You are on page 1of 37

ELEMENTE DE SIMULARE NUMERICA

IN MATLAB
Curs 3
1
2. ECUATII NELINIARE (continuare)
Alte exemple de probleme de acest tip:
3. Probleme de dinamica populatiei. In studiul evolutiei pop-
ulatiei dintr-o specie (de exemplu, bacterii) se foloseste ecuatia
x
+
= (x) = xR(x) ,
care stabileste legatura dintre numarul indivizilor dintr-o gener-
atie x si numarul indivizilor din generatia urmatoare x
+
.
Functia R(x) modeleaza viteza de variatie a populatiei studiate
si poate aleasa in diferite moduri. Printre cele mai cunoscute
modele se aa:
1) Modelul lui Malthus (17661834):
R(x) = R
M
(x) = r, r > 0 const.
2
2) Modelul Verhulst (1804-1849), al cresterii cu resurse limitate:
R(x) = R
V
(x) =
r
1 +xK
, r > 0, K > 0 const. (1)
3) Modelul prada-pradator cu saturatie:
R(x) = R
P
(x) =
rx
1 +(x/K)
2
, r > 0, K > 0 const., (2)
care reprezinta o adaptare a modelului Verhulst, pentru cazul
cand exista o alta populatie daunatoare.
Dinamica populatiei este denita deci prin procesul iterativ
x
(k)
= (x
(k1)
), k 1,
unde x
(k)
reprezinta numarul de indivizi prezenti cu k generatii
mai tarziu decat generatia initiala x
(0)
.
3
Conguratiile stationare (de echilibru) x

ale populatiei studiate


vor solutiile ecuatiei:
x

= (x

) .
Acesta este un exemplu de problema de punct x.
2.3. Algoritmi de punct x.
Consideram urmatoarea problema:
ind data o functie : [a, b] R, gasiti [a, b] astfel incat
= () .
Un astfel de numar se numeste punct x al functiei .
4
Punctul x ar putea calculat cu urmatorul algoritm iterativ:
x
(k+1)
= (x
(k)
) , k 0, (3)
unde x
(0)
este o estimare initiala. Aceasta metoda se numeste
algoritm de punct x , iar este numita functie de iteratie .
Din (3) se vede ca, daca este o functie continua si sirul {x
(k)
}
este convergent, atunci limita sirului {x
(k)
} este un punct x al
functiei .
Observatii. 1) In general, orice ecuatie f(x) = 0 poate scrisa
ca o problema de punct x (x) = x, daca notam (x) = xf(x).
2) Metoda lui Newton poate privita ca un algoritm de punct
x, avand functia de iteratie data de:
(x) =
N
(x) = x
f(x)
f

(x)
.
5
0.5 0 0.5 1 1.5 2
0.5
0
0.5
1
1.5
2
y = x
y
x
x
(0)
x
(1)
x
(2)

6
In unele situatii, algoritmul de punct x (3) ar putea sa nu e
convergent. Urmatorul rezultat ne ofera conditii suciente de
convergenta.
Propozitia 2.1. Presupunem ca functia satisface:
1. (x) [a, b] pentru orice x [a, b];
2. este derivabila in [a, b];
3. K < 1 astfel incat |

(x)| K, x [a, b].


Atunci, are un punct x unic [a, b], iar sirul {x
(k)
} denit
de (3) converge la pentru orice alegere a estimarii initiale x
(0)
in [a, b]. Mai mult, avem
lim
k
x
(k+1)

x
(k)

=

() . (4)
7
Din relatia (4) se poate deduce ca algoritmul de punct x con-
verge cel putin liniar (de ordin 1), adica pentru k sucient de
mare eroarea la pasul k +1 este egala cu eroarea la pasul k in-
multita cu constanta

() (care are modulul < 1).


In cazul in care

() = 0, algoritmul de punct x are o conver-


genta patratica, dupa cum se vede din urmatorul rezultat.
Propozitia 2.2. In aceleasi ipoteze ca la Propozitia 2.1, pre-
supunem ca este de 2 ori derivabila si avem

() = 0,

() = 0.
Atunci, algoritmul de punct x are o convergenta de ordin 2 si
are loc
lim
k
x
(k+1)

(x
(k)
)
2
=
1
2

() . (5)
8
Ca si la metoda lui Newton, algoritmii de punct x vor stopat i
atunci cand diferenta dintre doua iteratii succesive este mai mica
decat o anumita precizie dorita: |x
(k+1)
x
(k)
| < .
Algoritmul de punct x este implementat in programul pctx.m.
Variabilele de intrare sunt functia de iteratie , estimarea initiala
x0 , toleranta preciziei tol si numarul maxim de iteratii nmax.
function [x, niter]=pctx( , x0, tol, nmax, varargin)
% Calculeaza un punct x al functiei , pornind din estimarea
initiala x0
if nargin == 2
tol = 1.e-4; nmax = 100;
elseif nargin == 3
9
nmax = 100;
end
x = x0;
di = tol + 1;
niter = 0;
while niter <= nmax & di >= tol
xnou = feval( , x, varargin{:}); % Iteratia de punct x (3)
di = abs(x - xnou);
x = xnou;
niter = niter + 1;
end
if niter >= nmax
fprintf(Nu converge in numarul maxim de iteratii admis\n);
end
return
10
Exemplu: (Dinamica populatiei)
Aplicam algoritmul de punct x pentru a rezolva problema de
dinamica populatiei enuntata la inceputul cursului.
Consideram functiile de iteratie pentru modelul Verhulst
V
si
pentru modelul prada-pradator
P
, date de ecuatiile (1) si (2),
cu valorile parametrilor r = 3 si K = 1:

V
(x) =
rx
1 +Kx
,
P
(x) =
rx
2
1 +(x/K)
2
.
Pentru a gasi o estimare initiala x0 convenabila, putem folosi
gracul functiilor de iteratie (intersectiile gracului cu prima bi-
sectoare ne dau punctele xe, vezi gura urmatoare).
11
0 1 2 3 4 5
0
0.5
1
1.5
2
2.5
3
3.5
4
4.5
5

V
12
v = inline(3*x./(1+x), x)
p = inline(3*x.2./(1+x.2), x)
x0 = 1;
[alfa1, niter] = pctx(v, x0)
alfa1 = 2.0000
niter = 10
[alfa2, niter] = pctx(p, x0)
alfa2 = 2.6180
niter = 10
Acestea sunt punctele xe cautate.
13
2.3.1. Metoda de accelerare a lui Aitken.
Prezentam o metoda care permite accelerarea convergentei sir-
ului obtinut prin iteratiile de punct x.
In acest scop, in loc sa denim sirul {x
(k)
} recursiv prin formula
(3), vom adopta urmatoarea relatie:
x
(k+1)
= x
(k)

((x
(k)
) x
(k)
)
2
((x
(k)
)) 2(x
(k)
) +x
(k)
, k 0. (6)
Aceasta expresie se numeste formula de extrapolare a lui Aitken.
Relatia (6) poate privita ca o alta iteratie de punct x, pentru
functia de iteratie urmatoare:
14
x
(k+1)
=

(x
(k)
),

(x) =
x((x)) [(x)]
2
((x)) 2(x) +x
. (6

)
Observam ca, daca x = este un punct x al functiei , atunci
functia

este nedeterminata intrucat numitorul si numaratorul


se anuleaza. Totusi, aplicand regula lui LHopital, obtinem
lim
x

(x) = .
Astfel, functia

(x) poate extinsa prin continuitate in punctul


x = , xand

() = .
Se poate verica ca punctele xe ale functiei

(x) coincid cu
punctele xe ale functiei (x). Ca urmare, metoda de accelerare
a lui Aitken se poate aplica pentru orice problema de punct x.
Avantajele folosirii metodei lui Aitken sunt date de urmatoarele
rezultate:
15
Propozitia 2.3. Consideram algoritmul de punct x (3) core-
spunzator functiei de iteratie (x) = x f(x) pentru calcularea
radacinilor lui f. Daca functia f este sucient de regulata, avem:
1) Daca algoritmul de punct x converge liniar la o radacina sim-
pla a lui f, atunci metoda lui Aitken converge patratic la aceeasi
radacina;
2) Daca algoritmul de punct x converge cu ordinul p 2 la
o radacina simpla a lui f, atunci metoda lui Aitken converge la
aceeasi radacina cu ordinul 2p 1;
3) Daca algoritmul de punct x converge liniar la o radacina cu
multiplicitatea m 2 a lui f, atunci metoda lui Aitken converge
liniar la aceeasi radacina, avand un factor asimptotic de conver-
genta de C = 1 1/m. (Eroarea este mai mica, indca C < 1).
In particular, daca p = 1 si radacina lui f este simpla,
metoda lui Aitken converge chiar daca algoritmul de punct x
corespunzator diverge.
16
In programul metaitken.m este implementata metoda de accel-
erare a lui Aitken. Variabila de intrare este o functie denita
printr-un sierM sau o functie inline ce descrie expresia functiei
asupra careia se actioneaza prin metoda de accelerare a lui
Aitken. Estimarea intiala este data de variabila x0 , toleranta
la precizia aproximarii este tol , iar numarul maxim de iteratii
admis este nmax.
function [x, niter] = metaitken( , x0, tol, nmax, varargin)
% Calculeaza un punct x al functiei , pornind din estimarea
initiala x0, folosind metoda de accelerare a lui Aitken
if nargin == 2
tol = 1.e-4; nmax = 100;
elseif nargin == 3
17
nmax = 100;
end
x = x0; di = tol + 1; niter = 0;
while niter <= nmax & di >= tol
gx = feval( , x, varargin{:}); % Calculeaza (x)
ggx = feval( , gx, varargin{:}); % Calculeaza ((x))
xnou = (x*ggx - gx2)/(ggx - 2*gx + x); % Formula Aitken(6

)
di = abs(x - xnou);
x = xnou;
niter = niter + 1;
end
if niter >= nmax
fprintf(Nu converge in numarul maxim de iteratii admis\n);
end
return
18
Exemplu: Sa calculam punctele xe ale functiilor

0
(x) = ln(xe
x
) ,
1
(x) =
e
x
+x
e
x
+1
.
0 = inline(log(x*exp(x)),x)
1 = inline((exp(x)+x)/(exp(x)+1),x)
x0 = 2; tol = 1.e-10; nmax = 100;
[alfa1,niter]=metaitken(1,x0, tol,nmax)
alfa1 = 1
niter = 4
[alfa2, niter]=pctx(1, x0, tol, nmax)
alfa2 = 1.0000
19
niter = 18
Metoda de punct x converge in 18 iteratii pentru 1, dar metoda
Aitken converge in doar 4 iteratii !
[alfa0,niter] = metaitken( 0, x0, tol, nmax)
alfa0 = 1.0000 - 0.0000i
niter = 10
[alfa, niter] = pctx( 0, x0, tol, nmax)
Nu converge in numarul maxim de iteratii admis
alfa = 494.7185
niter = 101
Metoda de punct x nu converge pentru 0, dar metoda Aitken
converge in 10 iteratii !
Se verica usor ca = 1 este punct x al functiilor
0
si
1
.
20
2.4. Radacinile polinoamelor.
Consideram cazul in care f(x) este o functie polinomiala
f(x) = a
n
x
n
+... +a
1
x +a
0
. (7)
Se stie ca pentru polinoame de grad n 5 nu exista o formula
explicita pentru calcularea tuturor radacinilor polinomului.
Aceasta sugereaza necesitatea aproximarii radacinilor polinoamelor
folosind metode numerice.
21
2.4.1. Algoritmul lui Horner.
Prezentam o metoda ecienta de calculare a valorii unei functii
polinomiale p
n
(x) (si a derivatei sale) intr-un punct dat z.
Aceasta metoda va conduce la stabilirea unui algoritm, numit
metoda reducerii gradului, pentru aproximarea progresiva a tu-
turor radacinilor unui polinom.
Orice polinom p
n
(x) de forma (7) poate scris sub forma
p
n
(x) = a
0
+x(a
1
+x(a
2
+... +x(a
n1
+xa
n
)...)). (8)
Pentru a calcula p
n
(x) folosind formula (7) trebuiesc efectuate
n sume si 2n 1 produse, in schimb formula (8) necesita doar n
sume si n produse.
Relatia (8) reprezinta baza algoritmului lui Horner pentru evalu-
area ecienta a unui polinom p
n
intr-un punct dat z:
22
b
n
= a
n
, b
k
= a
k
+b
k+1
z, k = n 1, n 2, ..., 0. (9)
In (9), toti coecientii b
k
cu k n 1 depind de z, si vom avea
b
0
= p
n
(z).
Denim polinomul de grad n 1 de x
q
n1
(x; z) = b
1
+b
2
x +... +b
n
x
n1
=
n

k=1
b
k
x
k1
, (10)
care se numeste polinomul asociat lui p
n
si depinde de parametrul
z prin intermediul coecientilor b
k
. Observam ca are loc relatia
p
n
(x) = (x z)q
n1
(x; z) +b
0
, b
0
= p
n
(z), (11)
care se verica imediat prin identicarea coecientilor.
23
Algoritmul (9) este implementat in programul methorner.m .
Variabila de intrare a este un vector care contine coecientii poli-
nomului ce trebuie evaluat, in ordine descrescatoare: a
n
, ..., a
0
.
Variabila de iesire y reprezinta valoarea polinomului in punctul
dat z , iar vectorul b contine coecientii polinomului asociat in
ordinea b= [b
n
, ..., b
1
].
function [y, b] = methorner( a, z)
% Aplica algoritmul lui Horner pentru evaluarea polinomului a in
punctul z si calculeaza coecientii b ai polinomului asociat
n = length(a) - 1;
b = zeros(n+1,1);
b(1) = a(1);
for j = 2:n+1
24
b(j) = a(j) + b(j-1)*z;
end
y = b(n+1);
b = b(1:end-1);
return
Sa gasim un algoritm ecient care, dupa determinarea unei radacini
z a lui p
n
(x) (sau o aproximare a ei), sa nlature din polinom
factorul (xz) si sa treaca la determinarea succesiva a celorlalte
radacini, pana la ultima.
Din (11) observam ca, daca z este o radacina a lui p
n
(x), avem
b
0
= p
n
(z) = 0 si p
n
(x) = (x z)q
n1
(x; z).
Deci cele n 1 radacini ramase ale lui p
n
(x) vor radacinile
polinomului q
n1
(x; z).
25
Aceasta observatie sugereaza urmatorul procedeu algoritmic prin
reducerea gradului pentru calcularea tuturor radacinilor :
Pentru m = n, n 1, ..., 1 :
1. gasim o radacina r
m
a lui p
m
printr-o metoda de aproximare
adecvata;
2. calculam polinomul q
m1
(x; r
m
) folosind algoritmul (9)-(10)
pentru z = r
m
;
3. luam p
m1
= q
m1
.
Cel mai cunoscut si folosit procedeu de acest tip foloseste metoda
lui Newton la pasul 1, pentru aproximarea radacinilor polinomu-
lui.
26
2.4.2. Metoda NewtonHorner.
Avantajul acestei metode consta in faptul ca implementarea metodei
lui Newton se cupleaza in mod convenabil cu algoritmul lui H orner
(9).
Mai precis, observam ca din relatia (11) rezulta
p

n
(x) = q
n1
(x; z) +(x z)q

n1
(x; z) ,
si deci avem
p

n
(z) = q
n1
(z; z).
Datorita acestei egalitati, metoda NewtonHorner pentru aprox-
imarea radacinilor r
j
(reale sau complexe) ale polinomului p
n
are
urmatoarea forma:
27
Fie o estimare initiala r
(0)
a radacinii, calculam pentru k 0
(pana la convergenta)
r
(k+1)
= r
(k)

p
n
(r
(k)
)
p

n
(r
(k)
)
= r
(k)

p
n
(r
(k)
)
q
n1
(r
(k)
; r
(k)
)
. (12)
Folosim apoi tehnica de reducere a gradului prin relatia
p
n
(x) = (x r)p
n1
(x).
Continuam cu aproximarea unei radacini a lui p
n1
(x) si asa mai
departe pana cand toate cele n radacini au fost calculate.
Observam ca pentru a obtine si radacinile complexe r C \ R
trebuie aleasa o estimare initiala r
(0)
cu partea imaginara nenula.
28
In programul newthorner.m se implementeaza metoda Newton
Horner. Variabila de intrare a =[a
n
, ..., a
0
] contine coecientii
polinomului caruia dorim sa-i determinam radacinile, x0 este o
estimare initiala. Variabila de iesire rad este un vector care con-
tine radacinile calculate, iar iter un vector ce arata numarul de
iteratii folosite de metoda lui Newton pentru ecare radacina.
function [rad, iter] = newthorner( a, x0, tol, nmax)
% Aplica metoda Newton-Horner pentru calcularea radacinilor
unui polinom
if nargin == 2
tol = 1.e-4; nmax = 100;
elseif nargin == 3
nmax = 100;
29
end
n = length(a) - 1;
rad = zeros(n,1); iter = zeros(n,1);
for k = 1:n
% Iteratiile metodei Newton
niter = 0; x = x0; dif = tol+1;
while niter <= nmax & dif >= tol
[pz, b] = methorner(a,x); % Calculeaza p(x)
[dpz, b] = methorner(b,x); % Calculeaza p

(x)
xnew = x - pz/dpz; % Formula Newton
dif = abs(xnew - x);
niter = niter+1;
x = xnew;
end
if niter >= nmax
30
fprintf(Nu converge in numarul maxim de iteratii admis\n);
end
% Metoda reducerii gradului
[pz, a] = methorner(a,x);
rad(k) = x;
iter(k) = niter;
end
return
Observatie. Pentru a minimiza efectul erorilor de rotunjire, in
procesul de reducere a gradului este recomandabil sa aproximam
mai intai radacina r
1
cu modulul cel mai mic, si apoi sa trecem
la aproximarea celorlalte radacini r
2
, r
3
, ... pana se ajunge la cea
cu modulul cel mai mare.
Din acest motiv, estimarea initiala se ia deseori x0=0.
31
Exemple: 1. Calculati radacinile polinomului
p
3
(x) = x
3
6x
2
+11x 6
a=[1 -6 11 -6];
[x, iter]=newthorner(a, 0, 1.e-15, 100)
x = 1.0000 2.0000 3.0000
iter = 8 8 2
Se vede ca metoda converge cu o precizie mare, folosind putine
iteratii.
In cazul radacinilor multiple insa, datorita propagarii erorilor de
rotunjire, metoda nu este intotdeauna la fel de ecienta, dupa
cum se vede din exemplul urmator.
32
2. Calculati radacinile polinomului (are radacina r
1,2,3
= 1 de
multiplicitate 3, si radacina r
4
= 4)
p
4
(x) = x
4
7x
3
+15x
2
13x +4.
c=[1 -7 15 -13 4];
format long
[x, iter]=newthorner(c, 0, 1.e-15, 100)
Nu converge in numarul maxim de iteratii admis
x = 1.00000693533737
0.99998524147571
1.00000782324144
3.99999999994548
iter = 61 101 6 2
Lipsa preciziei aproximarii se datoreaza faptului ca radacina r = 1
are multiplicitatea 3.
33
2.5. Comenzi Matlab specializate.
Cele mai sosticate metode pentru calculul zerourilor unei functii
neliniare sunt combinatii ale diferitilor algoritmi, in incercarea de
a obtine o convergenta mai buna catre solutie.
De exemplu, functia Matlab predenita fzero calculeaza zerourile
unei functii folosind asa-numita metoda Dekker-Brent.
Aceasta comanda are sintaxa de baza fzero( fun, x0) , unde
argumentul fun deneste functia prin comanda inline sau printr-
un sierM, iar x0 este o estimare initiala.
Astfel, putem rezolva problema fondului de investitii (Problema
1, Curs 2) prin urmatoarele instructiuni:
34
function y= fond(r)
y=6000 - 1000*(1+r)/r*((1+r)5 - 1);
===================================
[I, res, ag]=fzero(fond, x0)
Zero found in the interval: [0.028471, 0.492].
I = 0.06140241153653
res = -1.818989403545857e-012
ag = 1
Daca variabila de iesire ag este < 0, nseamna ca functia fzero
nu poate gasi radacina.
35
Pentru calculul radacinilor unui polinom, in afara de metoda
NewtonHorner, exista numeroase alte metode de aproximare.
Comanda Matlab roots foloseste o metoda prin care se caracter-
izeaza zerourile unei functii ca si valorile proprii ale unei matrice
speciale asociate.
Pentru rezolvarea sistemelor de ecuatii neliniare, exista gener-
alizari ale metodei lui Newton, numite metode quasiNewton.
Comanda Matlab zero = fsolve(fun, x0) permite aarea unei
solutii pentru sisteme de ecuatii.
Variabila fun este numele unui sierM in care a fost denita
forma functiilor f
i
(x
1
, ..., x
n
), i = 1, ..., n, iar x0 este estimarea
initiala a solutiei.
De exemplu, pentru rezolvarea sistemului :
36
x
2
1
+x
2
2
= 1,
sin(x
1
/2) +x
3
2
= 0.
scriem insctructiunile:
function fx = expsist(x)
fx(1) = x(1)2+x(2)2-1;
fx(2) = sin(pi*0.5*x(1))+x(2)3;
====================================
x0 = [1, 1];
sol = fsolve(expsist, x0)
sol = 0.4761 -0.8794
Pentru a obtine solutia cu semn schimbat, pornim de la estimarea
initiala x0=[-1,-1].
37

You might also like