#05
LUCRAREA #05
CUPRINSUL LUCRRII
1. Consideraii introductive
2. Metoda njumtirii intervalului (metoda biseciei)
3. Metoda falsei poziii
4. Metoda Newton-Raphson (metoda tangentei)
5. Metoda secantei
6. Rezolvarea ecuaiilor polinomiale
7. Aplicaii de laborator
63
#05
1. Consideraii introductive
Se consider f(x)=0, cu x [a,b]., n care f(x) este o funcie continu, f(x):[a,b] R.
Se presupune c ecuaia admite o soluie real x*, izolat pe acest interval i se
dorete gsirea ei.
Dac f(x) ar fi o funcie liniar, problema este banal i admite o soluie analitic.
S presupunem c f(x) este neliniar. Dac f este un polinom, atunci ecuaia se
numete polinomial, dac nu, ecuaia se numete transcendent.
Metodele de gsire a soluiei sunt de obicei metode iterative. Aceste metode
furnizeaz un ir de aproximaii, care tinde la x*, n anumite condiii.
O metod iterativ presupune 3 aspecte importante:
Alegerea unei condiii iniiale pentru soluia ecuaiei;
Relaia de iteraie ce st la baza calculului irului de aproximaii;
Condiii de oprire a procesului iterativ de calcul.
Se vor studia 4 metode iterative de rezolvare a ecuaiilor i anume:
1. Metoda biseciei sau metoda njumtirii intervalului;
2. Metoda falsei poziii;
3. Metoda lui Newton sau metoda tangentei.
4. Metoda secantei
#05
(b a)
. Numrul de iteraii va fi
2m
(b a)
tol . n acest fel rezult:
2m
(b a )
m log 2
tol
dat de relaia:
(5.2)
y f(a)=f(a0)
f(x)
x0
x0
a0 b0
2
b=b0
x
a=a0
f(x0)
f(b)=f(b0)
f(x0)*f(a0)<0, deci se pastreaza intervalul din stanga lui x0
f(a1)
f(x1)
b1
a1
x1
a1 b1
2
x1
x
f(b1)
Dup cele spuse mai sus se poate construi algoritmul de rezolvare al unei ecuaii
cu metoda biseciei:
Date de intrare:
a, b capetele intervalului
f funcia continu
tol precizia determinrii soluiei
Date de ieire:
sol soluia ecuaiei
val valoarea funciei n soluie
err eroarea de calcul
1: Calculeaz f(a), f(b)
2: Dac f(a)f(b)<0
atunci f admite soluie pe intervalul [a,b]
altfel f nu admite soluie. Stop
sfarsit daca
3: Calculeaz max_iteratii=1+round((log(b-a)-log(tol))/log(2))
4: pentru k=1 pn la max_iteratii
Calculeaz c=(a+b)/2
Calculeaz f(c)
dac f(c)=0
atunci a=c; b=c;
altfel dac f(b)f(c)<0
atunci b=c
altfel a=c
sfarsit daca
sfarsit daca
dac b-a<tol
65
#05
atunci Exit
sfarsit daca
5: Calculeaz sol=(a+b)/2
err=abs(b-a)
val=f(c)
6: afieaz valorile obinute
Rezolvarea n MatLab:
n cele ce urmeaz se propune o soluie de implementare a metodei biseciei n
limbajul de programare MatLab.
Pentru a avea generalitate, adic pentru a putea fi folosit la orice ecuaie algebric,
se implementeaz, dup algoritmul de mai sus, o funcie care poate fi adugat celorlalte
funcii MatLab. Se mai face nc o data observaia, ca pentru a funciona, aceasta trebuie
salvat ntr-un folder, a crui cale a fost setat cu opiunea Set path....
Codul de program MatLab pentru metoda biseciei poate fi urmtorul; acesta a
fost scris folosind multe comentarii pentru a putea fi neles mai uor.
function [solutie,val,eroare]=mbisect(f,a,b,tol)
echo off;
%functie pentru rezolvarea ecuatiilor algebrice prin metoda bisectiei
%sau metoda injumatatirii intervalului
% Intrari
%
f
numele functiei descrisa intr-un fisier functie
%
a
limita stanga a intervalului
%
b
limita dreapta a intervalului
%
tol
toteranta de caclul
% Iesiri
%
solutie
Solutia ecuatiei pe intervalul stabilit
%
val
Valoarea functiei in "solutie"
%
eroare
Eroarea estimata pentru solutie
ya=feval(f,a);
yb=feval(f,b);
if ya*yb<0
fprintf('Se observa ca ecuatia are solutie pe intervalul [%d %d]',a,b)
else
error('Ecuatia nu prezinta solutie pe intervalul stabilit')
return;
end
disp('Apasa o tasta...');
pause;
nr_iteratii=1 + round((log(b-a)-log(tol))/log(2));
for k=1:nr_iteratii
solutie=(a+b)/2;
val=feval(f,solutie);
if val==0
a=solutie;
b=solutie;
elseif yb*val>0
b=solutie;
yb=val;
else
a=solutie;
ya=val;
end
if b-a<tol
break;
end
end
66
#05
solutie=(a+b)/2;
val=feval(f,solutie);
eroare=abs(b-a)/2;
O dat scris i salvat ntr-o cale definit, funcia poate fi apelat pentru diverse
ecuaii i pentru diverse intervale.
Practic, pentru a calcula soluiile unei ecuaii folosind aceast metod, respectiv
aceast funcie definit mai sus, se parcurg urmtoarele etape:
1. se definete ntr-un fiier function, funcia matematic ce definete ecuaia;
2. se reprezint grafic funcia, pn cnd se descoper intervalele pe care ecuaia
are soluii izolate. Citirea acestor date se poate face interactiv folosind funcia MatLab
ginput;
3. se apeleaz funcia mbisect de tot attea ori, cte intervale s-au descoperit la
pasul anterior.
Exemplul 5.1. S se rezolve ecuaia x 3 3 x 1 0 .
Se definete un fiier funcie cu urmtorul coninut:
function y = ex5_1(x)
y = x.^3-3*x+1
-1.5
-1
-0.5
0.5
1.5
67
#05
Se vor scrie astfel de funcii pentru diferite ecuaii i se vor experimenta la ora de
laborator.
n Matlab este, de asemenea, implementat pentru ecuaii de forma f(x)=0 o variant a
metodei biseciei prin funcia fzero, cu sintaxa urmtoare (n forma cea mai simpl):
x = fzero(funct,x0)
x = fzero(funct,x0,tol)
x = fzero(funct,x0,tol,trace)
unde funct reprezint numele dat de utilizator funciei f(x) a crei expresie poate
fi particular transcendent, x0 este o aproximare iniial a soluiei ecuaiei, x reprezint
soluia de aproximare a ecuaiei dat de funcia Matlab, tol tolerana de calcul, iar variabila
trace controleaz afiarea rezultatelor intermediare pe ecran.
Exemplul 5.2. S se rezolve ecuaia e x sin( x) 3 .
Se definete fiierul function cu definiia ecuaiei astfel:
function y1=ex5_2(x)
y1=exp(x)-sin(pi*x)-3
68
#05
2.5
2
1.5
1
0.5
0
-0.5
-1
-1.5
-2
-2.5
0.5
0. 6
0.7
0.8
0.9
1.1
1.2
1.3
1. 4
1.5
Se observ c soluia se afl n intervalul [1;1,1]. Oricare din aceste dou valori
poate fi folosit pentru a afla soluia ecuaiei cu funcia fzero:
x=fzero('ex5_2',1)
x =
1.0476
xi
ai f (bi ) bi f (ai )
f (bi ) f (ai )
(5.3)
69
#05
ai
xi
bi
f(x)
f(xi)
f(ai)
Fig. 5. 4 mprirea intervalului de cutare la metoda falsei poziii
70
#05
f(x0)
f(xi)
f(xn-1)
x
Metoda este cea mai eficient datorit convergenei rapide a irului de aproximaii
ctre soluia ecuaiei.
S studiem i n acest caz cele 3 aspecte importante:
a) condiii iniiale: este nevoie s se aleag o soluie iniial a ecuaiei. O bun
metod ar fi alegerea lui x0 astfel nct: f ''( x) f ( x0 ) 0 , pentru x0 [a,b].
Pentru uurin se alege unul din capetele intervalului, care respect aceast
relaie;
b) Relaia de iteraie: la fiecare pas soluia se aproximeaz cu
f ( xi )
xi 1 xi
(5.4)
f '( xi )
c) Condiii de oprire a procesului: n ipoteza unei tolerane de calcul tol se
consider c xn 1 este o soluie a ecuaiei dac xn 1 xn tol . De asemenea, se
impune un numr maxim de iteraii, iar funcia ar trebui s spun dac
condiia de mai sus este ndeplinit dup depirea numrului de iteraii.
Avantajele metodei constau n evaluarea funciei ntr-un singur punct i eficiena
ei i convergena rapid spre soluia ecuaiei.
Metoda are i dezavantaje: necesit cunoaterea n prealabil a derivatei I a funciei
i rezultatele sunt eficiente doar pentru o aproximaie iniial x0 foarte apropiat de soluia
exact a ecuaiei, altfel se poate ntmpla ca ntre soluia exact i x0 funcia s prezinte un
punct de extrem, caz n care se ntrerupe irul de calcule. De asemenea din condiia
iniial, ar trebui s se cunoasc chiar i derivata a II-a.
S scriem, conform celor spuse mai sus algoritmul metodei lui Newton:
Date de intrare:
a, b unul din capetele intervalului, care va fi prima aproximaie
f funcia continu i derivabil de 2 ori
f prima derivate
tol precizia determinrii soluiei
nr_iteraii numrul de iteraii
71
#05
Date de ieire:
soluie soluia ecuaiei
val valoarea funciei n soluie
eroare eroarea de calcul
nr_it numrul de iteraii dup care s-a gsit soluia
pentru i=1 pn la max_iteratii
Calculeaz xi=xi-1-f(xi-1)/f(xi-1)
dac abs(xi-xi-1)<tol
atunci solutie=xi;
nr_it=i;
val=f(xi);
eroare=abs(xi-xi-1);
break
afieaz valorile obinute
solutie, nr_it, val, eroare
Implementarea n MatLab:
function [solutie,val,eroare,nr_it]=mnewton(f1,f2,x0,nr_iteratii,tol)
echo off;
%functie pentru rezolvarea ecuatiilor algebrice prin metoda lui Newton
%sau metoda tangentei
% Intrari
%
f1
numele functiei
%
f2
numele derivatei I a functiei
%
x0
aproximatia initiala a ecuatiei
%
nr_iteratii
numarul de iteratii impuse
%
tol
toteranta de caclul
% Iesiri
%
solutie
Solutia ecuatiei pe intervalul stabilit
%
val
Valoarea functiei in "solutie"
%
eroare
Eroarea estimata pentru solutie
%
nr_it
Numarul de iteratii dupa care s-a gasit solutia
i=1;rez=0;
while i<=nr_iteratii
x=x0-(feval(f1,x0)/feval(f2,x0));
if abs(x-x0)<tol
solutie=x;
nr_it=i;
val=feval(f1,x);
eroare=abs(x-x0);
rez=1;
return;
end
i=i+1;
x0=x
end
if rez==0
error('S-a depasit numarul impus de iteratii fara a se indeplini conditia de
oprire');
error('Mariti numarul de iteratii sau micsorati intervalele de cautare si
rulati din nou programul');
end
72
#05
function y1 = ex5_3_1(x)
y1 = x.^3-3*x+1
function y2 = ex5_3_2(x)
y2 = 3*x.^2-3
function y3 = ex5_3_3(x)
y3 = 6*x
Graficul funciei este cel din fig. 5.2. Deci, intervalele de cutare sunt cele de pe
graficul respectiv.
Apelul funciei se face astfel:
[solutie1,val1,eroare1,nr_it1]=mnewton('ex5_3_1',ex5_3_2,-1.5,20,0.0001)
[solutie2,val2,eroare2,nr_it2]=mnewton('ex5_3_1',ex5_3_2,0.5,20,0.0001)
[solutie3,val3,eroare3,nr_it3]=mnewton('ex5_3_1',ex5_3_2,1.5,20,0.0001)
solutie1 =
-1.8794
val1 =
-3.9968e-014
eroare1 =
8.3097e-008
nr_it1 =
5
solutie2 =
0.3473
val2 =
5.7248e-009
eroare2 =
7.4131e-005
nr_it2 =
3
solutie3 =
1.5321
val3 =
1.4189e-011
eroare3 =
1.7570e-006
nr_it3 =
3
5. Metoda secantei
Se consider ecuaia f(x)=0, f:R R continua i presupunem c s-a gsit un interval
[a,b] R, pentru care: f (a) f (b) 0 , adic, exist cel puin o soluie n acest interval.
Ipotezele pentru funcia f(x) sunt urmtoarele:
f este continu pe intervalul [a,b];
f este derivabil de 2 ori pe intervalul [a,b] i derivata a doua pstreaz
semn constant pe [a,b];
derivata I nu se anuleaz pe intervalul specificat.
73
#05
xi
f ( xi )
f ( xi )
xi
( x0 xi )
f '( xi )
f ( x0 ) f ( xi )
(5.6)
f ( x0 ) f ( xi )
(5.7)
( x0 xi )
Deci, se poate spune c metoda secantei are marele avantaj c nu trebuie tiut de
la nceput care este derivata I a funciei, aceasta fiind exprimat prin relaia de mai sus.
f '( xi )
(5.8)
atunci rezolvarea ecuaiei f(x)=0 este mult mai simpl, pentru c MatLab are
predefinit o funcie n acest scop: roots.
Funcia roots, poate fi apelat cu sintaxa:
r = roots(c)
unde c reprezint un vector care conine coeficienii polinomului n ordine
descresctoare a puterilor variabilei, adic:
c=[an an-1 ... a1 a0]
74
#05
-10
-3
Mai mult, MatLab mai are predefinit o funcie, poly, prin intermediul creia se pot
determina coeficienii unei ecuaii polinomiale, dac se cunosc rdcinile acesteia.
Sintaxa de apelare:
c = poly(r)
Roots i poly sunt funcii inverse.
Se verific exemplul de mai sus:
c=poly(r)
c =
Columns 1 through 7
1.0000
-0.0000
Columns 8 through 9
-0.0000
-3.0000
0.0000
1.0000
3.0000
-0.0000
-10.0000
7. Aplicaii de laborator
Aplicaia 5.1. S se rezolve ecuaia cos(x)-x=0, folosind metodele descrise.
Indicaii: Se scrie un fiier funcie, care conine definiia funciei:
function y = aplic5_1(x)
y = cos(x)-x
#05
-1.5
-1
-0.5
0.5
1.5
Se observ c ecuaia admite o soluie pe intervalul [0,5;1]. Deci, se apeleaz funcia mbisect
astfel:
[solutie,val,eroare]=mbisect('aplic5_1',0.5,1,0.0001)
Se alege ca soluie iniial captul din dreapta al intervalului, adic x0=1 i se apeleaz
funcia mNewton astfel:
[solutie,val,eroare,nr_it]=mnewton('aplic5_1','aplic5_1_1',1,100,0.0001)
76