Python の数値計算ライブラリで固有ベクトルを求める

そうだ! 固有ベクトルを求めよう!

SymPy で求めよう.

import sympy
matrix = sympy.Matrix([[1,1,2],[0,2,-1],[0,0,3]])
matrix
matrix.eigenvals()
matrix.eigenvects()

出力

Matrix([
[1, 1,  2],
[0, 2, -1],
[0, 0,  3]])

{1: 1, 2: 1, 3: 1}

[(1, 1, [Matrix([
[1],
[0],
[0]])]),
 (2, 1, [Matrix([
[1],
[1],
[0]])]),
 (3, 1, [Matrix([
[1/2],
[ -1],
[  1]])])]

NumPy で求めよう.

import numpy
matrix = numpy.array([[1,1,2],[0,2,-1],[0,0,3]])
matrix
(vals,vects) = numpy.linalg.eig(matrix)
(vals,vects)

出力

array([[ 1,  1,  2],
       [ 0,  2, -1],
       [ 0,  0,  3]])

(array([ 1.,  2.,  3.]),

 array([[ 1.        ,  0.70710678,  0.33333333],
       [ 0.        ,  0.70710678, -0.66666667],
       [ 0.        ,  0.        ,  0.66666667]]))

SciPy で求めよう.

import scipy
from scipy import linalg
matrix = scipy.mat([[1,1,2],[0,2,-1],[0,0,3]])
matrix
linalg.eig(matrix)

出力

matrix([[ 1,  1,  2],
        [ 0,  2, -1],
        [ 0,  0,  3]])

(array([ 1.+0.j,  2.+0.j,  3.+0.j]),

 array([[ 1.        ,  0.70710678,  0.33333333],
       [ 0.        ,  0.70710678, -0.66666667],
       [ 0.        ,  0.        ,  0.66666667]]))

SymPy では固有値が何重の解になっているか,も一緒に出してくれた.
NumPy では固有ベクトルを正規化して出してくれた.
SciPy では複素数の範囲で固有値を探してくれ,固有ベクトルを正規化して出してくれた.
あと,NumPy と SciPy はインデントつけて出してくれたので見やすい.