„Jacobi-módszer” változatai közötti eltérés
[ellenőrzött változat] | [ellenőrzött változat] |
Tartalom törölve Tartalom hozzáadva
a összedolgozandó |
FoBe (vitalap | szerkesztései) a Articles with example pseudocode kategória eltávolítva (a HotCattel) |
||
1. sor:
{{összedolgoz|Jacobi-
A [[numerikus analízis]]ben, a '''Jacobi-féle módszer''' egy [[iteráció]]s módszer valamely valós szimmetrikus mátrix [[sajátvektor és sajátérték|sajátérték és sajátvektorának]] kiszámítására. (ez a folyamat mátrix diagonalizálás néven ismert). Nevét [[Carl Gustav Jacob Jacobi]], útán kapta aki a módszszert először 1846-ban publikálta,<ref>{{cite journal
|last=Jacobi |first=C.G.J. |authorlink=Carl Gustav Jacob Jacobi
|url=http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002144522
|title=Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen
|journal=[[Crelle's Journal]]
|volume=30 |year=1846 |pages=51–94
|language=German
}}</ref> de csak az 1950-es években vált elterjedtté a számítógépek fejlődése miatt.<ref>{{cite journal
|first=G.H. |last=Golub
|first2=H.A. |last2=van der Vorst
|title=Eigenvalue computation in the 20th century
|journal=Journal of Computational and Applied Mathematics
|volume=123 |issue=1-2 |year=2000 |pages=35–65
|doi=10.1016/S0377-0427(00)00413-1
}}</ref>
== Leírás ==
Az olyan transzformációt, ahol egy mátrixszal jobbról és az inverzével balról szorzunk
egy mátrixot, hasonlósági transzformációnak nevezzük. A karakterisztikus egyenletet felírva
belátható, hogy a hasonlósági transzformáció nem változtatja meg a sajátértékeket.
Valós és szimmetrikus mátrixok esetén <math>\mathbf{R^{-1} = R^T}</math>
, vagyis a hasonlósági transzformáció
ortogonális transzformáció is egyben.
Ezen az összefüggésen alapul a következőkben ismertetett módszer is. Vagyis a megfelelően
megválasztott transzformációval a mátrixot diagonalizáljuk.
Mivel a sajátvektorok maguk is valósak és ortogonálisak, az <math>\mathbf{A}</math> szimmetrikus mátrix
diagonalizálása megoldható az <math>\mathbf{R}</math> ortogonális hasonlósági transzformáció segítségével,
azaz
:<math>
\begin{align}
\mathbf{R^T\cdot A\cdot R = \Lambda}.
\end{align}
</math>
Vegyük példaként a <math>2\times 2</math> típusú mátrix esetét. Ekkor a transzformációhoz használjuk a
:<math>
\mathbf{R} =
\begin{pmatrix}
\cos\varphi & -\sin\varphi \\
\sin\varphi & \cos\varphi
\end{pmatrix}
</math>
síkforgatást leíró mátrixot, ahol <math>\varphi</math> a forgatás szöge. Ha felírjuk ezzel az <math>\mathbf{A' = R^T\cdot A\cdot R}</math>
szimmetria transzformációt, a transzformálás után az <math>\mathbf{A'}</math> mátrix elemei
:<math>
\begin{align}
a^'_{11} &= a_{11}\cos^2\varphi+2a_{21}\sin\varphi\cos\varphi+a_{22}\sin^2\varphi \\
a^'_{22} &= a_{11}\sin^2\varphi-2a_{21}\sin\varphi\cos\varphi+a_{22}\cos^2\varphi \\
a^'_{21} &= a_{21}(\cos^2\varphi-\sin^2\varphi)+(a_{22}-a_{11})\sin\varphi\cos\varphi = a^'_{12}
\end{align}
</math>
lesznek. Ha a nem átlós <math>a^'_{12}</math> és <math>a^'_{21}</math> elemeket 0-vá alakítjuk, az elforgatási szögre a következő egyenletet kapjuk:
:<math>
\begin{align}
\cot^2\varphi+\frac{a_{22}-a_{11}}{a_{21}}\cot\varphi-1 &= 0,
\end{align}
</math>
melynek alapján
:<math>
\begin{align}
\tan\varphi &= \Biggl[ \frac{a_{11}-a_{22}}{2a_{12}}\pm \sqrt{\Bigl(\frac{a_{11}-a_{22}}{2a_{12}}\Bigl)^2+1} \Biggl]^{-1}.
\end{align}
</math>
Innen megkaphatjuk a <math>
\cos\varphi=(1+\tan\varphi)^{-1/2}
</math>
és <math>\sin\varphi = \tan\varphi\cos\varphi</math> függvényeket, melyekkel
felépítjük a forgatásmátrixot.
Az így kapott <math>\mathbf{A'}</math> mátrix diagonális, tehát az átlóban található együtthatók a sajátértékek,
míg az <math>\mathbf{R}</math> forgatásmátrix két oszlopa a sajátértékeknek megfelelő két sajátvektor:
:<math>
\begin{align}
\lambda_1&=a^'_{11}, & \mathbf{x}^{(1)} &=
\begin{bmatrix}
\cos\varphi \\
\sin\varphi
\end{bmatrix}
; \\
\lambda_2 &= a^'_{22}, & \mathbf{x}^{(2)} &= \begin{bmatrix}
-\sin\varphi \\
\cos\varphi
\end{bmatrix}.
\end{align}
</math>
== Általános eset ==
A következőkben nézzük meg, hogy miként működik ez a módszer általános esetben
<math>n\times n</math> méretű mátrixok esetén. A sík-forgatás mátrixunk az egységmátrixtól csak az <math>r_{ii},
r_{ij} , r_{ji}, r_{jj}</math> elemekben tér el, vagyis
:<math>
\mathbf{R}_{ij} = \begin{pmatrix}
1 & \vdots & & \vdots & 0 \\
\cdots & \cos\varphi &\cdots & -\sin\varphi & \cdots \\
& \vdots & \ddots&\vdots& & \\
\cdots & \sin\varphi &\cdots & \cos\varphi & \cdots \\
0 & \vdots & & \vdots & 1
\end{pmatrix}
</math>
Ezt felhasználva az
:<math>
\mathbf{A'= R^T_{ij}\cdot A\cdot R_{ij}}
</math>
ortogonális hasonlósági transzformációval nullákat viszünk be az <math>a^'_{ij}</math>és <math>a^'_{ji}</math> elemek helyére.
A szorzás elvégzése után az
:<math>
\begin{align}
a^'_{ik} &= a^'_{ki}=a_{ik}\cos\varphi+a_{jk}\sin\varphi, k=\overline{1,n} \\
a^'_{jk} &= a^'_{kj}=a_{ik}\sin\varphi+a_{jk}\cos\varphi, k\neq i,j \\
a^'_{ii} &= a_{ii}\cos^2\varphi+2a_{ji}\sin\varphi\cos\varphi+a_{jj}\sin^2\varphi \\
a^'_{jj} &= a_{ii}\sin^2\varphi-2a_{ji}\sin\varphi\cos\varphi+a_{jj}\cos^2\varphi \\
a^'_{ji} &= a_{ji}(\cos^2\varphi-\sin^2\varphi)+(a_{jj}-a_{ii})\sin\varphi\cos\varphi=a^'_{ij}
\end{align}
</math>
mátrixelemeket kapjuk eredményül. Ezek közül megköveteljük, hogy az <math>a^'_{ij}</math> , illetve az <math>a^'_{ji}</math>
elemek 0-ák legyenek. Ekkor a
:<math>
\cot^2\varphi+\frac{a_{jj}-a_{ii}}{a_{ji}}\cot\varphi -1=0
</math>
egyenlethez jutunk, melyet megoldva a forgatás szöge
:<math>
\tan\varphi = \Bigg[\frac{a_{ii}-a_{jj}}{2a_{ij}}\pm\sqrt{\Big( \frac{a_{ii}-a_{jj}}{2a_{ji}}
\Big)^2+1} \Bigg]^{-1}
</math>
lesz.
Meg kell jegyeznünk, hogy amikor egy másik elemet nullázunk ki a következő lépésben, akkor az előzőekben kinullázott elem elromlik. Viszont belátható, hogy bizonyos
feltételek mellett az átlón kívüli elemek négyzetösszege egy lépésben <math>2\mid a_{ij}\mid^2</math>-tel csökken,
vagyis monoton módon tart 0-hoz.
<math>A_l</math>-lel jelölve az <math>l</math>. transzformáció utáni mátrixot, a transzformáció-sorozatot a következőképpen írhatjuk:
:<math>
\mathbf{A_0=A, A_1=R^T_1\cdot A_0\cdot R_1, A_2=R^T_2\cdot A_1\cdot R_2,\dots ,A_l=R^T_l\cdot A_{l-1}\cdot R_l,\dots,}
</math>
ahol <math>\mathbf{R_l}</math>-el valamely nem-átlós elemre alkalmazott transzformációt jelöltük. Képezzük a
transzformációs mátrixok
:<math>
\begin{align}
\mathbf{X_l=R_0\cdot R_1\cdots R_l},& & l=0,1,2,\dots,
\end{align}
</math>
szorzatát. Ha végtelen sok transzformációt végzünk, akkor
:<math>
\begin{align}
\lim_{l\to\infty}\mathbf{A_l = \Lambda}, && \lim_{l\to\infty}\mathbf{X_l = X}
\end{align}
</math>
lesz. Ez azt jelenti, hogy ha ezeket a transzformációkat egymás után alkalmazzuk, akkor
a mátrix diagonalizálódik, és az átlóban a sajátértékeket kapjuk. A sajátvektorok pedig
a transzformációk szorzatmátrixának oszlopaiban lesznek.
Beszéljünk még egy keveset a módszer konvergenciájáról, melyet a <math>\tan\varphi\leq 1</math> feltétel
tiszteletbentartása biztosít, ami egy <math>\varphi\leq\pi/4</math> forgatásnak felel meg. Ezt úgy tudjuk
biztosítani, hogy a két gyök közül a "+" előjelest válasszuk, amennyiben <math>(a_{ii}-a_{jj})/a_{ji}>0</math>
és a "−" előjelest az ellenkező esetben. Ezt úgy tudjuk legkönnyebben megvalósítani, hogy
a szöget a következőképpen számoljuk:
:<math>
\tan\varphi = sign \Big( \frac{a_{ii}-a_{jj}}{2a_{ji}} \Big) \Bigg[ \left | \frac{a_{ii}-a_{jj}}{2a_{ji}} \right | +\sqrt{\Big( \frac{a_{ii}-a_{jj}}{2a_{ji}} \Big)^2+1} \Bigg]^{-1}.
</math>
== Algoritmus ==
A leírt módszer a következő algoritmus segítségével alkalmazható számítógépre:
<source lang=python>
from __future__ import division
import math
dim=4
def Jacobi(a,imax,epsilon,x,l):
for i in range(dim):
for j in range(dim):
x[i][j]=0
x[i][i]=1
l[i]=a[i][i]
for it in range (imax):
amax=0
for j in range(1,dim,1):
for i in range (j):
a[i][i]=l[i]
a[j][j]=l[j]
a[j][i]=math.fabs(a[j][i])
if amax<a[j][i]:
amax=a[j][i]
if a[j][i]>epsilon:
tmp=(a[i][i]-a[j][j])/(2*a[j][i])
t=1/(math.fabs(tmp)+math.sqrt(1+tmp*tmp))
if tmp<0:
t=-t
c=1.0/(math.sqrt(1+t*t))
s=c*t
for k in range(i):
temp=a[i][k]*c+a[j][k]*s
a[j][k]=a[j][k]*c-a[i][k]*s
a[i][k]=temp
for k in range(i+1,j,1):
temp=a[k][i]*c+a[j][k]*s
a[j][k]=a[j][k]*c-a[k][i]*s
a[k][i]=temp
for k in range(j+1,dim,1):
temp=a[k][i]*c+a[k][j]*s
a[k][j]=a[k][j]*c-a[k][i]*s
a[k][i]=temp
for k in range (dim):
temp=x[k][i]*c+x[k][j]*s
x[k][j]=x[k][j]*c-x[k][i]*s
x[k][i]=temp
tmp=2*s*c*a[j][i]
l[i]=a[i][i]*c*c+a[j][j]*s*s+tmp
l[j]=a[i][i]*s*s+a[j][j]*c*c-tmp
a[j][i]=0
if amax<=epsilon:
return 0
return 666
a=[
[3,0,2,1],
[0,1,3,4],
[2,3,2,1],
[1,4,1,5]
]
x=[
[0,0,0,0],
[0,0,0,0],
[0,0,0,0],
[0,0,0,0]
]
l=[0,0,0,0]
epsilon=1e-16
imax=1e6
print a
b=Jacobi(a,imax,epsilon,x,l)
print b
print x
print l
</source>
=== Példa ===
Legyen
<math>
A = \begin{pmatrix} 3 & 0 & 2 & 1 \\ 0 & 1 & 3 & 4 \\ 2 & 3 & 2 & 1 \\ 1 & 4 & 1 & 5 \end{pmatrix}
</math>
A ''jacobi'' a következő sajátértékeket és sajátvektorokat adja:
<math>
\lambda_1 = 3.8614176875601696
</math>
<math>
\eta^{(1)} = \begin{bmatrix}0.20847934594025172\\ -0.9248091113211869\\ -0.30940655891140356\\ 0.07437776036050801\end{bmatrix}
</math>
<math>
\lambda_2 = 1.0818507981865024
</math>
<math>
\eta^{(2)} = \begin{bmatrix}0.04702320745376396\\ 0.334174641833777\\ -0.9043336166358197\\ 0.2613366345126636\end{bmatrix}
</math>
<math>
\lambda_3 = -2.741255286528889
</math>
<math>
\eta^{(3)} = \begin{bmatrix}0.5641570498877014\\ 0.09332500337954595\\ 0.2860200054465712\\ 0.7689016993677129\end{bmatrix}
</math>
<math>
\lambda_4 = 8.797986800782214
</math>
<math>
\eta^{(4)} = \begin{bmatrix}-0.7975286849631742\\ -0.156031599737972\\ 0.06812376684627766\\ 0.5787584029064224\end{bmatrix}
</math>
== Referenciák ==
* {{cite book | last1=Zsolt | first1=Lázár| last2=József | first2=Lázár | last3=Ferenc | first3=Járai-Szabó |year=2008 | title=Numerikus módszerek | edition=1st | publisher=[[Kolozsvári Egyetemi Kiadó]]}}
{{reflist}}
== További olvasnivaló ==
{{refbegin}}
*{{Citation | last1=Press | first1=WH | last2=Teukolsky | first2=SA | last3=Vetterling | first3=WT | last4=Flannery | first4=BP | year=2007 | title=Numerical Recipes: The Art of Scientific Computing | edition=3rd | publisher=Cambridge University Press | publication-place=New York | isbn=978-0-521-88068-8 | chapter=Section 11.1. Jacobi Transformations of a Symmetric Matrix | chapter-url=http://apps.nrbook.com/empanel/index.html#pg=570}}
* {{cite journal
|last=Rutishauser |first=H.
|title=Handbook Series Linear Algebra: The Jacobi method for real symmetric matrices.
|journal=Numerische Mathematik
|volume=9 |issue=1 |year=1966 |pages=1–10
|doi=10.1007/BF02165223 |mr=1553948
}}
* {{cite journal
|last=Sameh |first=A.H.
|title=On Jacobi and Jacobi-like algorithms for a parallel computer
|journal=[[Mathematics of Computation]]
|volume=25 |issue=115 |year=1971 |pages=579–590
|mr=297131 | jstor = 2005221 | doi = 10.1090/s0025-5718-1971-0297131-6
}}
* {{cite journal
|last=Shroff |first=Gautam M.
|title=A parallel algorithm for the eigenvalues and eigenvectors of a general complex matrix
|journal=Numerische Mathematik
|volume=58 |issue=1 |year=1991 |pages=779–805
|doi=10.1007/BF01385654 |mr=1098865
}}
* {{cite journal
|last=Veselić |first=K.
|title=On a class of Jacobi-like procedures for diagonalising arbitrary real matrices
|journal=Numerische Mathematik
|volume=33 |issue=2 |year=1979 |pages=157–172
|doi=10.1007/BF01399551 |mr=549446
}}
* {{cite journal
|last=Veselić |first=K.
|last2=Wenzel |first2=H. J.
|title=A quadratically convergent Jacobi-like method for real matrices with complex eigenvalues
|journal=Numerische Mathematik
|volume=33 |issue=4 |year=1979 |pages=425–435
|doi=10.1007/BF01399324 |mr=553351
}}
{{refend}}
[[Category:Numerikus analízis]]
|