„Jacobi-módszer” változatai közötti eltérés

A Wikipédiából, a szabad enciklopédiából
[ellenőrzött változat][nem ellenőrzött változat]
Tartalom törölve Tartalom hozzáadva
aNincs szerkesztési összefoglaló
Varadiemil (vitalap | szerkesztései)
Új oldal, tartalma: „A numerikus analízisben, 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ér…”
1. sor: 1. sor:
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
A '''Jacobi-módszer''' (vagy '''Jacobi-féle sajátértékmódszer''') néven ismert eljárás egy [[iteráció|iteratív]] módszer, amely kis méretű (n<10) szimmetrikus valós [[mátrix (matematika)|mátrixok]] [[Sajátvektor és sajátérték|sajátértékeinek]] és [[Sajátvektor és sajátérték|sajátvektorainak]] a meghatározására használható. Ezen módszer célja a mátrix főátlón kívüli elemeinek iteratív eljárással történő kinullázása. A Jacobi-módszer esetén az iterációs lépéseket addig ismételjük, míg egy általunk meghatározott pontosságig az ismeretleneket meg nem határozzuk. Ez azt fogja jelenteni, hogy akkor állunk meg a lépesekkel, mikor már két egymás utáni lépésben kapott ismeretlen értékek különbsége kisebb egy általunk meghatározott értéknél.
|last=Jacobi |first=C.G.J. |authorlink=Carl Gustav Jacob Jacobi
A Jacobi-módszer esetében az iterációs képlet a következő lesz:
|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&ndash;65
|doi=10.1016/S0377-0427(00)00413-1
}}</ref>


== Leírás ==
<math>x_i^{(k)}={b_i\over a_{ii}}-\sum_{j=1,j\ne i}^n a_{ij} x_j^{(k-1)}</math>
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
Ahhoz, hogy könnyebben megérthessük a módszer elvét, tekintsünk egy példát:
:<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>
<math>\begin{pmatrix} a_{11} & a_{12} \\ a_{21} & a_{22} \end{pmatrix} {x_1 \choose x_2}={b_1 \choose b_2}</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>
Hogy jobban áttekinthető legyen, átírhatjuk egyenletek formájába, amely így nézhet ki:
\begin{align}
\cot^2\varphi+\frac{a_{22}-a_{11}}{a_{21}}\cot\varphi-1 &= 0,
\end{align}
</math>


melynek alapján
<math>\begin{cases} a_{11}x_1+a_{12}x_2=b_1 \\ a_{21}x_1+a_{22}x_2=b_2 \end{cases}</math>


:<math>
Innen kifejezhető az x<sub>1</sub> és x<sub>2</sub> ismeretlen, így a következő egyenleteket kapjuk:
\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>
<math>x_1=-{a_{12}\over a_{11}}x_2+{b_1\over a_{11}}</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 ==
<math>x_2=-{a_{21}\over a_{22}}x_1+{b_2\over a_{22}}</math>


A következőkben nézzük meg, hogy miként működik ez a módszer általános esetben
Az így kapott egyenletrendszert úgy oldhatjuk meg, hogy kezdetben kiindulunk az <math>x_1^{(0)}</math>, illetve az <math>x_2^{(0)}</math> legjobb becslésünkből, vagy az egyszerűség kedvéért indulhatunk 0-ból is. Ezután felhasználva az
<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>x_1^{(k)}=-{a_{12}\over a_{11}}x_2^{(k-1)}+{b_1\over a_{11}}</math>,
:<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>
<math>x_2^{(k)}=-{a_{21}\over a_{22}}x_1^{(k-1)}+{b_2\over a_{22}}</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.


lépéseket, eljuthatunk egy jobb közelítő értékig. Ezt addig alkalmazzuk, amíg az ismeretleneket tetszőleges pontossággal meg nem határozzuk.


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
== Források ==
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,
* Lázár Zsolt, Lázár József, Járai-Szabó Ferenc: Numerikus módszerek, egyetemi jegyzet, 2008
vagyis monoton módon tart 0-hoz.
* Digitális tankönyvtár/Természettudományok/Matematika/Numerikus módszerek 1./Jacobi-módszer


<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:
[[Kategória:Lineáris algebra]]
:<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]]
[[Category:Articles with example pseudocode]]

A lap 2018. február 8., 01:20-kori változata

A numerikus analízisben, a Jacobi-féle módszer egy iterációs módszer valamely valós szimmetrikus mátrix 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,[1] de csak az 1950-es években vált elterjedtté a számítógépek fejlődése miatt.[2]

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 , 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 szimmetrikus mátrix diagonalizálása megoldható az ortogonális hasonlósági transzformáció segítségével, azaz

Vegyük példaként a típusú mátrix esetét. Ekkor a transzformációhoz használjuk a

síkforgatást leíró mátrixot, ahol a forgatás szöge. Ha felírjuk ezzel az szimmetria transzformációt, a transzformálás után az mátrix elemei

lesznek. Ha a nem átlós és elemeket 0-vá alakítjuk, az elforgatási szögre a következő egyenletet kapjuk:

melynek alapján

Innen megkaphatjuk a és függvényeket, melyekkel felépítjük a forgatásmátrixot. Az így kapott mátrix diagonális, tehát az átlóban található együtthatók a sajátértékek, míg az forgatásmátrix két oszlopa a sajátértékeknek megfelelő két sajátvektor:

Általános eset

A következőkben nézzük meg, hogy miként működik ez a módszer általános esetben méretű mátrixok esetén. A sík-forgatás mátrixunk az egységmátrixtól csak az elemekben tér el, vagyis

Ezt felhasználva az

ortogonális hasonlósági transzformációval nullákat viszünk be az és elemek helyére. A szorzás elvégzése után az

mátrixelemeket kapjuk eredményül. Ezek közül megköveteljük, hogy az , illetve az elemek 0-ák legyenek. Ekkor a

egyenlethez jutunk, melyet megoldva a forgatás szöge

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 -tel csökken, vagyis monoton módon tart 0-hoz.

-lel jelölve az . transzformáció utáni mátrixot, a transzformáció-sorozatot a következőképpen írhatjuk:

ahol -el valamely nem-átlós elemre alkalmazott transzformációt jelöltük. Képezzük a transzformációs mátrixok

szorzatát. Ha végtelen sok transzformációt végzünk, akkor

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 feltétel tiszteletbentartása biztosít, ami egy forgatásnak felel meg. Ezt úgy tudjuk biztosítani, hogy a két gyök közül a "+" előjelest válasszuk, amennyiben é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:



Algoritmus

A leírt módszer a következő algoritmus segítségével alkalmazható számítógépre:

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


Példa

Legyen

A jacobi a következő sajátértékeket és sajátvektorokat adja:


Referenciák

  1. Jacobi, C.G.J. (1846). „Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen” (german nyelven). Crelle's Journal 30, 51–94. o.  
  2. Golub, G.H. (2000). „Eigenvalue computation in the 20th century”. Journal of Computational and Applied Mathematics 123 (1-2), 35–65. o. DOI:10.1016/S0377-0427(00)00413-1.  


További olvasnivaló

  • Press, WH; Teukolsky, SA & Vetterling, WT et al. (2007), "Section 11.1. Jacobi Transformations of a Symmetric Matrix", Numerical Recipes: The Art of Scientific Computing (3rd ed.), New York: Cambridge University Press, ISBN 978-0-521-88068-8
  • Rutishauser, H. (1966). „Handbook Series Linear Algebra: The Jacobi method for real symmetric matrices.”. Numerische Mathematik 9 (1), 1–10. o. DOI:10.1007/BF02165223.  
  • Sameh, A.H. (1971). „On Jacobi and Jacobi-like algorithms for a parallel computer”. Mathematics of Computation 25 (115), 579–590. o. DOI:10.1090/s0025-5718-1971-0297131-6.  
  • Shroff, Gautam M. (1991). „A parallel algorithm for the eigenvalues and eigenvectors of a general complex matrix”. Numerische Mathematik 58 (1), 779–805. o. DOI:10.1007/BF01385654.  
  • Veselić, K. (1979). „On a class of Jacobi-like procedures for diagonalising arbitrary real matrices”. Numerische Mathematik 33 (2), 157–172. o. DOI:10.1007/BF01399551.  
  • Veselić, K. (1979). „A quadratically convergent Jacobi-like method for real matrices with complex eigenvalues”. Numerische Mathematik 33 (4), 425–435. o. DOI:10.1007/BF01399324.