ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

det

説明

d = det(A) は、正方行列 A の行列式を返します。

すべて折りたたむ

3 行 3 列の正方行列 A を作成します。

A = [1 -2 4; -5 2 0; 1 0 3]
A = 3×3

     1    -2     4
    -5     2     0
     1     0     3

A の行列式を計算します。

d = det(A)
d = -32

行列式が特異性の正確な尺度にならない理由を調べます。

単位行列 eye(10) に小さい数を乗算して 10 行 10 列の行列を作成します。

A = eye(10)*0.0001;

行列 A の主対角の要素は非常に小さくなります。ただし、A は単位行列の倍数であるため、特異では "ありません"。

A の行列式を計算します。

d = det(A)
d = 1.0000e-40

行列式は極めて小さくなります。この行列について abs(det(A)) < tol の形式の許容誤差テストを行うと、ほとんどの場合は特異行列として判定されます。この行列の行列式はゼロに近くなりますが、実際には A が悪条件ということはありません。したがって、A は特異と見なされません。行列の行列式がゼロに近いからといって、それが特異性を示すとは限りません。

A が特異かどうかを調べるには、関数 cond または関数 rcond のいずれかを使用します。

A の条件数を計算します。

c = cond(A)
c = 1

この結果から、A が悪条件でないことを確認できます。

悪条件の行列 A の逆行列 A^(-1) の行列式を計算する方法について、A^(-1) を明示的に計算する以外の方法を調べます。

10 行 10 列のヒルベルト行列 A を作成します。

A = hilb(10);

A の条件数を求めます。

c = cond(A)
c = 1.6025e+13

条件数が大きいことから A が特異行列に近いと考えられるため、inv(A) の計算結果は正確にならない可能性があります。したがって、逆行列の行列式の計算 det(inv(A)) も不正確になります。

以下の事実を利用して、A の逆行列の行列式を計算します。

det(A-1)=1det(A)

d1 = 1/det(A)
d1 = 4.6202e+52

この方法では、行列 A の逆行列を計算する必要がありません。

invhilb を使用して、ヒルベルト行列 A の厳密な逆行列の行列式を計算します。その結果を d1 と比較して d1 の相対誤差を求めます。

d = det(invhilb(10));
relError = abs(d1-d)/abs(d)
relError = 1.0443e-04

d1 の相対誤差は十分に小さいことがわかります。A の逆行列を明示的に計算しないことで相対誤差は最小限になります。

比較のために、逆行列を明示的に計算する方法でも A の逆行列の行列式を計算します。その結果を d と比較して相対誤差を確認します。

d2 = det(inv(A));
relError2 = abs(d2-d)/abs(d)
relError2 = 2.2039e-05

d2 の計算の相対誤差は d1 の相対誤差よりも数桁大きいことがわかります。

厳密に特異であるものの非ゼロの大きい行列式をもつ行列について調べます。特異行列の行列式は理論的にはゼロになりますが、浮動小数点計算の性質上、この理論が常に成り立つとは限りません。

13 行 13 列の対角優位特異行列 A を作成し、非ゼロ要素のパターンを表示します。

A = diag([24 46 64 78 88 94 96 94 88 78 64 46 24]);
S = diag([-13 -24 -33 -40 -45 -48 -49 -48 -45 -40 -33 -24],1);
A = A + S + rot90(S,2);
spy(A)

A は行が線形従属であるため、特異です。たとえば sum(A) はゼロのベクトルを返します。

A の行列式を計算します。

d = det(A)
d = 1.0597e+05

A が特異であるという事実にもかかわらず、A の行列式は極めて大きくなります。実際、A の行列式は厳密にゼロになるはずです。d が不正確になる理由は、det による行列式の計算には LU 分解を使用しており、その LU 分解の MATLAB® 実装で丸め誤差が蓄積されるためです。この結果は数値行列式の計算の重要な側面を示しています。詳細については、制限の節を参照してください。

入力引数

すべて折りたたむ

入力行列。正方数値行列として指定します。

データ型: single | double
複素数のサポート: あり

制限

行列が特異であるかどうかを調べるときは、次のような制限があるため det の使用は避けてください。代わりに cond または rcond を使用してください。

制限結果

一般に行列式の大きさは行列の条件数には無関係です。

条件数が変わらなくても、行列の行列式が大きくなったり小さくなったりすることがあります。

det による行列式の計算では LU 分解を使用しており、浮動小数点の丸め誤差の影響を受けます。

行列式の計算で数値的に安定した結果が得られないことがあります。たとえば、特異行列の行列式の大きさは理論上は 0 ですが、det では大きい行列式が返されることがあります。

アルゴリズム

det では、関数 lu によるガウスの消去法で得られた三角因子から行列式を計算します。

[L,U] = lu(X)
s =  det(L)      % This is always +1 or -1 
det(X) = s*prod(diag(U))

拡張機能

参考

| | | | | |

R2006a より前に導入