Program do wartości własnych
Mariusz:
Maciess , jak będziesz miał trochę więcej czasu to odpisz
Oto co do tej pory napisałem
https://ideone.com/c7vgTD
https://ideone.com/jcmdLu
Redukcję macierzy do postaci Hessenberga zrealizowałem za pomocą eliminacji Gaussa
choć wolałbym użyć odbić Householdera jednak nie znalazłem dobrze opisanego
ani sposobu konstrukcji macierzy odbić Householdera jak i efektywnego sposobu mnożenia przez
macierze odbić (zarówno lewostronnego jak i prawostronnego)
Redukcję macierzy do postaci Hessenberga za pomocą eliminacji Gaussa znalazłem w książce
Z Fortuna B Macukow J Wąsowski Metody numeryczne
Jeżeli chodzi o rozkład QR to rozpisałem sobie zarówno lewostronne jak i prawostronne mnożenie
przez macierze obrotów
Okazało się że lewostronne mnożenie przez macierze obrotów modyfikuje tylko dwa wiersze
a prawostronne mnożenie przez macierze obrotów modyfikuje tylko dwie kolumny
W przypadku mnożenia macierzy to wystarczyły trzy pętle ale aby dobrze działało trzeba było
macierz skopiować
Wiem że mnożenie macierzy można przyśpieszyć ale kosztem zwiększenia złożoności pamięciowej
Przydałoby się dopisać jakieś przesunięcie ale iloraz Rayleigha nie daje gwarancji zbieżności
a poza tym podobno wektor dla którego liczymy ten iloraz powinien dążyć do wektora własnego
Przesunięcie Wilkinsona natomiast działa tylko dla macierzy symetrycznych
Zastanawiam się nad tzw podwójnym przesunięciem ale jak je zrealizować
Chciałbym przybliżać zespolone wartości własne unikając arytmetyki zespolonej
rozwiązując równanie kwadratowe z klatek 2x2 występujących na diagonali
Co z deflacją ?
Jak rozpoznać że można dokonać deflacji i jak ją zrealizować w miejscu ?
Zamiana kolumn i wierszy albo zastosowanie podobnego pomysłu
co w iteracji sortowania przez wstawianie
może popsuć postać Hessenberga a także ostateczną postać Schura
Ostatnio znalazłem też w tablicach Mizerskiego
wzór na współczynniki wielomianu charakterystycznego jednak okazało się że
Mizerski pokręcił coś z indeksami ale udało mi się to poprawić
Tr(A
m) = ∑
i=1nλ
im
zatem ślad potęgi macierzy daję nam sumę jednakowych potęg
a my potrzebujemy funkcji symetrycznych podstawowych bo to one występują we wzorach Vieta
Suma jednakowych potęg jest funkcją symetryczną więc możliwe jest wyrażenie jej za pomocą
funkcji symetrycznych podstawowych
Wzory Newtona−Girarda wiążą funkcje symetryczne podstawowe z sumą jednakowych potęg
Tutaj mamy jak je wyprowadzić
http://matwbn.icm.edu.pl/ksiazki/mon/mon11/mon1109.pdf
Wzory Newtona−Girarda dają nam taki wzór rekurencyjny
ke
k = ∑
i=1k(−1)
i−1e
k−ip
i
| 1 | |
ek = |
| (∑i=1k(−1)i−1ek−ipi) |
| k | |
| −1 | |
ek = |
| (∑i=1k(−1)iek−ipi) |
| k | |
| −1 | |
ek = |
| (∑i=1k(−1)i−k(−1)kek−ipi) |
| k | |
| −1 | |
(−1)kan−k = |
| (∑i=1k(−1)kan−(k−i)Tr(Ai)) |
| k | |
| 1 | |
an−k = − |
| (∑i=1k(−1)kan−k+iTr(Ai)) |
| k | |
Niech m=n−k
m=n−k
k=n−m
Mamy zatem
a
n = 1
| 1 | |
am = − |
| (∑j=1n−maj+mTr(Aj)) 0 ≤ m < n |
| n−m | |
I teraz trzeba by policzyć pierwiastki wielomianu o wyżej podanych współczynnikach
Samo obliczenie współczynników wielomianu charakterystycznego
w ten sposób wymaga O(n
4) czasu i O(n
2) pamięci
Dodatkowo potęgowanie macierzy może zwiększyć błędy numeryczne
a zadanie poszukiwania zer wielomianu charakterystycznego może być źle uwarunkowane
Napisałem to w C# ze zgodnością z C# 5
bo każdy użytkownik Windowsa ma kompilator C#
i maszynę wirtualną do interpretowania kodu bajtowego
Pod tym względem C# jest dość podobny do Javy która była kiedyś w Linuksach