Sunteți pe pagina 1din 35

ELEMENTE DE SIMULARE NUMERICA

IN MATLAB
Curs 2
1
2. ECUATII NELINIARE
Ne punem problema calcularii zerourilor unei functii f , sau
echivalent, a radacinilor ecuatiei
f(x) = 0.
Aceasta problema se intalneste des in calculul stiintic si in simu-
larea numerica. In general, daca f este o functie neliniara, acest
calcul nu poate realizat intr-un numar nit de pasi. Chiar
si pentru polinoame de grad 5 nu exista o formula explicita
pentru radacini.
Din acest motiv, se folosesc metode iterative de aproximare a
solutiei. Pornind de la un set de date initiale, metoda iterativa
construieste un sir de valori x
(k)
care trebuie sa convearga la
valoarea a radacinii cautate, adica sa avem f() = 0.
2
Exemple de probleme care se reduc la ecuatii neliniare:
1. Problema fondului de investitii. La inceputul ecarui an,
clientul unei banci depoziteaza v lei intr-un fond de investitii si,
la sfarsitul celui de-al n lea an, retrage suma de M lei. Sa
calculam rata medie de crestere anuala I a acestui fond.
Relatia matematica intre v , M si I este:
M = v
n

k=1
(1 +I)
k
= v
1 +I
I
[(1 +I)
n
1] .
Astfel, problema se reduce la rezolvarea ecuatiei neliniare
f(I) = 0, unde f(I) = M v
1 +I
I
[(1 +I)
n
1] . (1)
Vom rezolva aceasta problema in cele ce urmeaza.
3
2. Ecuatia de stare a unui gaz. Sa determinam volumul V
ocupat de un gaz, la temperatura T si presiunea p. Ecuatia de
stare (adica ecuatia ce leaga V , T si p) este:
[p +a(N/V )
2
](V Nb) = kNT , (2)
unde a si b sunt doi coecienti ce depind de gazul particular, N
este numarul de molecule continute in volumul V si k este asa-
numita constanta a lui Boltzmann.
Pentru a rezolva problema trebuie deci sa rezolvam ecuatia neliniara
de mai sus, cu necunoscuta V .
4
2.1. Metoda injumatatirii intervalului.
Fie f o functie continua pe intervalul [a, b] si care satisface condi-
tia f(a)f(b) < 0. Atunci, f se va anula cu singuranta in intervalul
(a, b). Pentru simplitate, presupunem ca f are o radacina unica
in (a, b) si o notam cu .
(In cazul cand exista mai multe radacini in (a, b), cu ajutorul
gracului obtinut prin fplot putem localiza un interval ce con-
tine o singura radacina.)
Strategia acestei metode iterative consta in a imparti intervalul
dat in cele doua jumatati si a selecta acel subinterval pe care f
isi schimba semnul. Subintervalul ales va contine cu siguranta
radacina .
Procedeul se repeta pana cand ultimul subinterval ales devine
atat de mic, incat a fost atinsa precizia dorita pentru aproxi-
marea solutiei (v. gura).
5
I
(0)
I
(1)
I
(2)
I
(3)
a
(0)
x
(0)
x
(1)
x
(2)
x
y
b
(0)
f
6
Notand cu I
(k)
sirul subintervalelor selectate iterativ si cu x
(k)
sirul mijloacelor acestor subintervale, rezulta ca
x
(k)
pentru k ,
deorece lungimea subintervalelor tinde la zero.
Intr-adevar avem |I
(k)
| = (1/2)
k
|I
(0)
| . Atunci, eroarea e
(k)
la
pasul cu numarul k satisface estimarea
|e
(k)
| = |x
(k)
| <
1
2
|I
(k)
| =

1
2

k+1
(b a).
Notam cu precizia (toleranta) admisa pentru aproximarea so-
lutiei . In acest caz, pentru a satisface inegalitatea dorita
|e
(k)
| < , este sucient sa facem un numar de iteratii k
min
,
unde k
min
este cel mai mic intreg ce indeplineste conditia
k
min
> log
2

b a

1. (3)
7
Se observa ca inegalitatea nu depinde de alegerea functiei f !
Observatii critice :
In ciuda simplitatii sale, metoda injumatatirii nu garanteaza o re-
ducere monotona a erorii. Intrucat singurul criteriu este lungimea
subintervalului la ecare pas, in acest procedeu se pot elimina
aproximari foarte bune ale solutiei.
De fapt, aceasta metoda nu ia in considerare pe deplin com-
portarea functiei f. Surprinzator este faptul ca metoda nu con-
verge dintr-o singura iteratie nici macar in cazul unei functii f
liniare.
8
Procedeul iterativ este urmatorul: Se incepe cu
a
(0)
= a, b
(0)
= b, I
(0)
= (a
(0)
, b
(0)
), x
(0)
= (a
(0)
+b
(0)
)/2.
La pasul k se alege subintervalul I
(k)
= (a
(k)
, b
(k)
) din intervalul
I
(k1)
= (a
(k1)
, b
(k1)
) astfel:
pentru x
(k1)
= (a
(k1)
+b
(k1)
)/2,
daca f(x
(k1)
) = 0 atunci = x
(k1)
si procedeul se opreste; in rest,
daca f(a
(k1)
)f(x
(k1)
) < 0 se ia a
(k)
= a
(k1)
, b
(k)
= x
(k1)
;
daca f(x
(k1)
)f(b
(k1)
) < 0 se ia a
(k)
= x
(k1)
, b
(k)
= b
(k1)
.
Se deneste x
(k)
= (a
(k)
+b
(k)
)/2 si k trece in k +1.
9
Metoda injumatatirii intervalului este implementata in programul
bisectie.m .
Variabile de intrare: fun este un sir de caractere (sau o functie
inline) care da expresia functiei f , a si b sunt extremitatile
intervalului de cautare, tol este toleranta admisa, iar nmax
este numarul maxim de iteratii admise. Atunci cand fun este o
functie inline (sau o functie denita intr-un sierM), ea poate
depinde si de alti parametri auxiliari (in afara de variabila x) care
sunt trecuti in varargin.
Variabile de iesire: zero contine valoarea aproximativa calculata
pentru radacina , valoarea reziduala res care indica valoarea
functiei f in zero, si niter care este egal cu numar de iteratii
folosite de program.
10
Se utilizeaza urmatoarele instructiuni :
Comanda nd(fx==0) gaseste componentele vectorului fx care
sunt egale cu zero:
nd([2 3 9 0 6]==0)
ans = 4
Comanda sign(fx) ne da semnul componentelor vectorului fx:
sign([-8 0 5 64])
ans = -1 0 1 1
11
function [zero, res, niter]=bisectie(fun, a, b, tol, nmax, varargin)
%Calculeaza zerourile unei functii folosind metoda injumatatirii
intervalului
x = [a, (a+b)*0.5, b];
fx = feval(fun,x,varargin{:});
if fx(1)*fx(3)>0
error( Semnul functiei FUN trebuie sa se schimbe in extrem-
itatile intervalului );
elseif fx(1) == 0
zero = a; res = 0; niter = 0;
return
elseif fx(3) == 0
zero = b; res = 0; niter = 0;
12
return
end
niter = 0;
I = (b - a)*0.5;
while I >= tol & niter <= nmax
niter = niter + 1;
if sign(fx(1))*sign(fx(2)) < 0
x(3) = x(2); x(2) = x(1)+(x(3)-x(1))*0.5;
fx = feval(fun,x,varargin{:}); I = (x(3)-x(1))*0.5;
elseif sign(fx(2))*sign(fx(3)) < 0
x(1) = x(2); x(2) = x(1)+(x(3)-x(1))*0.5;
fx = feval(fun,x,varargin{:}); I = (x(3)-x(1))*0.5;
else
x(2) = x(nd(fx==0)); I = 0;
end
13
end
if niter > nmax
fprintf(A fost depasit numarul maxim de iteratii admis\n);
end
zero = x(2);
x = x(2); res = feval(fun,x,varargin{:});
return
14
Exemplu: Sa rezolvam problema fondului de investitii (Problema
1) prin aplicarea metodei injumatatirii intervalului. Consideram
ca v = 1000 lei (contributia anuala) si ca dupa 5 ani (n=5)
clientul obtine M = 6000 lei. Gracul functiei f(I) din ecuatia
(1), pe intervalul [0.01,0.3], poate obtinut prin comenzile:
f=inline(M-v*(1+I).*((1+I).5-1)./I,I,M,v)
fplot(f,[0.01,0.3],[ ],[ ],[ ],6000,1000); grid on
S-a luat tol=[ ], n=[ ], LineSpec=[ ], M=6000, v=1000.
Din grac se observa ca functia f are un zero unic in intervalul
(0.01,0.1), care este apropiat de valoarea 0.06.
15
0.05 0.1 0.15 0.2 0.25 0.3
6000
5000
4000
3000
2000
1000
0
1000
16
Executam programul bisectie cu parametrii a=0.01 , b=0.1 si
tol=10
12
:
[zero,res,niter]=bisectie(f, 0.01, 0.1, 10(-12), 40, 6000, 1000)
zero = 0.061402
res = 6.0390e-009
niter = 36
Numarul de iteratii este in acord cu estimarea din inegalitatea
(3), care ne da: k
min
= 36. Intr-adevar, avem
log((0.1-0.001)/10(-12))/log(2) -1
ans = 35.5267
In concluzie, rata medie de crestere anuala I a acestui fond este
aproximativ egala cu 6.14 %.
17
2.2. Metoda lui Newton.
O metoda mai ecienta de aare a radacinilor ecuatiei f(x) = 0
poate construita daca se tine seama de derivata functiei f.
In cazul cand f este derivabila, ecuatia dreptei tangente la gra-
cul functiei f intr-un punct x
(k)
este data de
y(x) = f(x
(k)
) +f

(x
(k)
) (x x
(k)
).
Denim punctul x
(k+1)
prin conditia ca y(x
(k+1)
) = 0, adica
x
(k+1)
este intersectia dreptei tangente cu axa absciselor Ox.
Obtinem ca
x
(k+1)
= x
(k)

f(x
(k)
)
f

(x
(k)
)
, (daca f

(x
(k)
) = 0). (4)
18
Formula (4) ne permite sa calculam un sir de valori x
(k)
, pornind
de la o estimare initiala x
(0)
. Pentru k sucient de mare, x
(k)
va
reprezenta o aproximare a solutiei.
Aceasta metoda iterativa este cunoscuta sub numele de metoda
lui Newton si consta, in principiu, in a calcula zeroul functiei
neliniare f prin inlocuirea gracului functiei f cu dreapta tangenta
(local). O reprezentare graca a acestor iteratii (pentru exemplul
f(x) = x +e
x
+10/(1 +x
2
) 5) este data in gura.
O justicare a metodei lui Newton poate obtinuta din formula
lui Taylor: dezvoltam functia f in jurul unui punct generic x
(k)
f(x
(k+1)
) = f(x
(k)
)+(x
(k+1)
x
(k)
)f

(x
(k)
)+O

(x
(k+1)
x
(k)
)
2

.
Daca neglijam termenul O

(x
(k+1)
x
(k)
)
2

si impunem sa aiba
loc relatia f(x
(k+1)
) = 0, atunci din egalitatea de mai sus obtinem
pe x
(k+1)
exprimat in functie de x
(k)
exact ca in relatia (4).
19
2 1.5 1 0.5 0 0.5 1 1.5 2
6
4
2
0
2
4
6
8
x
(0)
x
(1)
x
(2)
x
(3)
f

20
Se vede ca metoda lui Newton converge dintr-o singura iteratie
daca functia f este liniara: f(x) = a
1
x +a
0
. Intr-adevar,
x
(1)
= x
(0)

a
1
x
(0)
+a
0
a
1
=
a
0
a
1
.
In general, metoda lui Newton nu converge pentru orice alegere
a estimarii initiale x
(0)
, ci numai pentru acele valori ale lui x
(0)
care sunt sucient de apropiate de radacina .
Initial, pare greu de ales o estimare initiala apropiata de , in-
trucat radacina este ea insasi necunoscuta.
In practica, acest lucru se poate face cu ajutorul gracului func-
tiei f, sau executand cateva iteratii ale metodei injumatatirii
intervalului.
21
Daca estimarea initiala x
(0)
este convenabil aleasa si este o
radacina simpla, atunci metoda lui Newton converge.
Sa aratam ca in acest caz, daca functia f este de clasa C
2
intr-o vecinatate a lui , atunci are loc urmatorul rezultat de
convergenta:
lim
k
x
(k+1)

(x
(k)
)
2
=
f

()
2f

()
. (5)
Din dezvoltarea Taylor in jurul lui x
(k)
obtinem:
0 = f() = f(x
(k)
)+(x
(k)
)f

(x
(k)
)+
1
2
(x
(k)
)
2
f

(x
(k)
)+O

(x
(k)
)
3

.
Pe de alta parte, din relatia de recurenta (4) avem:
(x
(k+1)
) = (x
(k)
)
f(x
(k)
)
f

(x
(k)
)
.
22
Inlocuind pe x
(k)
din ultima egalitate in penultima se obtine
(x
(k+1)
) =
1
2
(x
(k)
)
2
f

(x
(k)
)
f

(x
(k)
)
+O

(x
(k)
)
3

.
Impartim cu (x
(k)
)
2
si facem k .
Folosind presupunerea ca x
(k)
, se obtine rezultatul dorit (5).
In virtutea relatiei (5), se spune ca metoda lui Newton are o
convergenta patratica (sau de ordin 2).
In cazul cand radacina are o multiplicitate m > 1, metoda lui
Newton are doar o convergenta liniara (adica de ordin 1). Pentru
a obtine o metoda iterativa de ordinul 2 si in acest caz, relatia
de recurenta (4) trebuie modicata in felul urmator:
x
(k+1)
= x
(k)
m
f(x
(k)
)
f

(x
(k)
)
, (daca f

(x
(k)
) = 0). (6)
23
Aplicarea acestei metode Newton modicata necesita insa sa
cunoastem dinainte multiplicitatea m a radacinii .
Teoretic, metoda lui Newton va converge catre radacina intr-
un numar innit de iteratii. Practic, algoritmul se va opri dupa
ce s-a obtinut o aproximare a lui cu o precizie dorita . Intrucat
este necunoscuta, nu putem estima direct eroarea
|e
(k)
| = | x
(k)
| < .
Trebuie gasita o alta modalitate de estimare a erorii care sa e
usor de calculat. Pentru metoda lui Newton, estimarea erorii se
face calculand diferenta dintre doua iteratii succesive x
(k)
.
Cu alte cuvinte, algoritmul se va opri la pasul k
min
, unde k
min
este cel mai mic intreg ce satisface
|x
(k
min
)
x
(k
min
1)
| < .
24
In programul metnewton.m este implementata metoda lui New-
ton clasica, data de relatia de recurenta (4). Metoda modicata
a lui Newton, data de relatia (6), poate obtinuta foarte usor
prin inlocuirea lui f

cu f

/m.
Variabilele de intrare sunt sirurile de caractere f si df prin care
se denesc functia f si prima derivata a ei f

, iar x0 este
estimarea initiala. Algoritmul se opreste cand diferenta dintre 2
iteratii succesive este mai mica decat toleranta tol , sau cand
numarul maxim de iteratii nmax a fost atins.
25
function [zero,res,niter]=metnewton(f,df,x0,tol,nmax,varargin)
%Calculeaza zerourile unei functii folosind metoda lui Newton
x = x0;
fx = feval(f,x,varargin{:});
dfx = feval(df,x,varargin{:});
niter = 0;
di = tol+1;
while di >= tol & niter <= nmax
niter = niter + 1;
di = - fx/dfx;
x = x + di;
di = abs(di);
fx = feval(f,x,varargin{:});
dfx = feval(df,x,varargin{:});
26
end
if niter > nmax
fprintf([A fost depasit numarul de iteratii admis\n]);
end
zero = x;
res = fx;
return
27
Exemplu: Sa rezolvam problema fondului de investitii (Prob-
lema 1) folosind metoda lui Newton. Forma functiei f este data
de (1). Intai vom executa 4 iteratii cu metoda injumatatirii in-
tervalului pentru a gasi o estimare initiala x0 convenabila.
f=inline(M-v*(1+I).*((1+I).n-1)./I,I,M,v,n)
df=inline(-v*((1+I).n-1)./I-n*v*(1+I).n./I+v*(1+I).*...
((1+I).n-1)./I.2,I,M,v,n) % Derivata lui f
[zero,res,niter]=bisectie(f,0.01,0.1,1.e-12,4,6000,1000,5)
A fost depasit numarul maxim de iteratii admis
zero = 0.0620
res = -11.0964
niter =5
28
% Astfel s-a obtinut o estimare initiala zero = 0.0620.
[zero,res,niter]=metnewton(f,df,zero,1.e-12,100,6000,1000,5)
zero = 0.0614
res = -6.3665e-012
niter = 3
Se observa ca metoda lui Newton converge in doar 3 iteratii !
Expresia derivatei se poate obtine folosind derivarea functiilor de
variabila simbolica.
29
2.2.1. Metoda lui Newton pentru sisteme de ecuatii neliniare.
Consideram sisteme de ecuatii neliniare de forma:
f
1
(x
1
, x
2
, ..., x
n
) = 0,
f
2
(x
1
, x
2
, ..., x
n
) = 0,
.........
f
n
(x
1
, x
2
, ..., x
n
) = 0.
Notand cu f = (f
1
, ..., f
n
)
T
si x = (x
1
, ..., x
n
)
T
, atunci sistemul
de mai sus poate scris in forma compacta
f(x) = 0. (7)
Pentru a extinde metoda lui Newton si in cazul sistemelor de
ecuatii, vom inlocui derivata f

a functiei scalare f cu matricea
Jacobiana J
f
a functiei vectoriale f, care se deneste prin:

J
f

ij
=
f
i
x
j
, i, j = 1, ..., n.
30
Cu aceste notatii, metoda lui Newton pentru ecuatia vectoriala
(7) se exprima in felul urmator: se alege estimarea initiala x
(0)

R
n
si se construieste iterativ sirul care va aproxima solutia prin:
x
(k+1)
= x
(k)
+x
(k)
, k = 0, 1, 2, ... (8)
unde x
(k)
este dat de: J
f
(x
(k)
)x
(k)
= f(x
(k)
).
Dupa cum se vede din (8), ecare iteratie a metodei lui Newton
pentru sisteme necesita rezolvarea unui sistem liniar cu matricea
coecientilor egala cu J
f
(x
(k)
).
Programul newtonsis.m implementeaza aceasta metoda si folos-
este comanda Matlab \ pentru rezolvarea sistemelor liniare in
care apare matricea Jacobiana J
f
(x
(k)
).
Variabilele de intrare sunt: un vector coloana x0 ce contine esti-
marile initiale, precum si doua functii Matlab (denite de utiliza-
tor in sereM) Ffun si Jfun . Aceste functii calculeaza functia
31
vectoriala f si respectiv matricea Jacobiana J
f
intr-un punct
generic x. Algoritmul se opreste cand diferenta intre 2 iteratii
succesive este mai mica (in norma euclidiana) decat toleranta
tol, sau cand a fost depasit numarul maxim de iteratii stabilit
nmax.
function [x, F, iter]=newtonsis(Ffun,Jfun,x0,tol,nmax,varargin)
% Calculeaza solutia unui sistem de ecuatii neliniare cu metoda
lui Newton
iter = 0; err = tol + 1; x = x0;
while err > tol & iter <= nmax
J = feval(Jfun, x, varargin{:});
F = feval(Ffun, x, varargin{:});
delta = - J \ F; % Rezolvarea sistemelor liniare
32
x = x + delta;
err = norm(delta);
iter = iter + 1;
end
F = norm(feval(Ffun, x, varargin{:})); % Valorile reziduale
if iter >= nmax
fprintf(Algoritmul nu converge in numarul de iteratii admis\n);
fprintf(Ultima iteratie da valoarea reziduala %e\n, F);
else
fprintf(Algoritmul converge la iteratia %i si da valoarea rezid-
uala %e\n, iter, F);
end
return
33
Exemplu: Sa se ae solutia sistemului de ecuatii
x
2
1
+x
2
2
= 1,
sin(x
1
/2) +x
3
2
= 0.
Scriem 2 functii Matlab in 2 siereM separate:
function F=Ffun(x)
F(1,1) = x(1)2 + x(2)2 - 1;
F(2,1) = sin(pi*x(1)/2) + x(2)3;
return
si
function J=Jfun(x)
pi2=0.5*pi;
J(1,1)=2*x(1); J(1,2)=2*x(2);
J(2,1)=pi2*cos(pi2*x(1)); J(2,2)=3*x(2)2;
return
34
In fereastra de comenzi, rezolvam sistemul prin
x0=[1;1]; tol=1.e-5; maxiter=10;
[x,F,iter]=newtonsis(Ffun,Jfun,x0,tol,maxiter)
Algoritmul converge la iteratia 8, valoarea rezid. 2.235421e-011
x = 0.4761 -0.8794
F = 2.2354e-011
iter = 8
Convergenta algoritmului va depinde de alegerea estimarii initiale
x
(0)
.
Pentru aplicarea metodei, trebuie sa avem det(J
f
(x
(0)
)) = 0.
35

S-ar putea să vă placă și