Documente Academic
Documente Profesional
Documente Cultură
Capitolul 2
Dependenţa y=y(x) se poate reprezenta grafic în planul (x, y), obţinându-se aşa-numitul
„nor de puncte”. De cele mai multe ori, după alura norului de puncte se poate stabili forma
exactă a funcţiei de regresie: dacă punctele se distribuie în jurul unei drepte, atunci se alege
drept funcţie de regresie un polinom de gradul I (regresie liniară), dacă se distribuie în jurul
unei parabole sau a unei parabole cubice, atunci trebuie aleasă o funcţie polinomială de
gradul al II-lea, respectiv de gradul al III-lea etc. Dacă forma sugerată a norului de puncte nu
corespunde unui caz simplu, atunci se procedează la regresia cu o funcţie polinomială de grad
superior, ales arbitrar în primă fază.
)
Dacă se notează cu y i , i = 1, n , valorile aproximate (estimate) şi cu freg funcţia generală
de regresie, atunci este valabilă relaţia:
(2.1) $y = f ( x )
i reg i
Funcţia freg depinde de un set de m parametri, fie aceştia ai , i = 1, m (în particular, aceştia
sunt coeficienţii polinomului de regresie), care se determină din minimizarea erorii pătratice
)
cumulate dintre valorile reale, yi, şi valorile aproximate, y i :
n 2
(2.2) E (a1, a2 ,...am )
i =1
(
∑ yi − $y i)
40 Metode numerice utilizate în analiza sistemelor – aplicaţii
Funcţia de eroare (2.2) este o expresie a dispersiei valorilor reale de la curba presupusă.
Fiind o sumă de pătrate, această funcţie prezintă un minim pozitiv (în cazul ideal, acesta este
0, corespunzând aproximării exacte), care se obţine din anularea derivatelor sale parţiale în
raport cu fiecare dintre parametrii ai , i = 1, m . Rezultă astfel sistemul de m ecuaţii în
necunoscutele ai , i = 1, m , numit sistemul ecuaţiilor normale:
∂E (a1, a2 ,...am )
(2.3) = 0, i = 1, m
∂ai
În cazul în care freg este funcţie polinomială, sistemul (2.3) este liniar şi compatibil
determinat, soluţia lui admiţând o formă generală, care este prezentată în §2.1.5.
O aplicaţie imediată şi intuitivă a metodei celor mai mici pătrate este trasarea grafică a
unei dependenţe de tipul celei din tabelul 2.1, presupunând că datele respective s-au obţinut
în urma măsurării variaţiei variabilei dependente y în funcţie de variaţia variabilei
independente x. Măsurătorile fiind în general afectate de erori, se aplică întâi o metodă de
regresie pentru determinarea unei aproximări analitice a dependenţei respective. Prin
reprezentarea grafică a norului de puncte de coordonate (xi,yi), i=1,2,...n, şi a funcţiei de
regresie $y = $y ( x) în acelaşi sistem de coordonate, se observă că aproximarea prin regresie
corespunde trasării graficului „printre puncte” (figura 2.1).
y
1.5
0.5
x
-3 -2 -1 0 1 2 3 4 5
-0.5
-1
-1.5
(2.4) $y = a ⋅ x + b
i i
n ⋅ S xy − S x ⋅ S y S xx ⋅ S y − S x ⋅ S xy
(2.5) a = , b= ,
n ⋅ S xx − S x2 n ⋅ S xx − S x2
n n n n
unde s-au făcut notaţiile: S x = ∑ xi , S xx = ∑ xi2 , S y = ∑ yi , S xy = ∑ xi yi . Relaţiile (2.5)
i =1 i =1 i =1 i =1
rezultă din dezvoltarea determinanţilor implicaţi în sistemul (2.3).
Funcţia Matlab de implementare a metodei de regresie liniară trebuie să primească drept
date de intrare cei doi vectori, x şi y, şi să returneze valorile celor doi coeficienţi de regresie,
a şi b. Funcţia Matlab cmmp_lin listată mai jos mai returnează şi şirul de valori aproximate,
)
y i , i = 1, n , în vectorul y_aprox, precum şi valoarea (minimizată) a erorii pătratice globale
(conform relaţiei (2.2)) în variabila E.
function [a,b,y_aprox,E]=cmmp_lin(x,y)
%REGRESIE LINIARĂ pe un set de perechi de date (x,y);
%dreapta de regresie are ecuaţia y=a*x+b;
%x şi y sunt vectori de aceeaşi dimensiune,
%(recomandabil ca x să fie ordonat crescător/descrescător)
n=length(x);
%calculul sumelor
Sx=sum(x);Sxx=sum(x.^2);Sy=sum(y);Syy=sum(x.*y);
%calculul numitorului şi numărătorilor din formulele lui a şi b
d=n*Sxx-Sx^2;da=n*Syy-Sx*Sy;db=Sxx*Sy-Sx*Syy;
%calculul coeficienţilor de regresie, a şi b
a=da/d;b=db/d;
%valorile aproximate
y_aprox=a*x+b;
%eroarea globală
E=sum((y-y_aprox).^2);
Ca o observaţie, se poate folosi şi funcţia det din biblioteca Matlab, care calculează
determinantul unei matrice pătratice.
În exemplul de mai jos se arată o modalitate de verificare a funcţiei cmmp_lin.
Exempl ul 2.1: Dându-se şirul de valori x=[1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6] (la
cazul general, acestea nu trebuie să fie echidistante), se generează vectorul
y după relaţia y=2*x+7 şi se apelează funcţia cmmp_lin.
x=[1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6];y=2*x+7;
[a,b,y_aprox,E]=cmmp_lin(x,y)
Rezultatul este conform aşteptărilor:
a =
2
b =
7
42 Metode numerice utilizate în analiza sistemelor – aplicaţii
y_aprox =
9 10 11 12 13 14 15 16 17 18 19
E =
0
Se perturbă apoi valorile obţinute cu formula y=2*x+7 (de exemplu, cu maxim ±10%),
rezultând y1=[8.1 11 9.9 13.2 11.7 15.4 13.5 17.6 15.3 19.8 17.1]. Apelul
funcţiei cmmp_lin cu argumentele de intrare x şi y1 (existente în spaţiul de lucru):
[a1,b1,y1_aprox,E1]=cmmp_lin(x,y1)
produce următoarele rezultate:
a1 =
1.8757
b1 =
7.3104
y1_aprox =
Columns 1 through 7
9.1860 10.1238 11.0617 11.9995 12.9373 13.8752 14.8130
Columns 8 through 11
15.7508 16.6887 17.6265 18.5643
E1 =
4.5376
Evident, valorile coeficienţilor de regresie, a şi b, vor fi cu atât mai deviate de la valorile
2, respectiv 7, cu cât perturbaţia setului y de la dreapta exactă 2x+7 va fi mai mare.
Rezultatele regresiei se vizualizează grafic prin reprezentarea norului de puncte şi a graficului
dreptei de regresie, ax+b (pentru care se discretizează intervalul de variaţie al variabilei
independente, x, cu un pas suficient de mic – rezultatul se depune în vectorul xx – şi se
calculează variabila dependentă, y, în fiecare valoare astfel obţinută – rezultatul se depune în
vectorul yy).
20
18
16
14
12
10
8
1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6
xx=min(x):(max(x)-min(x))/200:max(x);
yy=a*xx+b;
plot(x,y,’o’,xx,yy,’-’);grid;
se obţine graficul din figura 2.2.
(2.6) $y = a ⋅ x 2 + b ⋅ x + c
i i i
S xx Sx n
S 2 xy S3 x S xx
∆ a = S xy S xx S x = nS xx S 2 xy − S x2 S 2 xy − nS3 x S xy + S x S3 x S y + S x S xx S xy − S xx
2
Sy
Sy Sx n
S4 x S2 xy S xx
2
∆ b = S3 x S xy S x = nS4 x S xy − S x S4 x S y − nS3 x S2 xy + S x S xx S 2 xy + S xx S3 x S y − S xx S xy
S xx Sy n
S4 x S3 x S 2 xy
∆ c = S3 x S xx S xy = S xx S 4 x S y − S x S 4 x S xy − S32x S y + S xx S3 x S xy + S x S3 x S2 xy − S xx
2
S 2 xy
S xx Sx Sy
n n n n n
S-au făcut notaţiile: S x = ∑ xi , S xx = ∑ xi2 , S3 x = ∑ xi3 , S4 x = ∑ xi4 , S y = ∑ yi ,
i =1 i =1 i =1 i =1 i =1
n n
S xy = ∑ xi yi , S2 xy = ∑ xi2 yi .
i =1 i =1
Metoda de regresie parabolică este implementată printr-o funcţie numită cmmp_par, care
primeşte aceleaşi argumente de intrare ca şi cmmp_lin, funcţia destinată regresiei liniare, şi
anume seturile de date x şi y. Pe lângă coeficienţii de regresie, a, b şi c, şi eroarea globală,
funcţia mai returnează şi perechea de vectori (xx,yy), calculaţi pentru reprezentarea grafică a
curbei de regresie (în maniera arătată la regresia liniară, exemplul 2.1).
44 Metode numerice utilizate în analiza sistemelor – aplicaţii
function [a,b,c,E,xx,yy]=cmmp_par(x,y)
%REGRESIE PARABOLICĂ pe seturile de date (x,y);
% 2
%curba de regresie are ecuaţia y = a*x + b*x + c;
%x şi y sunt vectori de aceeaşi dimensiune,
%(recomandabil ca x să fie ordonat crescător/descrescător)
n=length(x);
%calculul sumelor
Sx=sum(x);Sxx=sum(x.^2);S3x=sum(x.^3);S4x=sum(x.^4);
Sy=sum(y);Sxy=sum(x.*y);S2xy=sum((x.^2).*y);
%calculul determinanţilor
d=n*Sxx*S4x-Sx^2*S4x-n*S3x^2+2*Sx*Sxx*S3x-Sxx^3;
da=n*Sxx*S2xy-Sx^2*S2xy-n*S3x*Sxy+Sx*S3x*Sy+ ...
Sx*Sxx*Sxy-Sxx^2*Sy;
db=n*S4x*Sxy-Sx*S4x*Sy-n*S3x*S2xy+Sx*Sxx*S2xy+ ...
Sxx*S3x*Sy-Sxx^2*Sxy;
dc=Sxx*S4x*Sy-Sx*S4x*Sxy-S3x^2*Sy+Sxx*S3x*Sxy+ ...
Sx*S3x*S2xy-Sxx^2*S2xy;
%calculul coeficienţilor de regresie
a=da/d;
b=db/d;
c=dc/d;
Exempl ul 2.2: Dându-se vectorul x=[0 0.3 1 1.4 1.6 2 2.1 2.4 2.8 3 3.5
3.7 3.9 4] şi vectorul y=x.^2-4*x-10, apelul funcţiei cmmp_par cu
returnarea numai a primelor patru argumente de ieşire:
[a,b,c,E]=cmmp_par(x,y)
va avea drept ecou la ecran:
a =
1.0000
b =
-4.0000
c =
-10.0000
2. Aproximare, interpolare şi optimizare parametrică 45
E =
4.3108e-024
Rezultatele confirmă aşteptările; câteva comentarii se impun. Se observă că valoarea
erorii globale este foarte mică, practic 0; totuşi, ea nu a fost afişată ca 0, ceea ce înseamnă că
nu este exact 0, aşa cum s-a obţinut în cazul regresiei liniare pe un set de date perfect „curat”,
neperturbat (exemplul 2.1). Nici coeficienţii de regresie nu corespund exact valorilor curbei
după care a fost generat vectorul y; aceasta se constată reafişând coeficienţii în formatul de
afişare cu 15 zecimale:
format long
a
a =
0.99999999999995
b
b =
-3.99999999999985
c
c =
-9.99999999999946
Rezultatele confirmă o intuiţie firească: erorile de calcul cresc cu cât ordinul regresiei
creşte (cu cât numărul coeficienţilor de regresie este mai mare).
Exempl ul 2.3: Regresia parabolică se aplică acum pe seturi de date legate printr-o lege
liniară; de exemplu, fie cele din exemplul 2.1: x=[1 1.5 2 2.5 3 3.5
4 4.5 5 5.5 6] şi y=2*x+7.
Rezultatul aşteptat în urma apelului funcţiei cmmp_par este ca parabola de regresie să
aibă coeficientul a aproximativ nul (parabola se reduce la o dreaptă). Într-adevăr, comanda:
[a,b,c,E]=cmmp_par(x,y)
are ca rezultat:
a =
0
b =
2
c =
7
E =
0
Rezultatul este de această dată exact, coeficienţii sunt determinaţi fără eroare.
Rămânând în continuare la exemplul 2.1 şi apelând funcţia cmmp_par pentru setul y
perturbat, y1=[8.1 11 9.9 13.2 11.7 15.4 13.5 17.6 15.3 19.8 17.1]:
[a1,b1,c1,E1]=cmmp_par(x,y1)
46 Metode numerice utilizate în analiza sistemelor – aplicaţii
se obţine:
a1 =
-0.1305
b1 =
2.8592
c1 =
5.7909
E1 =
21.4862
Eroarea globală obţinută prin regresie parabolică (21.4862) este mai mare decât cea prin
regresie liniară (4.5376, din exemplul 2.1), ceea ce arată că respectivul nor de puncte se
aproximează mai bine printr-o dreaptă decât printr-o parabolă.
De aici se desprinde o concluzie generală: în cazul aplicării regresiei polinomiale unui
set dat de date, mai întâi trebuie determinat ordinul regresiei care asigură eroarea minimă. Se
va reveni la această problemă când se va discuta cazul general de regresie polinomială
(§2.1.5).
care este un model de regresie liniară pentru seturile de date x şi z ln( y ) , cu coeficienţii
A = α şi B = ln(C ) > 0 . Aceştia se pot, deci, determina adaptând formulele (2.5):
n ⋅ S xz − S x ⋅ S z S ⋅ S − S x ⋅ S xz
(2.10) A = , B = xx z ,
2 2
n ⋅ S xx − S x n ⋅ S xx − S x
n n n n n
unde s-au făcut notaţiile: S x = ∑ xi , S xx = ∑ xi2 , S z = ∑ zi = ∑ ln( yi ) = ln ∏ yi ,
i =1 i =1 i =1 i =1 i =1
n n
S xz = ∑ xi zi = ∑ xi ln( yi ) . Relaţia (2.8) se poate rescrie sub forma:
i =1 i =1
2. Aproximare, interpolare şi optimizare parametrică 47
$y = e A⋅ xi + B , B > 0
i
Având în vedere reducerea de mai sus, funcţia Matlab pentru regresia exponenţială,
numită cmmp_exp, constă în esenţă în apelarea funcţiei cmmp_lin, de regresie liniară.
Semnificaţia argumentelor de ieşire ale funcţiei cmmp_exp este aceeaşi ca în cazul funcţiei
cmmp_par, de regresie parabolică; ea este listată şi comentată mai jos.
function [A,B,E,xx,yy]=cmmp_exp(x,y)
%REGRESIE după o CURBA EXPONENTIALĂ a unui set de date (x,y);
% A*x+B
%curba de regresie are ecuaţia y=e;
%x şi y sunt vectori de aceeaşi dimensiune;
%(recomandabil ca x să fie ordonat crescător/descrescător);
%y conţine valori pozitive
Exempl ul 2.5: Se perturbă acum uşor valorile lui y din exemplul 2.4 cu maxim ±25%,
obţinându-se şirul y1=[0.2998 0.4044 1.3435 1.4115 2.8443
4.9266 9.9275 8.9768].
48 Metode numerice utilizate în analiza sistemelor – aplicaţii
10
$y 2
par = 0.2457 ⋅ x + 0.9255 ⋅ x + 1.1475
$y 0.4641⋅ x + 0.1791
exp = e
0
-3 -2 -1 0 1 2 3 4 5
Fig. 2.3 Aproximarea prin regresie parabolică şi exponenţială a unui nor de puncte
2. Aproximare, interpolare şi optimizare parametrică 49
Deci norul de puncte mai admite şi aproximarea $y par = 0.2457 ⋅ x 2 + 0.9255 ⋅ x + 1.1475 ,
cu eroarea globală de 66.1489.
Se observă că eroarea globală are valori mari în ambele cazuri, dar că este mai mică în
cazul regresiei parabolice (66.1489) decât în cazul regresiei exponenţiale (69.562). Deci, deşi
datele iniţiale, neperturbate, corespundeau unei dependenţe exponenţiale, perturbarea lor a
fost suficient de semnificativă pentru a modifica tipul dependenţei: datele perturbate ale
variabilei dependente, y, respectă mai degrabă o lege parabolică în raport cu variabila
independentă, x.
Reprezentarea norului de puncte şi trasarea graficelor curbelor de regresie obţinute mai
sus în acelaşi sistem de coordonate se realizează prin următorul bloc de comenzi:
[A,B,E1,xx1,yy1]=cmmp_exp(x,y1);
[a,b,c,E2,xx2,yy2]=cmmp_par(x,y1);
plot(x,y,'ko',xx1,yy1,'k--',xx2,yy2,'k-');grid;
care produce rezultatele din figura 2.3.
Matricea S fiind nesingulară, sistemul (2.3’) este compatibil determinat şi are soluţia:
(2.13) c = S −1 ⋅ t
Mai jos este prezentată funcţia Matlab cmmp_gen, care reprezintă o implementare
posibilă a cazului general de regresie polinomială. Spre deosebire de funcţiile de regresie
prezentate până acum, această funcţie mai primeşte încă un argument de intrare, şi anume pe
m, numărul de parametri de regresie (pe lângă vectorii x şi y). Pentru simplitate, formula
(2.13) s-a realizat prin apelul funcţiei inv din biblioteca Matlab (implementarea de algoritmi
numerici pentru calculul inverselor matriciale va fi discutată pe larg mai târziu în această
50 Metode numerice utilizate în analiza sistemelor – aplicaţii
lucrare). Primul argument de ieşire al funcţiei de mai jos, coef, este vectorul coeficienţilor
polinomului de regresie, în ordine crescătoare a puterilor variabilei. Celelalte argumente de
ieşire au aceeaşi semnificaţie ca în cazul celorlalte funcţii.
function [coef,E,y_aprox,xx,yy]=cmmp_gen(x,y,m)
%metoda CMMP de aproximare a dependenţei y=f(x)
%printr-un POLINOM DE GRADUL m-1 (altfel spus, regresie cu m parametri);
%coeficienţii polinomului de regresie se returnează în coef,
%care este de dimensiune m, în ordine crescătoare a puterilor variabilei;
%x şi y au aceeaşi dimensiune;
%(recomandabil ca x să fie ordonat crescător/descrescător);
%n>m (numărul de perechi de date trebuie sa fie mai mare
% decât numărul parametrilor de regresie)
n=length(x);
%calculul elementelor matricei şi al termenilor liberi
for j=1:m,
t(j)=0;
for i=1:m,
s(j,i)=0;
for k=1:n,
s(j,i)=s(j,i)+x(k)^(j+i-2);
end;
end;
for k=1:n,
t(j)=t(j)+y(k)*(x(k)^(j-1));
end;
end;
coef=inv(s)*t';
coef=coef';%operaţie de transpunere pentru ca vectorul coef să rezulte de tip linie
yy(k)=0;
for i=1:m,
yy(k)=yy(k)+coef(i)*(xx(k)^(i-1));
end;
end;
O b s e r v a ţ i e : Dacă se doreşte obţinerea coeficienţilor de regresie în ordine
descrescătoare a puterilor variabilei (ceea ce corespunde manierei Matlab de returnare a
rezultatelor de acest tip), atunci se poate folosi funcţia Matlab fliplr (engl. flip left-right,
oglindire stânga-dreapta; alte funcţii din aceeaşi clasă sunt flipud – engl. flip up-down – şi
rot90). Avantajul acestei variante este că y_aprox şi yy se pot calcula mai elegant, şi
anume apelând o altă funcţie din bibliotecă, polyval, de calcul al valorii unui polinom dat
prin vectorul coeficienţilor în ordine descrescătoare a puterilor variabilei într-o valoare dată
(a se vedea şi §1.3.3.8, exerciţiul propus 4). Ultimele trei blocuri de comenzi din funcţia
cmmp_gen se rescriu sub forma:
coef=inv(s)*t';
coef=fliplr(coef');
Exempl ul 2.6: Pentru seturile de date x=[3 3.3 3.7 3.9 4.7 4.8 4.9 5 5.25] şi
y=[3 5 10 14 43 49 56 63 84] (de lungime n=9) se efectuează întâi
regresia de gradul n-1, adică de gradul 8:
[coef,E]=cmmp_gen(x,y,length(x)-1)
Rezultatul apelului de mai sus constă în primul rând în afişarea unui mesaj de avertizare
asupra apropierii de singularitate a matricei sistemului (a cărei inversă se calculează),
numărul ei de condiţionare – calculat în RCOND – fiind mic (comparabil cu epsilon maşină).
Interpretorul avertizează astfel că este posibil ca acurateţea rezultatelor să nu fie bună.
52 Metode numerice utilizate în analiza sistemelor – aplicaţii
Exempl ul 2.7: [BACH 86] Un satelit este plasat pe o orbită excentrică dată de legea lui
Kepler:
ρ
(2.14) r =
1 + ε cos ϕ
Să se estimeze parametrii ρ şi ε prin metoda celor mai mici pătrate, având la dispoziţie
observaţiile din tabelul 2.2.
ϕ 12° 48° 151° 208° 350°
r 1.04 1.24 9.27 9.69 1.06
Tabel 2.2 Set de observaţii pentru exemplul 2.7
b =
0.5050
y_aprox =
0.9498 0.8092 0.1072 0.1034 0.9528
E =
2.3518e-004
Conform notaţiilor introduse în relaţia (2.14’):
1 a
ρ= , ε= ,
b b
deci, în final, se obţin parametrii ρ=1.9804 şi ε=0.9006.
90
10
120 60
8
6
150 30
4
180 0
210 330
240 300
270
Fig. 2.4 Aproximarea în sensul celor mai mici pătrate a unei traiectorii eliptice
ro=1/b;epsi=a/b;
xx=0:pi/100:2*pi;%generarea unei diviziuni fine a intervalului de variaţie a unghiului ϕ
yy=ro./(1+epsi*cos(xx));%obţinerea valorilor corespondente ale razei r
polar(fi,r,'ko');%punctele iniţiale (din tabelul 2.2)
hold on;%comandă de reţinere a graficului anterior
polar(xx,yy,'k-');%trasarea traiectoriei
n=length(x);
%calculul sumelor
Sxx=sum(x.^2);S3x=sum(x.^3);S4x=sum(x.^4);
Sxy=sum(x.*y);S2xy=sum((x.^2).*y);
56 Metode numerice utilizate în analiza sistemelor – aplicaţii
%calculul determinanţilor
d=Sxx*S4x-S3x^2;
da=Sxx*S2xy-Sxy*S3x;
db=S4x*Sxy-S2xy*S3x;
%calculul coeficienţilor de regresie
a=da/d;
b=db/d;
2.5
1.5
0.5
α
0
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5
Fig. 2.5 Traiectoria parabolică de tragere obţinută prin regresie (exemplul 2.8)
plot(x,y,'o',xx,yy,'-');grid;
care afişează norul de puncte Pi, i=1,2,...5 şi parabola de regresie din figura 2.5.
Pe aceeaşi figură s-a pus în evidenţă unghiul de tragere, α, a cărui tangentă este panta
dreptei tangente la traiectorie în origine. Aşadar tg(α) = y '(0) = 2ax + b x = 0 = b , de unde
rezultă α = arctg(b) = 1.1228 rad=64.3309° .
Exerciţii propuse
1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003
5.695 5.724 5.598 5.612 5.636 5.605 5.635 5.668 5.711 5.703 5.720 5.691
k 1 2 3 4 5 6 7 8
k 9 10 11 12 13 14 15 16
4. Coeficientul de cuplu al unei tubine eoliene cu două pale, CΓ, depinde de o mărime
58 Metode numerice utilizate în analiza sistemelor – aplicaţii
adimensională, λ, numită viteză specifică. Mai jos se prezintă tabelar dependenţa CΓ(λ), iar
norul de puncte corespunzător este dat în figura 2.6.
k 1 2 3 4 5 6 7 8 9 10 11 12
λ [-] 0 0.5 0.99 1.49 1.99 2.48 2.98 3.47 3.96 4.46 4.96 5.45
CΓ [-] 0.006 0.006 0.013 0.02 0.026 0.037 0.045 0.056 0.062 0.069 0.072 0.075
k 13 14 15 16 17 18 19 20 21 22 23 24
λ [-] 5.95 6.44 6.94 7.43 7.93 8.42 8.92 9.42 9.91 10.4 10.9 11.4
CΓ [-] 0.075 0.072 0.069 0.063 0.056 0.048 0.04 0.032 0.024 0.017 0.011 0.006
Tabel 2.5 Coeficientul de cuplu al unei turbine eoliene în funcţie de viteza specifică, CΓ(λ)
0.08
0.07
0.06
0.05
0.04
0.03
0.02
0.01
0
0 2 4 6 8 10 12
Fig. 2.6 Norul de puncte reprezentând dependenţa CΓ(λ) din tabelul 2.5
Să se determine o formulă analitică polinomială pentru aproximarea dependenţei CΓ(λ)
în sensul celor mai mici pătrate.
5. Metoda celor mai mici pătrate ale erorii are largă aplicabilitate în domeniul
identificării sistemelor.
Ca exemplificare, unui circuit RC serie (filtru de ordinul I) i se aplică la momentul t0 o
0, t < t0
tensiune de tip treaptă, u (t ) = , condensatorul fiind iniţial descărcat. Expresia
U 0 t ≥ t0
analitică a variaţiei teoretice a tensiunii pe condensator, uC(t), este în acest caz:
(
uC (t ) = U 0 ⋅ 1 − e− (t − t0 ) RC )
Pentru identificarea produsului T=RC (numit constanta de timp a circuitului), se obţine
experimental forma de variaţie a tensiunii uC, pentru U0=2V (treaptă unitară). Vizualizarea ei
pe osciloscop este dată în figura 2.7, iar setul de date prelevate se găseşte în tabelul 2.6.
k 1 2 3 4 5 6 7 8 9 10
t [s] 3 4 5 6 7 8 9 10 11 12
uC [V] 0 0.45 1.04 1.37 1.59 1.71 1.8 1.84 1.88 1.91
k 11 12 13 14 15 16 17 18 19 20
t [s] 13 14 15 16 17 18 19 20 21 22
uC [V] 1.91 1.91 1.93 1.93 1.94 1.94 1.94 1.94 1.95 1.95
Tabel 2.6 Set de date experimentale asupra dependenţei uC(t), obţinute din figura 2.7
2. Aproximare, interpolare şi optimizare parametrică 59
2.5
uC [V]
1.5
0.5
t [s]
0
0 t0 = 3 5 10 15 20 25
După cum s-a văzut, funcţia de regresie permite estimarea valorii variabilei dependente
în orice punct din domeniul de variaţie al variabilei independente – operaţie ce se numeşte
generic interpolare – aşa cum ea poate fi folosită şi la calculul de valori dinafara acestui
domeniu – ceea ce se numeşte extrapolare.
Rămânând în cadrul funcţiilor de o singură variabilă reală, interpolarea porneşte de la
aceleaşi date (tabelate) de intrare, (xi, yi), i=1,2,...n, ca şi metoda celor mai mici pătrate şi are
acelaşi scop: determinarea unei funcţii analitice care aproximează dependenţa exprimată prin
tabelul de intrare. Deosebirea faţă de regresie este că, de această dată, funcţia de interpolare
este constrânsă să treacă prin punctele (xi, yi) şi nu printre ele, aşa cum rezulta în cazul
regresiei. Aceste puncte se numesc noduri (de interpolare).
În general se foloseşte interpolarea cu funcţii polinomiale. Acest paragraf este dedicat
implementării în Matlab a celor mai uzuale metode de interpolare unidimensională, prin
funcţii utilizator sau folosind funcţiile disponibile în biblioteca mediului.
60 Metode numerice utilizate în analiza sistemelor – aplicaţii
unde:
y −y ∆y − ∆y1 ∆ n − 2 y2 − ∆ n − 2 y1
∆y1 = 2 1 , ∆ 2 y1 = 2 , … ∆ n −1 y1 =
x2 − x1 x3 − x1 xn − x1
sunt diferenţele finite succesive calculate pentru variabila y, a căror formulă recursivă
generală este:
∆ j −1 yi +1 − ∆ j −1 yi
(2.16) ∆ j yi = , j = 1, n − 1, i = j , n − 1 ,
xi + j − xi
unde s-a notat ∆ 0 yi ≡ yi . Relaţia (2.16) conduce la ideea de a calcula aceste diferenţe ca
elementele triunghiului inferior al unei matrice de n-1 linii şi n-1 coloane, după cum urmează:
∆y1
2
∆y2 ∆ y1
∆y3 ∆ 2 y2 ∆3 y1
D= . . ... ...
. . ∆ j yi ... ∆ j y1
. . ... ... ...
2
∆yn −1 ∆ yn − 2 ... ∆ j yn − j ... ∆ n −1 y1
Conform relaţiei (2.15), din matricea D interesează doar elementele de pe diagonala
principală (încercuite cu linie punctată).
Elementele primei coloane a matricei D se calculează exclusiv pe baza nodurilor de
interpolare (xi, yi), i=1,2,...n, pentru restul elementelor se foloseşte formula recursivă (2.16),
care se rescrie în spiritul observaţiilor de mai jos.
Elementul generic ∆ j yi se află pe coloana l=j şi linia k=i+j-1 ale matricei D:
(2.17) Dkl = ∆ j yi , l = 1, n − 1, k = l , n − 1
Corespondenţele din relaţia (2.18) se înlocuiesc în relaţia (2.16) şi rezultă astfel relaţia de
calcul al elementelor triunghiului inferior al matricei D, ţinând cont că elementele primei
coloane (l=1) se calculează separat:
yk +1 − yk
Dk1 = x , k = 1, n − 1
k +1 − xk
(2.19) ,
D = Dk ,l −1 − Dk −1,l −1 , l = 2, n − 1, k = l , n − 1
kl xk +1 − xk − l +1
∆y1 ∆ 2 y1 ∆ n −1 y1
(2.15’) y = y1 + ( x − x1 ) + ( x − x1 )( x − x2 ) + ... + ( x − x1 ) ... ( x − xn −1 )
1!h 2!h 2 (n − 1)!h n −1
Pentru n=1 se obţine interpolarea liniară, pentru n=2 interpolarea pătratică, iar pentru
n=3 interpolarea cubică.
Mai jos se prezintă programul script int_newt care calculează polinomul de interpolare
al lui Newton şi exemplifică trasarea graficului acestuia prin nodurile de interpolare.
%INTERPOLARE CU POLINOM NEWTON
%exemplu de iniţializare
x=[1 5 8 9 10];
y=[2 30 11 4 8];
n=length(x);
%calculul primei coloane din matricea de diferenţe finite, D
for k=1:(n-1),
D(k,1)=(y(k+1)-y(k))/(x(k+1)-x(k));
end;
(2.20) L( x) = ∑ yi ⋅
n ( x − x1 ) ⋅ ( x − x2 ) ⋅ ... ⋅ ( x − xi −1 ) ⋅ ( x − xi +1 ) ⋅ ... ⋅ ( x − xn )
i =1 ( xi − x1 ) ⋅ ( xi − x2 ) ⋅ ... ⋅ ( xi − xi −1 ) ⋅ ( xi − xi +1 ) ⋅ ... ⋅ ( xi − xn )
Observaţie:
Formula (2.20) şi formula (2.15), de interpolare a lui Newton, conduc la acelaşi polinom
de interpolare; acesta poate fi referit ca „polinom Newton” sau ca „polinom Lagrange”, după
cum este obţinut cu una sau cu cealaltă din formule.
Dacă se notează:
(2.21) si ( x) = ( x − x1 ) ⋅ ( x − x2 ) ⋅ ... ⋅ ( x − xi −1 ) ⋅ ( x − xi +1 ) ⋅ ... ⋅ ( x − xn ) , i = 1, n ,
Pentru i de la 1 la n
#1. Se calculează vectorul cs al coeficienţilor polinomului si.
#2. Se calculează valoarea polinomului si în xi: v ← si(xi).
#3. Se calculează vectorul cp al coeficienţilor polinomului pi: cp ← cs⋅yi/v.
#4. L ← L+cp
Repetă
Mai jos este listat un program Matlab care realizează calculul polinomului Lagrange şi
evaluează polinomul într-o valoare intermediară dată de utilizator. S-a introdus o secvenţă de
comenzi prin care se îndeplineşte condiţia ca valorile xi să fie ordonate monoton (folosirea
funcţiei sort).
%Interpolarea funcţiilor prin POLINOMUL DE INTERPOLARE LAGRANGE
%exemplu de iniţializare
x=[1 5 8 9 10];
y=[2 30 11 4 8];
[m n]=size(x);
pas=(max(x)-min(x))/250;
xx=min(x):pas:max(x);
for i=1:length(xx),
yy(i)=polyval(L,xx(i));
end;
%grafic
plot(xx,yy,'r-',x,y,'g*',xv,yv,'m--');grid;
s1=sprintf('INTERPOLARE PRIN POLINOM LAGRANGE');
title(s1);
xlabel('x');
ylabel('y');
S-a utilizat acelaşi exemplu de iniţializare ca şi în programul int_newt, de calcul al
polinomului de interpolare Newton (din §2.2.1); se obţine următorul polinom Lagrange:
6 interpolare cu
funcţii spline
4
2
interpolare liniară
0
-2
interpolare cubică
-4
-6
-8
-2 0 2 4 6 8 10 12
Fig. 2.8 Trei metode de interpolare aplicate aceloraşi date de intrare
2. Aproximare, interpolare şi optimizare parametrică 65
unde h este pasul de discretizare al abscisei, n este numărul de puncte rezultate prin
discretizare (inclusiv capetele intervalului), iar xk = a + (k − 1) ⋅ h, k = 1, n − 1 .
c) Prin extrapolare liniară în punctul x=4, să se aproximeze valoarea funcţiei în x=5.
Rezolvarea punctului a) necesită executarea programului de calcul al polinomului
Lagrange, scris în §2.2.2, în care secţiunea de iniţializare se înlocuieşte cu:
x=[-2 -1 1 4];y=[0 -2 0 60];
Dacă programul astfel modificat se salvează cu numele int_lagr, el se va apela în linie
de comandă:
int_lagr
Se vizualizează conţinutul variabilei L, care conţine coeficienţii polinomului Lagrange:
L
L =
0.4667 1.9333 0.5333 -2.9333
deci acesta este:
L( x) = 0.4667 ⋅ x3 + 1.9333 ⋅ x 2 + 0.5333 ⋅ x − 2.9333
La punctul b) se propune întâi scrierea unei funcţii utilizator de calcul numeric al
integralei definite, conform formulei de aproximare (2.23). La cazul general, funcţia trebuie
să primească trei argumente de intrare, şi anume numele funcţiei de integrat ca şir de
caractere şi cele două capete ale intervalului de integrare (numere reale). O implementare
posibilă este dată mai jos.
66 Metode numerice utilizate în analiza sistemelor – aplicaţii
function I=met_trpz(nume_f,a,b)
%calcul de integrale definite prin METODA TRAPEZELOR
n=500;%se alege numărul de puncte de discretizare a abscisei, n, ca fiind 500
h=abs(b-a)/(n-1);
I=0;
for k=1:n-1,
x1=a+(k-1)*h;x2=x1+h;
I=I+h/2*(feval(nume_f,x1)+feval(nume_f,x2));
end;
Funcţia Matlab feval evaluează valoarea unei funcţii – date prin numele ei ca şir de
caractere – într-un şir specificat al argumentelor ei de intrare; rezultă, deci, că numărul
argumentelor de intrare ale lui feval este cu unul mai mult decât cel al funcţiei pe care o
evaluează. Mai sus apelul feval(nume_f,a) este echivalent cu nume_f(a). Funcţia
feval s-a folosit pentru ca, la schimbarea funcţiei de integrat, să nu fie necesară schimbarea
codului funcţiei met_trpz, ci doar transmiterea unui alt prim argument de intrare.
În cazul de faţă, funcţia de integrat va fi funcţia polinomială descrisă de coeficienţii din
vectorul L mai sus obţinut, care trebuie transmis ca variabilă globală; implementarea ei este
dată mai jos.
function y=pollagr(x)
global L;
y=polyval(L,x);
Această funcţie trebuie să existe ca funcţie Matlab (în fişierul pollagr.m) în momentul
apelului funcţiei met_trpz, în acelaşi director cu aceasta. Valoarea aproximativă a ariei
cuprinse între abscisele -2 şi 4 sub curba de interpolare rezultă din următoarea comandă:
aria=met_trpz(’pollagr’,-2,4)
aria =
60.0005
Punctul c) se poate rezolva şi fără a apela la o maşină de calcul. Extrapolarea liniară a
funcţiei în 4 (ultimul nod) presupune interpolarea liniară între ultimele două noduri şi apoi
calculul valorii funcţiei de interpolare în abscisa 5. Aceasta se poate realiza tot cu funcţia
int_lagr, unde secvenţa de iniţializare devine:
x=[1 4];y=[0 60];
Evident, funcţia de interpolare este polinomială de gradul I, L( x) = 20 ⋅ x − 20 , iar
valoarea ei în 5 este L(5)=80.
Exerciţii propuse
timp real, dacă se admite o eroare relativă de aproximare – definită ca în exerciţiul propus 3
din §2.1.6 – de maxim 1%?
Indicaţie: Se determină polinomul de regresie de grad minimal care asigură ca eroarea
relativă să fie mai mică decât 1% şi se compară cu gradul polinomului de interpolare (care
este 23); evident, se alege formula mai simplă.
2. Asupra caracteristicii de intrare – curentul de bază în funcţie de tensiunea bază-emitor,
iB=iB(uBE) – a unui tranzistor bipolar în montaj cu emitor comun se dispune de măsurările din
tabelul 2.7. Caracteristicile statice de ieşire – curentul de colector în funcţie de tensiunea
colector-emitor, iC=iC(uCE) – sunt date, pentru 6 valori cunoscute ale curenţilor de bază, doar
prin câte două măsurători, aşa cum se descrie în tabelul 2.8.
uBE [V] 0 0.2 0.3 0.4 0.6
iB [µA] 0 0 0.4 20 150
Tabel 2.7 Măsurări privind caracteristica de intrare a unui tranzistor bipolar, iB=iB(uBE)
iB1=20µA iB2=40µA iB3=60µA iB4=80µA iB5=100µA iB6=120µA
uCE [V] 1 15 1 13 1 10 1 10 1 5 1 5
iC [mA] 3 4 6.5 8.5 10.5 13 14 17.5 17 19 21 24
Tabel 2.8 Măsurări privind caracteristica de ieşire a unui tranzistor bipolar, iC=iC(uCE)
Ştiind că aceste caracteristici sunt liniare în plaja normală de funcţionare a tranzistorului,
să se afle caracteristicile punctului static de funcţionare, PSF(iB0, iC0), pentru care uBE0=0.5V
şi uCE0=6V.
Indicaţie: Se recomandă întâi reprezentarea grafică a punctelor din cele două tabele
pentru a se percepe alura curbelor. Se calculează polinomul de interpolare al caracteristicii de
intrare şi se deduce valoarea curentului de bază, iB0, pentru care uBE0=0.5V. Cu această
valoare se stabileşte pe care dintre cele 6 caracteristici de ieşire se află PSF şi, folosind
interpolarea liniară, se deduce valoarea curentului de colector, iC0, pentru care uCE0=6V.
∂ 2 f ( x) ∂ 2 f ( x) ∂ 2 f ( x)
...
2 ∂x1∂x2 ∂x1∂xn
∂x1
2
∂ f ( x) ∂ 2 f ( x) ∂ 2 f ( x)
∂x ∂x ...
(2.25) f "( x) = H ( x) ∂x22 ∂x2∂xn
2 1
... ... ... ...
∂ 2 f ( x) ∂ 2 f ( x) ∂ 2 f ( x)
∂x ∂x ...
n 1 ∂xn ∂x2 ∂xn2
(2.28) d (i )
=±
( ) , unde „+/–” corespund maximizării/minimizării
∇f x ( i )
∇f ( x ( i ) )
număr de iteraţii mai mic sau mai mare, depinzând de condiţia iniţială şi de pasul de
deplasare ales. Într-adevăr, apelul:
[x,nr_it]=opt_grad(1,1e-3)
produce rezultatele:
x =
-0.2000
nr_it =
1201
iar apelul:
[x,nr_it]=opt_grad(-1,1e-3)
are drept rezultat:
x =
-0.2000
nr_it =
801
Numărul mare de iteraţii se datorează folosirii unui pas foarte mic (p=0.001); folosirea
unui astfel de pas se justifică în cazul extremelor abrupte („creste” ascuţite sau „văi”
abrupte), unde componentele gradientului au variaţii mari.
Algoritmul Fletcher-Reeves (metoda gradienţilor conjugaţi) este o procedură puternică
de determinare a minimului local al unei funcţii generale, f(x). De această dată, la fiecare
iteraţie i se defineşte o nouă direcţie de căutare, p(i), ca o combinaţie liniară între vectorul
gradient la iteraţia curentă, ∇f(x(i)), şi direcţiile de la iteraţiile anterioare, {p }(i )
j j = 0,i −1
.
( ) (
(2.30) f x(i +1) = f x (i ) + α ⋅ p (i ) )
Se determină astfel punctul x(i+1).
4. Se determină noua direcţie de căutare, p(i+1), din punctul x(i+1):
2
(
∇f x(i +1) )
(
(2.31) p (i +1) = −∇f x(i +1) +) 2
⋅ p (i )
( )
∇f x ( i )
( ) ( )
5. Dacă f x(i +1) ≥ f x (i ) , atunci punctul de minim a fost găsit: x* ← x(i), STOP;
altfel se reia de la etapa 3.
72 Metode numerice utilizate în analiza sistemelor – aplicaţii
[nr_it n]=size(x);nr_it
minim=x(nr_it,:)
Execuţia programului din linie de comandă necesită iniţializarea variabilei x0, punctul de
start al căutării. De exemplu, pentru:
x0=1;fletreev
2. Aproximare, interpolare şi optimizare parametrică 73
rezultatul:
nr_it =
2
minim =
-0.2000
arată o convergenţă mai rapidă decât cea a metodei de gradient anterioare, implementată prin
funcţia utilizator opt_grad.
Observaţie:
Pentru o funcţie de n variabile care nu este pătratică, după fiecare n iteraţii se
reiniţializează direcţia de căutare la direcţia antigradientului, ca la primul pas. Scopul este
eliminarea erorilor datorate faptului că funcţia se poate aproxima bine cu o funcţie pătratică
numai în stricta vecinătate a optimului.
1. Se alege un punct iniţial caracterizat de vectorul x(0) = x1(0) x2(0) ... xn(0) ,
valoarea iniţială a pasului de căutare, p, şi pragul ε.
2. Se iniţializează indexul coordonatei de relaxat: k ← 1.
3. Se iniţializează contorul de iteraţii din optimizarea în raport cu coordonata k: i ← 0.
4. La o iteraţie i se relaxează coordonata de index k, obţinându-se vectorul:
74 Metode numerice utilizate în analiza sistemelor – aplicaţii
x(i +1) = x1(i ) ... xk(i ) + p ... xn(i )
1
424 3
( i +1)
xk
Dacă ( ) ( )
f x(i +1) ≤ f x (i ) , atunci i ← i+1 şi se reia etapa 4;
altfel dacă i=1 (prima iteraţie), atunci se face relaxarea în sens opus:
x(i +1) = x1(i ) ... xk(i +1) − 2 p ... xn(i )
p←–p
i ← i+1
şi se reia etapa 4;
altfel
( ) ( )
dacă f x(i ) ≤ f x(i −1) , atunci valoarea de optim a coordonatei k este:
%iniţializări
i=1;x(i,:)=x0;p=pas_init;
n=length(x0);
while (p>tol),
p0=p*r;p=p0;
k=1;d=zeros(1,n);
stop_global=0;inapoi=0;
while (~stop_global),
d(k)=1;j=0;
stop=0;
2. Aproximare, interpolare şi optimizare parametrică 75
while (~stop)
if inapoi,
p=p/2;
inapoi=0;
end;
x(i+1,:)=x(i,:)+p*d;
j=j+1;
if feval(fct_scop,x(i+1,:))>feval(fct_scop,x(i,:)),
if j==1,
p=-2*p;
i=i+1;
x(i+1,:)=x(i,:)+p*d;
inapoi=1;
else stop=1;
x(i+1,:)=[];
i=i-1;
d(k)=0;
k=k+1;
p=p0;
end;
end;
i=i+1;
end;
if k<=n,
stop_global=0;
else stop_global=1;
end;
end;
end;
[nr_it n]=size(x);
x_opt=x(nr_it,:);
Pentru exemplificare, s-a folosit o funcţie de două argumente reale:
function y=f(x)
y=4+6*x(1)-4*x(2)+x(1)^2+2*x(2)^2-...
6*x(1)*x(2)+x(1)^4+2*x(1)^2*x(2);
care descrie o suprafaţă (figura 2.9), şi care are trei minime locale, calculabile analitic, situate
aproximativ în punctele de coordonate (0;1), (0.3117;1.419) şi (–4.8117;–17.794).
Cele două apeluri de mai jos arată că, din acelaşi punct de start, (–1;3), dar cu alt pas
iniţial (p=1, respectiv p=0.5), metoda relaxării poate furniza rezultate semnificativ diferite.
[x_opt,nr_it]=opt_rlx('f',[-1 3],1,0.5,1e-6)
x_opt =
0.0000 1.0000
nr_it =
84
76 Metode numerice utilizate în analiza sistemelor – aplicaţii
[x_opt,nr_it]=opt_rlx('f',[-1 3],0.5,0.5,1e-6)
x_opt =
0.3118 1.4191
nr_it =
407
f(x1,x2)
x2
x1
Dintr-un alt punct de start se poate obţine un alt punct de minim local:
[x_opt,nr_it]=opt_rlx('f',[-3 -7],2,0.5,1e-5)
x_opt =
-4.8158 -17.8200
nr_it =
3577
metode
de gradient
Metode de ord. al II-lea
ale direcţiilor (Newton)
conjugate
metode
de gradient
metode simplu
DIRECTE
viteza de convergenţă
Asupra acestor caracteristici ale algoritmilor prezentaţi în secţiunile anterioare s-au făcut
referiri succinte; un grafic sintetic de apreciere calitativă este dat în figura 2.10.
Mai jos se studiază comparativ performanţele unei metode directe şi ale unei metode
indirecte, respectiv ale metodei relaxării (funcţia opt_rlx) şi ale metodei gradienţilor
conjugaţi, Fletcher-Reeves (programul script fletreev) pe două exemple de funcţii
obiectiv, una având două argumente, cealaltă patru argumente reale.
(2.32) f3 [ x1 x2 ] = 10 x14 − 20 x2 x12 + 10 x22 + x12 − 2 x1 + 5
1 424 3
x
2
144 4 2444 3
2
( ) 4
(2.33) f 4 [ x1 x2 x3 x4 ] = ( x1 + 5 x2 ) + 8 x3 − x42 + 2 ( x2 − 5 x3 ) + 8 ( x1 − x4 )
4
x
Funcţiile obiectiv sunt respectiv implementate de funcţiile Matlab f3 şi f4, date mai jos.
function y=f3(x)
y=10*x(1)^4-20*x(1)^2*x(2)+10*x(2)^2+x(1)^2-2*x(1)+5;
function y=f4(x)
y=(x(1)+5*x(2))^2+8*(x(3)-x(4)^2)^2+...
2*(x(2)-5*x(3))^4+8*(x(1)-x(4))^4;
De observat că scriptul fletreev scris în §2.3.4 trebuie modificat în sensul înlocuirii
apelului funcţiei f1 pe rând cu cel al funcţiilor f3 şi f4. Dimpotrivă, în cazul lui opt_rlx
nu trebuie modificat codul, ci numai apelul funcţiei, transmiţând în fiecare caz ca argument
de intrare numele fişierului (ca şir de caractere) unde se găseşte funcţia obiectiv.
Tabelul 2.10 conţine rezultatele aplicării celor două metode asupra celor două funcţii de
optimizat, din aceleaşi condiţii de start.
Apel Rezultat Obs.
Algoritmul Fletcher-Reeves (gradienţi conjugaţi) nr_it = Funcţia are
x0=[1.5 0.5]; 19
fletreev
un singur
minim =
f3(x) 1.0000 1.0000 minim,
Metoda relaxării x_opt = calculabil
(2.32)
x0=[1.5 0.5]; 0.9693 0.9396 analitic:
[x_opt,nr_it1]=opt_rlx('f3',x0,1,0.9,1e-5) nr_it1 =
(1,1)
3614
Algoritmul Fletcher-Reeves (gradienţi conjugaţi) nr_it = itermax a
x0=[0.3 2.2 -0.5 5.0000]; 101
fletreev
fost setată la
minim =
0.0729 -0.0146 0.0034 0.0591 100 şi a fost
f4(x)
depăşită
(2.33) Metoda relaxării x_opt =
x0=[0.3 2.2 -0.5 5.0000] 0.1093 -0.0218 0.0061 0.0801
[x_opt,nr_it1]=opt_rlx('f4',x0,1,0.9,1e-5) nr_it =
2008
Tabel 2.10 Metoda gradienţilor conjugaţi în comparaţie cu metoda relaxării – două exemple
Cele două exemple rezumate în tabelul 2.10 sugerează superioritatea metodei indirecte a
gradienţilor conjugaţi în raport cu metoda directă a relaxării. În cazul primei funcţii obiectiv
78 Metode numerice utilizate în analiza sistemelor – aplicaţii
calitatea soluţiilor numerice se poate aprecia prin referire la soluţia exactă, care se poate
calcula analitic; viteza de convergenţă este mai bună pentru algoritmul Fletcher-Reeves.
Totuşi, nu trebuie uitat că, de fapt, fiecare iteraţie a algoritmului (contorizată în variabila
nr_it) conţine o optimizare în raport cu parametrul α, iar limitele domeniului de variaţie ale
acestui parametru şi pasul de căutare sunt alese arbitrar, depinzând de la caz la caz. Deci
numărul real de iteraţii poate fi uneori foarte mare.
În cazul celei de a doua funcţie obiectiv soluţia exactă este dificil de calculat (presupune
rezolvarea unui sistem de ecuaţii neliniare); trebuie, deci, comparate rezultatele evaluării
funcţiei f4 respectiv în punctele de extrem găsite prin cele două metode:
f4(minim)
ans =
2.3554e-006
f4(x_opt)
ans =
2.1664e-005
de unde rezultă că şi în acest caz metoda gradienţilor conjugaţi ar fi mai avantajoasă.
Merită făcută încă o observaţie, şi anume că implementările Matlab prezentate calculează
numeric gradientul, aceasta deoarece nu întotdeauna se dispune de expresia analitică exactă a
funcţiei scop (ea poate fi dată uneori tabelar) pentru a i se putea calcula analitic gradientul. O
altă soluţie este aproximarea funcţiei scop cu o expresie analitică (fie prin regresie, fie prin
interpolare, după cum s-a prezentat în secţiunile anterioare), urmată de calculul analitic al
gradientului respectivei expresii. Un exemplu în acest sens este prezentat mai jos.
2.5
1.5
0.5
x
-4 -3 -2 -1 0 1 2 3 4
-0.5
deci, să aibă cel puţin patru rădăcini reale). Pentru determinarea coeficienţilor de regresie se
poate folosi funcţia cmmp_gen, scrisă în §2.1.5:
x=[-4 -2 0 2 4]; y=[0.0004 -0.35 3 0.35 0.0004];
[coef,E]=cmmp_gen(x,y,5)
care furnizează rezultatele:
coef =
3.0000 0.0000 -1.0542 0.0000 0.0542
E =
4.4407e-029
Pentru a aplica algoritmul Fletcher-Reeves funcţiei polinomiale descrise de vectorul
coef este necesar gradientul acestei funcţii (în cazul de faţă, derivata ei în raport cu singura
variabilă de care depinde), de data aceasta sub formă analitică.
În cazul unei funcţii polinomiale de o singură variabilă reală de grad n, derivata ei este
tot o funcţie polinomială, de grad n-1. Dacă funcţia este dată prin coeficienţii polinomiali
{ai }i = 0, n , atunci se pot deduce algoritmic coeficienţii polinomiali ai derivatei acesteia,
{b j } j =0,n −1 , conform cu relaţia:
b j = ( j + 1) ⋅ a j +1, j = 0, n -1
În scrierea funcţiei Matlab pentru calculul polinomului derivat al unui polinom dat
trebuie avut în vedere ca vectorii de coeficienţi să fie daţi în ordine descrescătoare a puterilor
variabilei. Astfel, pentru un polinom de grad n, între rangurile coeficienţilor, i, şi poziţiile lor,
k, există relaţia i=n–k+1. Funcţia Matlab este următoarea:
function [coef_der]=der_pol(coef)
m=length(coef);%m=n+1
for k=1:m-1,
coef_der(k)=(m-k)*coef(k);
end;
Funcţia der_pol va fi apelată de scriptul grco_pol, prezentat în continuare, care este o
variantă modificată a programului fletreev din §2.3.3. De remarcat că grco_pol este
destinat exclusiv optimizărilor funcţiilor scop polinomiale de o singură variabilă reală.
I=1;
x(i)=x0;n=length(x0);
[coef_der]=der_pol(coef);
h=0.0001;itermax=100;
grad(i)=polyval(coef_der,x0);
p(i)=-grad(i);
stop=0;
while (~stop)&(i<=itermax),
alfa=0:0.0001:1;
y_min=polyval(coef,x(i));
stop=1;
80 Metode numerice utilizate în analiza sistemelor – aplicaţii
for j=1:length(alfa),
y=polyval(coef,x(i)+alfa(j)*p(i));
if y<y_min,
y_min=y;
x(i+1)=x(i)+alfa(j)*p(i);
stop=0;
end;
end;
if (~stop)
grad(i+1)=polyval(coef_der,x(i+1));
p(i+1)=-grad(i+1)+grad(i+1)^2/grad(i)^2*p(i);
end;
i=i+1;
end;
nr_it=length(x);nr_it
minim=x(nr_it)
Variabila coef existând deja în spaţiul de lucru, testarea programului presupune
introducerea punctului de start, x0. Mai jos sunt date două apeluri ale programului pentru
două puncte diferite de start şi rezultatele furnizate în fiecare din cazuri (este bine ca după
fiecare apel cu un nou punct de start să se dea comanda clear x).
X0=-1;grco_pol
nr_it =
5
minim =
-0.4192
clear x
x0=2;grco_pol
nr_it =
4
minim =
0.4192
După cum şi tabelul iniţial de date sugerează, poziţiile punctelor de minim sunt simetrice
faţă de origine.
Pentru determinarea punctului de maxim al funcţiei, se poate folosi în principiu acelaşi
program, dar pentru minus funcţia scop (vectorul coef va fi, de fapt, –coef); aceste adaptări
sunt lăsate cititorului ca exerciţiu.
a) f ( x1, x2 , x3 ) = 2 x12 + x22 + 2 x32 + 2 x1x2 + x1x3 − 200 x1 − 140 x2 + 120 x3 + 200 ;
unde δh este eroarea statică a traductorului de nivel, δQ este eroarea statică a traductorului de
debit, iar β este o constantă dependentă de proces. Pentru determinarea celor trei parametri
(identificarea experimentală a procesului) s-au efectuat măsurătorile din tabelul 2.11.
h Q
1 0.45 2.10
2 0.45 3.00
3 0.65 3.60
4 1.70 4.20
5 3.00 4.90
6 4.20 5.50
7 5.20 5.90
8 6.10 6.30
9 7.00 6.50
Tabel 2.11 Măsurări în vederea identificării parametrilor dependenţei h(Q) (relaţia (2.34))