CATEGORII DOCUMENTE |
Astronomie | Biofizica | Biologie | Botanica | Carti | Chimie | Copii |
Educatie civica | Fabule ghicitori | Fizica | Gramatica | Joc | Literatura romana | Logica |
Matematica | Poezii | Psihologie psihiatrie | Sociologie |
Metoda Jacobi este o metoda iterativa de rezolvare a sistemelor liniare de forma
Ax = b. (2.25)
Matricea A se descompune in suma L + D + U , unde
(2.26)
(2.27)
(2.28)
Se defineste traiectoria Jacobi a vectorului x(0) ca fiind vectorul
x(k+1) = D−1[b − (L + U )x(k)] k = 0, 1, 2, (2.29)
Folosind teorema de convergenta se studiaza daca traiectoria Jacobi converge la solutia x(*) a sistemului (2.25).
Traiectoria Jacobi converge la solutia x(*) a sistemului (2.25), daca si numai daca raza spectrala ρ a matricei
M = −D−1(L + U) (2.30)
este strict subunitara, adica
max < 1. (2.31)
In caz de convergenta, componentele ale vectorului , situat pe traiectoria Jacobi a vectorului x(0) , sunt date de relatiile:
(2.32)
Calculati primii trei termeni ai traiectoriei Jacobi asociate vectorului (0, 0, 0) pentru sistemul:
Rezolvare
Sistemul se mai poate scrie sub forma Ax = b, unde:
Matricea A se descompune in suma L + D + U cu
Verificarea conditiei de convergenta a algoritmului presupune calculul valorilor proprii ale matricei
M = −D−1(L + U) =
Calculand maximul in modul al valorilor proprii ale matricei M , obtinem
(M ) = 0.2673998083 < 1,
si deci algoritmul converge.
Aplicam formulele (2.32), plecand de la x(0) = 0, y(0) = 0, z(0) = 0, obtinem succesiv:
x y(1) = 0.2222222222, z(1) = −0.4285714286
x y(2) = 0.2031746032 z(2) = −0.5174603174
x = 0.1917460316 y(3) = 0.3283950617 z(3) = −0.4158730159
Pentru comparatie, am rezolvat acest sistem folosind procedura solve furnizata de Maple, iar rezultatele sunt:
x = 0.1861198738, y = 0.3312302839, z = −0.4227129338.
A. Algoritm
Observatia. Deoarece metoda lui Jacobi este o metoda iterativa, trebuie specificata o conditie de oprire a algoritmului. Algoritmul converge daca sirul (x(k)) este convergent. Convergenta acestui sir poate fi descrisa in mod teoretic in diverse moduri. In practica, se foloseste o varianta a criteriului lui Cauchy, si anume: sirul (x(k)) este convergent, daca
unde ε este o constanta data.
In cazul nostru, vom considera ca solutiile sistemului au fost obtinute cu eroarea ε, adica
De aici rezulta o conditie de oprire a algoritmului:
(2.33)
Date de intrare: un sistem de ecuatii (o multime de ecuatii), un punct initial, x(0), o eroare ε.
Date de iesire: solutia aproximativa a sistemului, obtinuta in urma aplicarii traiectoriei Jacobi vectorului x(0) pana cand este indeplinita conditia (2.33).
Algoritmul consta in urmatoarele etape:
1. generarea matricei A a sistemului si a vectorului b
. n - numarul de necunoscute (numarul de linii ale matricei A)
2. generarea matricelor L, D, U si verificarea convergentei metodei:
(−D−1(L + U )) < 1
3. construirea traiectoriei Jacobi
repeta
pana cand
B. Programe MAPLE si rezultate
jacobi := proc (eq::set (equation), init::vector, eps::float)
local var, n, AA, A, b, l, d, u, i, j, m, lst, xo, test, k, x;
var := [op (indets (eq))];
n := nops (var);
if vectdim (init) <> n then
ERROR ('numarul de necunoscute nu este egal cu dimensiunea vectorului initial')
fi;
AA := genmatrix (eq, var, flag);
A := delcols (AA, n+1 .. n+1);
b := col (AA, n+1);
l := matrix (n, n, 0):
u := matrix (n, n, 0):
d := matrix (n, n, 0):
for i from 1 to n do
for j from 1 to i-1 do
l[i, j] := A[i, j];
od;
d[i, i] := A[i, i];
for j from i+1 to n do
u[i, j] := A[i, j];
od;
od;
# conditia de convergenta
m := multiply (inverse (d), matadd (l, u, -1, -1));
lst := [eigenvals (m)];
if evalf (max (seq (abs (lst[k]), k=1 .. nops (lst))))>=1 then
ERROR('Algoritmul nu converge');
fi;
# algoritmul propriu-zis
for i from 1 to n do
xo[i] := init[i]
od;
test := 1;
while test >= evalf (eps*sqrt(n)) do
for i from 1 to n do
x[i] := evalf (1/A[i, i]*( b[i]-sum(A[i, k]*xo[k], k=1 .. n)+A[i,i]*xo[i]));
od;
test := evalf (sqrt (sum ((x[k]-xo[k])^2, k=1 .. n )));
for i from 1 to n do
xo[i] := x[i];
od;
od;
RETURN (seq (var[i] = x[i], i=1 .. n));
end:
debug(jacobi):
jacobi(, vector(2, [0,0]), 0.01);
, array(1 .. 2, [(1)=0, (2)=0]), .1e-1
var := [x, y]
n
, b
d u1, 2 := 1 l2, 1 := 1 d2, 2 := 2
xo1 := 0 xo2 := 0 test := 1
x x2 := 2.500000000 test := 3.004626063
xo1 := 1.666666667 xo2 := 2.500000000
x := 0.8333333333 x2 := 1.666666666 test := 1.178511303
xo1 := 0.8333333333 xo2 := 1.666666666
x x2 := 2.083333334 test := 0.5007710115
xo1 := 1.111111111 xo2 := 2.083333334
x := 0.9722222220 x2 := 1.944444444 test := 0.1964185512
xo1 := 0.9722222220 xo2 := 1.944444444
x x2 := 2.013888889 test := 0.08346183593
xo1 := 1.018518519 xo2 := 2.013888889
x := 0.9953703703 x2 := 1.990740740 test := 0.03273642604
xo1 := 0.9953703703 xo2 := 1.990740740
x := 1.003086420 x2 := 2.002314815 test := 0.01391030679
xo1 := 1.003086420 xo2 := 2.002314815
<-- exit jacobi (now at top level) = x = 1.003086420, y = 2.002314815}
x = 1.003086420, y = 2.002314815
Se pot compara rezultatele obtinute daca eroarea ε se modifica:
> jacobi (, vector (2, [0,0]), 0.01);
x = 1.003086420, y = 2.002314815
> jacobi (, vector (2, [0,0]), 0.001);
x = 0.9998713993, y = 1.999742798
> jacobi (, vector (2, [0,0]), 0.00001);
x = 1.000002381, y = 2.000001786
De asemenea, se poate compara sirul solutiilor partiale cu solutia exacta obtinuta rezolvand sistemul Ax = b cu ajutorul procedurii linsolve. Pentru sistemul considerat mai sus, a carui solutie exacta este x = 1, y = 2, obtinem urmatoarele grafice:
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 3421
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved