QR Algorithm for the Computation of the Eigenvalues

advertisement
QR Algorithm for the Computation of the
Eigenvalues
Maciej Kluczny
Mateusz Kramarczyk
AGH University of Science and Technology
26 marca 2006
Streszczenie
W niniejszym dokumencie postaraliśmy się przedstawić opis iteracyjnej metody QR wyznaczania wartości własnych dużych macierzy kwadratowych. Przedstawiony został również cały aparat matematyczny (głównie
algebraiczny) potrzebny do zrozumienia niniejszego dokumentu poczynając na macierzach i definicji wartości własnych na opisie właściwego algorytmu QR kończąc. W końcu przedstawiony też został prosty przykład
praktycznego wykorzystania zdobytej po przeczytaniu tego dokumentu
wiedzy oraz różne sposoby prowadzące do ulepszenia właściwej metody
QR.
Tekst dostępny również na stronie:
http://www.nic-nac-project.de/~leoha/qralgorithm/
1
Spis treści
1 Wstęp teoretyczny
1.1 Podstawy algebraiczne . . . . . . . . . . . .
1.1.1 Macierz symetryczna . . . . . . . . .
1.1.2 Macierz transponowana . . . . . . .
1.1.3 Macierz ortogonalna . . . . . . . . .
1.1.4 Macierz Hermite’a . . . . . . . . . .
1.1.5 Macierz unitarna . . . . . . . . . . .
1.1.6 Macierz normalna . . . . . . . . . .
1.1.7 Macierz Hessenberga . . . . . . . . .
1.1.8 Wartości i wektory własne macierzy
1.2 Dekompozycja QR (QR factorization) . . .
1.2.1 Refleksja Householdera . . . . . . .
1.2.2 Ortogonalizacja Gram-Schmidt’a . .
1.2.3 Rotacja Givensa . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3
3
3
3
3
3
4
4
4
4
5
5
7
7
2 Algorytm właściwy
2.1 Algorytm podstawowy . . . . . . . . . . . . . . . . . . . .
2.2 Algortym z wykorzystaniem macierzy Hessenberga . . . .
2.3 Algorytm z wykorzystaniem przesunięć wartości własnych
2.4 Porównanie różnych wariantów algorytmu QR . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
8
8
10
11
12
2
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1.1
Wstęp teoretyczny
Podstawy algebraiczne
W tym rozdziale umieścilismy niezbędne definicje twierdzenia etc. potrzebne do
zrumienia poniższego tekstu. Podrozdział ten należy traktować jako pewnego
rodzaju swoiste kompendium wiedzy, szczególnie dla tych, którzy z tą tematyką
nie mieli wcześniej do czynienia.
Oto ważniejsze definicje, określenia, które mogą być przydatne:
1.1.1
Macierz symetryczna
Macierz A nazywamy macierzą symetryczną jeżeli spełnia ona następujący warunek:
∀i,j (aij = aji ) ⇔ AT = A
1.1.2
Macierz transponowana
Macierz transponowana macierzy A = [aij ]n,m to macierz powstała w wyniku
zamiany odpowiednich wierszy i kolumn: AT = [aij ]m,n
1.1.3
Macierz ortogonalna
Macierz A jest macierzą ortogonalną jeżeli spełnia zależność:
AAT = I
gdzie I jest macierzą jednostkową. Innymi słowy iloczyn skalarny dowolnych
dwóch wierszy (kolumn) jest równy zero, natomiast iloczyn skalarny dowolnego
wiersza (kolumny) jest równy jeden.
1.1.4
Macierz Hermite’a
Mówimy, że macierz A jest macierzą Hermite’a (hermitianem), jeżeli jest ona
macierzą kwadratową, symetryczną oraz określoną na zbiorze liczb zespolonych,
dla której:
∀i,j (aij = aji )
gdzie aji jest liczbą sprzężoną do liczby aji .
Macierz Hermite’a oznaczamy zazwyczaj symbolami : A∗ , AT , A† , oraz AH
Jeżeli elementy macierzy A należą do zbioru liczb rzeczywistych to macierz
Hermite’a odpowiada macierzy symetrycznej. Bardzo ważną własnością macierzy Hermite’a jest to, że jej wartości własne sa zawsze liczbami rzeczywistymi
oraz fakt, że wektory główne są ortogonalne. Jednakże ostatnia własność jest
spełniona jedynie w przypadku gdy macierz jest macierzą diagonalizowalną.
3
1.1.5
Macierz unitarna
Jest to macierz będąca macierzą kwadratową, określona na zbiorze liczb zespolonych oraz mająca własność:
AAH = I
W przypadku liczb rzeczywistych macierz unitarna sprowadza się do macierzy
ortogonalnej.
1.1.6
Macierz normalna
Macierz A jest macierzą normalną jeśli jest spełniona następująca zależność:
AAH = AH A
1.1.7
Macierz Hessenberga
Jest to macierz trójkątna górna (dolna), która bezpośrednio pod(nad) diagonalą
posiada dodatkową przekątkną.


X X X X X
 X X X X X 


 0 X X X X 


 0 0 X X X 
0 0 0 X X
1.1.8
Wartości i wektory własne macierzy
Mówimy, że dana macierz A n × n ma wektor własny v i odpowiadającą mu
wartość własną λ, jeżeli
Av = λv
aby obliczyć wartości własne macierzy A należy rozwiązać równanie
det(A − λI) = 0
Wartości własne są niezmiennikiem danej macierzy, dla każdej macierzy Q podobnej do macierzy A wartości własny tych macierzy bedą takie same. Jeżeli
pomnożymy macierz A przez dowolną liczbę ϑ to wartości własne macierzy ϑA
bedą równe wartością własnym macierzy A pomnożonymi przez liczbę ϑ:
(1)
(2)
(n)
λϑA = [λϑA , λϑA , . . . , λϑA ] = ϑλA
natomiast wektory własne obu macierzy nie zmieniają się, operacja ta nazywa
sie przesuwaniem wartości własnych macierzy Reasumując, jeśli odejmniemy od
macierzy A macierz A − ϑI, to i-ta wartość własna λ macierzy A bedzie równa
λi − ϑ.
4
1.2
Dekompozycja QR (QR factorization)
Dekompozycja macierzy polega na przedstawieniu jej w postaci iloczynu dwóch
innych specyficznych macierzy. Istnieje kilka takich dekompozycji, które znalazły szczególne zastosowania. Jedną z takich dekompozycji jest na przykład
faktoryzacja LU:
A = L · U.
Macierz A jest przedstawiona tutaj jako iloczyn dolnej macierzy trójkątnej L
oraz górnej macierzy trójkątnej R. Dodatkowo jeśli macierz L ma na przekątnej
tylko jedynki faktoryzacja ta zwana jest dekompozycją Doolittle’a. Dodatkowo jeśli również macierz R ma na diagonali same jedynki jest to faktoryzacja
Crout’a. Ponadto jeśli L = U T jest to dekompozycja Cholesky’iego. Jak łatwo
zauważyć dekompozycji może być nieskończenie wiele jednak, mało które są
do czegokolwiek przydatne, dlatego nawet drobne, subtelne różnice jak w tym
przykladzie dekompozycji LU maja swoje zastosowania stąd też mają one nawet
inne nazwy choć w rzeczywistości są prawie identyczne (implementacja zaś z koleji jest całkiem różna). Na przykład dekompozycja PA jest niczym innym jak
dekompozycją LU jednakże z zastosowaniem pivotingu. Zainteresowanych bliżej
zagadnieniami dekompozycji odsyłamy do odpowiedniej literatury. Istnieje inna
bardzo przydatna dekompozycja, tak zwana faktoryzacja QR.
Dekompozycja QR macierzy rzeczywistej A jest dekompozycją na dwie inne
macierze oznaczone odpowiednio Q oraz R, gdzie macierz Q jest ortogonalna,
natomiast R jest górną macierzą trójkątną, co można zapisać:
A = Q · R.
Przy dodatkowym zalożeniu, że elementy na diagonali macierzy R powinny być
dodatnie faktoryzacja QR jest jednoznaczna. Dekompozycja QR jest często używana do rozwiązywania liniowego problemu najmniejszych kwadratów, jest również podstawą do iteracyjnego liczenia wartości własnych macierzy.
Istnieje kilka metod w jaki można rozłożyć macierz na odpowiednie macierze Q
oraz R. Kolejno zostaną przedstawione najbardziej użyteczne.
1.2.1
Refleksja Householdera
Metoda Householdera zwana również transformacją Householdera lub refleksją (odbiciem) Housoldera jest najczęściej używaną metodą dekompozycji QR.
Kluczowym obiektem jest tutaj macierz oznaczona symbolicznie H - symetryczna i ortogonalna zwana macierzą Householdera. Jest to macierz przekształcenia
wektora, które odbija go względem pewnej płaszczyzny. Macierz ma następującą
postać:
H = I − 2xxT
gdzie I jest macierzą jednostkową oraz x jest znormalizowanym wektorem spełniającym równanie:
kxk2 = xT x = 1.
5
Użyta tutaj norma jest normą euklidesową czyli po prostu długościa wektora
(jeśli jego współrzędne są rzeczywiste). Transformacja Householdera zeruje m−1
ostatnich elementów w wektorze (kolumnie) poniżej pierwszego elementu:
 
 
v1
c
 v2 
0
 
 
 ..  →  .. 
 . 
.
0
vm
gdzie:
v
um
uX
v2 .
c = ±|v| = ±t
i
i=1
Łatwo sprawdzić, że:

v1 − c
 v2 


x=f . 
 .. 

vm
gdzie:
f=p
1
.
2c(c − v1 )
Aby zastosować dekompozycję dla macierzy A = QR o wymiarach m × n
(m ­ n) kontruujemy macierz H (1) o wymiarach m × m by zamienić m − 1
ostatnich elementów pierwszej kolumny na zera. Podobnie skontruowana macierz G(2) o wymiarach (m − 1) × (m − 1) zamieni m − 2 elementów drugiej
kolumny na zera. Za pomocą macierzy G(2) tworzymy macierz m × m:


1 0 ... 0

0


H (2) =  .
.
(2)

 ..
G
0
Po n takich ortogonalnych przekształceniach (n − 1 w przypadku, gdy m = n)
otrzymamy:
R = H (n) . . . H (2) H (1) A.
R jest górną macierzą trójkątną; ortogonalną macierz Q otrzymamy z iloczynu:
Q = H (1) H (2) . . . H (n) .
Z równości:
A = QR = H (1) H (2) . . . H (n) H (n) . . . H (2) H (1)
wyraźnie widać dlaczego metoda zwana jest też refleksją. W praktyce macierze
H (i) nigdy nie są jawnie liczone.
6
1.2.2
Ortogonalizacja Gram-Schmidt’a
Każdy zbiór liniowo niezależnych wektorów v1 , . . . , vn może zostać „skonwertowany” do zbioru ortogonalnych wektorów q1 , . . . , qn poprzez proces GramSchmidt’a. Rozpatrzmy sytuacje dla trzech wymiarów; wektor v1 wyznacza prostą; wektory v1 i v2 wyznaczają płaszczyznę. Wektor q1 jest wektorem jednostkowym równoległym do wektora v1 . Wektor (jednostkowy) q2 leży na płaszczyźnie
wektorów v1 ,v2 i jest normalny do wektora v1 . Wektor (jednostkowy) q3 jest
normalny do płaszczyzny wektorów v1 , v2 etc.
W ogólnosci przyjmujemy, że u1 = v1 , a każdy kolejny wektor ui jest ortogonalny
do pozostałych u1 , . . . , ui−1 :
ui = v i −
i=1
X
j=1
uj
uTj vi
.
uTj uj
Baza i wektorów ui generuje tą sama podprzestrzeń co baza wektorów vi . Wektory qi = kuuii k sa ortonormalne. To prowadzi do następującego twierdzenia:
Każda macierz A o wymiarach m × n z liniowo niezależnymi kolumnami (wektorami) może być zdekomponowana w iloczyn A = QR, gdzie kolumny macierzy
Q są ortonormalne, a macierz R jest górna trójkątna i odwracalna.
1.2.3
Rotacja Givensa
Niech dana będzie macierz A o wymiarach m × n (m ­ n). Dekompozycja QR
wymaga wyznaczenia ortogonalnej macierzy Q takiej, że:
R
T
Q A=
0
a R jest górną macierzą trójkątną n × n. A następnie rozwiązania układu
Rx = P y, gdzie P jest macierzą n pierwszych wierszy Q.
Transformacja Householdera „czyści” całe kolumny z wyjątkiem pierwszego elementu wektora. Jeśli chcemy „wyczyścić” część macierzy zerując naraz tylko
jeden element kolumny możemy użyć rotacji Givensa, która jest szczególnie
wdzięczna do równoległej implementacji.
Macierz:


1 ...
0 ... 0 ... 0
 .. . .
..
..
.. 
.
.
.
.
.


0 . . .
c . . . s . . . 0



..
..
.. 
..
G =  ...
. .
.
.


0 . . . −s . . . c . . . 0


.
.. 
.. . .
..
 ..
. .
.
.
0 ...
0 ... 0 ... 1
z odpowiednio dobranym c = cos(ϕ) oraz s = sin(ϕ) dla pewnych kątów ϕ
może zostać użyta do wyzerowania elementu aki .
7
Elementy moga być zerowane kolumna po kolumnie od dołu w następującej
kolejności:
(m, 1), (m − 1, 1), . . . , (2, 1), (m, 2), . . . , (3, 2), . . . , (m, n), . . . , (n + 1, n).
Wtedy Q jest iloczynem g = (2m + n + 1)/2 macierzy Givensa Q = G1 G2 . . . Gg
Na przykład do anihilacji dolnego elementu wektora 2 × 1:
c
−s
s
c
T a
r
=
b
0
z warunków sa + cb = 0 oraz c2 + s2 = 1 dostajemy:
c= √
2
2.1
a
b
.
,s = √
a2 + b a
a2 + b 2
Algorytm właściwy
Algorytm podstawowy
Algorytm znajdowania wartości własnych QR wymaga aby dana macierz A,
była macierzą kwadratową n × n określoną na liczbach rzeczywistych. Algorytm
polega na iteracyjnym wykonywaniu określonych czynnosci aż do otrzymania
macierzy trojkątniej górnej podobnej do macierzyA która na diagonali zawiera
wartości własne.
c0 równą macierzy jednostkowej
W pierwszym kroku definiujemy macierz Q
oraz macierz D1 równą macierzy A
c0 = I
Q
D1 = A
następnie wykonujemy dekompozycję macierzy A za pomocą algorytmu dekompozycji QR, otrzymujemy
c1 R1
A=Q
(1)
c1 jest macierzą ortogonalną, natomiast R1 jest macierzą trójgdzie macierz Q
c1 oraz traktując ją jako macierz przejścia
kątną górną. Mając daną macierz Q
znajdujemy za pomocą transformacji macierzy podobnej macierz A1 podobną
do macierzy A.
A1 = Q1 −1 AQ1
(2)
mnożąc obustronnie (1) przez Q1 −1 otrzymujemy:
Q1 −1 A = R1
łącząc (2) z (3) otrzymujemy
A1 = R 1 Q1
8
(3)
Jeżeli otrzymana macierz A1 nie jest macierzą trójkątną górną (z zadanym przybliżeniem) to musimy przejść do kolejnego kroku iteracyjnego, w którym przyjmujemy, że
D2 = AQ1
Ponieważ macierz D2 oraz A1 są macierzami tego samego odwzorowana, różnią
się jedynie bazami. w następnym kroku dokonujemy dekompozycji QR obu tych
macierzy, w wyniku której otrzymujemy rownania
c2 R2
D2 = Q
A1 = Q 2 R2
gdzie macierz R2 w obu przypadkach jest taka sama. Wykonując proste obliczenia otrzymujemy macierz A2
Q2 −1 A1 = R2
A2 = Q2 −1 A1 Q2 = R2 Q2
Jeżeli otrzymana macierz A2 nie jest macierzą trójkątną górną kontynuujemy
interacje. Przechodząc do m-tego kroku mamy daną macierz Am−1 , a następnie
wykonując te same operacje otrzymujemy równania
Am−1 = Qm Rm
Am = R m Qm
gdzie
b m = Q 1 Q2 Q3 . . . Qm
Q
natomiast Qi reprezentuje zmianę współrzędnych w i-tym kroku.
Cały algorytm można zapisać w postaci uproszczonej. Przyjmujemy sobie w
kroku zerowym, macierz A0 równą macierzy A, następnie otrzymujemy
c1 R1
A1 = Q 1 R1 = Q
c2 R2
A2 = Q 1 R1 Q1 R1 = Q 1 Q2 R2 R1 = Q
...
Am = (
m
Y
i=1
Qi )(
1
Y
k=m
d
Rk ) = Q
m Rm
Przedstawiony powyżej algorytm ma jedną poważną wadę - jest mało wydajny, algorytm ten wymaga O(n3 ) operacji mnożenia, istnieje jednak kilka
ulepszeń, które znacznie poprawiaja jego szybkość. Metody usprawniające działanie tego algorytmu są wyjaśnione w dalszej części pracy.
9
przykład:
Mając dana macierz P wykonujemy kolejne kroki w algorytmie.


1 2 5
 5 8 6 ,
8 6 7
dokonujemy dekompozycji QR macierzy A



−0.1054 −0.2673 −0.9578
−9, 4868 −9, 4868 −9, 5922
A = Q1 R1 =  −0, 5270 −0, 8018 0, 2817  
0
−3, 7417 −2, 4054 
−0.8433
0.5345
0.0563
0
0
−3, 4933
Następnie znajdujemy macierz A1 podobną do macierzy A względem macierzy
przejścia Q1 , powinna być ona równa macierzy otrzymanej z R1 A1 .


14.0889 5.0146
6.9547
 4.0004
1.7143 −0.9186  ≡ R1 Q1
A1 = Q−1
1 AQ1 =
2.9458 −1.8672 0.1968
Ponieważ macierz A1 nie jest macierzą trójkątną górną przechodzimy do następnej iteracji. Rozdzielamy używając dekompozycji QR macierz A1 na macierz
unitarną Q2 oraz macierz trójkątkną górną R2



−0.9431 −0.1624 −0.2902
−14.9391 −4.8200 −6.3517
A1 = Q2 R2 =  −0.2678 −0.1467 0.9522  
0
−2.8877 −0.8025 
−0.1972 0.9758
0.0949
0
0
−2.8744
następnie obliczamy macierz A2

16.6321 −3.0651 −0.8568
 0.9315 −0.3594 −2.8259 
A2 = Q−1
2 A1 Q2 = R 2 Q2 =
0.5668 −2.8047 −0.2727

Wykonując te same obliczenia za każdym krokiem iteracyjnym macierz A n dązy
do macierzy trójkątnej górnej, która na diagonali posiada wartości własne. W
powyższym przypadku wykonując 68 iteracji otrzmymamy wartości własne z
dokladnością do 4 cyfry po przecinku.
λ = [16.4536, −2.9814, 2.5278]
2.2
Algortym z wykorzystaniem macierzy Hessenberga
Bardzo prostym ulepszeniem algorytmu podstawowego QR jest użycie w nim
macierzy Hessenberg’a. Ogromną zaletą macierzy Hessenberga jest fakt, iż ilość
operacji mnożenia w pojedyńczej iteracji w algorytmie QR wynosi O(n2 ) zamiast O(n3 ), oraz to, że macierz Hessenberga zachowuje swoją postać podczas
kolejnych iteracji QR.
10
Twierdzenie 1. Dla dowolnej macierzy A n × n istnieje podobna unitarnie
do niej macierz Hessenberga, która może być skonstruowana kosztem 5n 3 /3
operacji mnożenia. Jeżeli dodatkowo macierz A jest macierzą Hermite’a to kosz
maleje do poziomu 2n3 /3 oraz ilość operacji mnożenia w jednej iteracji w algorytmie QR maleje o jeden rząd, czyli wynosi O(n).
2.3
Algorytm z wykorzystaniem przesunięć wartości własnych
Chociaż algorytm bazujący na macierzach Hessenberga działa znacznie szybciej od algorytmu QR w formie podstawowej to mimo wszystko w niektórych
przypadkach współczynnik zbiegania się elementów znajdujących się na pod(k)
diagonali jest zbyt wolne. Dla elementu ai,i+1 w k-tym kroku ów współczynnik
λi k
wynosi ( λi−1 ) , co w przypadku gdy wartości własne λi oraz λi−1 mają zbliżone wartości jest przyczyną powolnego zbiegania się algorytmu QR do szukanych
wartości. Aby uniknąć powyższej sytuacji stosuje się w każdym kroku iteracyjnym przesunięcia wektorów własnych
Ak − ϑ k I = Q k Rk
Ak+1 = Rk Qk + ϑk I
dzięki czemu współczynnik ψ
równy
(k)
(k)
zbiegania się elementu ai,i+1 pod diagonalą jest
ψ (k) =
λi+1 − ϑk
λi − ϑ k
Łatwo można zauważyć, że jeżeli wartość współczynnika zbieżności ψ (k) dąży
do 0 to ϑk dąży do λi .
lim ψ (k) = 0 ⇒ lim ϑk = λi
n→∞
n→∞
Oczywistym wnioskiem, który można wyciągnąć z powyższej zależności jest
możliwość osiągnięcia zbieżności liniowej, a nawet kwadratowej. Algorytm polega na tym, że najpierw skupiamy się na wartości własnej λn i na jego podstawie
obliczamy współczynnik ψ (k) . Jeżeli λn zostanie obliczona z zadowalającą nas
precyzją to przechodzimy do obliczania wartości λn−1 , operacje powtarzamy aż
do uzyskania wszystkich wartości własnych. Początkowo za element ψ (k) wy(k)
bierano element ann macierzy, jednakże Wilkinson w 1965 roku zauważył, żę
lepszym rozwiązaniem będzie wybranie wartości własnej z minora o wymiarach
(k)
(k)
2 × 2 zawierającego na diagonali wartości an−1,n−1 oraz an,n . Konsekwencją
wyboru algorytmu z przesunięciami wartości własnych jest brak uporządkowania wartości własnych na diagonali, zazwyczaj największe wartości własne są na
początku.
#
"
(k)
(k)
an−1,n−1 an−1,n
(k)
(k)
an,n−1
an,n
11
Algorytm QR z przesunięciami dla wcześniej zaprezentowanego przykładu oblicza wartości własne z precyzją do 4 miejsc po przecinku w 6 iteracjach co jest
ponad 10 krotnym przyspieszeniem i to jedynie dla macierzy 4 wymiarowej.
2.4
Porównanie różnych wariantów algorytmu QR
Aby zobrazować działanie przedstawionych algorytmów znajdowania wartości
własnych opartych na algorytmie QR przeprowadziliśmy testy, w których obliczaliśmy wartości własne macierzy CAN 61 1 , która jest macierzą o wymiarach
61 × 61. Miarą zbieżności algorytmu jest współczynnik zbieżności ψ równy:
ψ=
(m)
max ν
k∈1,...,n−1 k
(m)
gdzie νk jest k-tym elementem na poddiagonali, w m-tym kroku iteracyjnym.
Widać gołym okiem, iż najstabilniej zachowującym się algorytmem jest algorytm QR z przesunięciami, również najszybciej, w sensie ilości iteracji, osiąga
on określoną dokładność. Najmniej stabilnie zachowuje się algorytm z wykorzystaniem macierzy Hessenberga, jednak mimo tego, że wymaga on większej ilośći
iteracji to i tak sam algorytm działa znacznie szybciej, co wynika z szybszego
działania algorytmu dekompozycji dla macierzy Hessenberga.
4.5
Algorytm podstawowy
Algorytm z macierzami Hessenberga
Algorytm z przesunieciami
4
3.5
Zbieznosc
3
2.5
2
1.5
1
0.5
0
0
100
200
300
400
Kolejne iteracje algorytmu
500
1 http://math.nist.gov/MatrixMarket/data/Harwell-Boeing/cannes/
12
600
700
800
Literatura
[1] William H. Press, Saul A. Teukolsky, William T. Vetterling, Brian P. Flannery, Numerical Recipies in C
[2] J. Stoer, R. Bulirsch, Introduction to numerical analysis
[3] David S. Watkins, Understanding the QR Algorithm, Society for Industrial
and Applied Mathematics Review, Vol. 24, No. 4. (Oct., 1982), pp. 427-440.
[4] Nicholas J. Higham, Accuracy and Stability of Numerical Algorithms
[A] PlanetMath.org
[B] Wikipedia.org
13
Download