−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
   応用数学II                         1995.11. 9/10
   13.行列にアタック                     飯島
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

13.1 はじめに

 今回は,線形台数で扱う「行列」について考えてみたいと思います。

13.2 「行列」をどう扱うか −2次元配列−

 さて,たとえば,2×2行列でも3×3行列でもいいんですけど,どう扱ったらいいん でしょうね。一番「下手」な方法は,                  a11,a12,a21,a22 っていう感じで,変数そのものの名前に番号を付けてしまう方法。これも使えない手では ないけれども,「番号」そのものが全く意味を持たないことになってしまう。  第二の方法は,「配列」を使う方法。いや,ちょっとまて。配列っていうのは, DIM x(10) のような使い方だから,「行列」には合わない。... そう,今までの配列は,行列に合わなかったんですが,次のような使い方ができます。 DIM x(10,10) たとえば,この宣言で,10×10の行列を作ることができるわけです。その要素は,                    x(i,j) という表現をすることができますから,数学の証明の中での表現とよく似た表現をプログ ラムの中ですることもできるわけです。 ちなみに, DIM x(10,10,10) と宣言すれば,....

13.3 行列の和

目的は,行列のいろいろな演算を実行するところにおきましょう。最初は「和」ですね。 数学的には,                  C=A+B という形の式で表されます。しかし,QuickBASICでは,この表現をすることはできません 。一歩譲って,                  C =sum(A,B) くらいができるといいんですけど,それも無理です。                   なぜか それは,上記の書き方は,FUNCTION文ですが,FUNCTION文で「返してくれる値」というの は,「実数」などの普通の数値等でからです。「行列」等の値は返してくれません。その ため,こういうような場合には,                  SUB 文を使う ということになります。ここで,SUB 文に関する認識を少し深めていただきたいのですが ,一般に,SUB 文では,  CALL 名前( 変数1,変数2,... , 変数n) という書き方をします。一見すると,すべてが「入力」のように見えますが,実際には, ここでの変数は「入力変数と出力変数」とが併記してあるわけです。そして,それは自分 自身で「意識」して分けて考えるようにしなければいけません。たとえば,和を実現する ためには,メインには,次のようなプログラムを書くことになります。 CLS DIM a(3,3), b(3,3),c(3,3) CALL InputMatrix(a()) CALL DispMatrix(a()) CALL InputMatrix(b()) CALL DispMatrix(b()) CALL SumMatrix(a(),b(),c()) CALL DispMatrix(a()) PRINT "+" CALL DispMatrix(b()) PRINT "=" CALL DispMatrix(c()) では,SUB の方はどうしたらいいでしょう。たとえば,InputMatrix については,次のよ うにすればいいでしょう。他は... 考えてみましょうね。 SUB InputMatrix (a())   FOR i = 1 TO UBOUND(a, 1)     FOR j = 1 TO UBOUND(a, 2)       PRINT "("; i; ","; j; ")=";       INPUT a(i, j)     NEXT   NEXT END SUB なお,この中で,UBOUNDの使い方には注意してください。他も同様にできますよ。( 「同 様」って言っても,同じプログラムをそのまま写してもダメ。) 解答例 DECLARE SUB InputMatrix (a!())       −+この部分は,保存時に,自動的に付 DECLARE SUB DispMatrix (a!())        |けられます。あまり気にしないで。 DECLARE SUB SumMatrix (a!(), b!(), c!())  −+ CLS DIM a(3, 3), b(3, 3), c(3, 3) CALL InputMatrix(a()) CALL DispMatrix(a()) CALL InputMatrix(b()) CALL DispMatrix(b()) CALL SumMatrix(a(), b(), c()) CALL DispMatrix(a()) PRINT "+" CALL DispMatrix(b()) PRINT "=" CALL DispMatrix(c()) SUB DispMatrix (a())   FOR i = 1 TO UBOUND(a, 1)     PRINT "[";     FOR j = 1 TO UBOUND(a, 2)       PRINT a(i, j);     NEXT     PRINT "]"   NEXT END SUB SUB InputMatrix (a())   FOR i = 1 TO UBOUND(a, 1)     FOR j = 1 TO UBOUND(a, 2)       PRINT "("; i; ","; j; ")=";       INPUT a(i, j)     NEXT   NEXT END SUB SUB SumMatrix (a(), b(), c())   FOR i = 1 TO UBOUND(a, 1)     FOR j = 1 TO UBOUND(a, 2)       c(i, j) = a(i, j) + b(i, j)     NEXT   NEXT END SUB

13.4 行列の積

 次は「差」じゃつまらないので,「積」でしょうね。上のプログラムを修正しましょう 。メインは,次のように直します。 CLS DIM a(3, 3), b(3, 3), c(3, 3) CALL InputMatrix(a()) CALL DispMatrix(a()) CALL InputMatrix(b()) CALL DispMatrix(b()) CALL MultiMatrix(a(), b(), c()) CALL DispMatrix(a()) PRINT "*" CALL DispMatrix(b()) PRINT "=" CALL DispMatrix(c()) 今度のMultiMatrix は少し面倒ですね。積を要素で書き上げるときには,一体どのように 書かれていたのかを読みなおす必要がありそうです。                    n                cij =Σaik×bkj                    k=1 なんですが,さて,プログラムで書くには,どうしたらいいでしょう。 解答例 SUB MultiMatrix (a(), b(), c())   FOR i = 1 TO UBOUND(a, 1)     FOR j = 1 TO UBOUND(b, 2)       sum = 0       FOR k = 1 TO UBOUND(a, 1)        sum = sum + a(i, k) * b(k, j)       NEXT       c(i, j) = sum     NEXT   NEXT END SUB

13.5 いろいろと実際に計算してみよう。

たとえば,   +−1 1 1−+ A=| 0 1 1 |   +−0 0 1−+ の逆元,つまりかけたらEになるやつでも見つけてみようか。

13.6 ちょっとした問題

 実数と行列での違いの一つに                   An =E となるものがE(1,−1)以外にも,いろいろあることがあります。そこで,次のよう なプログラムを作って,次の問題について考えてみましょう。 プログラム:Aを入力すると,A,A2 ,A3 ,A4 ,A5 を表示する。 問題   :n乗するとEになるような行列を見つける。 例    : +−−1 −1 −1−++−0  1  0−+ |  0  1  0 || −1 −1−1 | +− 0  0  1−++−0  0  1−+  は何乗するのか。 ヒント? CLS DIM a(3, 3), b(3, 3), c(3, 3) CALL InputMatrix(a()) CALL DispMatrix(a()) CALL CopyMatrix(a(), b()) FOR i = 1 TO 4   PRINT "A ^ "; i + 1   CALL MultiMatrix(a(), b(), c())   CALL DispMatrix(c())   CALL CopyMatrix(c(), b()) NEXT SUB CopyMatrix (a(), b())   FOR i = 1 TO UBOUND(a, 1)     FOR j = 1 TO UBOUND(a, 2)       b(i, j) = a(i, j)     NEXT   NEXT END SUB