怪獣算

[pukiwiki]
引き続きMathematica(Player) で遊んでおります。
今日は連立方程式の解き方、それに関連して逆行列の求め方などを勉強

最近は、並列化プログラミングが流行りですが、問題を連立方程式として考えたほうが並列化しやすいのかも?

連立方程式といえば 『鶴亀算』 ですが、今回は、変数を3つにして、ゴジラ、キングギドラ、モスラの三大怪獣による 『怪獣算』 で遊んでみました。
—-
その前に 一個
*[[DIMENSIONS:http://faculty.ms.u-tokyo.ac.jp/users/dim_jp/]]
“DIMENSIONSは,Jos Leys, Étienne Ghys, Aurélien Alvarezが作り,Creative Commonsライセンスに従って提供している数学の啓蒙のためのビデオです.
このビデオは,無償ダウンロードできます.オンラインでも見られます. 日本語版のオンライン視聴のサイトもあります.

今度見るー  via [[ホットコーナーの舞台裏:http://iiyu.asablo.jp/blog/]]

[/pukiwiki]

[pukiwiki]
—-

まず、変数を決めます

x ゴジラの匹数
y キングギドラの匹数
z モスラの匹数

a 頭の数の合計。

キングギドラだけは3、ゴジラ、モスラはそれぞれ1なので、

x+3y+z=a

b 足の数

ゴジラは手ではなく、前足と数えて4
キングギドラは2
モスラは蛾の怪獣だから 6

4x+2y+6z=b

c 羽根の数

ゴジラはゼロ。 
キングギドラは2。 モスラは4枚

0x+2y+4z=c

*Solve関数
今までの式をMathematicaに解かせます。
Mathematicaの場合、関係式では等号が二重になります。

では、頭が3、足が2、 翼が2の場合を解いてみます。

Solve[
{ x+3y+z==3,
4x+2y+6z==2,
0x+2y+4z==2
} ]

答 {{x -> 0, y -> 1, z -> 0}}

キングギドラが一匹出現したようです(汗

*行列で解いてみる
さて、上記では連立方程式として解かせました。
連立方程式の解き方としては、行列として表現し、逆行列を計算することで解を求める方法もあります。

上記の連立方程式

x+3y+z==3
4x+2y+6z==2
0x+2y+4z==2

は、式の係数を行列にまとめ、次のように表現するとします。

http://boxheadroom.com/wp/wp-content/uploads/2009/11/kaiju1.png

解を求めるには、逆行列を使います
InverseはMathematicaで正方行列の逆行列を求める関数です。

http://boxheadroom.com/wp/wp-content/uploads/2009/11/kaiju2.png

。。。と、説明をはしょりましたが、私にもよくわかってません(汗 まずは、そういうものだと思ってください。

さらに怪獣が現れました。
合計で 頭が 6 足が18 翼が10枚に。

これを、Mathematicaで、逆行列を使って解いてみます。

t={{1,3,1},{4,2,6},{0,2,4} };

Inverse[t].{6,18,10}

解 {1, 1, 2}

ゴジラが一匹と、キングギドラが一匹、さらにモスラが2匹の大乱戦となっております(汗

さて、今、何も考えずに逆行列を使って方程式を解きました。でも、解けない場合もあります。

連立方程式が解けるか、解けないか、は行列式を使って判定することができます。

行列式がゼロの時は、逆行列が存在しません。すなわち、解けない連立方程式だということになります。

MathematicaではDet関数で求めることができます。

Det [ {{1,3,1},{4,2,6},{0,2,4} } ]
答 -44

怪獣算は解けることがわかります。

次のような行列には、逆行列が存在しません。

1 2 3
4 5 6
7 8 9

行列式を計算すると、ゼロになります。
無理に解かせようとすると、空集合が返ってきます。

Solve[
{ x+2y+3z==a,
4x+5y+6z==b,
7x+8y+9z==c},{x,y,z}]
答 {}

*解けないときのReduceだのみ

今回の場合、上記の式を成り立たせるような x y z が無数に存在する、ということです。 Reduce関数を使って、x y zの関係を得ることができます

Reduce[
x+2y+3z==a&&
4x+5y+6z==b&&
7x+8y+9z==c,{x,y,z}]

答 a == 2*b – c &&
    y == -3*b + 2*c – 2*x &&
    z == (8*b)/3 – (5*c)/3 + x

Reduce関数では、条件に不等式も使うことができます。

—-
で、なんで、こんな話を書いてるかといいますと、、、

最近は、並列化が流行りです。
CPUのマルチコア化であったり、クラウドによる分散化であったり、GPGPUなど、GPUを使った高速化であったり。

で、従来型の、頭から初めて終わりまで直線的に読んでいくプログラムの書き方よりも、こういった連立方程式によって問題を解くと考えたほうが、並列化しやすい、かもしれないなと。

 これぐらいの小さな問題だと、あまりメリットを感じませんけれども。
—-
今回はIronPython+Mathematicaで遊びましたが、CPythonだと、行列演算には数値演算パッケージNumPyを使うほうが普通かも。

-[[Microsoft Solver Foundation :http://code.msdn.microsoft.com/solverfoundation]]
連立方程式を解く、というか、線形計画法みたいな。
最近のエクセルにはアドオンとして搭載されている?みたいです

チュートリアル「What Is Solver Foundation?」 に載ってる、人工衛星打ち上げ計画のモデルケースは、こんど読んでみようかと思います(汗

[[http://ecx.images-amazon.com/images/I/515I480zzuL._SL160_.jpg:http://www.amazon.co.jp/exec/obidos/ASIN/4274067416/tamc-22/ref=nosim/]]
絵柄が可愛いし、非常にわかりやすいので、中学生でも読めると思うのですが、普段使わないと忘れちゃうんですよねぇ(汗

[/pukiwiki]

コメントを残す

メールアドレスが公開されることはありません。