このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
シンボリック行列演算
この例では、Symbolic Math Toolbox™ を使って簡単な行列計算を実行する方法を示します。
一般的なテスト行列である 5 行 5 列のヒルベルト行列を生成します。
H = sym(hilb(5))
H =
この行列式は非常に小さいです。
d = det(H)
d =
逆行列の要素は整数です。
X = inv(H)
X =
この逆行列が正しいことを確認します。
I = X*H
I =
特性多項式を求めます。
syms x; p = charpoly(H,x)
p =
この特性多項式の因数分解を試みます。
factor(p)
ans =
この結果は、この特性多項式を有理数上で因数分解できないことを示しています。
固有値を 50 桁の精度で近似計算します。
digits(50) e = eig(vpa(H))
e =
自由変数 を含む一般化ヒルベルト行列を作成します。
t = sym('t');
[I,J] = meshgrid(1:5);
H = 1./(I+J-t)
H =
を代入すると、元のヒルベルト行列が得られます。
subs(H,t,1)
ans =
行列式の逆数は、 の多項式です。
d = 1/det(H)
d =
d = expand(d)
d =
逆行列の要素も の多項式です。
X = inv(H)
X =
を代入すると、ヒルベルト行列の逆行列が生成されます。
X = subs(X,t,'1')
X =
X = double(X)
X = 5×5
25 -300 1050 -1400 630
-300 4800 -18900 26880 -12600
1050 -18900 79380 -117600 56700
-1400 26880 -117600 179200 -88200
630 -12600 56700 -88200 44100
別の例を調べます。
A = sym(gallery(5))
A =
これは "べき零行列" です。これを 5 乗すると、ゼロ行列になります。
A^5
ans =
これはべき零行列であるため、その特性多項式は非常に単純です。
p = charpoly(A,'lambda')
p =
ここで、この固有値の計算は暗算ができるぐらい単純です。固有値は、方程式 lambda^5 = 0 の零点です。
シンボリック計算によって、正確な固有値を求めることができます。
lambda = eig(A)
lambda =
数値計算は丸め誤差を伴い、lambda^5 = eps*norm(A) のような方程式の零点を求めます。このため、計算された固有値は概ね lambda = (eps*norm(A))^(1/5) となります。ここで、Symbolic Math Toolbox によって 16 桁の精度で、固有値の計算をします。すべての解が 0 になるべきですが、計算結果を確認すると、そうではないことが分かります。
digits(16) lambda = eig(vpa(A))
lambda =
これは、"欠陥" 行列でもあります。この行列は、対数行列ではありません。この行列のジョルダン正準形は非対角です。
J = jordan(A)
J =
行列の指数関数 expm(t*A) は通常、固有値 exp(lambda(i)*t) を含むスカラーの指数関数によって表されます。しかし、この行列の場合、expm(t*A) の要素はすべて t の多項式です。
t = sym('t');
E = simplify(expm(t*A))
E =
ところで、関数 "exp" は要素ごとの指数を計算します。
X = exp(t*A)
X =