数学の具体的な計算にPythonを使って、数学もPythonも同時に学んでしまいましょう。今回はPythonを使って行列の計算をしてみたいと思います。Pythonのごく基本的な使い方については以下の記事を参照してください:
行列の諸操作
行列を入力する
Python (SymPy) で行列を入力するには
import sympy sympy.init_printing() sympy.var('m11, m12, n11, n21') sympy.var('a11, a12, a21, a22, b11, b12, b21, b22') M = sympy.Matrix([ [m11,m12] ]) N = sympy.Matrix([ [n11], [n21] ]) A = sympy.Matrix([ [a11,a12], [a21,a22] ]) B = sympy.Matrix([ [b11,b12], [b21,b22] ])
などとすれば良いです。
ここで は -行列、 は -行列、、 は -行列としました:
行列の要素を参照する
行列の要素を参照するには
A[0,1] # つまり行列 A の (k ,l) 成分は A[ k-1 , l-1 ] です(ラベルは0から数えます)
B[1,1]
などとします。
行列の演算(積、和、定数倍、ベキ乗)
行列の積の定義から、行列の積 、、、 などが許されます:
A*B # 行列の積はアスタリスク(通常の積と同じ)です
M*A
B*N
M*B*N
などとして計算します。行列のベキ乗は
A**2
です。
同じ型の2つの行列の線形結合は
sympy.var('a, b')
a*A+b*B
となります。
逆行列をとる
逆行列は
A.inv()
または
A**(-1)
によって求められます。
連立1次方程式を解く
求めた逆行列を応用する問題として、連立1次方程式
を考えましょう。これは行列を使って
と表すことができます。その解は、行列
として求めることができます。
例えば3変数 、 、 の連立1次方程式
は行列
の逆行列をもとめれば良いわけです:
import sympy sympy.init_printing() sympy.var('a, b, c, d, e, f, g, h, i') A3 = sympy.Matrix([ [a, b, c], [d, e, f], [g, h, i] ]) sympy.cancel(A3**(-1))
により、逆行列が
と求まります。ここで
です。最後はこの逆行列にベクトル
を掛け合わせれば解が得られます:
これをsolveを使って求めた解と見比べてみましょう:
eq1=sympy.Eq(a*x+b*y+c*z, j) eq2=sympy.Eq(d*x+e*y+f*z, k) eq3=sympy.Eq(g*x+h*y+i*z, l) sympy.solve ([eq1, eq2, eq3], [x, y, z])
より
確かに解になっていることがわかります。
行列式を求める
行列 の行列式を求めるには
A.det()
と入力します。
行列 の余因子行列 は
A.adjugate()
です:実際
A.inv() == 1/(A.det())*A.adjugate()
より
が成り立ちます。
単位行列
単位行列は
sympy.eye(2)
です。引数の数字は行列のサイズを指定します。
たとえば、逆行列になっていることを確認するときなどに
sympy.simplify(A.inv()*A) == sympy.eye(2)
のようにして使うことができます。
トレースをとる
行列 のトレースをとるには
A.trace()
とします。
転置をとる
行列 の転置行列
は
A.transpose()
です。
随伴行列をとる
行列 の随伴行列
をとるには
A.adjoint()
とします。