Algoritmus vlastní hodnoty Jacobiho - Jacobi eigenvalue algorithm
v numerická lineární algebra, Algoritmus vlastní hodnoty Jacobiho je iterační metoda pro výpočet vlastní čísla a vlastní vektory a nemovitý symetrická matice (proces známý jako diagonalizace ). Je pojmenován po Carl Gustav Jacob Jacobi, který tuto metodu poprvé navrhl v roce 1846,[1] ale široce se začal používat až v padesátých letech s příchodem počítačů.[2]
Popis
Nechat být symetrická matice a být Dává rotační matici. Pak:
je symetrický a podobný na .
Dále má záznamy:
kde a .
Od té doby je kolmý, a mít stejné Frobeniova norma (druhá odmocnina součet druhých mocnin všech složek), ale můžeme si vybrat takhle , v jakém případě má větší součet čtverců na úhlopříčce:
Nastavte tuto hodnotu na 0 a přeskupte:
-li
Za účelem optimalizace tohoto efektu Sij by měl být mimo diagonální prvek s největší absolutní hodnotou, která se nazývá pivot.
Metoda vlastní hodnoty Jacobi opakovaně provádí rotace dokud se matice nestane téměř diagonální. Pak jsou prvky v úhlopříčce aproximacemi (skutečných) vlastních čísel S.
Konvergence
Li je otočným prvkem, tedy podle definice pro . Nechat označte součet čtverců všech off-diagonálních záznamů z . Od té doby má přesně mimo diagonální prvky, máme nebo . Nyní . Z toho vyplývá nebo ,tj. sled Jacobiho rotací konverguje alespoň lineárně o faktor na diagonální matici.
Počet Jacobiho rotace se nazývá zametání; nechat označit výsledek. Předchozí odhad přináší výnosy
- ,
tj. posloupnost rozmítání konverguje alespoň lineárně s faktorem ≈ .
Následující výsledek však Schönhage[3] poskytuje lokálně kvadratickou konvergenci. Za tímto účelem S mít m odlišné vlastní hodnoty s multiplicitami a nechte d > 0 je nejmenší vzdálenost dvou různých vlastních čísel. Zavoláme na číslo
Jacobi otáčí Schönhage. Li pak označuje výsledek
- .
Konvergence se tak stane kvadratickou, jakmile
Náklady
Každou Jacobiho rotaci lze provést v O (n) kroky, když je otočný prvek str je známo. Nicméně hledání str vyžaduje kontrolu všech N ≈ ½ n2 mimo diagonální prvky. Můžeme to snížit na O (n) složitost, pokud zavedeme další pole indexů s majetkem, který je index největšího prvku v řádku i, (i = 1, …, n - 1) proudu S. Pak indexy pivot (k, l) musí být jedním z dvojic . Aktualizaci indexového pole lze provést také v O (n) průměrná složitost: Nejprve maximální položka v aktualizovaných řádcích k a l lze najít v O (n) kroky. V ostatních řádcích i, pouze položky ve sloupcích k a l změna. Smyčka přes tyto řádky, pokud není ani jedno k ani l, stačí porovnat staré maximum v k novým položkám a aktualizaci Pokud je potřeba. Li by se měl rovnat k nebo l a odpovídající položka se během aktualizace snížila, maximum přes řádek i musí být nalezen od nuly v O (n) složitost. K tomu však dojde v průměru pouze jednou za rotaci. Každá rotace má tedy O (n) a jedno zametání O (n3) průměrná složitost, která odpovídá jednomu násobení matic. Navíc musí být inicializován před zahájením procesu, což lze provést v n2 kroky.
Jacobiho metoda obvykle konverguje v rámci numerické přesnosti po malém počtu tažení. Všimněte si, že několik vlastních čísel od té doby snižuje počet iterací .
Algoritmus
Následující algoritmus je popisem Jacobiho metody v matematické notaci. Vypočítá vektor E který obsahuje vlastní čísla a matici E který obsahuje odpovídající vlastní vektory, tj. je vlastní číslo a sloupec orthonormální vlastní vektor pro , i = 1, …, n.
postup jacobi (S ∈ Rn×n; ven E ∈ Rn; ven E ∈ Rn×n) var i, k, l, m, Stát ∈ N s, C, t, str, y, d, r ∈ R ind ∈ Nn změněno ∈ Ln funkce maxind (k ∈ N) ∈ N ! index největšího mimo diagonálního prvku v řádku k m := k+1 pro i := k+2 na n dělat -li │Ski│ > │Skm│ pak m := i endif konec vrátit se m endfunc postup Aktualizace(k ∈ N; t ∈ R) ! aktualizace ek a jeho stav y := Ek; Ek := y+t -li změněnok a (y=Ek) pak změněnok : = false; Stát := Stát−1 elsif (ne změněnok) a (y≠Ek) pak změněnok : = true; Stát := Stát+1 endif endproc postup točit se(k,l,i,j ∈ N) ! provést rotaci S.ij, S.kl ┌ ┐ ┌ ┐┌ ┐ │Skl│ │C −s││Skl│ │ │ := │ ││ │ │Sij│ │s C││Sij│ └ ┘ └ ┘└ ┘ endproc ! init e, E a pole ind se změnily E := Já; Stát := n pro k := 1 na n dělat indk : = maxind (k); Ek := Skk; změněnok : = pravda konec zatímco Stát≠0 dělat ! další rotace m := 1 ! najít index (k, l) kontingenčního p pro k := 2 na n−1 dělat -li │Sk indk│ > │Sm indm│ pak m := k endif konec k := m; l := indm; str := Skl ! vypočítat c = cos φ, s = sin φ y := (El−Ek)/2; d := │y│+√(str2+y2) r := √(str2+d2); C := d/r; s := str/r; t := str2/d -li y<0 pak s := −s; t := −t endif Skl : = 0,0; Aktualizace(k,−t); Aktualizace(l,t) ! otáčet řádky a sloupce k a l pro i := 1 na k−1 dělat točit se(i,k,i,l) konec pro i := k+1 na l−1 dělat točit se(k,i,i,l) konec pro i := l+1 na n dělat točit se(k,i,l,i) konec ! otáčet vlastní vektory pro i := 1 na n dělat ┌ ┐ ┌ ┐┌ ┐ │Eik│ │C −s││Eik│ │ │ := │ ││ │ │Eil│ │s C││Eil│ └ ┘ └ ┘└ ┘ konec ! řádky k, jsem změnil, aktualizovat řádky indk, indl indk : = maxind (k); indl : = maxind (l) smyčkaendproc
Poznámky
1. Logické pole změněno udržuje stav každého vlastního čísla. Pokud je číselná hodnota nebo změny během iterace, odpovídající složka změněno je nastaven na skutečný, jinak Nepravdivé. Celé číslo Stát počítá počet komponent změněno které mají hodnotu skutečný. Iterace se zastaví, jakmile Stát = 0. To znamená, že žádná z aproximací nedávno změnila svou hodnotu, a proto není příliš pravděpodobné, že k tomu dojde, pokud bude iterace pokračovat. Zde se předpokládá, že operace s plovoucí desetinnou čárkou jsou optimálně zaokrouhleny na nejbližší číslo s plovoucí desetinnou čárkou.
2. Horní trojúhelník matice S je zničen, zatímco spodní trojúhelník a úhlopříčka se nezmění. Je tedy možné obnovit S v případě potřeby podle
pro k := 1 na n−1 dělat ! obnovit matici S pro l := k+1 na n dělat Skl := Slk koneckonec
3. Vlastní čísla nejsou nutně v sestupném pořadí. Toho lze dosáhnout jednoduchým třídicím algoritmem.
pro k := 1 na n−1 dělat m := k pro l := k+1 na n dělat -li El > Em pak m := l endif konec -li k ≠ m pak vyměnit Em,Ek vyměnit Em,Ek endifkonec
4. Algoritmus se zapisuje pomocí maticového zápisu (1 pole namísto 0).
5. Při implementaci algoritmu musí být část zadaná pomocí maticového zápisu provedena současně.
6. Tato implementace správně nezohledňuje případ, kdy je jedna dimenze nezávislým podprostorem. Například pokud je dána úhlopříčná matice, výše uvedená implementace se nikdy nezastaví, protože se žádný z vlastních čísel nezmění. Proto v reálných implementacích musí být pro tento případ přidána další logika.
Příklad
Nechat
Pak jacobi po 3 taženích (19 iterací) vytvoří následující vlastní čísla a vlastní vektory: