第3回 行列の計算
•
線形代数のパッケージ線形代数に関係する作業を実行しやすくするパッケージがあります。
with
コマンド を用いて、with(linalg):
と入力してください。•
行列の定義各行ベクトルを指定する方法、行列のサイズを指定し 、順に成分を 指定する、または、関数、手続きで指定する方法があります。
a:=matrix([ [1,2,3], [4,5,6],[7,8,9],[10,11,12] ]);
b:=matrix( 4, 2, [2,0,3,-1,6,9,7,1]);
c:=matrix(5,6, (i,j)->i-j^2);
id7:=matrix(7,7, proc(i,j) if i=j then 1 else 0 fi end);
•
行列の計算式 命令 和
a + b a+b
差a − b a-b
スカラー倍ka k*a
1
k a a/k
積
ab a &* b
ベキa
na^n
逆行列a
−1a^{-1}
1/a inverse(a)
• evalm
コマンド行列はリスト
(順番に並んだデータ列)
のリストと考えられます。evalm
コマンド によって、このリストを行列の形で表示してくれます。
• augment
コマンドc := augment(a, b);
によって以下のように2つの行列をくっつけます。
a = Ã
1 2 3 0 −1 1
!
, b = Ã
4 5
−2 2
!
, c = Ã
1 2 3 4 5
0 −1 1 −2 2
!
•
行列式正方行列
a
に対して、その行列式はdet(a);
で計算できる。a:=matrix([ [3,9,1], [2,0,-1], [8,1,1] ]);
det(a);
det(x-a);
練習
(1)
次のような行列a
を定義せよ.
1 2 3 4 5
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
(2) a
2, a
3 を求めよ.(3) a
の固有値を求めよ.例題次の連立方程式を考える.
3x
1+ x
2− x
3= 1 2x
1− 5x
2+ x
3= 0
−x
1+ 4x
2+ 2x
3= −2
行列の形で書くと
3 1 −1 2 −5 1
−1 4 2
x
1x
2x
3
=
1 0
−2
この係数行列が逆を持つかど うかは、行列式が
0
にならないかど うかで 判定できる. 今の場合は行列式が0
にならないので
x
1x
2x
3
=
3 1 −1 2 −5 1
−1 4 2
−1
1 0
−2
を計算することによって解が求められる.
a:= matrix([ [3,1,-1], [2,-5,1], [-1,4,2] ]);
det(a);
b:=matrix(3,1,[1,0,-2]);
evalm(1/a &* b);
逆を持たない場合にも適用可能な方法として、行の基本変形を行う方法 を考える. 次のような行列を作り
3 1 −1 1
2 −5 1 0
−1 4 2 −2
第1行を
1/3
倍し,
さらに第1行の−2
倍を第2行に加え,第1行の1
倍 を第3行に加え、という作業を繰り返し
1 1/3 −1/3 1/3 0 1 −5/17 2/17 0 0 1 −37/50
という形が得られる. これより
x
3= −37/50, x
2= 2/17 − (−5/17)x
3, x
1= 1/3 − (1/3)x
2− (−1/3)x
3 と求められる.a:= matrix([ [3,1,-1], [2,-5,1], [-1,4,2] ]);
b:=matrix(3,1,[1,0,-2]);
c:=augment(a,b);
mulrow(c, 1, 1/3);
addrow(%, 1, 2, -2);
addrow(%, 1, 3, 1);
mulrow(%, 2, -3/17);
addrow(%, 2, 3, -13/3);
d := mulrow(%, 3, 17/50);
x[3]:=d[3,4];
x[2]:=d[2,4]-d[2,3]*x[3];
x[1]:=d[1,4]-d[1,2]*x[2]-d[1,3]*x[3];
sum(a[1,j]*x[j], j=1..3);
sum(a[2,j]*x[j], j=1..3);
sum(a[3,j]*x[j], j=1..3);
•
行列の基本変形行列
a
のi
行のk
倍,i
行とj
行の交換,i
行のk
倍をj
行に加え る命令は,mulrow(a, i, k) , swaprow(a, i, j) ,
addrow(a, i, j, k)
を用いる.練習次の連立方程式を解け。