Iai, 2009
PREFA
Prezenta lucrare se adreseaz studenilor i i propune s exemplifice modul n care pot fi puse n practic diversele metode de calcul numeric prezentate n cadrul cursului de Metode Numerice. Este evident c, atunci cnd o anumit tem nu se poate finaliza prin utilizarea metodelor clasice, este necesar gsirea unei modaliti de calcul care s permit totui obinerea rezultatelor problemei n cauz. n aceast situaie intervine calculul numeric, adic implementarea unei metode numerice pe un sistem de calcul, utiliznd un anumit limbaj de programare. Pentru fixarea mai clar a metodei de calcul abordate, au fost readuse n atenia studenilor elementele de baz specifice fiecrei metode de calcul, cu evidenierea pailor teoretici ce trebuie parcuri pentru rezolvarea unei probleme printr-o anumit metod. Programele au fost elaborate n MATLAB, avnd n vedere faptul c acest mediu de programare este cunoscut studenilor, el fiind utilizat i n cadrul lucrrilor practice aferente altor discipline. Fiind destinate nelegerii metodelor de calcul i a modului efectiv de realizare a modulelor soft, fiecare dintre aceste programe este conceput a se desfura pas cu pas, studentul avnd posibilitatea de a analiza modul n care a fost efectuat calculul n cadrul unui anumit pas i de a analiza i chiar de a anticipa ce presupune parcurgerea pasului urmtor. Acest lucru este deosebit de util, deoarece impune studentului aprofundarea teoretic a metodei respective de calcul. Avnd n vedere modul n care au fost concepute aceste programe, studentul are posibilitatea de a aplica metodele de calcul prezentate fie pe unele exemple predefinite, fie pe probleme concrete pe care le are de rezolvat. Programele prezentate sunt utile nu numai studenilor ci i tuturor celor care au de rezolvat o anumit problem iar metodele clasice de lucru nu le sunt de folos. Autorul
Metode Numerice
CUPRINS
L 1. L 2. L 3. L 4. L 5. L 6. L 7. L 8.
Rezolvarea ecuaiilor prin metoda biseciei (njumtirii intervalului) Rezolvarea ecuaiilor prin metoda lui Newton (tangentei) Rezolvarea ecuatiilor prin metoda aproximaiilor succesive Rezolvarea ecuatiilor prin metoda secantei Rezolvarea sistemelor de ecuaii liniare prin metoda lui Gauss Rezolvarea sistemelor de ecuaii liniare prin metoda Gauss-Jordan Descompunerea unei matrice n produs TS Rezolvarea sistemelor de ecuaii liniare prin metoda iterativ Jacobi
3 7 11 15 19 27 35 40
Indrumar de laborator 44 48 51 55 63 67 71 74
L 10. Polinomul de interpolare Lagrange L 11. Polinomul de interpolare Newton cu diferene divizate L 12. Polinoame de interpolare Newton cu pas constant L 13. Aproximarea funciilor prin metoda celor mai mici ptrate. Dreapta de regresie L 14. Integrare numeric. Formulele trapezelor L 15. Integrare numeric. Formula lui Simpson L 16. Integrare numeric. Formulele lui Gauss
Metode Numerice
c0 =
f(x) A0 c0 a0 a1 xR b1
a 0 + b0 2
(1.1)
b0 B0
Fig.1.1. Se efectueaz apoi produsul f (a 0 )f (c 0 ) . Intervalul care conine n continuare soluia se noteaz (a1 , b1 ) . Situaiile care pot aprea sunt urmtoarele:
Indrumar de laborator
i {b n } descresctor (sau constant pe poriuni) soluia x R aflndu-se n permanen n intervalul (a n , b n ) . Lungimea acestui interval este:
(a 1 , b1 ) se procedeaz n mod asemntor. Rezult dou iruri, {a n }nN cresctor (sau constant pe poriuni)
bn a n =
1 2n
b0 a 0 .
(1.3)
bn a n < .
Rezult pentru nmin o expresie de forma:
b0 a 0 n min = log 2 + 1,
(1.4)
(1.5)
unde [] reprezint funcia parte ntreag. Valoarea nmin nu depinde de complexitatea ecuaiei care se rezolv ci numai de lungimea intervalului iniial i de precizia impus. Orice valoare cuprins n intervalul final (a n , b n ) poate fi considerat ca fiind soluie aproximativ pentru ecuaia dat. De obicei se consider
xR 1 (a n + b n ), 2
(1.6)
6
format short Pasul_final = Pasul format long Radacina_aprox = c format short e Eroarea = 0 return end if sign(fa*fc) < 0 b = c; fb = fc; else a = c; fa = fc; end c = (a+b)/2; eroarea = b-c pause end format short Pasul_final = Pasul format long Radacina_aprox = c format short e Eroarea = b-c %%%%%%%%%%%%%%%%%%%%%%%%%%%% function fct = f(x,index)
Indrumar de laborator
% functia f, ce defineste ecuatia f(x)=0 : switch index case 1 fct = x.^6 - x - 1; case 2 fct = x - exp(-x); case 3 fct = x.^3-x-2; case 4 fct = x.^3-2; end
Metode Numerice
Fig.2.1. nu are punte de inflexiune. Ea presupune aproximarea soluiei exacte x R printr-un ir de valori x 1 , x 2 ... obinute prin intersecia tangentelor duse la graficul funciei f n punctele A0, A1,... cu axa absciselor. Punctul iniial x 0 se alege ca fiind una din extremitile intervalului (a 0 , b 0 ) i anume aceea care ndeplinete condiia: f ( x 0 )f " ( x 0 ) > 0 (2.1)
Aceast condiie ne asigur c intersecia tangentei la grafic cu axa Ox se va afla n interiorul intervalului iniial. Considerm punctul generic A k ( x k , f ( x k )) situat pe graficul funciei f. Ecuaia tangentei n acest punct la graficul lui f este:
y f ( x k ) = f ' ( x k )(x x k ) .
(2.2)
Indrumar de laborator
x k +1 = x k
f (x k ) ; k = 0,1,2,.... f ' (x k )
(2.3)
Aceast expresie este formula iterativ a lui Newton. Se noteaz: ( x ) = x f (x) . f ' (x) (2.4)
Funcia se numete funcia de iterare a lui Newton. Cu noua notaie, relaia de recuren dat de (2.3) se poate pune sub forma:
x k +1 = ( x k ), k = 0,1,2,...
obine:
(2.5)
k +1 = 2 k
" ( x R ) . 2!
(2.6)
Aceast relaie arat c eroarea de aproximare evolueaz dup o lege ptratic. Metoda lui Newton are deci o vitez mare de convergen. Dezavantajul metodei const n faptul c n cadrul fiecrui pas este necesar calculul derivatei funciei n punctul respectiv. Programul n MATLAB: L2_newton.m
function rad_ec = newton_ec(x0,max_er,max_it,index_f) % Rezolvarea ecuatiei f(x)=0 prin metoda lui Newton (tangentei) % x0 = aproximarea initiala pentru radacina ecuatiei; % max_er = valoarea maxima admisa a erorii de aproximare; % max_it = numarul maxim de iteratii admis; % index_f = selectorul de functii; ecuatia este f(x)=0. eroare = 1; contor = 1;
Metode Numerice
while abs(eroare) > max_er & contor <= max_it fx = f(x0, index_f); dfx = deriv_f(x0, index_f); if dfx == 0 disp('Valoarea derivatei este zero. STOP !') return end format short Pasul = contor disp('Valoarea aproximativa a radacinii este :') format long x1 = x0 - fx/dfx; x=x1 format short e eroare = x1 - x0 pause x0 = x1; contor = contor + 1; end if contor > max_it disp('Numarul de iteratii stabilit initial a fost atins.') disp('Acesta este prea mic pentru a se gasi o radacina') disp('cu precizia impusa pentru ecuatia data !') disp(' ') else disp('Nivelul de precizie impus a fost atins :') format short Pasul format long Radacina_aprox = x1 format short e Eroarea = eroare end %%%%%%%%%%%%%%%%%%%%%%%%%%%% function fct = f(x, index) % Definirea functiei f ce a generat ecuatia : switch index
10
case 1 fct = x.^6 - x - 1; case 2 fct = x - exp(-x); case 3 fct = x.^3-x.^2-x-1; end %%%%%%%%%%%%%%%%%%%%%%%%%%%% function d_fct = deriv_f(x, index) % Derivata functiei f este: switch index case 1 d_fct = 6*x.^5 - 1; case 2 d_fct = 1 + exp(-x); case 3 d_fct = 3*x.^2-2*x-1; end
Indrumar de laborator
Metode Numerice
11
(3.1)
Dac x R este soluie pentru ecuaia f ( x ) = 0 , ea este soluie i pentru ecuaia (3.1), deci vom avea:
x R = ( x R ) .
Fie x 0 (a 0 , b 0 ) o aproximaie iniial pentru soluia ecuaiei.
(3.2)
Metoda const n aproximarea soluiei exacte x R printr-un ir de valori x 1 , x 2 ..., construit pe relaia iterativ
x k +1 = ( x k ), k = 0,1,2,...
(3.3)
' ( x ) < 1 () x (a 0 , b0 ) .
(3.4)
n aceste condiii, irul de iterare definit de relaia (3.3) este convergent ctre soluia x R a ecuaiei. Funcia este continu iar prin trecere la limit n relaia de recuren (3.3) se obine:
k
lim x k +1 = ( lim x k )
k
(3.5)
adic:
x R = ( x R ).
(3.6)
12
Indrumar de laborator
Din punct de vedere grafic, rezolvarea ecuaiei (3.1) prin aceast metod se desfoar aa cum este prezentat n Fig.3.1 i n Fig.3.2.
y y=x y=(x) y y=(x) y=x
xR x2 x1
(a)
x0
x1 xR x2
(b)
x0 x
x1 xR x0
(a)
x2
x1 x0 xR
(b)
k +1 = k ' ( x R ).
(3.7)
Se obine un grad de convergen liniar; eroarea de la pasul (k+1) este proporional cu eroarea de la pasul k.
13
function rad_ec = aprox_succ_ec(x0,max_er,max_it,index_fi) % Rezolvarea ecuatiei f(x)=0 prin metoda aproximatiilor succesive % x0 = aproximarea initiala pentru radacina ecuatiei; % max_er = valoarea maxima admisa a erorii de aproximare; % max_it = numarul maxim de iteratii admis; % index_fi = selectorul de functii; ecuatia este x=fi(x). neconv = 0; eroare = 1; eroare_0 = 10; contor = 0; while abs(eroare) > max_er & contor < max_it contor = contor + 1; Pasul = contor format long x1 = fi(x0,index_fi); disp('Valoarea aproximativa a radacinii este :') x = x1 format short e eroare = x1-x0 if abs(eroare)>abs(eroare_0) neconv = neconv + 1; disp('Metoda este neconvergenta') neconv if neconv == 3 disp(' ') disp(' Va rugam sa abandonati ! ') disp(' Nu luati in considerare rezultatele ! ') disp(' ') return end end eroare_0=eroare; x0=x1; pause end if contor >= max_it disp('Numarul de iteratii stabilit initial, atins.') disp('Acesta este prea mic pentru a se gasi o radacina')
14
Indrumar de laborator
disp('cu precizia impusa pentru ecuatia data !') disp(' ') else disp('Nivelul de precizie impus a fost atins :') format short Pasul format long Radacina_aprox = x1 format short e Eroarea = eroare end %%%%%%%%%%%%%%%%%%%%%%%%%%%% function fct = fi(x,index) % Definirea functiei fi: switch index case 1 fct = x.^3-2; case 2 fct = (x+2)^(1/3); end
Metode Numerice
15
a0
x0
x1
xR b0
B0
Fig.4.1. Se unesc punctele A 0 i B 0 printr-o dreapt de ecuaie: f ( b 0 ) f (a 0 ) y f (a 0 ) = (x a 0 ) . (4.1) b0 a 0 Intersecia dreptei cu axa Ox (y = 0) ne d punctul x 0 : a f ( b ) b 0 f (a 0 ) x0 = 0 0 (4.2) f ( b 0 ) f (a 0 ) Punctul x 0 mparte intervalul (a 0 , b 0 ) n dou subintervale din care numai unul va conine n continuare soluia x R . Pentru a determina care subinterval conine soluia x R se efectueaz produsul:
16
xn =
a n f ( b n ) b n f (a n ) . f ( b n ) f (a n )
(4.4)
Aceste dou iruri, {a n }nN i {b n }nN au o limit comun, soluia x R a ecuaiei. La toate metodele iterative prezentate procedeul de calcul se oprete atunci cnd exist un indice n pentru care:
x n x n 1 < ,
(4.5)
fiind eroarea admis. Acest test nu ne asigur c am determinat o valoare aproximativ pentru soluia situat fa de valoarea exact la o distan mai mic dect . Pentru a fi mai siguri, n aceast situaie se consider o condiie de oprire a calculelor de forma:
x n x n 1 < . 10
(4.6)
Metode Numerice
contor = 0;
17
while abs(eroare) > max_er & contor <= max_it contor = contor + 1; Pasul = contor disp(' Punctul de intersectie cu abscisa este :') format long x0=(a0*fb0-b0*fa0)/(fb0-fa0); x = x0 fx0 = f(x0,index_f); if fa0*fx0 < 0 b0 = x0; else a0 = x0; end fa0 = f(a0,index_f); fb0 = f(b0,index_f); % Eroarea se calculeaza incepand de la pasul 2. if contor > 1 format short e eroare = x0 - x1 end pause x1 = x0; end if contor > max_it disp('Numarul de iteratii stabilit initial, atins.') disp('Acesta este prea mic pentru a se gasi o radacina') disp('cu precizia impusa pentru ecuatia data !') disp(' ') else disp('Nivelul de precizie impus a fost atins :') format short Pasul format long Radacina_aprox = x0 format short e Eroarea = eroare end
18
%%%%%%%%%%%%%%%%%%%%%%%%%%%% function fct = f(x,index) % Definirea functiei f : switch index case 1 fct = x.^6 - x - 1; case 2 fct = x - exp(-x); end
Indrumar de laborator
Metode Numerice
19
a 11x1 + a 12 x 2 + ... + a 1n x n = b1 a x + a x + ... + a x = b 21 1 22 2 2n n 2 . .......... .......... .......... .......... .......... a n1x1 + a n 2 x 2 + ... + a nn x n = b n Dac se fac notaiile:
a11 a12 a 22 a A = 21 ... ... a n1 a n 2 ... a1n x1 b1 ... a 2n x2 b ; x = ; b = 2 ... ... ... .... x b ... a nn n n
(5.1.)
(5.2)
Ax = b.
(5.3)
Aceast metod permite rezolvarea sistemului (5.1) prin transformarea, n cadrul unui anumit numr de pai, a matricei ptratice A a sistemului ntr-o matrice superior triunghiular. Se consider a 11 0 . n caz contrar, se reordoneaz i renumeroteaz ecuaiile sistemului astfel nct aceast condiie s fie ndeplinit. Numrul de pai pentru un sistem de n ecuaii cu n necunoscute este (n-1). Pentru a putea urmri modul n care se efectueaz triunghiularizarea sistemului este necesar descrierea operaiilor care se efectueaz n cadrul fiecrui pas n parte. Pasul 1: Elementul a 11 0 se numete pivot n cadrul acestui pas, iar ecuaia "1" care rmne nemodificat se numete ecuaie de pivotare. Necunoscuta x 1 este eliminat din ultimele (n-1) ecuaii prin
Indrumar de laborator
a i1 i scderea acesteia a 11
Pasul k, k = 2, n 1 : Primele k ecuaii ale sistemului obinut la pasul anterior rmn nemodificate. Ecuaia "k" este ecuaia de pivotare iar elementul situat pe diagonala principal n aceast ecuaie este pivotul. Dac acest element este nul, este necesar reordonarea i renumerotarea ultimelor n-(k-1) ecuaii ale sistemului de la pasul precedent astfel nct s avem un pivot nenul, dup care se procedeaz la transcrierea primelor k ecuaii. n cadrul acestui pas, necunoscuta x k este eliminat din ultimele (n-k) ecuaii ntr-o manier asemntoare cu cea de la pasul 1. De aceast dat, ecuaia de pivotare se nmulete cu un raport care are la numrtor coeficientul lui x k din ecuaia curent iar la numitor pivotul din cadrul acestui pas i se scade din ecuaia curent. n acest fel necunoscuta x k este eliminat din ultimele (n k) ecuaii. La ultimul pas, (n-1), necunoscuta x n 1 este eliminat numai din ultima ecuaie a sistemului obinut la pasul anterior, primele (n-1) ecuaii rmnnd nemodificate. Pentru a putea scrie relaiile de recuren care leag matricele sistemului la trecerea de la un pas la cellalt, convenim s atam matricei iniiale A indicele superior "1", ea devenind:
(1) A (1) = a ij
( )
i, j=1, n
(5.4)
Numai elementele care se modific n cadrul unui pas i indexeaz indicele superior cu o unitate. Notm: A (k ) x = b (k ) (5.5)
forma sistemului nainte de eliminarea necunoscutei x k din ultimele (nk) ecuaii. Astfel, pentru k=1 avem:
A (1) = A ; b (1) = b .
(5.6)
Metode Numerice
21
Pentru k = 2, n , elementele matricei A(k) i a vectorului b(k) se vor calcula n funcie de elementele matricelor de la pasul precedent astfel:
( k 1) a ij , pentru i k 1 = 0 , pentru i k , j k 1 ( k 1) ( k 1) ( k 1) a i,k 1 a k 1, j , pentru i k, j k a ij ( k 1) a k 1,k 1
(k ) a ij
(5.7)
bi( k )
(5.8)
Relaiile (5.7) i (5.8) reprezint de fapt rezultatul nmulirii n cadrul pasului (k-1) a ecuaiei (k-1) a sistemului: A ( k 1) x = b ( k 1) (5.9)
i k. Este eliminat astfel necunoscuta xk-1 din ultimele n-(k-1) ecuaii. La sfritul acestui pas, matricea A(k) i vectorul termenilor liberi b(k) arat astfel:
22
a (1) 11 0 ... = 0 0 ... 0
(1) a12 2) a( 22 ...
Indrumar de laborator
... ... ... ... ... ...
(1) a1 , k 1 2) a( 2, k 1 ... (1) a1 k 2) a( 2k ... k) a( kk
A (k )
0 0 ... 0
k 1) ( k 1) ... a ( k 1, k 1 a k 1, k
0 ... 0
...
k) a( nk
b (k )
. (5.10)
n cadrul ultimului pas avem k = n-1, necunoscuta x n 1 este eliminat din ultima ecuaie, obinndu-se sistemul echivalent sub form triunghiular: a (1) x1 + a (1) x 2 + ... + a (1) x k + ... + a (1) x n = b (1) 1n 1 12 1k 11 ( 2 ) ( 2 ) ( 2 ) 2) a 22 x 2 + ... + a 2k x k + ... + a 2 n x n = b ( 2 .............................................................. (k ) (k ) k) a( kk x k + ... + a kn x n = b k .......................................... n) (n ) a( nn x n = b n
(5.11)
Gsirea efectiv a soluiei sistemului se face printr-un procedeu de eliminare invers aplicat sistemului triunghiular (5.11):
Metode Numerice
n) b( n x n = ( n ) a nn n 1) ( n 1) b( n 1 a n 1, n x n x n 1) n 1 = a( n 1, n 1 . ............................................ n k) k) b( xj a (kj k j= k +1 x k = , k = n 2, n 3,...2,1 (k ) a kk
23
(5.12)
24
Indrumar de laborator
for k=1:n-1, for i=k+1:n, if A(k,k)==0 disp('Pivotul este 0: EROARE') return else P(i)=A(i,k)/A(k,k); A(i,k)=0; end for j=k+1:n, A(i,j)=A(i,j)-P(i)*A(k,j); end b(i)=b(i)-P(i)*b(k); end Pasul=k; Pasul disp('Matricea sistemului este acum :') A disp('Vectorul termenilor liberi este :') b pause end x(n)=b(n)/A(n,n); for i=n-1:-1:1, T=0; for j=i+1:n, T=T+A(i,j)*x(j); end x(i)=(b(i)-T)/A(i,i); end disp('Solutia sistemului este :') sol_sist=x;
Pentru creterea preciziei calculelor numerice este necesar reordonarea ecuaiilor n sistem n cadrul fiecrui pas, astfel nct, de fiecare dat, pivotul s aib o valoare maxim, n modul. Reordonarea ecuaiilor se face prin nlocuirea de tip pereche a ecuaiei de pivotare ce rezult n mod normal la finele unui anumit pas cu o ecuaie situat sub aceasta i care are, n modul, cea mai mare valoare a primului coeficient nenul din ecuaie. Acest coeficient devine noul pivot iar ntreaga ecuaie va nlocui ecuaia de pivotare obinut n mod natural.
25
26
b(k) = b(index); b(index) = temp_b; temp = piv(k); piv(k) = piv(index); piv(index) = temp; end
Indrumar de laborator
disp('Matricea sistemului cu liniile invesate este :') A pause for i=k+1:n, if A(k,k)==0 disp('Pivotul este 0: EROARE') return else P(i)=A(i,k)/A(k,k); A(i,k)=0; end for j=k+1:n, A(i,j)=A(i,j)-P(i)*A(k,j); end b(i)=b(i)-P(i)*b(k); end Pasul=k; Pasul disp('Matricea sistemului este acum :') A disp('Vectorul termenilor liberi este :') b pause end x(n)=b(n)/A(n,n); for i=n-1:-1:1, T=0; for j=i+1:n, T=T+A(i,j)*x(j); end x(i)=(b(i)-T)/A(i,i); end disp('Solutia sistemului este :') sol_sist = x(1:n)
Metode Numerice
27
Coloanele j
k 1) a( k 1, j
1) a i(,kk 1
a i(,kj1)
(6.1)
Matricea sistemului va purta la finele fiecrui pas un indice superior egal cu numrul pasului care urmeaz. n cadrul fiecrui pas toate elementele matricei sistemului i indexeaz indicele superior cu o unitate.
28
Indrumar de laborator
Relaiile de recuren ce permit trecerea de la matricea A(k-1) la matricea A(k) pot fi scrise mai uor dac se evideniaz, pe elementele matricei A(k-1) operaiile care se execut, aa cum este prezentat n (6.1): Ele au forma:
1) ( k 1) a i(,k k 1 a k 1, j ( k ) ( k 1 ) a ij = a ij ( k 1) , a k 1, k 1 (k ) ( k 1) , a k 1, j = a k 1, j (k ) ( k 1) a ij = a ij
pentru
i k 1 j k 1 (6.2)
pentru j k 1 pentru j k 2
i respectiv:
1) a i(,k k 1 (k ) ( k 1) k 1) ( k 1) b ( k 1 , b i = b i a k 1,k 1 (k ) ( k 1) b k 1 = b k 1
pentru i k 1
(6.3)
(6.4)
, pentru i = 1, n .
(6.5)
Metoda Gauss-Jordan permite i calculul matricei inverse A-1 dac se procedeaz n felul urmtor: - se formeaz o matrice de dimensiuni n(2n+1) compus din: pe primele n coloane matricea A;
Metode Numerice
29
pe urmtoarele n coloane matricea I n ; pe ultima coloan vectorul b; - se aplic procedeul de rezolvare dat de metoda Gauss-Jordan numai c operaiile descrise pentru matricea sistemului se extind asupra ntregii matrice de dimensiuni n(2n+1). Se efectueaz aceste operaii pn cnd n locul matricei A apare matricea diagonal. Ultima operaie care se efectueaz asupra acestei matrice extinse este aceea de a mpri fiecare linie la elementul situat pe diagonala principal a matricei de pe primele n coloane. Ca urmare, n locul matricei diagonale cu elemente oarecare ce se afl pe primele n coloane, vom obine matricea unitate I n . Pe urmtoarele n coloane vom obine matricea invers A-1 iar pe ultima coloan, a (2n+1) - a, vom obine chiar soluia sistemului. Sintetic, metoda poate fi descris astfel:
[A | I n | b] [I n | A 1 | x ]
(6.6)
30
format disp('Matricea sistemului este :') A disp('Vectorul termenilor liberi este :') b pause
Indrumar de laborator
for k=1:n, for i=1:n, if i~=k if A(k,k)==0 disp('Pivotul este 0: EROARE') return else P(i)=A(i,k)/A(k,k); A(i,k)=0; end for j=k+1:n, A(i,j)=A(i,j)-P(i)*A(k,j); end b(i)=b(i)-P(i)*b(k); end end Pasul=k; Pasul disp('Matricea sistemului este acum :') A disp('Vectorul termenilor liberi este :') b pause end x(n)=b(n)/A(n,n); for i=n-1:-1:1, T=0; for j=i+1:n, T=T+A(i,j)*x(j); end x(i)=(b(i)-T)/A(i,i); end disp('Solutia sistemului este :') sol_sist=x(1:n)
Metode Numerice
31
Ca i la metoda Gauss, pentru creterea preciziei calculelor numerice este necesar reordonarea ecuaiilor n sistem n cadrul fiecrui pas, astfel nct, de fiecare dat, pivotul s aib o valoare maxim, n modul. Programul in MATLAB: L6_G_J_2.m
function sol_sist = G_J_2(A,b) % Rezolvarea sistemelor de ecuatii liniare prin % metoda Gauss-Jordan de eliminare, % cu schimbarea pivotului [m,p]=size(A); if m~=p disp('Matricea sistemului nu este patratica !'); return end n=length(b); if m~=n disp('Vectorul b are dimensiune gresita !'); return end format piv = (1:n)'; disp('Matricea sistemului este ;') A disp('Vectorul termenilor liberi este ;') b pause for k=1:n, [col_max index] = max(abs(A(k:n,k))); index = index + k-1; if index ~= k % Schimba liniile k si index intre ele temp_A = A(k,k:n); A(k,k:n) = A(index,k:n);
32
A(index,k:n) = temp_A; temp_A pause temp_b = b(k); b(k) = b(index); b(index) = temp_b;
Indrumar de laborator
temp = piv(k); piv(k) = piv(index); piv(index) = temp; end disp('Matricea sistemului cu liniile inversate :') A pause for i=1:n, if i~=k if A(k,k)==0 disp('Pivotul este 0: EROARE') return else P(i)=A(i,k)/A(k,k); A(i,k)=0; end for j=k+1:n, A(i,j)=A(i,j)-P(i)*A(k,j); end b(i)=b(i)-P(i)*b(k); end end Pasul=k; Pasul disp('Matricea sistemului este acum :') A disp('Vectorul termenilor liberi este :') b pause end x(n)=b(n)/A(n,n); for i=n-1:-1:1, T=0; for j=i+1:n, T=T+A(i,j)*x(j); end
Metode Numerice
x(i)=(b(i)-T)/A(i,i); end disp('Solutia sistemului este :') sol_sist=x(1:n)
33
Se poate determina matricea invers matricii A a sistemului, prin alipirea la aceasta, n partea dreapt, a unei matrice unitate de acelai ordin i prin aplicarea algoritmului de rezolvare a sistemului prin metoda Gauss-Jordan, fr schimbarea pivotului. Odat cu soluia sistemului se obtine i matricea invers. Programul in MATLAB: L6_G_J_inv.m
function sol_sist = g_j_inv_1(A,b) % Matricea A se extinde, prin alipirea matricii unitate % de acelasi ordin cu A format disp('Matricea initiala a sistemului este ;') A disp('Vectorul termenilor liberi este ;') b pause n=length(b); % Se formeaza matricea extinsa : for i=1:n for j=n+1:2*n if j==i+n A(i,j)=1; else A(i,j)=0; end end end disp('Matricea extinsa asociata sistemului este :') A_extinsa = A disp('Vectorul termenilor liberi este :') b pause
34
Indrumar de laborator
for k=1:n, for i=1:n, if i==k else if A(k,k)==0 disp('Pivotul este 0: EROARE') else P(i)=A(i,k)/A(k,k); A(i,k)=0; end for j=k+1:2*n, A(i,j)=A(i,j)-P(i)*A(k,j); end b(i)=b(i)-P(i)*b(k); end end Pasul=k; Pasul disp('Matricea sistemului este acum :') A disp('Vectorul termenilor liberi este :') b pause end for i=1:n, for j=1:2*n inv_A(i,j)=A(i,j)/A(i,i); end x(i)=b(i)/A(i,i); end disp('Matricea finala extinsa este :') A_final=A pause disp('Matricea inversa este urmatoarea:') inv_A = A(:,n+1:2*n) disp('Solutia sistemului este :') sol_sist = x(1:n)
Metode Numerice
35
A = T S
unde:
t ij = 0 pentru i < j T = ( t ij )i, j=1, n , t ii = 1 pentru i = 1, n . S = (sij )i, j=1, n , sij = 0 pentru i > j
(7.1)
(7.2)
Se pot determina relaiile pentru calculul elementelor matricelor T i S dac se impune coincidena ntre elementele matricei A i cele ale matricei produs TS. Considerm un element oarecare al matricei A, a kj avnd k j. Acest element se obine prin nmulirea liniei k din matricea T cu coloana j din matricea S. Deoarece k j se poate scrie:
a kj = t kps pj .
p =1 k
(7.3)
(7.4)
Indrumar de laborator
(7.5)
t ik =
k 1 1 a ik t ips pk , (i > k ) . s kk p =1
(7.6)
Relaiile (7.4) i (7.6) permit determinarea tuturor elementelor matricelor T i S presupunnd c se cunosc elementele primei linii din S i ale primei coloane din T. Este necesar s se defineasc deci elementele primei linii din S: s1 j = a 1 j , j = 1, n i ale primei coloane din T:
t i1 = a i1 , i = 1, n (a11 0) . a11
(7.7)
(7.8)
Ordinea n care se pot determina elementele matricelor T i S este urmtoarea: o linie din S, o coloan din T, o linie din S, o coloan din T,..., pn la epuizarea elementelor celor dou matrice. Avnd determinate elementele matricelor produs se poate proceda la rezolvarea sistemului:
Ax = b, TSx = b .
(7.9) (7.10)
Se noteaz:
Sx = y ,
astfel nct rezolvarea sistemului iniial (5.1) presupune rezolvarea a dou sisteme triunghiulare de forma: Sx = y . Ty = b Al doilea sistem din (7.11) poate fi scris detaliat astfel: (7.11)
37
(7.12)
(7.13)
Avnd cunoscut vectorul y se poate trece la rezolvarea primului sistem din (7.11) care se poate scrie: s11 x1 + s12 x 2 + ... + s1n x n = y1 s 22 x 2 + ... + s 2n x n = y 2 . ........................... s nn x n = y n Soluia se afl prin eliminarea invers:
yn x n = s nn n . y s kp x p k p = k +1 x = ; k = n 2,...,1 k s kk
(7.14)
(7.15)
Aceast metod, care presupune descompunerea matricei A n produs TS, mai apare n literatura de specialitate ca fiind descompunerea LR, corespondena ntre diversele notaii fiind evident. Programul in MATLAB: L7_desc_TS.m
38
function [T,S] = desc_ts(A);
Indrumar de laborator
% Matricea sistemului se descompune in produs TS, % matricea T inferior triunghiulara, % matricea S superior triunghiulara n=length(A); disp(' Matricea initiala a sistemului este :') A pause for i=1:n S(1,i)=A(1,i); end for j=1:n T(j,1)=A(j,1)/A(1,1); end for k=2:n for j=2:n if j>=2 if(k<j) T(k,j)=0; elseif k==j T(k,k)=1; end if(k>j) Q=0; for p=1:j-1 Q=Q+T(k,p)*S(p,j); T(k,j)=(A(k,j)-Q)/S(j,j); end end end end for j=1:n if k>=2 if k>j S(k,j)=0; elseif k<=j R=0; for p=1:k-1 R=R+T(k,p)*S(p,j); end S(k,j)=A(k,j)-R;
Metode Numerice
end end end end disp(' Matricea inferior triunghiulara, T este :') T disp(' Matricea superior triunghiulara, S este :') S disp(' Verificare T*S=A :' ) T*S
39
40
Indrumar de laborator
(8.1)
Rezolvarea sistemului prin metoda Jacobi ncepe prin a pune n eviden n partea stng a semnului egal a necunoscutei x i din ecuaia i:
x1 = (b1 a12 x 2 ... a1n x n ) a 11 x = (b a x a x ... a x ) a 2 2 21 1 23 3 2n n 22 . ................................ x n = (b n a n1x1 a n 2 x 2 ... a n , n 1x n 1 ) a nn
(8.2)
(8.3)
x = Ax + u .
(8.4)
Metoda Jacobi const n faptul c pune sistemul (8.4) ntr-o form ce permite calculul iterativ: x ( k +1) = Ax ( k ) + u pornind de la o aproximaie iniial x(0) a soluiei sistemului. (8.5)
Metode Numerice
41
x i( k +1)
n 1 (k ) = b i a ij x j , i = 1, n, k = 0,1,.... a ii j=1 j i
(8.6)
Metoda este convergent cu condiia ca toate valorile proprii ale matricei A s fie mai mici dect unitatea n modul. Aceast condiie cere ca:
a
j=1 ji
a ij
ii
< 1, i = 1, n .
(8.7)
Relaia (8.7) reprezint pentru metoda iterativ Jacobi o condiie necesar de convergen. n matricea sistemului iniial, trebuie ca fiecare element de pe diagonala principal, n modul, s fie mai mare dect suma modulelor celorlalte elemente din linia respectiv. Este posibil ca sistemul, n forma sa iniial s nu respecte aceast condiie necesar de convergen. nainte de a ncepe aplicarea algoritmului metodei, este necesar o reordonare i renumerotare a ecuaiilor n sistem astfel nct condiia de convergen s fie ndeplinit. Sistemele pentru care se preteaz metoda Jacobi au matricea diagonal dominant. Pentru metodele de rezolvare prin tehnici iterative este necesar s se impun un nivel de precizie > 0 n obinerea soluiei. Oprirea calculelor se poate face atunci cnd valorile pe componente n cadrul a dou iteraii succesive sunt suficient de apropiate, printr-un test de forma:
max x i( k +1) x i( k ) <
i
(8.8)
Indrumar de laborator
function sol_sist = Jacobi_1(A,b,x0,max_er,max_it) % Sistemul este de forma A*x=b % x0 este aproximatia initiala a solutiei sistemului % max_er este valoarea maxima admisa pentru componentele solutiei % max_it este numarul maxim de iteratii impus [m,p]=size(A); if m~=p disp('Matricea sistemului nu este patratica !'); return end n = length(b); if m~=n disp('Vectorul b are dimensiune gresita !'); return end % Se verifica mai intai conditia de convergenta; cc=1; for i=1:n, S=0; for j=1:n, if i==j else S=S+abs(A(i,j)); end if S>abs(A(i,i)) cc=0; end end end if cc==0 disp('Sistemul nu indeplineste conditia de converg.!') end % Se construieste procedeul iterativ pentru calculul necunoscutelor; k=1;
Metode Numerice
for i=1:n, x(i,k)=x0(i); end while k < max_it+1 k = k+1; Pasul=k-1; Pasul format long max=0; for i=1:n, S=0; for j=1:n, if i<j S=S+A(i,j)*x(j,k-1); end if i>j S=S+A(i,j)*x(j,k-1); end end x(i,k)=(b(i)-S)/A(i,i); err(i)=abs(x(i,k)-x(i,k-1)); if err(i)>max max=err(i); end end eroarea=max; format short e eroarea if max < max_er disp('Limita erorii a fost atinsa !') disp(' ') disp('Solutia sistemului este :') format long x return end if k == max_it+1 disp('Numarul maxim de iteratii, atins') disp(' ') disp('Solutia partiala a sistemului este :') format long x return end end
43
44
Indrumar de laborator
(9.1)
n contrast cu metoda Jacobi, care nu folosete n calculul lui x dect componente ale vectorului x ( k ) , relaia (8.6), metoda Gauss-Seidel folosete pentru determinarea diferitelor componente ale vectorului x ( k +1) att componente ale vectorului de la pasul anterior x ( k ) ct i componente ale vectorului din pasul prezent x ( k +1) , pe msur ce acestea au fost determinate, accelernd astfel convergena procesului. Astfel, pentru calculul lui x i( k +1) , se folosesc componentele noi
( k +1) ( k +1) k +1) x1 , x 2 ,..., x i( 1 , deja calculate n cadrul acestui pas, ct i
k) (k ) (k) componentele x i(+ de la pasul anterior, necalculate nc 1 , x i + 2 , ..., x n n pasul prezent. n aceste condiii, relaia de recuren pentru metoda GaussSeidel este de forma:
x i( k +1) =
n i 1 1 b a x ( k +1) a ij x (jk ) . i ij j a ii j = i +1 j =1
(9.2)
Se apreciaz c, la acelai nivel de precizie impus n calculul soluiei sistemului, metoda Gauss-Seidel este de dou ori mai rapid dect metoda Jacobi.
Metode Numerice
45
Pentru metodele de rezolvare prin tehnici iterative este necesar s se impun un nivel de precizie > 0 n obinerea soluiei. Oprirea calculelor se poate face atunci cnd valorile pe componente n cadrul a dou iteraii succesive sunt suficient de apropiate, prin testul:
max x i( k +1) x i( k ) <
i
(9.3)
Pentru aceste metode, convergena nu depinde de alegerea soluiei iniiale x (0) . Este totui important alegerea acestui vector n ceea ce privete viteza de convergen. Cu ct o mai mare parte dintre componentele vectorului iniial x (0) se afl mai aproape de soluia exact a sistemului, cu att viteza de convergen este mai mare. n practic, este bine s inem seama de datele problemei practice care a generat un asemenea sistem astfel nct s nu alegem chiar la ntmplare vectorul iniial x (0) . Programul in MATLAB: L9_G_Seidel_1.m
function sol_sist = G_Seidel_1(A,b,x0,max_er,max_it) % Sistemul este de forma A*x=b % x0 este aproximatia initiala a solutiei sistemului % max_er este valoarea maxima admisa pentru componentele vectorului solutie % max_it este numarul maxim de iteratii impus [m,p]=size(A); if m~=p disp('Matricea sistemului nu este patratica !'); return end n = length(b); if m~=n disp('Vectorul b are dimensiune gresita !'); return end % Se verifica mai intai conditia de convergenta;
46
cc=1; for i=1:n, S=0; for j=1:n, if i==j else S=S+abs(A(i,j)); end if S>abs(A(i,i)) cc=0; end end end
Indrumar de laborator
if cc==0 disp('Sistemul nu indeplineste conditia de converg.!') end % Se construieste procedeul iterativ pentru calculul necunoscutelor; k=1; for i=1:n, x(i,k)=x0(i); end while k < max_it+1 k = k+1; Pasul=k-1; Pasul format long max=0; for i=1:n, S=0; for j=1:n, if i<j S=S+A(i,j)*x(j,k-1); end if i>j S=S+A(i,j)*x(j,k); end end x(i,k)=(b(i)-S)/A(i,i); err(i)=abs(x(i,k)-x(i,k-1)); if err(i)>max max=err(i);
Metode Numerice
end end eroarea=max; format short e eroarea if max < max_er disp('Limita erorii a fost atinsa !') disp(' ') disp('Solutia sistemului, pas cu pas, este :') format long x return end if k == max_it+1 disp('Numarul maxim de iteratii, atins') disp(' ') disp('Solutia partiala a sistemului este :') format long x return end end
47
48
Indrumar de laborator
(10.1)
Se pune problema determinrii unui polinom de grad n, de forma: L n ( x ) = y 0 0 ( x ) + y11 ( x ) + ... + y n n ( x ) care s coincid cu funcia f n nodurile de interpolare:
L n ( x i ) = f ( x i ) = y i , i = 0, n .
(10.2)
(10.3)
Funciile 0 , 1 ,..., n sunt polinoame de grad n ce urmeaz a fi determinate, y 0 , y1 ,..., y n fiind valorile funciei n punctele x 0 , x 1 ,..., x n . Relaiile (10.3) pot fi puse sub forma:
k =0
y k k (x i ) = y i ,
0, k (x i ) = 1,
i = 0, n .
(10.4)
(10.6)
Metode Numerice
49
k (x k ) = 1
provenit din (10.5), rezultnd pentru k o expresie de forma:
k (x) = x xi , k = 0, n . x x k i i=0
ik n
(10.7)
(10.8)
k =0
yk
x xi . x x i i=0 k
ik
(10.9)
n=length(xk); n disp('Functia este cunoscuta prin valorile :') xk yk pause L=0; disp('Valoarea polinomului, adunand termen cu termen :') for k=1:n F(k)=1; for i=1:n if i==k else F(k)=F(k)*(x-xk(i))/(xk(k)-xk(i)); end end
50
Indrumar de laborator
L=L+F(k)*yk(k) pause end val_functie=L; disp('Valoarea functiei in punctul dat este :') disp(' ') val_functie
Metode Numerice
51
f ( x1 ) f ( x 0 ) f ( x 2 ) f ( x1 ) f ( x n ) f ( x n 1 ) , ,..., x1 x 0 x 2 x1 x n x n 1
poart numele de diferene divizate de ordinul nti ale lui f. Aceste diferene se noteaz prin: f ( x 0 , x1 ), f ( x1 , x 2 ),..., f ( x n 1 , x n ) .
(11.1)
(11.2)
Diferenele divizate de ordinul I se constituie ca fiind operatori liniari fa de f, fiind simetrice n raport cu punctele x i , x j . Se pot defini recursiv diferenele divizate de ordinul II prin:
f (x i , x j , x k ) = f (x j , x k ) f (x i , x j ) xk xi
(11.3)
Diferenele divizate de ordinul k se scriu pornind de la diferenele divizate de ordin (k-1) astfel:
f ( x i1 , x i ,..., x i + k ) = f ( x i ,..., x i + k ) f ( x i 1 ,..., x i+ k 1 ) . x i + k x i 1
(11.4)
Pentru aproximarea funciei f printr-un polinom Newton cu diferene divizate se pornete de la: N n ( x ) = c 0 + c1 ( x x 0 ) + c 2 ( x x 0 )(x x 1 ) + ... + + c n ( x x 0 )...( x x n 1 )
N n ( x i ) = f ( x i ), i = 0, n
(11.5)
52
Indrumar de laborator
c 0 = f ( x 0 ) ; .........;
c1 = f ( x 0 , x1 ) c n = f ( x 0 , x1 ,..., x n )
(11.7)
Expresia final a polinomului Newton cu diferene divizate este: N n ( x ) = f ( x 0 ) + f ( x 0 , x 1 )( x x 0 ) + ... + + f ( x 0 , x 1 ,..., x n )( x x 0 )...( x x n 1 ). (11.8)
Diferenele divizate de diverse ordine pot fi uor calculate dac se construiete un tabel de forma:
xk
x0
f (x k )
f (x 0 )
f (x i , x j )
f (x i , x j , x p )
f ( x 0 , x1 )
x1 x2
x3
f ( x1 ) f ( x1 , x 2 ) f (x 2 )
f (x 2 , x 3 ) f (x 3 )
f ( x 0 , x1 , x 2 ) f ( x 0 , x 1 , x 2 , x 3 ) (11.9) f ( x1 , x 2 , x 3 )
De exemplu,
f ( x1 , x 2 , x 3 ) =
f ( x 2 , x 3 ) f ( x1 , x 2 ) , x 3 x1
(11.10)
relaie ce se determin urmrind liniile ngroate din (11.9). Avantajul utilizrii acestui tip de polinom este dat de faptul c nu se pornete de la nceput cu o anumit valoare a lui n ci se crete treptat gradul polinomului pn cnd se atinge precizia dorit. Atunci cnd se dorete aproximarea valorii funciei f ntr-un punct oarecare t, prin creterea gradului polinomului Newton nu ntotdeauna se obine o cretere semnificativ a preciziei de aproximare. Ar fi de dorit, pentru a obine o precizie foarte bun, ca punctele x 0 , x1 , x 2 ,... s se situeze destul de aproape de punctul t n care se face
Metode Numerice
53
aproximarea. Numai c, n general, nodurile x 0 , x1 , x 2 ,... sunt fixate dinainte, iar pe msur ce folosim un numr mai mare de astfel de noduri (atunci cnd gradul polinomului crete) ne deprtm de punctul t, fapt care conduce la "pierderea" din precizie a aproximrii. Programul n MATLAB L11_Newton_DD.m
function val_functie = Newton_DD(xk,yk,x) % % % % % Aproximare prin Polinoame Newton cu diferente divizate xk este vectorul nodurilor de interpolare yk este vectorul valorilor functiei in nodurile xk Vectorii xk si yk trebuie sa aiba aceeasi lungime x este punctul in care se doreste aproximarea
n=length(xk); n1=length(yk); if n==n1 else disp('Functia este incorect data !') disp('Cei doi vectori nu au aceeasi lungime !') return end n disp('Functia este cunoscuta prin valorile :') xk yk pause % Calcul diferente divizate for i=0:n-2, DD(1,i+1)=(yk(i+2)-yk(i+1))/(xk(i+2)-xk(i+1)); end for k=2:n-1, m=n-k; for i=1:m, DD(k,i)=(DD(k-1,i+1)-DD(k-1,i))/(xk(i+k)-xk(i)); end end disp('Tabloul cu diferente divizate de diverse ordine:') disp(' ') DD' pause
54
% Calculul polinomului NW_DD
Indrumar de laborator
disp('Polinoamele NW_DD, calculate pas cu pas, sint :') P=yk(1); NW_DD=P T=1; for k=1:n-1, pause T=T*(x-xk(k)); P=P+DD(k,1)*T; NW_DD=P end pause disp('Valoarea functiei in punctul indicat') disp('aproximata prin Polinom Newton cu') disp('diferente divizate este :') NW_DD
Metode Numerice
55
(12.1)
Se consider funcia y = f(x) ale crei valori sunt cunoscute ntrun ansamblu de noduri echidistante, de pas h. Se numete diferen finit la dreapta pentru funcia f(x) expresia:
f ( x ) = f ( x + h ) f ( x ) .
(12.2)
Aceste relaii se simplific dac se calculeaz diferenele finite n nodurile reelei, deci pentru valorile x = x k :
y k = y k +1 y k 2 y k = (y k ) = y k + 2 2 y k +1 + y k ................
j n y k = (1) j C n y n +k j j=0 n
(12.4)
n practic, este mai util a se calcula diferenele finite la dreapta dac se construiete tabelul diagonal urmtor:
56
Indrumar de laborator
x k yk x 0 y0 x1 y1
y k
y 0
2 y k
3 y k .....
4 y k
2 y 0
y1 x 2 y2 y 2
x 3 y3 y 3 2 y 2 ........ 2 y1
3 y 0 4 y 0
.....
(12.5)
3 y1 ........
........
x 4 y4 .....
n mod asemntor se pot defini diferenele finite la stnga printr-o relaie de forma:
f ( x ) = f ( x ) f ( x h ) .
(12.6)
n f ( x ) = n 1 (f ( x )) = ( n 1f ( x )) .
(12.7)
Dac se efectueaz calculul diferenelor finite la stnga n nodurile reelei se obine: y k = y k y k 1 2 y k = (y k ) = y k 2 y k 1 + y k 2 ............
j n y k = (1) j C n y k j j=0 n
(12.8)
Tabelul diagonal, care este mai util n determinarea diferenelor la stnga de diverse ordine, se construiete pornind de la baz, el avnd aspectul:
Metode Numerice
57
xk
yk
y k
......... y n 3
2 yk
3 y k ..... 4 y k
...... ...... x n 4 yn 4 x n 3 y n 3
...........
y n 2 x n 2 yn 2 y n 1 x n 1 y n 1 y n xn yn
2 y n 2 2 y n 1
........... 3 y 0 ...........
4 y n ..... 3 y1
(12.9)
2 yn
n practic, pentru un ansamblu de noduri dat x 0 , x1 ,..., x n , din punctul de vedere al calculelor efective aceste dou tabele sunt identice. Diferena dintre cele dou tabele este la nivel de semnificaii i anume un anumit element calculat al tabelului poate s aib o anumit notaie prin prisma primului tabel i o alt notaie prin prisma celui de al doilea. De exemplu, y 2 = y 3 y 2 = y 3 , (12.10) i deci diferena y 3 y 2 (care este unic) este notat y 2 prin intermediul primului tabel i y 3 prin cel de-al doilea. a) Polinomul de interpolare Newton de spea I Acest tip de polinom folosete diferenele finite la dreapta. Se pune problema determinrii unui polinom care s coincid cu funcia f n nodurile reelei echidistante. Acest polinom se consider de forma:
Nd n ( x ) = c 0 + c1 ( x x 0 ) + c 2 ( x x 0 )( x x 1 ) + + ... + c n ( x x 0 )( x x 1 )...(x x n 1 )
(12.11)
58
Indrumar de laborator
Nd n ( x i ) = f ( x i ) = y i , i = 0, n .
n relaia (12.11) se dau pe rnd lui x valorile x 0 , x1 ,..., x n . Rezult:
c0 = y0 c1 = c2 = y1 y 0 y 0 = h 1!h
(12.12)
(12.13)
Nd n (x)
(12.14)
Coeficienii y 0 , y 0 ...n y 0 se iau din tabelul (12.5) de pe latura de sus. Expresia acestui polinom poate fi pus sub form mai comod pentru aplicaii care s nu depind n mod explicit de nodurile reelei de interpolare, dac se noteaz:
t=
Atunci:
( x x 0 )( x x1 )...( x x k 1 ) hk
x x0 . h
(12.15)
Metode Numerice
Nd n ( x 0 + th ) = y 0 + ty 0 + t ( t 1) 2 y 0 + ... + 2! t ( t 1)...( t (n 1)) n + y0. n!
59
(12.17)
Dac se dorete interpolarea ntr-un punct oarecare x diferit de noduri, se calculeaz t i apoi se evalueaz N d n ( x 0 + th ) cu (12.17). Acest tip de polinom de interpolare se utilizeaz de obicei pentru aproximarea funciei f ntr-un punct x situat n vecintatea punctului x 0 . b) Polinomul de interpolare Newton de spea a II-a Acest tip de polinom utilizeaz diferenele finite la stnga. Modul de construcie al polinomului este oarecum asemntor. Se pornete de la:
Ns n ( x ) = c 0 + c1 ( x x n ) + c 2 ( x x n )( x x n 1 ) + + ... + c n ( x x n )( x x n 1 )...(x x1 ).
(12.18)
Ns n ( x i ) = f ( x i ) = y i , i = 0, n .
(12.19)
(12.20)
60 Ns n (x) = y n + + ... +
n yn n!h n
(12.21)
Coeficienii y n , y n ,..., n y n se iau din tabelul (12.9) de pe latura de jos. i aceast expresie a polinomului poate fi pus ntr-o form care s nu depind n mod explicit de nodurile reelei de interpolare, dac se noteaz:
t=
Se obine:
Ns n ( x n + th ) = y n +
x xn . h
(12.22)
y n 2yn t+ t ( t + 1) + ... + 1! 2!
n yn + t ( t + 1)...( t + (n 1)). n!
(12.23)
Acest polinom se utilizeaz de obicei pentru aproximarea funciei f ntr-un punct x situat n vecintatea punctului x n . Programul n MATLAB L12_Newton_DF.m
function val_functie = Newton_DF(xk,yk,x) % % % % % Aproximare prin Polinoame Newton cu diferente finite xk este vectorul nodurilor de interpolare, echidistante yk este vectorul valorilor functiei in nodurile xk Vectorii xk si yk trebuie sa aiba aceeasi lungime x este punctul in care se doreste aproximarea
Metode Numerice
disp('Cei doi vectori nu au aceeasi lungime !') return end n disp('Functia este cunoscuta prin valorile :') xk yk pause % Se verifica mai intai echidistanta nodurilor a=1; for i=1:n-2, if xk(i+1)-xk(i)==xk(i+2)-xk(i+1) else a=0; end end if a==1 h=xk(2)-xk(1); else disp('Punctele date nu sunt echidistante.') disp('Corectati reteaua de noduri xk !') disp(' ') return end % Calcul diferente finite
61
for i=0:n-2, Dyk(1,i+1)=yk(i+2)-yk(i+1); end for k=2:n-1, m=n-k; for i=1:m, Dyk(k,i)=Dyk(k-1,i+1)-Dyk(k-1,i); end end disp('Tabloul cu diferente finite de diverse ordine :') disp(' ') Dyk' pause % Calculul polinomului NW1 disp('Polinoamele NW1, calculate pas cu pas, sint:') P=yk(1);
62
Indrumar de laborator
NW1=P T=1; for k=1:n-1, pause T=T*(x-xk(k))/(k*h); P=P+Dyk(k,1)*T; NW1=P end disp('Valoarea functiei in punctul indicat') disp('aproximata prin Polinom Newton de speta I este :') NW1 pause
% Calculul polinomului NW2 disp('Polinoamele NW2, calculate pas cu pas, sint:') R=yk(n); NW2=R S=1; for k=1:n-1, pause S=S*(x-xk(n-k+1))/(k*h); R=R+Dyk(k,n-k)*S; NW2=R end disp('Valoarea functiei in punctul indicat') disp('aproximata prin polinom Newton') disp('de speta a II-a este :') NW2
Metode Numerice
63
LUCRAREA 13 Aproximarea funciilor prin metoda celor mai mici ptrate. Dreapta de regresie
Se consider funcia f cunoscut ntr-un ansamblu de noduri x 0 , x1 ,..., x n avnd valorile:
y i = f ( x i ), i = 0, n .
(13.1)
Se pune problema aproximrii acestei funcii printr-un polinom de grad m, m < n, de forma: Fm ( x ) = c 0 + c1x + ... + c m x m astfel nct abaterea medie ptratic i deci suma:
n
(13.2)
S=
k =0
[f (x k ) Fm (x k )]2
(13.3)
s aib o valoare minim. Cazul cel mai simplu l constituie aproximarea funciei f printrun polinom de gradul I reprezentnd geometric o dreapt de ecuaie
F1 ( x ) = ax + b .
Se impune condiia ca suma:
n
(13.4)
S(a , b) =
k =0
[y k (ax k + b)]2
(13.5)
(13.6)
64
Indrumar de laborator
Aceste relaii reprezint un sistem de 2 ecuaii cu 2 necunoscute care mai poate fi scris sub forma:
a x k + b(n + 1) = y k . 2 + = a x b x x y k k k k
(13.7)
Pentru uurina scrierii s-a renunat la limitele de sumare. Rezolvarea sistemului permite obinerea necunoscutelor a i b de forma:
a = b =
( x k )( y k ) (n + 1) x k y k ( x k )2 (n + 1) x 2 k . ( x 2k )( y k ) ( x k )( x k y k ) 2 (n + 1) x 2 k ( x k )
(13.8)
Se poate verifica uor, folosind derivatele de ordinul al II-lea pentru S(a,b) c valoarea obinut este o valoare minim. Procedura descris poate fi generalizat cutnd n locul funciei liniare o funcie polinomial de grad m, cu m<n. n aceast situaie, trebuie ca suma:
S=
k =0
[y k (c 0 + c1x k + ... + c m x m k )]
n
(13.9)
(13.10)
Dac se noteaz:
Metode Numerice
n i u i = x k k =0 n v = i i x k yk k =0
65
(13.11)
(13.12)
Soluia acestui sistem reprezint coeficienii c 0 ,..., c m ai polinomului de aproximare cutat. Aceast metod este utilizat frecvent n prelucrarea datelor experimentale. Atunci cnd se dispune de un numr mare de date (funcia f cunoscut ntr-un numr mare de puncte) iar la o simpl reprezentare grafic aceste date se grupeaz sub forma unui nor avnd o anumit dezvoltare, se poate face aproximarea funciei prin aceast metod. Nu se va putea gsi un polinom de aproximare care s treac prin toate punctele norului (deci nu se poate folosi interpolarea) dar se va putea gsi o funcie liniar (sau polinom de grad superior) care s urmreasc direcia norului de puncte ndeplinind condiia dat de relaia (13.3). Programul n MATLAB L13_regresie.m
function drp_regresie = regresie(xk,yk) % Aproximarea functiilor prin Metoda celor mai mici patrate % xk este vectorul nodurilor in care se cunosc valorile functiei % yk este vectorul valorilor functiei in nodurile xk % Vectorii xk si yk trebuie sa aiba aceeasi lungime n=length(xk); n
66
Indrumar de laborator
disp('Functia este cunoscuta prin valorile :') xk yk pause A=sum(xk); B=sum(xk.^2); C=sum(yk); D=sum(xk.*yk); disp('Ecuatia dreptei construita prin') disp('aceasta metoda este y=a*x+b, unde:') a=(n*D-A*C)/(n*B-A*A) b=(C*B-D*A)/(n*B-A*A) % Reprezentarea grafica a dreptei de regresie si a punctelor disp('Reprezentarea grafica arata astfel : (vezi Fig.1)') clf i=1:n; x=min(xk)-10:0.1:max(xk)+10; plot(xk(i),yk(i),'b*',x,a*x+b,'r.') grid
Metode Numerice
67
(14.1)
Singurul nod de calcul este punctul x1 . Acest nod este un punct interior intervalului [a,b]. Se calculeaz coeficientul Newton-Cotes:
(1) (1) I11 = 1 ; A1 = ( b a ) I11 = ( b a ).
(14.2)
Rezult:
~ a + b I = A1f ( x1 ) = ( b a ) f . 2
(14.3)
Relaia dat de (14.3) poart numele de "a doua formul a trapezelor". Restul acestei formule are expresia: R 1 (f ) = f ' ' ( ) (b a )3 = x ( x x ) dx 1 2! 12 a
b
(14.4)
h = ( b a ) ; x1 = a; x 2 = b .
(14.5)
n acest caz avem dou noduri, punctele x1 i x 2 , extremitile intervalului [a,b]. Coeficienii Newton-Cotes vor fi:
68
(2) I10
1 ba ; A1 = 2 2 ba A2 = 2
(14.6)
2) I( 20
1 = ( t 1)dt = ; 2 1
~ I=
k =1
A kf (x k ) =
ba (f (a ) + f ( b)) . 2
(14.7)
Aceast formul, dat de (14.7), se numete "prima formul a trapezelor". Restul formulei este, n acest caz, : f ' ' ( ) (b a )3 '' R 2 (f ) = ( x a )( x b ) = f ( ) . 2! 12 a
b
(14.8)
Aceste formule de cuadratur, aplicate o singur dat pentru ntregul interval, conduc la erori mari de aproximare. Pentru creterea preciziei se mbuntete prima formula a trapezelor prin mprirea intervalului [a,b] n n subintervale egale, prin punctele echidistante a = x 0 , x1 , x 2 ,..., x n = b. Se poate scrie: I = f ( x )dx =
a b n xi
i =1 x i 1
f ( x )dx = I i .
i =1
(14.9)
(14.10)
(14.11)
69
(14.12)
M( b a ) 3 12n 2
(14.13)
70
fct = exp(cos(x)); case 5 fct = exp(x); end
Indrumar de laborator
Metode Numerice
71
1 1 ba ( t 2)( t 3)dt = ; A1 = 41 6 6
3
3) I( 20
(15.1)
3) I( 30
deoarece
h=
(15.3)
~ I=
k =1
A kf (x k ) =
ba a + b f ( a ) + 4 f + f ( b) . 6 2
(15.4)
i aceast formul de cuadratur introduce erori mari. Ea poate fi mbuntit prin mprirea intervalului [a,b] n 2n subintervale egale prin punctele a = x 0 , x1 ,..., x n = b , de pas h = ( b a ) / 2 n i prin aplicarea formulei lui Simpson pe cte dou subintervale consecutive, scriind integrala: I = f ( x )dx =
a b n x 2i
i =1 x 2 i 2
f ( x )dx = I i .
i =1
(15.5)
72
Indrumar de laborator
Folosind valoarea integralei dat de (15.4), se poate determina valoarea aproximativ pentru I i :
~ x 2i x 2i 2 Ii = f ( x 2i 2 ) + 4f ( x 2i 1 ) + f ( x 2i ) . 6
(15.6)
Rezult:
n n 1 ~ n ~ h . f ( a ) 4 f ( x ) 2 f ( x ) f ( b ) I = Ii = + + + 2 i 1 2 i 3 i =1 i =1 i =1
(15.7)
unde x i = x 0 + ih, i = 1,2n . Pentru evaluarea restului se recurge n mod asemntor la formula trapezelor, determinnd mai nti restul pentru un interval de forma [x 2i 2 , x 2i ] : f ( 4) ( 2i ) 2 i R 3i (f ) = x( x x 2i 2 )( x x 2i 1 )( x x 2i )dx . (15.8) 4! x
2 i2
Rezult:
R 3i (f ) = ( x 2i x 2i 2 )5 ( 4 ) f ( 2i ) . 2880
(15.9)
unde 2i ( x 2i 2 , x 2i ) . Dac exist M>0 astfel nct f ( 4 ) ( x ) M , () x (a , b) atunci se poate scrie restul pentru ntreaga formul:
R 3 (f )
( b a )5 2880n 4
M.
(15.10)
Metode Numerice
h=(b-a)/(2*n) int=0; n
73
format long for i=0:n-1, int=int+h*(f(a+2*i*h,index_f)+4*f(a+h+2*i*h,index_f)+ +f(a+2*h+2*i*h,index_f))/3; end disp('Valoarea integralei este :') int % Definirea functiei de integrat. function fct = f(x,index) switch index case 1 fct = exp(-x.^2); case 2 fct = 1 ./(1+x.^2); case 3 fct = 1 ./(2+sin(x)); case 4 fct = exp(cos(x)); case 5 fct = exp(x); end
74
Indrumar de laborator
(16.1)
a crei valoare exact nu poate fi determinat analitic. Formulele lui Gauss de cuadratur numeric sunt tot de forma:
~ I I =
k =1
A kf (x k ) ,
(16.2)
dar se caut s se determine att nodurile x k , ct i coeficienii A k , k = 1, n , astfel nct s se obin un grad de exactitate ct mai mare pe clasa polinoamelor algebrice. Dac aproximarea funciei f se consider un polinom construit pe baza irului fundamental 1, x , x 2 ,..., x m , vom avea:
i p( x )f ( x )dx = A k x k , i = 0, m . a k =1 b n
(16.3)
Relaia (16.3) reprezint un sistem de (m+1) ecuaii cu 2n necunoscute (nodurile x k i coeficienii A k , k = 1, n ). Pentru a avea o soluie unic trebuie s avem m + 1 = 2n , adic m = 2 n 1 . Rezult c gradul de exactitate al formulelor Gauss este m = 2 n 1 . Determinarea nodurilor x k i a coeficienilor A k , k = 1, n prin rezolvarea sistemului (16.3) este dificil, sistemul fiind neliniar. Se caut alt modalitate de determinare a necunoscutelor i anume: Se consider un polinom oarecare de grad 2 n 1 , notat P2 n 1 ( x ) pentru care formula de cuadratur este exact:
(16.4)
Metode Numerice
75
Wn ( x ) = ( x x1 )( x x 2 )...(x x n ) .
Se face mprirea cu rest a lui P2 n 1 ( x ) la Wn ( x ) :
(16.5)
P2 n 1 ( x ) = Wn ( x )q( x ) + ( x )
(16.6)
cu grad q n - 1, grad < n. pentru Wn ( x ) ( x ) , de grad 2 n 1 , formula de cuadratur este exact, adic:
(16.7)
deoarece Wn ( x k ) = 0, k = 1, n . Rezult polinomul Wn ( x ) este ortogonal oricrui polinom (x) de grad (n-1), cu ponderea p(x). Se poate demonstra c pentru p(x) 1, polinoamele Wn ( x ) care au coeficientul lui x n egal cu 1 i care sunt ortogonale pe [a,b] oricrui polinom de grad cel mult (n-1) sunt polinoamele Legendre de forma: Wn ( x ) = n! d n (x a )n (x b )n . n ( 2n )! dx
(16.8)
n plus, aceste polinoame au proprietatea c toate rdcinile lor sunt reale i cuprinse n intervalul (a,b). Polinoamele Wn ( x ) fiind determinate, sunt determinate i nodurile x k , k = 1, n , ca fiind rdcinile acestui polinom. Determinarea coeficienilor A k , k = 1, n se poate face acum rezolvnd sistemul (16.3) care devine liniar. Mai comod, se poate proceda astfel: Se consider polinomul:
Q k (x ) = Wn ( x ) x xk
(16.9)
76
Indrumar de laborator
de grad (n 1). Ptratul su, Q2 k ( x ) , de grad (2n 2), se anuleaz n punctele x = x i , i k , deoarece din expresia lui Q k ( x ) lipsete paranteza (x x k ) . Avnd gradul (2n-2), pentru acest polinom formulele de cuadratur sunt exacte, adic:
2 2 2 Q k ( x )dx = AiQ k ( x i ) = A kQ k ( x k ) . a i =1 b n
(16.10)
+
a
+ 2
a
(16.11)
Wn ( x ) W ' n ( x ) dx x xk
Primul termen poate fi calculat dac n scrierea lui Wn ( x ) se folosete formula de derivare Leibniz:
Wn ( x ) =
Rezult:
nk n! n k d k n d ( ) (x b)n C x a n k n k (2n )! k = 0 dx dx
(16.12)
Wn (a ) = ( 1) n
( n! ) 2 (b a) n ( 2n )!
( n! ) 2 Wn ( b) = (b a ) n ( 2n )!
(16.13)
Ultima integral din (16.11) este exact deoarece polinomul de sub integral este de grad (2n-2). Vom avea:
' ' 2 Q k ( x ) Wn ( x )dx = 2 A i Q k ( x i ) Wn (x i ) . a i =1 b n
(16.14)
Metode Numerice innd cont de expresia lui Q k ( x ) din (16.9) se poate scrie:
' Q k ( x k ) = Wn (x k ) .
77
(16.15)
Se obine: Ak
[W (x )]
' n k
[(2n)!)]2 (a x k )( b x k )
( n! ) 4 ( b a ) 2 n +1
( n! ) 4 ( b a ) 2 n +1
' + 2A k Wn (x k )
(16.16)
(16.17)
De obicei, polinoamele Legendre i rdcinile lor se calculeaz pentru intervalul [-1,1]. Trecerea de la acest interval la intervalul [a,b] se poate face prin:
x= (b a )t + (b + a ) , t [ 1 , 1 ] . 2
(16.18)
Coeficienii A k se pot determina independent de funcie i de limitele de integrare i pot fi tabelai. Se poate demonstra c restul formulei de cuadratur Gauss este de forma:
R 2 n (f ) =
( n! ) 4 ( b a ) 2 n +1
[(2n )!]
(2n + 1)!
f ( 2 n ) (),
(16.19)
unde (a,b). Aceste formule de cuadratur conduc la cele mai exacte rezultate, chiar i pentru un numr mic de noduri. De multe ori, atunci cnd valorile lui f sunt dificil de calculat, formulele lui Gauss pentru un numr mic de noduri sunt de preferat altor formule de cuadratur. Pentru calculul rdcinilor polinomului Legendre de diverse grade se poate folosi urmtorul program MATLAB:
Indrumar de laborator
% Functia permite determinarea radacinilor % polinomului Legendre de grad n folosit in % Formula de integrare Gauss a=[1 0 -1]; b=[1]; for i=1:n, b=conv(a,b); end % Aranj(n,k)=Comb(n,k)*Perm(k) % Noul coef b este vechiul coef b * Aranj(n,k) for i=1:n+1, b(i)=nchoosek((2*n-i+1),n)*factorial(n)*b(i); b=b(1:n+1); end format long rad_leg=roots(b); set_pct=sort(rad_leg); disp(' ') disp('Setul de puncte pe [-1, 1] este :') set_pct
Calculul integralei prin formule Gauss se face utiliznd urmtorul program MATLAB: Programul n MATLAB : L16_gauss_int.m
function integr = gauss_int(a,b,n,index_f); % % % % % % [int,baza,pond] = gauss_int(fun,a,b,n) integreaza functia f intre a si b folosind metoda lui Gauss in n puncte, care este o metoda exacta pentru un polinom de grad 2*n-1. Conceput dupa modelul din 'Methods of Numerical Integration', autori Philip Davis si Philip Rabinowitz, dupa care au fost
Metode Numerice
% alese punctele de integrare % de ponderare. si factorii
79
% a,b - limitele de intergrare % n - ordinul formulei lui Gauss (implicit n = 20) % int - valoarea integralei % baza, pond - sistemul de puncte si factorii de ponderare pe [-1,1] % index_f - indexul functiei de integrat. format long if nargin < 4, n=20; end u = (1:n-1)./sqrt((2*(1:n-1)).^2-1); [vc,baza] = eig(diag(u,-1)+diag(u,1)); [baza,k] = sort(diag(baza)); pond = 2*vc(1,k)'.^2; x = (a+b)/2+((b-a)/2)*baza; % Punctele in care se face calculul valorilor functiei: disp(' ') disp('Baza de noduri din intervalul [-1, 1] ') disp('pe care se bazeaza formula de calcul Gauss :') baza pause disp('Punctele reale in care se face calculul valorilor functiei :') x pause disp('Ponderile valorilor functiei f in aceste puncte :') pond pause f = fcn(x,index_f)*(b-a)/2; int = pond(:)'*f(:); disp('Valoarea integralei este: ') int % Definirea functiei de integrat function fct = fcn(x,index)
80
switch index case 1 fct = exp(-x.^2); case 2 fct = 1 ./(1+x.^2); case 3 fct = 1 ./(2+sin(x)); case 4 fct = exp(cos(x)); case 5 fct = exp(x); end
Indrumar de laborator