- 締切済み
行列の連立方程式 (mathematica)
mathematica4.1を使用して,行列で表した連立方程式を計算したいと思っています.例えば A= a11 a12 a13 a21 a22 a23 a31 a32 a33 B=b11 b12 b13 b21 b22 b23 b31 b32 b33 C,Dも同様に定義して A .x+B .y=1 C .x+D .y=0 x=x1 y=y1 x2 y2 x3 y3 のような連立方程式のx,yについて解きたいのですが,どのようにmathematicaで表現すればよいかが分かりません. どなたか教えてください.お願いします. 当然ではありますが,A,B,C,Dはすべて既知としています.
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- kazuma1956
- ベストアンサー率50% (1/2)
Mathematicaでの回答例 (* 以下の様に定義します *) (* 例えば、Aの(i,j)成分は、a[i,j]となります *) A = Array[a, {3, 3}]; B = Array[b, {3, 3}]; CC = Array[c, {3, 3}]; DD = Array[d, {3, 3}]; X = Array[x, {3}]; Y = Array[y, {3}]; (* このまま、 Solve[{A.X+B.Y={1,1,1},C.X+D.Y=={0,0,0}},Join[X,Y]] を実行したいところですが、結構時間がかかるようです。*) (* {{A,B},{C,D}}を結合した大きな行列を作ります。*) M = ArrayFlatten[{{A, B}, {CC, DD}}]; (* M.{x[1],x[2],x[3],y[1],y[2],y[3]}={1,1,1,0,0,0} を解けばよいのですが、これも時間がかかります *) (*そこで、LinearSolveを使います。これは短時間で処理が済みますが、出力 が膨大になるようです *) (* このような計算のとき、Det[M] !=0 という前提で、計算されるので、ご注意ください *) LinearSolve[M][{1,1,1,0,0,0}]
- 178-tall
- ベストアンサー率43% (762/1732)
Mathematica の使用経験はありませんが、たとえば、 (Linear Algebra パッケージ?) MatrixManipulation パッケージに BlockMatrix 関数があるようです。
- alice_44
- ベストアンサー率44% (2109/4759)
行列を並べて作った行列を「ブロック行列」とか「区分行列」とか言うが、 ブロック行列の逆行列について、↓のような資料があった。 http://ja.wikipedia.org/wiki/%E5%8C%BA%E5%88%86%E8%A1%8C%E5%88%97#2_.C3.97_2_.E3.81.AE.E5.8C.BA.E5.88.86.E8.A1.8C.E5.88.97.E3.81.AE.E9.80.86.E8.A1.8C.E5.88.97 あるいは、スカラーの 2 元 2 連立方程式と同じように、 C x + D y = 0 を y = … の形に解いて A x + B y = 1 へ代入する などでもよいのかもしれない。 A, B, C, D の中にひとつでも正則な行列があれば、このやり方がスムースにいく。 たとえ四つとも非正則であっても、連立一次方程式の不能の場合、不定の場合を処理する 方法を知っていれば、det D = 0 の時に C x + D y = 0 を y = … と扱うことが できると思う。解の一意性を判定して不定解を正しく扱う部分を、プログラムで自動的に やらせるには、ゴタゴタした場合分けをコーディングしなければならないだろうけど。 # やっぱり、6 連立方程式に展開してしまったほうが # 楽なように見えるなあ。
お礼
ありがとうございました.この方法で考えてみます. ただ,今回は6連立でしたが,今後はNxNの場合に拡張したかったので 展開する手法は取りたくなかったのです.
- alice_44
- ベストアンサー率44% (2109/4759)
訂正: 単位行列の訳ないか。 右辺もベクトルでなきゃね。 =0 は零ベクトルと読めるとして、 =1 は意味不明。 ここを適切なベクトルで書いた問題は、 やはり、x1,x2,x3,y1,y2,y3 についての 6 元 6 連立一次方程式だから、 普通に解けばよいのだけれど。
補足
すみません,質問の説明が足りませんでした. "=1"の部分は =1 1 1 です. ただ,mathematica上で式を一文ずつ並べて連立するのではなく,行列の形の状態で xやyを求める方法が知りたかったのです.
- alice_44
- ベストアンサー率44% (2109/4759)
=1 は、単位行列の意味でいいのかな? 6 元 6 連立の一次方程式だから、 普通に解けばいいんじゃないの? A,B,C,D とかに拘ることない。
お礼
遅くなりまして申し訳ありません.回答有り難うございます. しかし,mathematicaの経験が浅いため,このBlockMatrix関数をどう適用すればよいのか… 勉強してみます.