はぁ。特異点を決定するための行列式の計算は、ばかげたことです。まったくそうです。特に大規模なマトリックスの場合はそうです。申し訳ありませんが、そうです。なんで?はい、いくつかの本はあなたにそうするように言います。多分あなたのインストラクターでさえ。
分析的特異点は 1 つのことです。しかし、特異点の数値決定はどうだろうか? シンボリック ツールを使用していない限り、MATLAB は浮動小数点演算を使用します。これは、数値を浮動小数点の倍精度値として格納することを意味します。これらの数値は、以下よりも小さくすることはできません
>> realmin
ans =
2.2251e-308
(実際には、MATLAB はそれより少し低くなります。非正規化数に関しては、約 1e-323 まで下がる可能性があります。) それよりも小さい数を格納しようとすると、MATLAB はそれをゼロと見なします。
>> A = 1e-323
A =
9.8813e-324
>> A = 1e-324
A =
0
大きなマトリックスではどうなりますか? たとえば、次の行列は特異ですか。
M = eye(1000);
M は恒等行列であるため、明らかに非特異です。実際、det はそれが非特異であることを示唆しています。
>> det(M)
ans =
1
ただし、定数を掛けます。それはそれを非特異にしますか?いいえ!!!!!!!!!!!!!!!!!!!!!!!!もちろん違います。でもとにかくやってみる。
>> det(M*0.1)
ans =
0
うーん。それは奇妙です。MATLAB は、行列式がゼロであることを教えてくれます。しかし、行列式が 1e-1000 であることはわかっています。ああ、そうです。1e-1000 は、MATLAB が double として格納できることを示した最小の数値よりもかなり小さくなっています。したがって、行列式は明らかに非ゼロですが、アンダーフローします。行列は特異ですか?もちろん違います。しかし、det の使用はここで失敗しますか? もちろんそうなるでしょう、そしてこれは完全に予想されています。
代わりに、特異点を判断するための優れたツールを使用してください。cond や rank などのツールを使用します。たとえば、ランクをだますことはできますか?
>> rank(M)
ans =
1000
>> rank(M*.1)
ans =
1000
スケーリングするかどうかに関係なく、ランクはこれが完全なランク行列であることを認識していることを確認してください。同じことが cond にも当てはまり、M の条件数を計算します。
>> cond(M)
ans =
1
>> cond(M*.1)
ans =
1
浮動小数点演算の世界へようこそ。ところで、浮動小数点演算を使用するほぼすべての計算のツールとしての det のことは忘れてください。ほとんどの場合、これは不適切な選択です。