【数式処理 MuPAD 入門】
平田 浩一 / 2000年01月24日 
hirata@edserv.ed.ehime-u.ac.jp 
愛媛大学教育学部数学教室 


行列とベクトル (2)



行列の処理

前回に引き続き行列の計算について説明します。

まずは、行列を扱うために前回と同様の準備をしましょう。

● loadlib("linalg"): export(linalg);

● MAT := Dom::Matrix();

               Dom::Matrix(Dom::ExpressionField(id, iszero))

■ 行列の計算

行列の処理のために次のような関数が用意されています。

nrows(A)     行列 A の行数
ncols(A)     行列 A の列数
dimen(A)     行列 A の行数と列数
row(A,i)     行列 A の第 i 行 を取り出す
row(A,i1..i2)     行列 A の第 i1 行から第 i2 行を取り出す
col(A,j)     行列 A の第 j 列を取り出す
col(A,j1..j2)     行列 A の第 j1 列から第 j2 列を取り出す
A[i,j]     行列 A の i 行 j 列の要素
A[i,j] := x     行列 A の i 行 j 列の要素を x に変更
transpose(A)     行列 A の転置行列 tA
rank(A)     行列 A の階数 rank A

●A := MAT([[1,2,3],[6,5,4]]);

                               +-         -+
                               |  1, 2, 3  |
                               |           |
                               |  6, 5, 4  |
                               +-         -+

● nrows(A);

                                     2

● ncols(A);

                                     3

● dimen(A);

                                  [2, 3]

● row(A,2);

                                +-       -+
                                | 6, 5, 4 |
                                +-       -+

● col(A,1);

                                  +-   -+
                                  |  1  |
                                  |     |
                                  |  6  |
                                  +-   -+

● A[2,3];

                                     4

● A[2,3] := 7;

                                     7

● A;

                               +-         -+
                               |  1, 2, 3  |
                               |           |
                               |  6, 5, 7  |
                               +-         -+

● transpose(A);

                                +-      -+
                                |  1, 6  |
                                |        |
                                |  2, 5  |
                                |        |
                                |  3, 7  |
                                +-      -+

● rank(A);

                                     2

以下は正方行列に対して定義されている関数です。

det(A)     行列 A の行列式 |A|
adjoint(A)     行列 A の余因子行列。これを行列式で割ったものが逆行列です。
tr(A)     行列 A のトレース tr A (対角成分の和)

MuPAD の古いバージョンでは tr(A) が trace(A) となっていました。

● B := MAT([[2,-3,1],[1,2,0],[-1,3,2]]);

                              +-           -+
                              |   2, -3, 1  |
                              |             |
                              |   1,  2, 0  |
                              |             |
                              |  -1,  3, 2  |
                              +-           -+

● det(B);

                                    19

● adjoint(B);

                             +-            -+
                             |   4,  9, -2  |
                             |              |
                             |  -2,  5,  1  |
                             |              |
                             |   5, -3,  7  |
                             +-            -+

● 1/B;

                         +-                     -+
                         |   4/19,  9/19, -2/19  |
                         |                       |
                         |  -2/19,  5/19,  1/19  |
                         |                       |
                         |   5/19, -3/19,  7/19  |
                         +-                     -+

● tr(B);

                                     6

■ 行列の結合

2つの行列 A と B を結合する関数があります。

concatMatrix(A,B)     行列 A と B を横につなげる。
stackMatirx(A,B)     行列 A と B を縦につなげる。

● A := MAT([[a,b],[c,d]]); B := MAT(2,2,1,Diagonal);

                                +-      -+
                                |  a, b  |
                                |        |
                                |  c, d  |
                                +-      -+

                                +-      -+
                                |  1, 0  |
                                |        |
                                |  0, 1  |
                                +-      -+

● concatMatrix(A,B);

                             +-            -+
                             |  a, b, 1, 0  |
                             |              |
                             |  c, d, 0, 1  |
                             +-            -+

● stackMatrix(A,B);

                                +-      -+
                                |  a, b  |
                                |        |
                                |  c, d  |
                                |        |
                                |  1, 0  |
                                |        |
                                |  0, 1  |
                                +-      -+
行列の基本変形

次に行列の基本変形を用いた計算をとりあげます。

■ 基本変形

行列の行の基本変形に関する関数が用意されています。

addRow(A,i,j,x)     行列 A の第 i 行の x 倍を第 j 行に加える。
multRow(A,i,x)     行列 A の第 i 行を x 倍する。
swapRow(A,i,j)     行列 A の第 i 行と第 j 行を入れ換える。

● A := MAT([[1,2,3],[6,5,4]]);

                               +-         -+
                               |  1, 2, 3  |
                               |           |
                               |  6, 5, 4  |
                               +-         -+

● A1 := addRow(A,1,2,-6);

                             +-            -+
                             |  1,  2,  3   |
                             |              |
                             |  0, -7, -14  |
                             +-            -+

● A2 := multRow(A1,2,-1/7);

                               +-         -+
                               |  1, 2, 3  |
                               |           |
                               |  0, 1, 2  |
                               +-         -+

● A3 := swapRow(A2,1,2);

                               +-         -+
                               |  0, 1, 2  |
                               |           |
                               |  1, 2, 3  |
                               +-         -+

列に関する基本変形も同様です。

addCol(A,i,j,x)     行列 A の第 i 列の x 倍を第 j 列に加える。
multCol(A,i,x)     行列 A の第 i 列を x 倍する。
swapCol(A,i,j)     行列 A の第 i 列と第 j 列を入れ換える。

■ 基本変形による逆行列の計算

基本変形を用いて、次の行列 A の逆行列を計算してみましょう。

           +-      -+
           |  2  -5 |
       A = |        |
           |  1  -3 |
           +-      -+

行列 A と単位行列 E2 を用意し、concatMatrix を用いて連結します。

● A := MAT([[2,-5],[1,-3]]);

                                +-       -+
                                |  2, -5  |
                                |         |
                                |  1, -3  |
                                +-       -+

● E2 := MAT(2,2,1,Diagonal);

                                +-      -+
                                |  1, 0  |
                                |        |
                                |  0, 1  |
                                +-      -+

● A1 := concatMatrix(A,E2);

                             +-             -+
                             |  2, -5, 1, 0  |
                             |               |
                             |  1, -3, 0, 1  |
                             +-             -+

連結した行列の左半分が単位行列になるように、 行の基本変形を繰り返し行います。 左半分が単位行列になったときの右半分が求める逆行列です。

計算を始めましょう。 第1列に着目し基本変形を行います。

● A2 := swapRow(A1,1,2);

                             +-             -+
                             |  1, -3, 0, 1  |
                             |               |
                             |  2, -5, 1, 0  |
                             +-             -+

● A3 := addRow(A2,1,2,-2);

                            +-              -+
                            |  1, -3, 0,  1  |
                            |                |
                            |  0,  1, 1, -2  |
                            +-              -+

次に2列目を処理します。

● A4 := addRow(A3,2,1,3);

                             +-             -+
                             |  1, 0, 3, -5  |
                             |               |
                             |  0, 1, 1, -2  |
                             +-             -+

これで、左半分の 2x2 行列が単位行列になりました。 A の逆行列は右半分の 2x2 行列です。

右半分を取り出してみましょう。

● A5 := col(A4,3..4);

                          -- +-   -+  +-    -+ --
                          |  |  3  |  |  -5  |  |
                          |  |     |, |      |  |
                          |  |  1  |  |  -2  |  |
                          -- +-   -+  +-    -+ --

● B := concatMatrix(op(A5));

                                +-       -+
                                |  3, -5  |
                                |         |
                                |  1, -2  |
                                +-       -+

正しく逆行列がえられているかどうか、確認してみましょう。

● 1/A;

                                +-       -+
                                |  3, -5  |
                                |         |
                                |  1, -2  |
                                +-       -+

■ 基本変形による連立方程式の計算

次に、基本変形を用いて連立方程式 A v = b を解いてみましょう。

           +-      -+         +- -+         +- -+
           |  2  -3 |         | x |         | 1 |
       A = |        |     v = |   |     b = |   |
           |  1   2 |         | y |         | 4 |
           +-      -+         +- -+         +- -+

とします。

行列 A とベクトル b を用意し、連結します。

● A := MAT([[2,-3],[1,2]]); b := MAT([1,4]);

                                +-       -+
                                |  2, -3  |
                                |         |
                                |  1,  2  |
                                +-       -+

                                  +-   -+
                                  |  1  |
                                  |     |
                                  |  4  |
                                  +-   -+

● A1 := concatMatrix(A,b);

                              +-          -+
                              |  2, -3, 1  |
                              |            |
                              |  1,  2, 4  |
                              +-          -+

逆行列を求めたときと同様に、 左側の 2x2 行列が単位行列になるように、 行の基本変形を繰り返します。

● A2 := multRow(A1,1,1/2);

                            +-              -+
                            |  1, -3/2, 1/2  |
                            |                |
                            |  1,   2,   4   |
                            +-              -+

● A3 := addRow(A2,1,2,-1);

                            +-              -+
                            |  1, -3/2, 1/2  |
                            |                |
                            |  0,  7/2, 7/2  |
                            +-              -+

● A4 := multRow(A3,2,2/7);

                            +-              -+
                            |  1, -3/2, 1/2  |
                            |                |
                            |  0,   1,   1   |
                            +-              -+

● A5 := addRow(A4,2,1,3/2);

                               +-         -+
                               |  1, 0, 2  |
                               |           |
                               |  0, 1, 1  |
                               +-         -+

これで、左側の 2x2 行列が単位行列になりました。 第 3 列が連立方程式の解です。 x = 2, y= 1 となります。

■ 連立方程式を解く関数

上のように基本変形で連立方程式を解くのは大変です。

そのための関数が用意されています。

linearSolve(A,b)     方程式 A v = b を解く

上と同じ計算を linearSolve で解いてみましょう。

● A := MAT([[2,-3],[1,2]]);

                                +-       -+
                                |  2, -3  |
                                |         |
                                |  1,  2  |
                                +-       -+

● b := MAT([1,4]);

                                  +-   -+
                                  |  1  |
                                  |     |
                                  |  4  |
                                  +-   -+

● linearSolve(A,b);

                                  +-   -+
                                  |  2  |
                                  |     |
                                  |  1  |
                                  +-   -+

【演習問題】

(1) 基本変形を用いて次の行列 A, B の逆行列を求めよ。

           +-    -+
           | 2  3 |
       A = |      |
           | 1  4 |
           +-    -+

           +-           -+
           |   2  -3  1  |
           |             |
       B = |   1   2  0  |
           |             |
           |  -1   3  2  |
           +-           -+

(2) 次の方程式を基本変形を用いて解け。

           +-    -+  +- -+     +- -+
           | 1  4 |  | x |     | 1 |
      1.   |      |  |   |  =  |   |
           | 2  3 |  | y |     | 2 |
           +-    -+  +- -+     +- -+


           +-           -+  +- -+     +- -+
           |   2  -3  1  |  | x |     | 1 |
           |             |  |   |     |   |
      2.   |   1   2  0  |  | y |  =  | 2 |
           |             |  |   |     |   |
           |  -1   3  1  |  | z |     | 3 |
           +-           -+  +- -+     +- -+

【数式処理 MuPAD 入門】