Westchnienie. Obliczenie wyznacznika w celu określenia osobliwości jest absolutnie absurdalne. Zwłaszcza w przypadku dużej matrycy. Przepraszam, ale tak jest. Czemu? Tak, niektóre książki każą ci to zrobić. Może nawet twój instruktor.
Analityczna osobliwość to jedno. Ale co z liczbowym określeniem osobliwości? O ile nie używasz symbolicznego narzędzia, MATLAB używa arytmetyki zmiennoprzecinkowej. Oznacza to, że zapisuje liczby jako wartości zmiennoprzecinkowe, podwójnej precyzji. Liczby te nie mogą być mniejsze w wielkości niż
>> realmin
ans =
2.2251e-308
(Faktycznie, MATLAB idzie nieco niższe niż, że pod względem liczby nieznormalizowane, które mogą spadać do około 1E-323). Zobacz, że gdy próbuję zapisać liczba mniejsza od tej, MATLAB uważa, że wynosi zero.
>> A = 1e-323
A =
9.8813e-324
>> A = 1e-324
A =
0
Co dzieje się z dużą matrycą? Na przykład, ta macierz liczby pojedynczej:
M = eye(1000);
Ponieważ M jest matrycą tożsamości, jest dość wyraźnie nietypowe. W rzeczywistości det sugeruje, że jest nietypowy.
>> det(M)
ans =
1
Ale pomnóż go przez pewną stałą. Czy to sprawia, że jest nietypowy? NIE!!!!!!!!!!!!!!!!!!!!!!!! Oczywiście nie. Ale spróbuj mimo to.
>> det(M*0.1)
ans =
0
Hmm. To dziwne. MATLAB mówi mi, że wyznacznikiem jest zero. Ale wiemy, że wyznacznikiem jest 1e-1000. O tak. Gosh, 1e-1000 jest mniejszy, o znaczną kwotę niż najmniejsza liczba, którą właśnie pokazałem ci, że MATLAB może przechowywać jako podwójne. Wynika z tego niedobór, mimo że jest oczywiście niezerowy. Czy macierz jest pojedyncza? Oczywiście nie. Ale czy użycie detu nie działa tutaj?Oczywiście, że tak, a to jest całkowicie oczekiwane.
Zamiast tego użyj dobrego narzędzia do określania osobliwości. Użyj narzędzia takiego jak cond lub rang. Na przykład, czy możemy wygrać rangę?
>> rank(M)
ans =
1000
>> rank(M*.1)
ans =
1000
Widzisz, że ta kategoria wie, że jest to matryca o pełnej randze, niezależnie od tego, czy ją skalujemy, czy nie. To samo dotyczy cond, obliczając numer warunku M.
>> cond(M)
ans =
1
>> cond(M*.1)
ans =
1
Witamy w świecie arytmetyki zmiennoprzecinkowej. O, przy okazji, zapomnij o detie jako narzędziu do prawie wszystkich obliczeń z wykorzystaniem arytmetyki zmiennoprzecinkowej. Jest to kiepski wybór prawie zawsze.
istnieje funkcja PINV dla pseudoinverse – Amro