from sympy import *
#init_session()
#init_printing(use_unicode=True)
init_printing()
list_a = [1,2]
list_b = [3,4]
A=Matrix([list_a, list_b])
A
x,y = symbols('x,y')
v1=Matrix([x,y])
v1
zeros(2,3)
ones(2,3)
eye(3)
diag(1,2,3)
A=Matrix([[1,2,3],[4,5,6],[7,8,9]])
# i行j列の要素の取り出し
A[1,1]
A[:2,1:4]
col_0 = A[:,0]
col_0
row_1 = A[1,:]
row_1
numpyではcolumn_stackを使って拡大係数行列を作った. sympyではrow_insert, col_insertを使う.
b = Matrix([1,2,3])
A.row_insert(3,b.T)
A.col_insert(3,b)
A.shape
print(v1.shape)
print(v1.T.shape)
(2, 1) (1, 2)
A.T
v1.T
A = Matrix([[1,2],[3,4]])
A*v1
v1.T*v1 #v1*v1ではerror
v1.T*A
v1.T*v1
v1*v1.T
outer(v1,v2)がSympy1.1.1では見つからない. crossは使える.
v1 = Matrix([1,1,3])
v2 = Matrix([1,2,-1])
v1.outer(v2)
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-23-2fa213ccebb0> in <module> ----> 1 v1.outer(v2) AttributeError: 'MutableDenseMatrix' object has no attribute 'outer'
v1.cross(v2)
v3 = Matrix([-1,2,1])
v3.dot(v1.cross(v2))
A=Matrix([[1,2,3],[4,5,6],[5,7,9]])
print(A.nullspace())
Aex = A.col_insert(3,b)
pprint(Aex)
Aex.rref()
rrefはreduced row echelon formを取り出してくれる.これはGaussの消去法で下んとこまで行って,さらに上んとこへ戻ってきたやつ.拡張行列もそのままやってくれるはず.もうすこし,試す必要があるが,一応MapleのLUDecompositionに近い結果を与えてくれる.
A=Matrix([[1,2,3],[4,5,6],[7,9,8]])
L, U, P = A.LUdecomposition()
L, U, P
print(A)
print(A.rank())
c = Matrix([[1,1],[1,2]])
print(c.det())
a = Matrix([[1,2],[3,4]])
a.det()
次の行列式の計算を確認せよ. $$ \left| \begin {array}{cccc} 1+a & 1 & 1 & 1\\ 1 & 1+b & 1 & 1\\ 1 & 1 & 1+c & 1\\ 1 & 1 & 1 & 1+d \end {array} \right| = abcd \left(1+\sum_{i=a}^d \frac{1}{i}\right) $$
from sympy import *
a,b,c,d,x,y,z = symbols('a b c d x y z')
A = Matrix([[1+a,1,1,1],[1,1+b,1,1],[1,1,1+c,1],[1,1,1,1+d]]
)
pprint(A)
simplify(A.det())
A = Matrix([[1,2],[3,4]])
A.inv()
次の連立方程式を解け. $$ \left\{ \begin {array}{cl} x+y+z&=0\\ ax+by+cz&=0\\ bcx+cay+abz&=(a-b)(b-c)(c-a) \end {array} \right. $$
from pprint import pprint
from sympy import *
a,b,c,x,y,z = symbols('a b c x y z')
A = Matrix([[1,1,1],[a,b,c],[b*c,c*a,a*b]])
bb = Matrix([0,0,(a-b)*(b-c)*(c-a)])
print(A)
print(bb)
Ainv = A.inv()
res = Ainv * bb
pprint(simplify(res[0]))
pprint(simplify(res[1]))
pprint(simplify(res[2]))
A = Matrix([[1,2],[2,1]])
A.eigenvects()
eigenvectsの固有ベクトルは規格化されていません.norm()を使うとかんたんに規格化してくれます.
v1=Matrix(A.eigenvects()[0][2])
v2=Matrix(A.eigenvects()[1][2])
simplify(v1.T*v1)
v_norm = v1.norm()
v_norm
v1n = v1/v_norm
v1n
ちょいとわかりやすい行列を作成してみてみます.
D = diag(1,2)
P = Matrix([[1,0],[1,1]]).T
A = P*D*P.inv()
A, P, D
P,D = A.diagonalize()
P.inv()*A*P
eigs = A.eigenvects()
v1 = eigs[0][-1][0]
v2 = eigs[1][-1][0]
Matrix([v1,v2]).reshape(2,2).T
対角化行列$P$をeigenvectsから作ろうとして苦労した.まず,固有ベクトルの取り出しが自動的にできない.重複しているときには,固有ベクトルは二つ出てくる.さらに,タプルからの取り出しがこれでいいいのか...さらに,ベクトルから行列を作るときに横置きのができない.うううんん.他のやり方をしたでやってみる.上では仕方がないので,一旦4x1のMatrixにしてそのあとreshape,さらにTransposeで...
v1.col_insert(1,v2)
numpyにはravel()というフラット化の関数があるがsympyにはない.
結論:3つほど上でやっているdiagonalizeで取り出しましょう.重複があっても取り出してくれるんで.
行列 $$ A\, := \, \left[ \begin {array}{ccc} 2&0&1\\ 0&3&0\\ 1&0&2 \end {array} \right] $$
を対角化する変換行列$P$を求め,対角化せよ.
A = Matrix([[2,0,1],[0,3,0],[1,0,2]])
evs = A.eigenvects()
evs
#
P,D = A.diagonalize()
P,D
P.inv()*A*P