Professional Documents
Culture Documents
Metode Numericein Inginerieutilizand MATLAB2
Metode Numericein Inginerieutilizand MATLAB2
Nicoară
BRAȘOV 2014
Prefață
Metodele numerice sunt tehnici prin care problemele matematice sunt formulate
astfel încât să poată fi rezolvate prin operații aritmetice și operații logice.
Sunt mai multe moduri de a preda tehnicile aproximațiilor numerice.
Cursurile de Analiză Numerică tradițională prezintă atât metodele de aproximare
cât și partea de analiză matematică din care au rezultat aceste metode.
Cursurile de Metode Numerice sunt mai concentrate pe aplicarea acestor tehnici
numerice la rezolvarea problemelor din inginerie decât pe deducere teoretică a
acestora.
Acesta este și modul în care am gândit acest curs de Metode Numerice.
Fiecare metodă este motivată și descrisă din punctul de vedere al implementării
algoritmului numeric. Scopul este de a convige studentul că această metodă este
suficient de riguroasă atât din punct de vedere matematic cât și din punct de
vedere computațional. O descriere matematică completă este inclusă numai dacă
metoda nu poate fi înțeleasă altfel.
Cursul folosește ca suport pentru implementarea algoritmilor numerici pachetul de
programe MATLAB, care este un mediu de programare accesibil studenților.
Metodele numerice și programarea lor în cod program folosind MATLAB, au
devenit un mod de lucru nou, foarte util în înțelegerea și surmontarea eventualelor
dificultăți matematice.
Dezvoltarea calculatoarelor a făcut din metodele numerice un instrument de lucru
fundamental în rezolvarea problemelor din ingineria modernă.
De aceea consider că însușirea metodele numerice trebuie să fie parte din
pregătirea fiecărui inginer.
Acest curs este conceput ca suport al cursului de Metode Numerice, predat de
autor studenților anului II de la Facultatea de Inginerie Mecanică.
CUPRINS
5. 1 Introducere........................................................................................................... 200
5. 2. Interpolare polinomială........................................................................................ 201
5.2.1 Metoda directă ............................................................................................... 202
5.2.2 Interpolare cu polinomul Newton................................................................... 208
5.3 Implementare ȋn Matlab a metodei Newton ......................................................... 221
5.4 Interpolare cu polinoame Lagrange....................................................................... 222
5.5 interpolare spline................................................................................................... 233
5.6 Interpolare cu funcţia matlab interp1 ........................................................... 244
5.7 Interpolare cu funcţia Matlab polyfit ........................................................... 251
5.8 Probleme............................................................................................................... 253
BIBLIOGRAFIE 317
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
1
INTRODUCERE ÎN MATLAB
1
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
2
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
Mediul de dezvoltare Matlab este alcătuit dintr-un set de unelte care facilitează folosirea
funcţiilor şi fişierelor MATLAB. Multe dintre acestea reprezintă de fapt interfeţele grafice
şi includ fereastra principală MATLAB sau MATLAB Desktop, fereastra de comenzi sau
Command Window, fereastra ce memorează istoria comenzilor sau Command History, şi
browser-ele de Help, Workspace, Files, Search Path etc.
Workspace
Command Window
Current Folder
Command History
3
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
Variabilele în Matlab sunt numeric sau de tip şir şi sunt reprezentate ca matrice.
Variabilele sunt folosite pentru a memora valorile numerice sau variabile şir, atat în
modul de lucru interactiv, în Command Window, cât şi în modul de lucru cu M-file.
Valorile momentane ale variabilelor se definesc prin operaţia de atribuire:
unde variabila este un nume legal în Matlab, iar expresia este: o constantă, o expresie
aritmetică, o expresie logica sau o funcţie Matlab.
Operatorul de atribuire este semnul egal " = ".
Numele variabilelor în MATLAB
încep cu o literă a-z sau A-Z urmată de alte caractere: a-z, A-Z, sau _;
au lungimea maximă din 31 caractere;
numele variabilelor nu trebuie să coincidă cu numele funcţiilor din biblioteca
Matlab, built-in functions, sau cu funcţiile definite de utilizator;
Matlab este case sensitive, variabila raspuns_1 este diferită de variabila
RASPUNS_1 .
Variabilele definite se pot vedea în Workspace Window. Când se atribuie o expresie unei
variabile de la prompter " >> ", în fereastra de comandă Command Window, Matlab
răspunde, dupa apasarea tastei Enter, prin afişarea valorii memorate pentru variabilă.
Dacă la sfârşitul expresiei se pune semnul punct şi virgula (semicolon) " ; " se suprimă
afişarea rezultatului.
Constantele numerice pot fi numere reale sau numere complexe. Constantele de tip şir
sunt definite prin şiruri de caractere alcătuite din litere, cifre, spaţii, delimitate prin
apostrof ( 'a1 aria_cerc r a2' ).
Pentru a afişa valoarea unei variabila se tastează numele ei.
Exemplul 1.1
>> r=4
r =
4
4
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
aria_cerc =
50.2655
>> b = r+aria_cerc
b =
54.265
>> d = c+b
d =
2.5849e+003
>> z = 3+2i
z =
3.0000 + 2.0000i
>> z = 3+2j
z =
3.0000 + 2.0000i
ans =
0 + 1.0000i
Comanda format
5
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
are efect asupra afişării numerelor, şi nu asupra modului intern de reprezentare a acestora.
Pe sistemele Windows, se poate schimba setarea implicită a formatului prin selectarea
meniului Preferences din meniul File şi selectarea formatului dorit din General.
Formatele de afişare a numerelor sunt cele din Tabelul 1.1.
Prezentăm în Tabel 1.2 funcțiile care furnizează valorile unor constante pre-definite în
Matlab.
6
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
pi
>> format long
>> pi , (3.141592653589793.....)
ans =
3.141592653589793
i,j
>> sqrt(-1)
ans = unitatea imaginară
0 + 1.0000i
>> i^2
ans =
-1
realmax
>> format short limita superioară a numerelor
>> realmax 1.7977e+308 = 1.7976*10308
ans =
1.7977e+308
realmin
>> realmin limita inferioară a numerelor
ans = 2.2251e-308=2.2251*10-308
2.2251e-308
7
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
Inf
>> 1/0
ans = ∞ infinit
Inf
NaN
>> 0/0 " not a number"; 0 0
ans =
NaN
adunarea + 5+2=7
scăderea - 5-2=7
ȋnmulţire * 5*2=10
ȋmpărţirea la dreapta / 5/2=2.5
ȋmpărţirea la stânga \ 5\2=2/5=0.4
ridicare la putere ^ 5^2=25
Ordinea operaţiilor din Matlab este aceeaşi cu cea a operaţiilor aritmetice, cunoscute din
matematica elementară, adica se efectuează întâi operaţiile cuprinse în paranteze, apoi
ridicarea la putere, înmulţirea şi împărţirea, adunarea şi scăderea.
Pentru a şterge o variabilă sau pentru a obţine informaţii despre variabile curente, create
într-o sesiune de lucru, vom introduce în Command Window următoarele comenzi:
8
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
>> who
>> whos
Pentru aflarea tuturor informaţiilor utile despre o comandă sau o funcţie Matlab se
tastează help urmat de numele comenzii sau funcţiei respective.
MATLAB dispune de asemenea de informaţii complete despre utilizare sub forma unei
documentaţii tip .pdf.
Comenzi utile pentru aflarea de informaţii sunt: help, helpdesk, helpwin, lookfor, help
help, demo.
DEMO opens the Help browser and selects the MATLAB Demos
entry in the table of contents.
Examples:
demo 'matlab'
demo 'toolbox' 'signal'
demo 'matlab' 'getting started'
Exemplul 1.2
Exemplul 1.3
>> a = abs(3+4i)
a =
5
rho =
1.6180
>> who
a rho
Pentru calcule matematice elementare Matlab conţine funcţiile matematice uzuale. Matlab
conţine de asemenea multe funcţii matematice pentru calcule avansate, ca de exemplu
funcţiile Bessel şi funcţiile gama.
Detalii despre funcţiile elementare se obţin cu comanda
11
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
sin - Sine.
sind - Sine of argument in degrees.
sinh - Hyperbolic sine.
asin - Inverse sine.
asind - Inverse sine, result in degrees.
asinh - Inverse hyperbolic sine.
cos - Cosine.
cosd - Cosine of argument in degrees.
cosh - Hyperbolic cosine.
acos - Inverse cosine.
acosd - Inverse cosine, result in degrees.
acosh - Inverse hyperbolic cosine.
tan - Tangent.
tand - Tangent of argument in degrees.
tanh - Hyperbolic tangent.
atan - Inverse tangent.
atand - Inverse tangent, result in degrees.
atan2 - Four quadrant inverse tangent.
atanh - Inverse hyperbolic tangent.
sec - Secant.
secd - Secant of argument in degrees.
sech - Hyperbolic secant.
asec - Inverse secant.
asecd - Inverse secant, result in degrees.
asech - Inverse hyperbolic secant.
csc - Cosecant.
cscd - Cosecant of argument in degrees.
csch - Hyperbolic cosecant.
acsc - Inverse cosecant.
acscd - Inverse cosecant, result in degrees.
acsch - Inverse hyperbolic cosecant.
cot - Cotangent.
cotd - Cotangent of argument in degrees.
coth - Hyperbolic cotangent.
acot - Inverse cotangent.
acotd - Inverse cotangent, result in degrees.
acoth - Inverse hyperbolic cotangent.
hypot - Square root of sum of squares.
Exponential.
12
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
exp - Exponential.
expm1 - Compute exp(x)-1 accurately.
log - Natural logarithm.
log1p - Compute log(1+x) accurately.
log10 - Common (base 10) logarithm.
log2 - Base 2 logarithm and dissect floating
Complex.
Coordinate transforms.
Vom prezenta câteva funcţii din MATLAB utilizate în calcule matematice fundamentale.
Funcţia Rezultat
13
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
în baza 10
complex(a,b) Construieşte z a ib
exp(x)
Calculează ex
log(x) Calculează ln x
pow2(x)
Calculează x2
14
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
sqrt(x) Calculează x
tan(x) Calculează tg x
15
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
Elementary matrices.
Matrix manipulation.
16
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
Specialized matrices.
y Imz
iy z x iy
z
x Rez
z = Comanda Matlab
2.5981 + 1.5000*i
y = 1.5000
mod = 3
y >> theta=angle(z)
argumentul- unghiul arctan theta = 0.5236
x
18
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
>> theta_grade=theta*180/pi
theta_grade = 30.0000
cu notaţia lui Euler >> mod=3;theta=pi/6;
În MATLAB putem accesa o funcție calculator grafic interactiv pentru lucrul cu funcții de
o variabilă. Acesul la această funcție se face cu comanda:
>> funtool
Variabilele în Matlab sunt numeric sau de tip şir şi sunt reprezentate ca matrice.
Vectorii şi matricele sunt tablouri de numere aranjate în linii şi/sau coloane.
Ele se vor introduce între paranteze drepte, element-by-element .
v [v1 v 2 . . v n ],
unde v1, v 2 ,.., v n sunt scalari (numere reale sau complex), vom introduce elementele
separate printr-un spaţiu sau o virgulă.
Exemplul 1.5
>> v = [9 -6 3 2]
v =
9 -6 3 2
>> whos('v')
v 1x4 32 double
20
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
>> length(v)
ans =
4
Pentru introducerea manuală a unui vector coloană, vom introduce elementele separate
prin semicoloana (punct şi virgulă) (;).
Exemplul 1.6
v =
9
-6
3
2
>> whos('v')
ans =
-6
>> v(2)=10
v =
9 10 3 2
21
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
>> v=[9 -6 3 2]
v =
9 -6 3 2
>> u=v'
u =
9
-6
3
2
Exemplul 1.7:
10. Generarea unui vector cu operatorul " : " se face pornind de la valoarea iniţială 1 şi
până la valoarea finală 4, cu pasul 0.8:
>> x=1:0.8:4
x =
1.0000 1.8000 2.6000 3.4000
20. În cazul în care nu este trecut pasul, Matlab consideră pasul egal cu valoarea 1:
22
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
>> x = 1:5
x =
1 2 3 4 5
30. Putem genera un vector coloană folosind aceeaşi metodă împreună cu operatorul de
transpunere
>> y=(0:0.2:1)'
y =
0
0.2000
0.4000
0.6000
0.8000
1.0000
Metoda a doua de generare a unui vector, frecvent utilizată în programele din capitolele
următoare, foloseşte funcţia Matlab linspace.
Comanda se poate folosi cu următoarele două sintaxe:
a) sintaxa:
generează un vector linie cu 100 elemente, egal distanţate, între valoarea iniţială şi
valoarea finală.
b) sintaxa:
Exemplul 1.8
23
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
10)
>> v = linspace(0,0.25,6)
v =
Columns 1 through 4
0 0.0500 0.1000 0.1500
Columns 5 through 6
0.2000 0.2500
20)
>> v = linspace(0,0.25,6)'
v =
0
0.0500
0.1000
0.1500
0.2000
0.2500
30)
>> x=linspace(0,2*pi,4)';
>> y=sin(x);
>> z=cos(x);
ans =
0 0 1.0000
2.0944 0.8660 -0.5000
40)
>> x=linspace(0,4);
% definim funcția
>> y=x.^2-3*x+2;
>> plot(x,y)
>> grid
24
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
1.5
0.5
-0.5
0 0.5 1 1.5 2 2.5 3 3.5 4
Prezentăm în Tabelul 1.8 câteva funcţii din Matlab 7.0 utilizate în calcule cu vectori.
Funcţia Rezultat
25
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
Exemplul 1.9
a 2i j k și b 3i j 4k .
Folosim relaţiile :
a b a b cos(a, b ) a b cos , a b a x bx a y b y a z bz
a b
arccos( ) ; a a x2 a 2y a z2 norm(a )
ab
% introducem vectorii
>> theta=acos(c/(norm(a)*norm(b)))
theta =
1.4906 (rad)
>> theta_grade=theta*180/pi
theta_grade = 85.4078
26
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
Exemplul 1.10
A =
2 2 4 -2
1 3 2 -1
3 1 3 1
1 3 4 2
>> A(3,2)
ans = 1
ans =
4
2
3
4
c) Matricea transpusă
A =
2 2 4 -2
1 3 2 -1
3 1 3 1
1 3 4 2
A_transpusa =
2 1 3 1
2 3 1 3
4 2 3 4
-2 -1 1 2
28
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
Prezentăm în Tabelul 1.9 câteva funcţii din Matlab 7.0 utilizate în lucrul cu matrice.
Exemplul 1.11
ans =
4 4
>> diag(A)'
ans =
2 3 3 2
29
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
A =
1 0 0
0 2 0
0 0 3
ans =
1 0 0
0 1 0
0 0 1
Exemplul 1.12
% introducem matricele A și B
30
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
A =
0 1 2
5 1 4
3 2 -4
B =
1 0 0
0 1 0
0 0 1
>> C=A+B
C =
1 1 2
5 2 4
3 2 -3
n
% produsul matricelor, d ij a ik bkj
k 1
>> D=A*B
D =
0 1 2
5 1 4
3 2 -4
>> inv(A)
>> det(A)
31
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
Exemplul 1.13
>> det(A)
ans =
-68
% calculăm inversa
>> inv(A)
>> inv(A)*A
ans =
1.0000 0.0000 0.0000 0.0000
0.0000 1.0000 0.0000 0.0000
0.0000 0.0000 1.0000 0.0000
0.0000 0.0000 0.0000 1.0000
Împărţirea la stânga este folosită pentru rezolvarea sistemelor de ecuaţii algebrice liniare
(vezi Capitol 3) de forma
unde
32
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
Pentru o matrice A bine condiţionată (vezi secțiunea 3.5) şi nesingulară, soluţia ecuaţiei
matriceale se obţine prin înmulţirea în ambele părţi ale ecuaţiei (1.1) cu inversa matricei
sistemului, [ A ] 1 :
1
Deoarece A A I , din (1.3) obţionem soluţia:
>> A\b
Exemplul 1.14
A =
1 2 1
0 -1 2
0 0 3
b =
2
1
9
>> det(A)
ans = -3
33
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
>> x=A\b
x =
-11
5
3
>> x=inv(A)*b
x =
-11.0000
5.0000
3.0000
x A b
unde x şi b sunt vectori linie.
Soluţia ecuaţiei este
x b A1
În Matlab, ecuaţia se rezolvă folosind operatorul de împărţire la dreapta " / " şi se obţine
cu comanda
>> x= b/A
Exemplul 1.15
A =
1 2 1
0 -1 2
0 0 3
b =
2 1 9
>> x=b/A
>> b*inv(A)
ans =
2.0000 3.0000 0.3333
Exemplul 1.16
>> u=v.^2
u =
1 4 9 16
>> w=v^2
??? Error using ==> mpower
Inputs must be a scalar and a square matrix.
A =
1 2
3 4
35
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
B =
-1 5
3 1
>> C=A.*B
C =
-1 10
9 4
>> D=A*B
D =
5 7
9 19
>> E=A./B
E =
-1.0000 0.4000
1.0000 4.0000
F =
0.3125 0.4375
0.5625 1.1875
>> A*inv(B)
ans =
0.3125 0.4375
0.5625 1.1875
36
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
Tot element cu element se fac calculele şi pentru unele dintre funcţiile din biblioteca
Matlab când argumentul este o matrice. De exemplu, pentru A matrice, comenzile
sin(A), cos(A) sau exp(A)au ca rezultat matrice de aceași dimensiune cu matricea
A și cu elementele valoarea funcției pentru fiecare element (element cu element).
ans =
0.5000 1.0000
0.7071 0.8660
37
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
D =
16 3 2 13
5 10 11 8
9 6 7 12
4 15 14 1
Caracterul magic derivă din faptul că prin efectuarea unor operaţii asupra elementelor
matricei obținem rezultate surprinzătoare.
Dacă de exemplu, însumăm elementele pe orice linie sau coloană sau de pe cele două
diagonale vom obţine acelaşi număr. Să verificăm acest lucru cu MATLAB-ul.
Suma elementelor de pe cele 4 coloane se calculează cu comanda:
» sum(A)
ans =
34 34 34 34
Pentru calcularea sumelor pe linii, efectuăm întâi transpunerea matricei şi apoi se aplică
din nou comanda sum.
» A'
ans =
16 5 9 4
3 10 6 15
2 11 7 14
13 8 12 1
» sum(A')'
ans =
34
34
34
34
» diag(A)
ans =
38
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
16
10
7
1
» sum(diag(A))
ans =
34
Fișierul script poate fi editat (modificat și/sau corectat) și executat de mai multe ori. Orice
editor de text poate fi folosit pentru a crea fișiere script. În MATLAB fișiere script sunt
create și editate în Editor / Debugger Window. Această fereastră poate fi deschisă din
fereastra de comandă (Command Window). Din această fereastă selectați File, New și
apoi M-file (Script).
Exemplul 1.17 Vom scrie o M-fila pentru calculul rădăcinilor ecuației de gradul doi.
parcurgem următorii pași:
1. Alegem New..din File menu, apoi M-file (Script) și scriem comenzile în noua m-fila:
40
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
format short;
a=1; b=5; c=6;
m = -b/(2*a);
n = sqrt(b^2-4*a*c)/(2*a);
x1 = m+n
x2 = m-n
>> rad_ec_grad2
x1 =
-2
x2 =
-3
Exemplul 1.17 Vom scrie o M-fila pentru a obține graficul funcției sin(x)pe care o
salvăm cu numele sin_grafic.m.
Conținutul ei se afișează cu comanda:
41
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
0.8
0.6
0.4
0.2
sin(x)
0
-0.2
-0.4
-0.6
-0.8
-1
0 1 2 3 4 5 6 7
x
Aceste fişiere permit utilizatorului să extindă funcțiile de bază (built-in) din biblioteca
MATLAB prin adăugarea de funcții proprii. Fișierele M-file de tip funcție acceptă
argumente de intrare şi furnizează argumente de ieşire. Numele fişierului MATLAB (M-
file) şi cel al funcţiei (subrutinei) respective trebuie să fie identice. Funcţiile (subrutinele)
lucrează cu variabile proprii separate de spaţiul de lucru uzual al MATLAB-ului.
M-filele de tip funcție încep cu o linie de forma:
Prima linie a unei funcţii M-file începe cu cuvântul cheie function. Această linie dă
numele funcţiei, ordinea şi numărul argumentelor.
Liniile care încep cu caracterul % sunt linii de comentariu.
Exemplul 1.18
M-fila funcție pentru calculul radacinilor unei ecuații de gradul 2. Exemplul conține și o
demonstratie pentru utilizarea comenzii keybord.
42
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
function x = rad_ec_grad2(a,b,c)
x=zeros(1,2);
x(1)=q/a;
x(2)=c/q;
x = [x(1); x(2)]
x 2 5x 6 0 ( 0 )
>> x=rad_ec_grad2(1,5,6)
x =
-3
-2
43
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
x2 x 1 0 ( 0 )
>> x=rad_ec_grad2(1,1,1)
1. function M-files
2. anonymus functions sau function handles @(x)
3. inline functions
Pentru a defini funcții noi, diferite de funcțiile (built-in) matematice din Matlab putem
folosi comanda function.
Din File-New-Function obținem:
% scriem funcția
end
Funcția se va salva într-o M-fila cu numele funcției. (Matlab salvează implicit funcțiile
în acest mod).
44
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
Exemplul 1.19
function v = viteza(t,m,b)
v=10*(1-exp((-b/m)*t));
Cea mai simplă metodă pentru a crea funcții în Matlab este să folosim semnul @. Astfel
definim funcțiile ca handle functions sau anonymus functions.
Sintaxa:
nume_functie = @(var1,var2,..)expresie
Exemplul 1.20
f =
@(x)x^2-3*x+2
>> f(1)
ans =
0
>> x=1:4;
>> f=@(x) x.^2-3*x+2
f =
@(x)x.^2-3*x+2
>> f(x)
ans =
0 0 2 6
În Matalb putem defini funcții matematice simple nu numai în M-file tip funcție. O altă
metodă este de a scrie direct, în programe sau în Command Window, funcțiile folosind
comanda inline.
Sintaxa:
nume_functie = inline('expresie',var1,var2,..)
[y1,..,yn] = feval(f,x1,...,xn)
Exemplul 1.21
f =
Inline function:
f(x) = x.^2+3*x+1
>> argnames(f)
46
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
ans =
'x'
avem argumente de ieșire și argumente de intrare care sunt, respectiv, date de ieșire și
date de intrare.
Exemplul 1.22
valoarea x =
Exemplul 1.23
>> rad_ec_grad2(1,11,30)
x =
-6
-5
Recomandăm introducerea parametrilor de intrare direct în funcție.
Exemplul 1.24
a.
>> display('Buna ziua')
48
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
% Matlab afișează
Buna ziua
b.
>> format short
>> x=1:3;
>> disp(x)
1 2 3
c.
>> x=1:3;
>> y=4-x;
>> disp([x; y])
1 2 3
3 2 1
Funcția num2str
stringValue = num2str(numericValue)
Funcția str2num
Exemplul 1.25 a)
>> A = ones(3)
A =
1 1 1
1 1 1
1 1 1
49
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
>> S = num2str(A)
S =
1 1 1
1 1 1
1 1 1
>> A=ones(3);
>> S=num2str(A);
>> B=str2num(S);
>> A-S
>> A-B
ans =
0 0 0
0 0 0
0 0 0
>> whos
A 3x3 72 double
B 3x3 72 double
S 3x7 42 char
ans 3x3 72 double
Exemplul 1.25 b)
50
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
>> x = sqrt(3);
>> disp(['x = ',num2str(x)])
x = 1.7321
Funcția fprintf se folosește pentru formatarea (aranjarea) datelor pe ecran sau pentru
tipărire.
Sintaxa:
fprintf('format',lista de variabile)
Format este un șir ce conține text dar și indicații despre modul în care variabilele, din
lista de variabile, se convertesc (formatul) și se poziționează (afișează).
În tabelul 1.10 sunt date codurile de bază cu care se formatează variabilele din lista de
variabile.
\t insert tab
În tabelul 1.11 sunt date codurile pentru a preciza în format atât numărul total de
caractere precum și numărul de zecimale.
51
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
Exemplul 1.26
% varainta 1 % varianta 2
>> x=0:pi/4:2*pi; >> x=0:pi/4:2*pi;
>> y=sin(x); >> y=sin(x);
>> fprintf('%8.3f\n',y) >> fprintf('y = %8.3f\n',y)
0.000 y = 0.000
0.707 y = 0.707
1.000 y = 1.000
0.707 y = 0.707
0.000 y = 0.000
-0.707 y = -0.707
-1.000 y = -1.000
-0.707 y = -0.707
-0.000 y = -0.000
Exemplul 1.27
x = 0:0.2:1;
fprintf(' x sin(x)\n')
for i = 1:length(x)
fprintf('%4.1f %11.6f\n',x(i),sin(x(i)))
end
52
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
x sin(x)
0.0 0.000000
0.2 0.198669
0.4 0.389418
0.6 0.564642
0.8 0.717356
1.0 0.841471
Exemplul 1.28
Dacă o declaraţie (comandă) nu încape într-o linie de comandă, se vor utiliza trei puncte .
. . urmate de Return sau Enter pentru a indica faptul că expresia continuă pe linia
următoare.
Spaţiile albe din jurul semnelor =, +, - sunt opţionale şi pot îmbunătăţi citirea liniilor.
Maximul numărului de caractere pe o singură linie este de 4096.
O expresie relaţională este formată din două expresii aritmetice separate de un operator
relaţional. Operatorii de relație în Matlab sunt cei din Tabelul 1.11 Rezultatul unei
expresii relaţionale este true (adevărat) sau false (fals) ce au valorile 1 şi respectiv 0.
53
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
Operatorii logici au în Matalb simbolurile din Tabelul 1.12. Valorile logice de adevăr sau
fals sunt 1 respectiv 0.
Tabel 1.12 Operatori logici
| OR (sau)
~ NOT (nu)
A B A&B A B A|B
1 1 1 1 1 1 A ~A
1 0 0 1 0 1 1 0
0 1 0 0 1 1 0 1
0 0 0 0 0 0
Fiecare operator logic lucrează element cu element. Funcția Matlab (built-in) logical
convertește elementele vectorior sau maticelor în valorile logice 1 (True) și 0 (False).
Orice element real diferit de zero al matricei este convertit în 1, valorile 0 ale matricei
devin valoarea logică 0.
54
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
Numerele complexe nu se pot converti in valori logice, rezultatul fiind un mesaj de eroare
(>> help logical).
Exemplul 1.29
A =
2 -1 2 -2
0 1 2 3
B =
1 1 1 1
1 1 1 1
>> A<B
ans =
0 1 0 1
1 0 0 0
>> A<=B
ans =
0 1 0 1
1 1 0 0
>> A~=B
ans =
1 1 1 1
1 0 1 1
b) Vom crea, pornind de la doi vectori a și b, vectorii cu valori logice corespunzători, apoi
vom face operațiile logice cu ei.
55
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
>> v=logical(b)
v =
1 0 1 0 1
>> w = u & v
w_and =
1 0 1 0 0
w_ori =
1 1 1 0 1
>> w_si = ~u
w_si =
0 0 0 1 1
Nu este necesar să convertim vectorii în vectori logici. Dacă vectorii sau matricele nu sunt
tablouri de valori logice, operatorul logic va converti mai întâi operanzii în tablouri logice
și apoi va executa comanda cerută.
c)
>> a=[ 2 3 4 0 0];
>> b=[-1 0 3 0 10];
>> a&b
ans =
1 0 1 0 0
ans =
1 1 0
1 0 1
56
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
1 0 1
Sintaxa 2: for
i = start
end
i = i + pas
True
set de instructiuni
Exemplul 1.30
n=4;x=zeros(1,4);
for i=1:n
x(i)=i^2;
end
x
x =
1 4 9 16
57
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
c)
Calculul valorilor funcției cos(x)
x = 0:0.2:1;
fprintf(' x cos(x)\n')
for i = 1:length(x)
fprintf('%4.1f %11.6f\n',x(i),cos(x(i)))
end
x cos(x)
0.0 1.000000
0.2 0.980067
0.4 0.921061
0.6 0.825336
0.8 0.696707
1.0 0.540302
m=4; n=5;
for i=1:m
for j=1:n
A(i,j)=1/(i+j-1);
end
end
A
A =
1.10.2 Instrucțiunea if
Instrucțiunea if este instrucțiunea de testare pe baza unei condiții logice.
În general condiția logică apare sub forma:
expresie operator relațional expresie
Bucla if este folosită pentru luarea unor decizii multiple, executarea lor fiind
condiționată. Sunt trei moduri de construcție a buclei if:
if..end
if..else..end
if..elseif..else ..end
În figura 1.7 este prezentată schema logică și sintaxa pentru comanda condițională
if..end.
end
Setul de instrucțiuni este executat numai dacă conditie logica este adevărată.
Exemplul 1.31
În figura 1.8 este prezentată schema logică și sintaxa pentru comanda condițională
if..else..end.
if..else..end
Sintaxa: if..else..end
Nu -False(0) Da -True(1)
cond logica if conditie logica
set de instructiuni 1
else
set de instructiuni 2
Set de instructiuni 2 Set de instructiuni 1
end
Exemplul 1.32
Scriem un program, pentru a testa dacă un număr este par sau impar, în m-fila
script cu conținutul de mai jos, salvată cu numele par_impar.m
% par_impar.m
>> par_impar
Introduceti un numar intreg: 5
Numarul 5 este un numar impar.
>> par_impar
Introduceti un numar intreg: 9
Numarul 9 este un numar impar.
Exemplul 1.33 Scriem un program care testează dacă un număr este par; dacă da, este
,scrie numărul, dacă nu, adună 1 la număr și scrie numărul. Schema logică este în figura
1.9.
Start
iesire: scrie x
Stop
>> rest_rem
x =
4
>> rem(5,2)
ans =
1
Sintaxa: if..elseif..else..end
if conditie logica 1
set de instructiuni 1
elseif conditie logica 2
set de instructiuni 2
elseif conditie logica 3
set de instructiuni 3
else
set de instructiuni 4
end
Exemplul 1.34
a) Scriem o m-fila tip funcție pentru a testa semnul unui număr real, signum.m.
62
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
ans = 1
b) Calculul radicalului dintr-un număr real. Se testează condiția ca numărul să fie pozitiv,
dacă da, se calculează și se scrie radicalul, dacă condiția nu este satisfăcută, scrie că
numărul este negativ sau zero.
x=input('numar real:')
if x>0
fprintf('radical din %g este 8.4f\n', x,sqrt(x))
elseif x<0
disp('x este negativ;nu exista radical de ordin doi')
else
disp('x este egal cu zero')
end
% varianta_elseif.m
%
a=input('Introduceti numarul a: ');
b=input ('Introduceti numarul b: ');
fprintf('\n')
fprintf('1) aduna a si b.\n')
fprintf('1) scade b din a.\n')
fprintf('3) inmulteste a si b.\n')
fprintf('4) imparte a la b.\n')
fprintf('\n')
n=input('Alege cazul: ');
if n==1
fprintf('suma numerelor %0.2f si %0.2f este %0.2f.\n',a,b,a+b)
elseif n==2
63
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
>> varianta_elseif
1) aduna a si b.
1) scade b din a.
3) inmulteste a si b.
4) imparte a la b.
Alege cazul: 1
suma numerelor 4528077.00 si 35476.00 este 4563553.00.
>> varianta_elseif
1) aduna a si b.
1) scade b din a.
3) inmulteste a si b.
4) imparte a la b.
Alege cazul: 4
catul numerelor 87786.32 si 897.54 este 97.81.
64
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
Setul de instrucțiuni se execută repetat atâta timp cât condiția logica specificată
rămîne adevărată - true (valoarea este 1). În figura 1.10 este redată schema logică și
sintaxa instrucțiounii while.
Exemplul 1.35
Sa se determine primul numar întreg pentru care n! (n factorial) este un număr de 4 cifre.
n = 1;
while prod(1:n) < 1.e3
n = n+1;
end
n
Raspuns
n = 7
65
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
Exemplul 1.36
Scriem o m-fila, numere_prime.m, care să afișeze numerele prime dintr-o listă dată.
Arătăm variantele cu și fără comanda break.
În varianta fără comanda break se scriu toate numerele prime din listă.
Selectarea numerelor prime se face cu funcția Matlab isprime(n) (>> help
isprime)
for n = 2:50;
if isprime(n)
fprintf('numerele prime gasite, %d\n',n)
end
end
>> numere_prime
for n=2:50;
if isprime(n)
fprintf('numerele prime gasite, %d\n',n)
break
end
end
>> prime_numere
Instrucțiunea continue trece controlul la următoarea iterație din bucla for sau while,
în care apare, sărind peste orice alte comenzi din interiorul buclei.
Exemplul 1.37
n=15;
i=1;
while i <= n
if rem(i,3)~=0
i=i+1;
continue
end
fprintf('multiplul lui 3: %d\n',i)
i=i+1;
end
>> multipli_3
multiplul lui 3: 3
multiplul lui 3: 6
multiplul lui 3: 9
multiplul lui 3: 12
multiplul lui 3: 15
Exemplul 1.38 Scriem o m-fila sol_sistem.m pentru a găsi soluția sistemului algebric
liniar:
5a + 2b +c = 12
a + 4b + 2c = 15
a + 2b + 5c = 20
% sol_sistem.m
a=0;
b=0;
c=0;
while 1
a1 = (12 - 2*b - c)/5;
67
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
b1 = (15 - a1 - 2*c)/4;
c1 = (20 - a1- 2*b1)/5;
if((a==a1)&&(b1==b)&&(c1==c))
break;
end;
a = a1;
b = b1;
c = c1;
end;
>> sol_sistem
Solutiile sunt a = 1, b = 2, c = 3
Exemplul 1.39
1 1 1 1
2
1 2 2 2
n 1 n 2 3 4
2
Pînă la anul 1795, când la Leonard Euler a deteminat suma seriei, s , s-a crezut că
6
seria este divergentă, suma tinzând la infinit.
Fie șirul sumelor parțiale al seriei Euler și S limita sa
1 1 1 1
Sn 1 2
2 2 2 , lim S n S
2 3 4 n n
Dacă șirul sumelor parțiale este convergent cu limita finită S, atunci seria este
convergentă și are suma S.
a) Vom scrie, mai întâi o m-fila, sume_partiale_Euler.m, în care vom utiliza bucla
for pentru a calcula suma șirului sumelor parțiale pentru n 25 și vom calcula eroarea
relativă dintre această sumă parțială și 2 6 .
% m-fila sume_partiale_Euler.m
% sirul sumelor partiale pentru seria Euler
68
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
n=25;
s=0;
for i=1:25
s=s+1/i^2;
end
% calculam eroarea relativa
erel=abs(s-pi^2/6)/abs(pi^2/6);
% folosim fprintf pentru afisarea rezultatelor
fprintf('suma partiala a primilor %d termeni este s=%f.\n',n,s)
fprintf('eroarea relativa este erel= %e.\n',erel)
>> sume_partiale_Euler
Observăm că eroarea este mai mică decât 4 10 2 . Cu cât luăm mai mulți termeni în șirul
sumelor parțiale cu atât mai mult se va micșora eroarea.
b) Scriem o m-fila, seria_Euler.m, cu care, folosind bucla while, vom determina
de câți termeni este nevoie în șirul sumelor parțiale pentru a calcula suma seriei cu o
eroare relativă dată.
% seria_Euler.m
% determina numarul necesar de termeni pentru aproxima suma...
% cu o eroare, tol, data
tol=4e-5; % toleranta
s=0;
i=1;
err=1;
while err >= tol
s=s+1/i^2;
i=i+1;
err=abs(s-pi^2/6)/abs(pi^2/6);
end
% folosim fprintf pentru afisarea rezultatelor
fprintf('valoarea lui pi^2/6 = %f.\n',pi^2/6)
fprintf('suma primilor %d termeni este s = %f.\n',i-1,s)
fprintf('eroarea relativa este err = %f.\n',err)
>> seria_Euler
valoarea lui pi^2/6 = 1.644934.
suma primilor 15.198 termeni este s = 1.644868.
eroarea relativa este err = 0.000040.
69
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
Un număr mare de comenzi elseif, pentru controlul unui cod Matlab, îngreunează
execuția acestuia și chiar înțelegerea lui. Pentru asemenea situații , avem în Matlab o
metoda mai simplă de control a execuției programului prin instrucțiunea switch.
Structura unei instrucțiuni switch este formată din mai multe secvențe de comenzi
cuprinse între două cazuri: case valoare i. Forma generală și schema logică a
instrucțiunii switch este prezentată în figura 1.9.
Sintaxa: switch
Expresie
switch expresie
case valoare 1
set de instructiuni 1
T case valoare 2
Caz Set set de instructiuni 2
r
valoare 1 instructiuni 1 .
u .
e case valoare n
False set de instructiuni n
True otherwise
Caz Set set de instructiuni n+1
valoare 2 end
instructiuni 2
% expresie - scalar sau șir
False de caractere
True
Set % setul de instructiunii n
Caz se executa daca:
valoare n instructiuni n
expresie == valoare n =>
False true (1)
În comanda switch, expresie poate fi un scalar sau un șir de caractere. In timpul execuției
switch compară intrarea expresie cu valoarea fiecărui case și execută setul de
instrucțiuni n, al cazului pentru care este adevarată expresie == valoare n.
70
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
Dacă nici un caz nu satisface condiția, se vor executa liniile de comandă din set de
instrucțiuni n+1 care urmează după otherwise.
Exemplul 1.40
Vom rescrie m-fila din Exemplul 1.33 c), folosind în locul instrucțiunii elseif
instrucțiunea switch. Scriem un program pentru operații aritmetice cu două numere reale
oarecare. Salvăm fila script, cu conținutul de mai jos, cu numele varianta_switch.
% varianta_switch.m
switch n
case 1
fprintf('suma numerelor %0.2f si %0.2f este %0.2f.\n',a,b,a+b)
case 2
fprintf('diferenta numerelor %0.2f si %.2f este %.2f.\n’\',a,b,a-b)
case 3
fprintf('produsul numerelor %.2f si %.2f este %.2f.\n',a,b,a*b)
case 4
fprintf('catul numerelor %.2f si %.2f este %.2f.\n',a,b,a/b)
otherwise
fprintf('Nu este optiunea buna.\n')
end
Pentru a vedea care variantă consumă mai puțin timp, rulăm cele două variante de
program, varianta cu elseif și varianta cu switch, din Exemplele 1.33 c) și 1.39.
>> varianta_elseif
1) aduna a si b.
1) scade b din a.
3) inmulteste a si b.
71
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
4) imparte a la b.
Alege cazul: 3
produsul numerelor 123456789.00 si 1234.00 este 152345677626.00.
>> varianta_switch
1) aduna a si b.
1) scade b din a.
3) inmulteste a si b.
4) imparte a la b.
Alege cazul: 3
produsul numerelor 123456789.00 si 1234.00 este 152345677626.00.
Observăm că varianta care folosește instrucțiunea switch are un timp mai bun cu 18,8%
față de varianta de program cu elseif.
Timpul de rulare a fost măsurat cu funcțiile Matlab tic și toc.
Funcțiile tic și toc lucrează împreună pentru a măsura timpul de rulare al unui
program Matlab. Comanda tic pornește cronometrul iar comanda toc oprește
cronometrul și afișează timpul cu mesajul Elapsed time is ... seconds.
Pentru a obţine o viteză de calcul mare, este foarte importantă aşa-numita vectorizare a
algoritmilor în codurile MATLAB. Acolo unde alte limbaje folosesc bucle de tip for sau
DO, MATLAB-ul poate utiliza operaţii matriceale sau vectoriale. Ori de câte ori este
posibil , recomandăm acest mod de lucru.
Majoritatea funcţiilor din Matlab (built - in functions) suportă vectorizarea. Dacă mărimea
de intrare este un scalar, rezultatul este tot un scalar. Dacă intrarea este un vector sau o
matrice, ieşirea va fi un vector sau o matrice cu acelaşi număr de linii sau coloane ca la
intrare.
72
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
Prezentăm mai jos câteva exemple, pentru a compara vitezele de execuție ale operațiilor
matriceale (vectorizate) versus bucle for și while.
Pentru a măsura timpul de execuție în Matlab, avem funcțiile tic și toc (help
tic).
Funcțiile tic și toc lucrează împreună pentru a măsura timpul de rulare al unui cod
Matlab. Comanda tic pornește cronometrul, iar comanda toc oprește cronometrul și
afișează timpul cu mesajul Elapsed time is ... seconds.
Exemplul 1.41
i=0;
tic
for t=0:0.01:10;
i=i+1;
y(i)=sin(t);
end
toc
b) folosind vectorizarea
% varianta vectorizata
tic
t=0:0.01:10;
y=sin(t);
toc
Observăm că timpul de execuție este de aproape 10 ori mai mic în varianta vectorizată a
calculelor.
Exemplul 1.42
tic
x = 0;
for k = 1:1001
y(k) = log10(x);
x = x + .01;
end
toc,y
tic
x=0:0.01:10;
y=log10(x);
toc, y
MATLAB are mai multe comenzi care pot fi folosite pentru a crea grafice.
În acest paragraf vom introduce metode de a trasa grafice de funcții. Vom începe cu
grafice în plan.
Cea mai simplă funcție Matlab (built-in) prentru grafice este funcția ezplot.
74
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
Sintaxa:
ezplot('fun',[a,b])
ezplot(@cos,@sin)
Exemplul 1.43
>> ezplot('x^2',[-1,1])
x2+2
2.9
2.8
2.7
2.6
2.5
2.4
2.3
2.2
2.1
Fig.1.9
Pentru a face graficul setului de puncte y versus x, vom introducem vectorii x respectiv y
75
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
Funcția plot
m magenta * star
y yellow s square
k black d diamond
Pentru a scrie diverse informații despre grafic, funcția plot se poate folosi cu
următoarele funcții:
76
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
Pentru a face graficul unei funcții de o variabilă, mai întâi, vom crea un vector de valori
ale variabilei și apoi vom genera un vector al valorilor funcției calculate în vectorul
variabilei. Problema este redusă la problema anterioară – graficul funcției printr-un set de
date numerice discrete.
Exemplul 1.44
>> y
y =[17 10 5 2 1 2 5 10 17]
16 16
14 14
12 12
10 10
8 8
6 6
4 4
2 2
0 0
-4 -3 -2 -1 0 1 2 3 4 -4 -3 -2 -1 0 1 2 3 4
Fig.1.10
Exemplul 1.45
Graficul funcției y x3 3x 1
Introducem comenzile:
78
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
f(x)=x3-3*x+1
60
40
20
-20
-40
-60
-4 -3 -2 -1 0 1 2 3 4
Fig.1.11
>> plot(x,y,'-b',u,v,'--r',t,s,'g:s')
Exemplul 1.46
Vom scrie într-o m-fila script un program pentru obținerea în aceeași figură a graficelor
funcțiilor y sin(x) și z cos(x) , folosind opțiunille grafice prezentate în tabelul 1.13.
% exe_grafic3.m
79
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
>> exe_grafic3
grafice y=sin(x) si z=cos(x)
1
y=sin(x)
z=cos(x)
0.8
Exemplu grafice
0.6
0.4
0.2
y, z
-0.2
-0.4
-0.6
-0.8
-1
0 1 2 3 4 5 6 7
x [rad]
Fig.1.12
80
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
Exemplul 1.47
Graficul funcției
x2 x0
f ( x) 1 0 x 1
x2 1 x
3.5
2.5
1.5
0.5
-0.5
-1
-2 -1.5 -1 -0.5 0 0.5 1 1.5 2 2.5 3
Fig.1.13
r (t ) x(t ) , y(t ), t [a, b]
81
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
Exemplul 1.48
r (t ) 2 cos3 (t ) , 2 sin 3 (t ) , t [ , ]
>> t=linspace(-pi,pi,1000);
>> plot(2*(cos(t)).^3,2*(sin(t)).^3)
>> grid
>> xlabel('t')
>> title('r(t)=((2(cos(t))^3,2(sin(t))^3)')
r(t)=((2(cos(t))3,2(sin(t))3)
2
1.5
0.5
-0.5
-1
-1.5
-2
-2 -1.5 -1 -0.5 0 0.5 1 1.5 2
t
Fig.1.14
r u( ), [1 , 2 ]
Exemplul 1.49
Graficul funcției
82
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
r 3 6 sin( ), [ , ]
>> theta=linspace(-pi,pi,1000);
>> r=3-6*sin(theta);
>> polar(theta,r)
90
10
120 60
8
6
150 30
4
180 0
210 330
240 300
270
Fig.1.15
Pentru situatiile în care dorim să obținem mai multe subgrafice în aceeași fereastră
grafică, folosim comanda subplot(m,n,p).
Comanda împarte figura într-o matrice cu mxn părți, fiecare parte cu subgraficul ei, și
selectează partea cu indicatorul p ca fiind cea curentă. Numerotarea părților se face pe
linii, începând cu cea din stânga sus.
Exemplul 1.50
83
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
Pentru a obține în aceeași fereastră grafică graficele funcțiilor sin(x), exp(x), x^2 și
sin(x) /x , executăm comenzile:
>> subplot(2,2,1);ezplot('sin(x)');
>> subplot(2,2,2);ezplot('exp(-x)');
>> subplot(2,2,3);ezplot('x^2');
>> subplot(2,2,4);ezplot('sin(x)/x');
sin(x) exp(-x)
250
1
200
0.5
150
0
100
-0.5
50
-1 0
-5 0 5 -6 -4 -2 0 2 4
x x
x2 sin(x)/x
40 1
0.8
30
0.6
20 0.4
0.2
10
0
0 -0.2
-5 0 5 -5 0 5
x x
Fig.1.16
84
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
Programul Matlab are o serie de funcții, built-in, pentru reprezentări grafice specializate.
Funcția fplot
Sintaxa: fplot(fun,lims)
Creează graficul funcției fun între limitele x-axis limits, lims = [xmin xmax].
Exemplul 1.51
Graficul funcției
f ( x) e x sin( x) , x [3, 3]
>> fplot('exp(-x)*sin(x)',[-3,3])
>> grid
>> title('y=exp(-x)*sin(x)')
y=exp(-x)*sin(x)
1
-1
-2
-3
-4
-5
-6
-7
-8
-3 -2 -1 0 1 2 3
Fig.1.17
85
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
Exemplul 1.52
6
tan(x)
sin(x)
cos(x)
4
-2
-4
-6
-6 -4 -2 0 2 4 6
Fig.1.18
Sintaxa: bar(x,y)
Exemplu 1.53:
% bare_bare.m
x=[11 3 4 5 17 26 19 ];
subplot(2,2,1),bar(x),title('Bare verticale')
subplot(2,2,2),barh(x),title('Bare orizontale')
86
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
3
10
2
5
1
0
1 2 3 4 5 6 7 0 5 10 15 20 25 30
Fig.1.19
Sintaxa: hist(y,M)
unde y este vectorul punctelor de date, iar M este numărul de subdiviziuni în care este
divizat setul de date. Histograma arată cât de multe puncte sunt în fiecare diviziune.
87
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
Exemplul 1.54
Vom genera 10.000 de numere aleatoare după distribuția Gauss. Histograma sa va avea
forma clopotului lui Gauss.
>> y = randn(10000,1);
>> hist(y,100)
350
300
250
200
150
100
50
0
-4 -3 -2 -1 0 1 2 3 4
Fig.1.20
88
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
Exemplul 1.55
>> t=linspace(0,8*pi,2000);
>> plot3(sin(t),cos(t),t),grid on
30
25
20
15
10
0
1
0.5 1
0.5
0
0
-0.5
-0.5
-1 -1
Fig.1.21
>>plot3(x,y,z)
>>mesh(x,y,z)
>>surf(x,y,z)
>>surf(x,y,z),shading flat
89
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
Exemplul 1.56
Graficul funcției
z e ( x ^ 2 y ^ 2) ,
pe domeniul D ( x, y) / 2 x 2 , 2 y 2 .
[x,y]=meshgrid(-2:.5:2);
z=exp(-(x.^2+y.^2));
subplot(2,2,1),plot3(x,y,z),title('comanda plot3')
subplot(2,2,2),mesh(x,y,z),title('comanda mesh')
subplot(2,2,3),surf(x,y,z),title('comanda surf')
subplot(2,2,4),surf(x,y,z),shading flat,title('comanda surf shading')
Fig.1.22
Sintaxa:
Exemplul 1.57
90
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
>> pi_simbolic=sym('pi')
pi_simbolic =
pi
>> R=sym('R')
>> aria_cerc=2*pi*R
aria_cerc =
2*pi*R
Exemplul 1.58
f =
a*x^2 + b*x + c
2)
>> syms a b c x
>> f=sym('a*x^2+b*x+c')
91
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
Sintaxa:
subs(expresie_simbolica,{variabile_simbolice},{valori_numerice})
Exemplul 1.59
>> syms f x
>> f=x^2+log(x)+cos(x)
f =
cos(x) + log(x) + x^2
>> subs(f,pi)
ans =
10.0143
Exemplul 1.60
>> syms a b c d e f g h
>> A=[a b;c d]
A =
[ a, b]
[ c, d]
>> C=A+B
C =
[ a + e, b + f]
[ c + g, d + h]
>> D=A*B
D =
[ a*e + b*g, a*f + b*h]
[ c*e + d*g, c*f + d*h]
92
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
>> E=inv(A)
E =
[ d/(a*d - b*c), -b/(a*d - b*c)]
[ -c/(a*d - b*c), a/(a*d - b*c)]
>> a=1;b=-2;c=-1;d=4;e=1;f=6;g=7;h=3;
>> eval(A)
ans =
1 -2
-1 4
>> eval(E)
ans =
2.0000 1.0000
0.5000 0.5000
>> E1=inv(eval(A))
E1 =
2.0000 1.0000
0.5000 0.5000
>> I=A*inv(A)
+- -+
| a d b c |
| --------- - ---------, 0 |
| a d - b c a d - b c |
| |
| a d b c |
| 0, --------- - --------- |
93
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
| a d - b c a d - b c |
+- -+
ans =
[ 1, 0]
[ 0, 1]
>> syms x t
>> R=[cos(t) sin(t);-sin(t) cos(t)]
R =
[ cos(t), sin(t)]
[ -sin(t), cos(t)]
> R_inv=inv(R)
R_inv =
[ cos(t), -sin(t)]
[ sin(t), cos(t)]
>> I=R*R_inv
I =
[ cos(t)^2 + sin(t)^2, 0]
[ 0, cos(t)^2 + sin(t)^2]
>> pretty(I)
+- -+
| 2 2 |
| cos(t) + sin(t) , 0 |
| |
| 2 2 |
| 0, cos(t) + sin(t) |
+- -+
94
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
>> simplify(I)
ans =
[ 1, 0]
[ 0, 1]
Derivatele simbolice ale funcțiilor de una sau mai multe variabile se obțin cu funcția
diff.
Sintaxa:
Exemplul 1.61
a)
>> syms x
>> f=x*sin(2*x)
f =
x*sin(2*x)
>> diff(f)
ans =
sin(2*x) + 2*x*cos(2*x)
b)
>> syms x y
>> g=sqrt(x^2+y^2)
g =
(x^2 + y^2)^(1/2)
ans =
95
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
x/(x^2 + y^2)^(1/2)
>> pretty(ans)
2
1 y
------------ - ----------
2 2 1/2 3
(x + y ) -
2
2 2
(x + y )
f g h
x x x
D( f , g , h) f g h
J
D( x, y, z ) y y y
f g h
z z z
Exemplul 1.62
>> syms r t
>> x=r*cos(t)
>> y=r*sin(t);
>> J= jacobian([x; y],[r,t])
J =
[ cos(t), -r*sin(t)]
[ sin(t), r*cos(t)]
>> D = det(J)
D =
r*cos(t)^2 + r*sin(t)^2
>> simplify(D)
ans = r
Sintaxa:
taylor(f)
taylor(f,n) % rezultă primii n-1 termeni din dezvoltarea
Maclaurin
>> taylor(exp(x))
ans =
x^5/120 + x^4/24 + x^3/6 + x^2/2 + x + 1
>> taylor(cos(x),10)
ans =
x^8/40320 - x^6/720 + x^4/24 - x^2/2 + 1
>> pretty(ans)
8 6 4 2
97
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
x x x x
----- - --- + -- - -- + 1
40320 720 24 2
1.10.8 Rezolvarea simbolică a ecuațiilor algebrice. Funcția solve
Exemplul 1.62
x =
-(a12*b2 - a22*b1)/(a11*a22 - a12*a21)
(a11*b2 - a21*b1)/(a11*a22 - a12*a21)
Exemplul 1.63
>> syms a b c x
>> fx=a*x^2+b*x+c;
>> solve(fx)% formula pentru radacinile ecuatiei gr.2
ans =
x1 x 2 b1
b) Soluția unui sistem liniar folosind funcția solve
1
x 2 x 2 b 2
>> syms x1 x2 b1 b2
98
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
>> fx1=x1+x2-b1;
>> fx2=x1+2*x2-b2;% sistem de 2 ecuatii
>> [x10,x20]=solve(fx1,fx2)
x10 = 2*b1 - b2
x20 = b2 - b1
Exemplul 1.64
dx
a) Soluția ecuației diferențiale ax 0
dt
>> syms a b c x
>> x0=dsolve('Dx+a*x=0')
x0 = C2/exp(a*t)
dx
b) Soluția ecuației diferențiale ax 0 cu condiția inițială x(0) 1
dt
>> x0=dsolve('Dx+a*x=0','x(0)=1')
x0 =
1/exp(a*t)
>> x0=dsolve('D2x=-x','t')
x0 =
C1*cos(t) + C2*sin(t)
În Matlab polinoamele se reprezintă printr-un vector linie ale carui elemente sunt
coeficienții polinomului scriși în ordinea descrescătoare a puterilor lui x.
Exemplul 1.65
Polinomul
p( x) 6 x 4 2 x 3 7 x 12
>> p = [6 -2 0 7 12]
Valoarea unui polinom într-un punct x se obține folosind funcția Matlab polyval.
Sintaxa:
>> polyval(p,x)
Exemplul 1.66
Valoarea polinomului p( x) 6 x 4 2 x 3 7 x 12 în x 15
>> polyval(p,15)
ans = 297117
100
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
ans =
23 106 465 1448
Exemplul 1.67
Graficul polinomului p( x) x3 2 x 2 5x 10
p = [1 -2 5 -10];
x = linspace(-3,5,100);
px = polyval(p,x);
plot(x,px)
grid
title('p(x)=x^3-2x^2+5x-10')
xlabel('x')
3 2
p(x)=x -2x +5x-10
100
80
60
40
20
-20
-40
-60
-80
-3 -2 -1 0 1 2 3 4 5
x
101
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
Exemplul 1.68
>> p = [1 -2 5 -10];
>> roots(p)
ans =
2.0000
-0.0000 + 2.2361i
-0.0000 - 2.2361i
Sintaxa: conv(p,q)
Exemplul 1.69
>> p = [5 2 -3 27];
>> f = [1 3 1];
% Produsul polinoamelor p și f
g = conv(p,f)
g =
5 17 8 20 78 27
% Impartirea polinoamelor p și f
102
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
>> [q r]=deconv(p,f)
q =
5 -13
r =
0 0 31 40
Exemplul 1.70
>> p = [5 2 -3 27];
der_p =
15 4 -3
1.12 Probleme
N 1 1 N
a)
(i 2)(i 3)
; b) k p , p 1 și p 2 , N = 10.
i 1 i k 1
103
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
x sin x
f ( x)
( x 2 1)( x 3)
0 x0
0 x 1
x
f ( x)
2 x 1 x 2
0 x2
p( x) x 5 13x 4 10 x 3 12 x 8x 15
1
f ( x) 1 x x 2 x 3 ..... x i
1 x i 0
(a) Folosiți Matlab pentru calculul sumei primilor 20 termeni ai seriei pentru x 0.9 .
Care este eroare absolută și eroarea relativă?
(b) Câți termeni ai seriei sunt necesari pentru ca eroarea să fie mai mică decât 1% ?
Indicațe:
eroarea absolută dintre valoarea exactă u și valoarea calculată u*
E abs (u * ) u * u
104
CAPITOLUL 1 INTRODUCERE ÎN MATLAB
eroarea relativă în procente
u* u
% e rel (u )
*
100%
u
F
P1.7 Coeficientul de frecare este determinat experimental, prin măsurarea
mg
forței necesară pentru a mișca corpul de masă m , figura P1.7. Rezultatele măsurătorilor
pentru șapte valori ale forțelor sunt date in tabelul P7.1
Fig. P1.1
Tabel P7.1
Test nr. 1 2 3 4 5 6 7
Masa [kg] 3 5 6 9 15 25 50
Forta [N] 13.5 21.35 30 59 80 119 312
105
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
2
REZOLVAREA NUMERICĂ A
ECUAŢIILOR ALGEBRICE ŞI
TRANSCENDENTE
În acest capitol vom analiza metode numerice pentru calculul soluţiilor ecuaţiilor
algebrice și transcendente. Vom scrie programe ȋn MATLAB pentru
implementarea acestor metode. Metodele studiate sunt:
metoda grafică
metoda înjumătăţirii intervalului - metoda bisecţiei intervalului
metoda secantei
metoda tangentei - metoda Newton-Raphson
Funcția Matlab fzero
Există numeroase situaţii în care avem de rezolvat ecuaţii polinomiale sau
nepolinomiale (ecuaţii transcendente) cu o singură variabilă
f ( x) 0 (2.1)
Pentru rezolvarea numerică a ecuațiilor (2.1) este necesar mai întâi să se identifice,
printr-o anumită metodă, intervalele în care se află exact o rădăcină a ecuaţiei.
O metoda simplă pentru a obţine o estimare a pozițiilor radaciniilor ecuaţiei (2.1)
este metoda grafică: din graficul funcţiei observam unde şi de câte ori graficul
intersectează axa x. Vom utiliza Matlab pentru a obţine graficele.
106
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
Fie o funcție continuă f : [a, b] R . Pentru graficul funcţiei pe [a, b] putem avea
urmatoarele situaţii, figura 2.1:
Fig. 2.1
Exemplul 2.1
107
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
f ( x) 0.5x 3 4 x 2 6 x 2 0 (2.2)
>>x=0:0.01:7;
>> f=0.5*x.^3-4*x.^2+6*x-2;
>> plot(x,f);
>> grid
20
15
10
5
r1 r3
r2
-5
-10
-15
0 1 2 3 4 5 6 7
Observăm că ecuaţia are trei rădacini reale în intervalele (0, 1), (1, 2) și (6, 7).
Exemplu 2.2
>>x=0:0.01:2*pi;
>> y1=sin(x);
>>plot(x,f1)
>> hold on
>> y2=x;
>> plot(x,f2)
>> grid
>> gtext('x')
>> gtext('sin x')
x
3
1 sin x
-1
0 1 2 3 4 5 6 7
Fig. 2.3
109
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
Observăm ca există un singur punct comun in x=0, care este singura rădăcină a
ecuaţiei sin x x 0 .
Exemplul 2.3
>>x=0:0.01:4*pi;
>> y1=tan(x);
>> plot(x,y1)
>> y2=x;
>> hold on
>> plot(x,y2)
>> grid
>> gtext('x')
>> gtext('tan x')
10
6
tan x
4
x
2
tan x
0
tan x
-2
-4
-6
-8
-10
0 pi/2 2 4 3*pi/2 6 8 10 12 14
Fig. 2.4
110
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
Metoda bisecţiei sau metoda ȋnjumătăţirii intervalului este una din primele metode
dezvoltate pentru determinarea rădacinilor ecuaţiei f(x) = 0 .
Pentru determinarea unei rădăcini, din intervalul [a,b] prin metoda bisecţiei,
funcţia f(x) trebuie să satisfacă condiţiile:
f : [a, b] R continuă şi strict monotonă;
f (a) f (b) 0;
f x are o singură rădăcină xr (a, b) , f ( xr ) 0 .
111
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
pasul 2:
iniţializăm numărul iteraţiei : k=1;
calculăm mijlocul a=c b=c
ab
intervalului [a,b], c
2 verifica oprirea
ba
dacă f (c) 0 sau 0 iteratiilor
2
stop ;
112
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
xr
ba
bn an (2.5)
2n
ba
En (2.6)
2n
Dacă dorim ca eroarea să fie mai mică decât tol trebuie ca să avem
ba
ln
ba ba
2n n
2 n
ln 2
b a
n 1.443 ln 1 (2.7)
Ȋn relaţia (2.7) paranteza [x] este notaţia pentru partea ȋntreagă a numărului.
Partea intreaga a lui x, [x] = k, este numărul ȋntreg k cu proprietatea:
113
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
114
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
Exemplul 2.4
f ( x) 0.5x 3 4 x 2 6 x 2 0
f =
Inline function:
f(x) = 0.5*x.^3 - 4*x.^2+6*x -2
niter =
18
c =
0.4746
fc =
6.6163e-006
115
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
er =
3.8147e-006
I =
0 1.0000
0 0.5000
0.2500 0.5000
0.3750 0.5000
0.4375 0.5000
0.4688 0.5000
0.4688 0.4844
0.4688 0.4766
0.4727 0.4766
0.4727 0.4746
0.4736 0.4746
0.4741 0.4746
0.4744 0.4746
0.4745 0.4746
0.4745 0.4746
0.4745 0.4746
0.4746 0.4746
0.4746 0.4746
Exemplul 2.5
f =
Inline function:
f(x) = tan(x)-x
116
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
niter =
16
c =
4.4934
fc =
-2.1018e-004
er =
3.9673e-005
I =
2.0000 4.6000
3.3000 4.6000
3.9500 4.6000
4.2750 4.6000
4.4375 4.6000
4.4375 4.5187
4.4781 4.5187
4.4781 4.4984
4.4883 4.4984
4.4934 4.4984
4.4934 4.4959
4.4934 4.4946
4.4934 4.4940
4.4934 4.4937
4.4934 4.4935
4.4934 4.4934
Exemplul 2.6
Din graficul funcţiei, figura 2.6, observăm ca ecuaţia are rădăcina dublă
x1 x 2 1 , ( f (1) 0 , f (1) 0 ) şi rădăcina x 3 2 .
117
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
60
50
40
30
20 x3=2
x1=x2=-1
10
-10
-20
-30
-40
-50
-60
-4 -3 -2 -1 0 1 2 3 4
>> f=inline('x^3-3*x-2')
f =
Inline function:
f(x) = x^3-3*x-2
niter =
17
c =
2.0000
118
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
fc =
-2.0599e-004
er =
3.8147e-005
I =
-2.0000 3.0000
0.5000 3.0000
1.7500 3.0000
1.7500 2.3750
1.7500 2.0625
1.9063 2.0625
1.9844 2.0625
1.9844 2.0234
1.9844 2.0039
1.9941 2.0039
1.9990 2.0039
1.9990 2.0015
1.9990 2.0002
1.9996 2.0002
1.9999 2.0002
1.9999 2.0001
1.9999 2.0000
Se ştie din cele de mai sus, teorema valorii intermediare, că dacă funcţia f(x) este
continuă în intervalul [a, b] şi strict monotonă, adică derivata f '(x) are semn
119
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
120
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
f (b) f (a)
y f (a) x a (2.8)
ba
ba
x1 a f (a) (2.9)
f (b) f (a)
pasul 3:
(căutarea rădăcinii se va face ȋn subintervalele ȋn care funcţia ȋşi schimbă
semnul)
dacă
f (a) f ( x1 ) 0 noul subinterval este [a, x1]
(cazul din figura 2.7).
altfel
pasul 4:
înapoi la pasul 2.
x n x n 1
x n 1 x n f (x n ) . (2.10)
f (x n ) f (x n 1 )
Cod Matlab 2.2 Algoritmul 2.2 este implementat in m-fila metoda_secantei.m
% metoda_secantei.m
% Inputs:
% f = functia
% x0; x1 = valorile initiale intre care este localizata solutia
% tol = criteriul de convergenta (tol > 100*eps)
% maxiter = numarul maxim de iteratii
%
% Outputs: x = estimarile pentru radacinile f(x) = 0
% k = numarul iteratiilor
121
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
% apelare
% >> metoda_secantei(f, x0, x1, tol, maxiter)
Exemplul 2.7 Calculul soluţiei ecuaţiei din Exemplu 2.1 din intervalul (1, 2).
f =
Inline function:
122
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
>> [x k] = metoda_secantei(f,1,2,1e-5,10)
k x eroare
x =
1.3691
k =
>> [x k] = metoda_secantei(@(x)0.5*x.^3-4*x.^2+6*x-2,1,2,1e-
5,10)
Exemplul 2.8
Determinaţi rădăcinile ecuaţiei
ln( x 1) 6 x 2 3x 1 0 (2.11)
Pentru a vizualiza grafic, figura 2.8, numărul rădăcinilor, facem ȋn aceeaşi fereastră
graficele funcţiilor
f 1 ln( x 1) şi f 2 6 x 2 3x 1
123
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
3
f1
f2
2
-1
-2
-3
-4
-5
0 0.5 1 1.5 2 2.5 3
k x eroare
124
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
x =
0.6339
k =
6
y f ( xk ) f ( xk ) ( x xk ) (2.12)
0 f ( xk ) f ( xk ) ( xk 1 xk ) (2.13)
f ( xk )
x k 1 x k , k 0,1, 2, .... (2.14)
f ( x k )
125
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
xr
x
x2 x1 x0
% metoda_newton.m
% metoda_newton.m pentru determinarea radacinilor ecuației
% f(x) = 0 folosind metoda Newton
end
xx(1) = x0; fx = feval(f,x0);
for k = 1: MaxIter
if ~isnumeric(df), dfdx = feval(df,xx(k)); % derivata
else dfdx = (feval(f,xx(k) + h)-feval(f,xx(k) - h))/h2;
%derivarea numerica
end
dx = -fx/dfdx;
xx(k+1) = xx(k)+dx;
fx = feval(f,xx(k + 1));
if abs(fx)<TolFun | abs(dx) < TolX,
break;
end
end
xx = xx'
x = xx(k + 1);
if k <= MaxIter, fprintf('Aproximatia dupa %d iteratii\n',k)
end
În acest cod Matlab avem două variante de a introduce funcția și derivata ei:
varianta1 : scriem o M-fila tip funcție în care vom defini funcția și derivata
ei.
varianta2 : funcția se introduce ca funcție inline și derivata ei este
calculată numeric în codul Matlab 2.3.1.
În exemplele următoare folosim aceste variante de lucru cu programul 2.3.1.
Exemplul 2.9
function f = f_ex_2_8(x)
f = log(x+1)+6*x.^2-3*x-1;
df = 12*x+1./(x+1)-3;
127
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
xx =
1.0000
0.7165
0.6403
0.6339
0.6339
x =
0.6339
fx =
1.2051e-008
Exemplul 2.10
>> x0=0;
>> f=inline('x.^3-3*x-2','x')
f =
Inline function:
f(x) = x.^3-3*x-2
>> [x,fx,xx] = metoda_newton(f,x0,1e-4,10)
xx =
128
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
0
-0.6667
-0.8444
-0.9244
-0.9627
-0.9815
-0.9908
-0.9954
-0.9977
-0.9988
-0.9994
x =
-0.9994
fx =
-9.9395e-007
function f = f_ex_2_6(x)
f = x.^3-3*x-2;
df = 3*x.^2-3;
>> [x,fx,xx] = metoda_newton(@f_ex_2_6,-2,1e-4,20)
xx =
-2.0000
-1.5556
-1.2979
-1.1554
-1.0796
-1.0403
-1.0203
-1.0102
-1.0051
-1.0025
-1.0013
129
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
-1.0006
-1.0003
-1.0002
-1.0001
x =
-1.0001
fx =
-1.9076e-008 -1.2206e-006
Exemplu 2.11
f ( x) tg ( x) x 0 . (2.15)
În funcție de cum este dată derivata, avem două modalităţi de apelare a rutinei de
calcul metoda_newton.m:
a) Dacă derivata se calculează numeric în codul Matlab metoda_newton.m
(urmează să studiem problema derivării numerice) folosim comenzile:
f = inline('tan(pi - x)-x','x')
f =
Inline function:
f(x) = tan(pi - x)-x
xx =
1.8000
2.0333
130
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
2.0007
2.0000
2.0000
x =
2.0000
fx =
7.0699e-013
b) Dacă funcția și derivata este dată de utilizator (mai jos este dată prin
comanda „inline” vom folosi comenzile:
f =
Inline function:
f(x) = tan(pi - x)-x
df =
Inline function:
df(x) = -(sec(pi-x)).^2-1
131
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
xx =
1.8000
1.9220
2.0075
2.0280
2.0288
2.0288
x =
2.0288
fx =
1.1446e-011
132
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
Exemplul 2.12
În acest exemplu reluăm calculul rădăcinilor ecuației din Exemplul 2.6. Calculele
sunt realizare cu Cod Matlab 2.3.2 pentru valorile inițiale x0 = 1 și x0 = -2.
133
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
function fv=f_ex2_6(x);
fv=x.^3-3*x-2;
>> Newton_grafic
Xo = 1
n= 0, x=1.00000e+000, y=-4.00000e+000
n= 1, x=1.33389e+003, y=2.37333e+009
n= 2, x=8.89260e+002, y=7.03210e+008
n= 3, x=5.92841e+002, y=2.08359e+008
n= 4, x=3.95229e+002, y=6.17359e+007
n= 5, x=2.63488e+002, y=1.82921e+007
n= 6, x=1.75662e+002, y=5.41985e+006
n= 7, x=1.17112e+002, y=1.60586e+006
n= 8, x=7.80806e+001, y=4.75789e+005
n= 9, x=5.20627e+001, y=1.40959e+005
n= 10, x=3.47219e+001, y=4.17548e+004
n= 11, x=2.31680e+001, y=1.23641e+004
n= 12, x=1.54758e+001, y=3.65800e+003
n= 13, x=1.03636e+001, y=1.07999e+003
n= 14, x=6.98056e+000, y=3.17209e+002
n= 15, x=4.76551e+000, y=9.19283e+001
n= 16, x=3.35436e+000, y=2.56793e+001
n= 17, x=2.51968e+000, y=6.43780e+000
134
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
15
10
f(x)
5 Solutia finala
0
0
Fig.2.10
Vom executa din nou M-fila Newton_grafic cu punctul de start Xo = -2,
pentru a determina rădăcina x = -1.
>> Newton_grafic
135
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
Xo = -2
n= 0, x=-2.00000e+000, y=-4.00000e+000
n= 1, x=-1.55526e+000, y=-1.09613e+000
n= 2, x=-1.29746e+000, y=-2.91761e-001
n= 3, x=-1.15488e+000, y=-7.56751e-002
.
.
n= 31, x=-9.99947e-001, y=-8.49015e-009
n= 32, x=-9.99949e-001, y=-7.69307e-009
n= 33, x=-9.99952e-001, y=-7.00162e-009
n= 34, x=-9.99954e-001, y=-6.39811e-009
n= 35, x=-9.99956e-001, y=-5.86840e-009
n= 36, x=-9.99958e-001, y=-5.40102e-009
n= 37, x=-9.99959e-001, y=-4.98667e-009
n= 38, x=-9.99961e-001, y=-4.61767e-009
n= 39, x=-9.99962e-001, y=-4.28771e-009
n= 40, x=-9.99964e-001, y=-3.99150e-009
n= 41, x=-9.99965e-001, y=-3.72464e-009
n= 42, x=-9.99966e-001, y=-3.48339e-009
n= 43, x=-9.99967e-001, y=-3.26462e-009
n= 44, x=-9.99968e-001, y=-3.06562e-009
Pentru a face o analiză a erorilor vom considera dezvoltarea taylor de ordinul doi a
funcţiei f(x) în punctul x = xk:
136
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
Iteratia Newton
10
5 Solutia finala
0
0 1 2 3
-5
f(x)
-10
-15
-20
Fig.2.11
f ( x k )
f ( x) f ( x k ) f ( x k ) ( x x k ) ( x xk ) 2 (2.16)
2
f ( xk )
f ( xk ) f ( xk ) ( x0 xk ) ( x0 x k ) 2 (2.17)
2
f ( xk )
xk 1 xk ( x0 xk ) ( x0 xk ) 2 (2.18)
2 f ( xk )
137
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
f ( xk ) 2
ek 1 ek Ak ek2 Ak ek ek (2.19)
2 f ( xk )
Din relaţia (2.19) rezultă că ordinul de mărime al erorilor succesive va fi mic dacă
marimea eroarii iniţiale e0 este mică, astfel ca , Ae0 1.
Spunem că metoda Newton este “pătratic convergentă” deoarece, aşa cum se vede
din relaţia (2.19), marimea eroarii estimate la un anumit pas este proporţională cu
pătratul erorii estimate la pasul anterior.
x = fzero(function, x0)
[x, fx] = fzero(function, x0)
[x, fx] = fzero(function,x0,options)
fzero Options
138
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
options = optimset('Display','iter')
Exemplul 2.13
139
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
X =
0.5671
fx =
1.1102e-016
Exemplul 2.15
function f=ex_2_14(x)
f = cos(x)-x;
>> X = fzero(@ex_2_14,1,optimset('Display','iter'))
140
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
X =
0.7391
Pentru a calcula rădăcinile vom folosi funcția fzero
>> X = fzero(@ex_2_14,1)
X =
0.7391
>> eroare=feval('ex_2_14',X)
eroare =
0
Exemplul 2.16
p =
0.5000 -4.0000 6.0000 -2.0000
>> r = roots(p)
r =
6.1563
1.3691
0.4746
141
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
X =
0.4746
X =
1.3691
X =
6.1563
2.4 Probleme
(a) 4 x 2 e x 0
(b) x 3 4.001x 2 4.002 x 1.101 0
P2.3
142
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
(a) Folosiți metoda grafică pentru a determina intervalele în care sunt soluțiile
ecuației
x 4 2x 3 4x 2 4x 4 0
(a) x 3 x 2 x 1 0
(b) 2 x x 5 x 2 4
143
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
folosind :
(a) metoda bisectiei
(b) metoda lui Newton
(c) metoda secantei
d 2w ql qx 2
EI y M y , M y x
dx 2 2 2
d 2w ql qx 2
EI y x
dx 2 2 2
Fig. P2.10
144
CAPITOLUL 2 REZOLVAREA NUMERICĂ A ECUAȚIILOR
q
w ( x 4 2lx 3 l 3 x)
24 EI y
10. Pentru l 600cm, E 50kN / cm 2 , I y 30cm 4 , q 2.5kN / cm faceți graficele
următoarelor cantități versus x, folosiți funcția subplot:
(a) săgeata w,
dw
(b) panta ( x)
dx
(c) momentului M y
20. Determinați unde este deplasarea maximă și care este valoarea ei.
145
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
3
SISTEME DE ECUAȚII ALGEBRICE
LINIARE
METODE NUMERICE
În acest capitol vom studia metode numerice pentru calculul soluțiilor sistemelor
de ecuații algebrice liniare:
Metode directe:
o Regula lui Cramer
o Soluția cu matricea inversă
o Metoda Gauss
o Factorizarea LU
Metode indirecte
o Metoda Jacobi
o Metoda Gauss- Seidel
146
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
a11 a 21 . . an1 b1 x1
a a 22 a 21 b x
; b 2 ; x 2
. .
A mn 21 (3.2)
. . . . . . .
bm
am1 an 2 . . amn x m
Ax b
● Dacă condiţia (3.5) este satisfăcută dar r < n, sistemul are o infinitate de soluţii
şi r necunoscute, se scriu ca o combinaţie liniară de celelalte n - r necunoscute
care iau valori arbitrare.
Ȋn Matlab, rangul unei matrice se calculează cu comanda : r = rank(A)
a11 a 21 . . a n1 x1 b1
a a 22 . . a 21 x 2 b2
21 , Ax b (3.7)
. . . . . . .
a n1 an2 . . a nn x n bn
a11 a 21 . . a n1 b1 x1
a a 21 b x
; b 2 ; x 2
a 22 . .
A 21 (3.8)
. . . . . . .
bn x n
a n1 an 2 . . a nn
Matricea extinsă este
148
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
Fie sistemul
det[ Ak ] Ak D
xk k , k 1,2,...,n (3.11)
det[ A ] A D
Observaţia 3.1. Pentru un sistem cu mai mult de trei ecuaţii, regula lui Cramer
devine greu de folosit deoarece calculul determinanţilor necesită o durată mare ȋn
timp.
Cu Programul Matlab3.1, M-fila cost_Cramer.m, obţinem durata ȋn timp
(exprimată ȋn ani) pentru calculul soluţiei, ȋn funcţie de numărul necunoscutelor,
figura 3.1.
149
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
% cost_Cramer.m
SecAn=365*24*3600;
n=[5, 10, 15, 20, 50, 100];
Clock=100*1e9;
Cost=factorial((n+1))/Clock;
CostAn=Cost/SecAn;
loglog(n, CostYear,'ko-')
xlabel('n'); ylabel('CPU Time [Ani]'); title('Durata calcul
solutie cu regula lui Cramer')
150
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
140
10
120
10
100
CPU Time [Ani]
10
80
10
60
10
40
10
20
10
0
10
-20
10 0 1 2
10 10 10
n
% Cramer.m
% Intrare: - matricea A
% - matricea b
% Iesire: -vectorul solutiei x
A1=A;A1(:,1)=b;
A2=A;A2(:,2)=b;
A3=A;A3(:,3)=b;
D=det(A);
D1=det(A1);
D2=det(A2);
D3=det(A3);
x(1)=D1/D; x(2)=D2/D; x(3)=D3/D;
x=[x(1); x(2);x(3)]
verificare_b=A*x
151
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
Exemplul 3.1 Să se rezolve, ȋn Matlab, sistemul liniar folosind regula lui Cramer
3 2 4 x1 2
1 5 1 x 1
2
(3.12)
7 2 1 x3 7
>> Cramer
A = b =
D = -123.0000
3 2 -4 2
1 -5 1 1
7 2 -1 7
A1 = A2 = A3 =
2 2 -4 3 2 -4 3 2 2
1 -5 1 1 1 1 1 -5 1
7 2 -1 7 7 -1 7 2 7
D1 = -126.0000 D2 = -8 D3 = -37
x = verificare_b =
1.0244 2
0.0650 1
0.3008 7
152
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
Rezolvarea în Matlab, cu regula lui Cramer, a sistemelor cu mai mult de trei ecuații
este nerecomandată.
Fie sistemul
O cale formală, dar nu foarte eficientă, pentru a determina soluţia sistemului este
să înmulţim ambele părţi ale ecuaţiei (3.13) cu inversa matricei sistemului [ A ] 1
Dacă matricea [A] este nesingulară, adică valoarea determinantului este diferită de
zero
a11 a 21 . . a n1
a a 22 . . a 21
det[ A] 0 ; det A 21 (3.15)
. . . . .
a n1 a n 2 . . a nn
matricea este inversabilă.
1 [ A]*
[ A] (3.16)
det[ A]
153
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
unde matricea [ A]* [ Aij ] este matricea adjunctă a matricei [A] . Elementele
matricei adjuncte se obţin înlocuind fiecare element al matricei transpuse
(schimbăm linile în coloane), [ A]T [a ji ] , cu complementul sau algebric:
Fie matricea
1 1 1
[ A] 2 1 0
1 1 1
Pasul 1: Calculăm determinantul:
1 0 2 0 2 1
det [ A] 1(1)11 1(1)1 2 (1)(1)1 3 1 2 (3) 2
1 1 1 1 1 1
1 2 1
[ A] 1 1 1
T
1 0 1
1 1 1 1
A11 (1)11 1; A12 (1)1 2 0 ...
0 1 1 1
154
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
1 0 1
Pasul 4: Obţinem matricea adjunctă: A 2 2 2
*
3 2 1
Pasul 5: Obţínem matricea inversă
1 1
2 0
A
* 2
A1 1 1 1
(3.18)
det A 3 1
1
2 2
inv(A)=
>>I=A*inv(A)
I=
1 0
0 1
155
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
u ij 0 pentru i > j.
x1 2 x 2 x3 2
x 2 2 x3 1 (3.19)
3 x3 3
1 2 1 x1 2
U x b 0 1 2 x 2 1
0 0 3
x3 9
156
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
x3 9 / 3 3;
x 2 (1 2 x3 ) /(1) (1 2 3) /(1) 5;
x1 2 2 x 2 x3 2 2 5 3 11
2. Metode indirecte:
metoda Jacobi
metoda Gauss-Seidel
metodele de relaxare
Metoda Gauss numită şi metoda "naiva" de eliminare Gauss este una dintre cele
mai populare metode numerice pentru rezolvarea sistemelor algebrice liniare de
forma (4.2). Metoda Gauss se aplică ȋn doi paşi:
Pasul 1. Aducerea sistemului, prin transformări elementare, la un sistem
triunghiular superior echivalent (reducând matricea coeficienţilor la o marice de
formă triunghiulară superior).
157
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
1 2 1 x1 0
2 1 0 x 2
2 (3.20)
1 2 2 x3 1
1 2 1 | 0
[ A | b] 2 1 0 | 2 (3.21)
1 2 2 | 1
1 2 1 | 0
0 3 2 | 2
0 4 1 | 1
1 2 1 | 0
0 3 2 | 2
0 4 1 | 1
x1 2 x 2 x3 0
3 x 2 2 x3 2
11 11
x
3
3 3
x 3 1, x 2 0, x1 1.
159
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
n n(n 1)(2n 1)
k2
2
k 1
Mai ȋntâi, pentru simplitate, vom prezenta metoda pe cazul unui sistem cu matricea
[A] nesingulară de tip 3x3.
Fie sistemul
Etapa 1. Pivotarea
160
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
Pasul 1: Presupunem că pivotul este a11 ; vom elimina pe x 1 din ecuaţiile doi şi
trei:
ȋmpărţim prima linie la elementul pivot a11 ;
scădem prima linie ȋnmulţită cu primul element din celelalte linii:
1 a12
(1) (1)
a13 | b1(1)
(1) (1)
0 a 22 a 23 | b2(1) (3.24)
0 a32
(1) (1)
a33 | b3(1)
unde
(1) a1 j
a1 j , j 1, 2, 3
a11
b (1) 1
b
1 a11
(3.25)
(1)
aij aij ai1 a1(1j) , j 1, 2, 3; i 2, 3
b (1) bi ai1b1(1)
i
1 a12
(1) (1)
a13 | b1(1)
( 2)
0 1 a 23 | b2( 2) (3.26)
0 0 ( 2)
a33 | b3( 2)
unde:
( 2) a 2(1j)
a 2 j (1)
, j 2, 3
a 22
( 2) b2(1)
b2 (1) (3.27)
a 22
aij( 2) aij(1) ai(21) a 2( 2j) , j 2, 3; i 3
( 2)
bi bi(1) ai(21) b2( 2)
( 2)
Pasul 3: ȋmpărţim linia trei din (3.27) cu a33 şi obţinem:
161
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
1 a12
(1) (1)
a13 | b1(1)
( 2)
0 1 a 23 | b2( 2) . (3.28)
0 0 1 ( 2)
| b3( 2) / a33
x3 b3(3)
x 2 b2 a 23 x3
( 2) ( 2)
(3.29)
x b (1) (a (1) x a (1) x ).
1 1 12 2 13 3
Gauss_Pivot.m.
function x = Gauss_Pivot(A,b,ptol)
% Gauss_Pivot determina solutia sistemelor liniare
%
% Apelarea: x = GaussPivot(A,b)
% x = Gauss_Pivot(A,b,ptol)
%
% Intrare: A,b = matricea coeficientilor, matricea termenilor liberi
% ptol = (optional) toleranta pentru detectarea pivotului zero
% Default: ptol = 50*eps
% Iesire (raspuns): x = vectorul solutie
162
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
Ab
disp(sprintf('\n**Etapa de eliminare directa cu matricea extinsa**'))
disp(sprintf('\nPasul 1: determinam linia pivot\nvaloarea cea mai mare si
indexul ei\np este indexul in subvectorul i:n\nip este indexul liniei
pivotului ales'))
for i = 1:n-1
[pivot,p] = max(abs(Ab(i:n,i)));
ip = p + i - 1;
if ip~=i
fprintf('\nschimbam liniile %d and %d; pivot nou =
%g\n',i,ip,Ab(ip,i));
Ab([i ip],:) = Ab([ip i],:); % face schimbul liniilor
end
pivot = Ab(i,i);
if abs(pivot)<ptol, error('dupa schimbarea liniilor a gasit pivot cu
valoarea zero');
end
for k = i+1:n % k = indexul liniei urmatoare care va fi eliminata
Ab(k,i:nb) = Ab(k,i:nb) - (Ab(k,i)/pivot)*Ab(i,i:nb);
end
fprintf('\nDupa eliminare in coloana %d cu pivot = %f\n',i,pivot);
disp(Ab);
end
disp(sprintf('\n**** Etapa de determinare a soltiei ****'))
disp(sprintf('Determinam solutia prin metoda substitutiei inverse incepand
cu ultima ecuatie'))
x = zeros(n,1);
x(n) = Ab(n,nb)/Ab(n,n);
for i=n-1:-1:1
x(i) = (Ab(i,nb) - Ab(i,i+1:n)*x(i+1:n))/Ab(i,i);
end
2 x1 2 x 2 4 x3 2 x 4 10
x 3x 2 x x 17
1 2 3 4
(3.30)
3x1 x 2 3x3 x 4 18
x1 3x 2 4 x3 2 x 4 27
163
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
Ab =
2 2 4 -2 10
1 3 2 -1 17
3 1 3 1 18
1 3 4 2 27
Ab =
3 1 3 1 18
0 2.6667 1 -1.3333 11
0 1.3333 2 -2.6667 -2
0 2.6667 3 1.6667 21
Ab =
3 1 3 1 18
0 2.6667 1 -1.3333 11
0 0 1.5 -2 -7.5
0 0 2 3 10
Ab =
3 1 3 1 18
0 2.6667 1 -1.3333 11
0 0 1.5 -2 -7.5
164
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
0 0 0 5.6667 20
Obtinem solutia:
x =
3.1176
6
-0.29412
3.5294
Ax b
În Matlab ecuaţia matriceală se rezolvă cu metoda împărţirea la stânga, care
foloseşte operatorul " \ ". Metoda este bazată pe eliminarea Gauss cu pivotare.
Soluția se obţine cu comanda:
>> x = A\b
Exemplu 3.5
165
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
Exemplu 3.6
>> ex_3_6
A =
3 2 -4
1 -5 1
7 2 -1
b =
2
166
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
1
7
x =
1.0244
0.0650
0.3008
3.3.3 Factorizarea LU
Algoritmul 3.2
function y = substitutie_directa(L,b)
n = length(b);
y = zeros(n,1);
y(1) = b(1)/L(1,1);
for i=2:n
y(i) = (b(i)-L(i,1:i-1)*y(1:i-1))/L(i,i);
end
Algoritmul 3.3
function x = substitutie_inversa(U,y)
n = length(y);
x = zeros(n,1);
x(n) = y(n)/U(n,n);
for i=n-1:-1:1
x(i) = (y(i)-U(i,i+1:n)*x(i+1:n))/U(i,i);
end
Factorizarea LU în MATLAB
168
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
Exemplu 3.6
>> A =
14 2 3 5
3 32 9 6
3 1 23 2
3 6 4 16
>> b =
22
36
31
11
>> [L,U]=lu(A)
L =
1.0000 0 0 0
0.2143 1.0000 0 0
0.2143 0.0181 1.0000 0
0.2143 0.1765 0.0848 1.0000
U =
14.0000 2.0000 3.0000 5.0000
0 31.5714 8.3571 4.9286
0 0 22.2059 0.8394
0 0 0 13.9877
>> y = substitutie_directa(L,b)
y =
22.0000
169
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
31.2857
25.7195
-1.4155
>> x = substitutie_inversa(U,y)
x =
1.2587
0.6991
1.1621
-0.1012
Exemplu 3.6
Fie sistemul de bare articulate din Fig. 6.6, simplu rezemat în A şi articulat în D.
Folosind metoda echilibrului nodurilor să se determine eforturile din bare.
Necunoscutele sunt eforturile din cele 9 bare S1 , S2 ,.......S9 şi reacţiunile din
reazemul A şi articulaţia D, N A respectiv X D ,YD .
După izolarea nodurilor şi introducerea eforturilor din bare, scriem ecuaţiile de
YD
D
XD
2 3 12
4 E
B 1200 N
1 5 12
7 6
A 8 C 9 F
9 9
NA
2400 N 1200 N
Fig.6.6
echilibru pentru fiecare nod şi obţinem următorul sistem pentru determinarea
eforturilor din bare şi a reacţiunilor
170
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
0.6 0 0 0 0 0 0 1 0 0 0 0 S1 0
0.6 0.6
0 1 0 0.6 0 0 0 0 0 0 S 2 0
0.8 0.8 0 0 0 0.8 1 0 0 0 0 0 S 3 0
0 0 0 1 0 0 0 0 0 0 0 0 S 4 1200
0 0 0 0 1 0.8 0 0 0 0 0 0 S 5 1200
0 0 0 0 0 0.6 0 0 1 0 0 0 S 6 0
0
0 0 0 0 0 1 0 0 0 0 0 S 7 2400
0 0 0 0 0 0 0 1 1 0 0 0 S 8 0
0 0 1 0 1 0 0 0 0 0 0 0 S 9 0
0 0.6 0 0 0 0 0 0 0 1 0 0 X D 0
0 0.8 1 0 0 0 0 0 0 0 1 0 Y D 0
0.8
0 0 0 0 0 0 0 0 0 0 1 N A 0
0.6 0 0 0 0 0 0 1 0 0 0 0 S1
0.6 0.6 0 1 0 0.6 0 0 0 0 0 0 S
2
0.8 0.8 0 0 0 0.8 1 0 0 0 0 0 S3
0 0 0 1 0 0 0 0 0 0 0 0 S4
0 0 0 0 1 0.8 0 0 0 0 0 0 S5
0 0 0 0 0 0.6 0 0 1 0 0 0 S6
[A ] [b]
0 0 0 0 0 0 1 0 0 0 0 0 S7
0 0 0 0 0 0 0 1 1 0 0 0 S8
0 0 1 0 1 0 0 0 0 0 0 0 S9
0 0.6 0 0 0 0 0 0 0 1 0 0 X
D
0 0.8 1 0 0 0 0 0 0 0 1 0 YD
0.8 1 N
0 0 0 0 0 0 0 0 0 0 A
>> Gauss_Pivot
171
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
S1 - 2500
S - 2000
2
S3 3200
S4 1200
S5 3200
S6 - 2500
=
S 7 2400
S8 1500
S9 1500
X - 1200
D
YD 1600
N 2000
A
În cazul sistemelor cu numar mare de ecuaţii metodele directe pot conduce la erori
mari de rotunjire. Metodele iterative permit un control al acestor erori. În această
secţiune vom analiza mai ȋntâi metoda Jacobi şi apoi varianta modificată a metodei
cunoscută ca metoda iterativă Gauss-Seidel.
172
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
n
b1 a1 j x j
j 1
b a12 x 2 a13x 3 a1n x n j 1
x1 1
a11 a11
n
b2 a 2 j x j
j 1
b a 21x1 a 23x 3 a 2n x n j2
x2 2
a 22 a 22
.
.
n
bn1 an1, j x j
j 1
bn1 an1,1x1 an1, 2 x 2 an1,n2 x n2 an1,n x n j n1
x n1
an1,n1 an1,n1
n
bn anj x j
j 1
bn an1x1 an 2 x 2 an,n1x n1 j n
xn
ann ann
n
bi aij x j
j 1
j i
xi , i 1,2,, n. (3.37 )
aii
173
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
x ( 0) x1( 0) , x2( 0) ,...,xn( 0) arbitrar
n
bi aij x (jk )
j 1
(3.38)
x ( k 1) j i
, i 1, 2,, n; k 0
i
a ii
x inou x ivechi
err i 100 . (3.39)
x inou
% Script Jacobi.m
% Metoda Jacobi - solutia iterativa a sistemelor liniare Ax = b
% Intrarile care se modifica de utilizator
%
% [A] = nxn matricea coeficientilor
% [b] = nx1 matricea termenilor liberi
% x0 = 1xn vectorul valorilor initiale x0
174
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
A=[14,2,3,5;3,32,9,6;3,1,23,2;3,6,4,16];
b=[22;36;31;11];
Exemplul 3.7
A=[14,2,3,5;3,32,9,6;3,1,23,2;3,6,4,16];
b=[22;36;31;11];
x0=zeros(1,4);
k_max=1000;
% Parametrul pentru controlul convergentei err
175
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
err=0.0001;
>> Jacobi
D =
14 0 0 0
0 32 0 0
0 0 23 0
0 0 0 16
x =
1.2587 0.6992 1.1621 -0.1012
n_iteration =
19
x ( 0) x1( 0) , x2( 0) ,...,xn( 0) arbitrar
i 1 n
(bi aij x (jk 1) aij x (jk ) (3.40)
x ( k 1) j 1 j i 1
, i 1,2,...,n ; k 0
i
aii
n
aii aij , i 1,2,..n (3.41)
j 1
j i
Dacă matricea [A] nu este matrice diagonal dominantă metoda poate sau nu poate
fi convergentă.
M-fila Gauss_Seidel.m
% Script Gauss_Seidel
% Metoda Gauss-Seidel pentru sisteme liniare %
A=[14,2,3,5;3,32,9,6;3,1,23,2;3,6,4,16];
b=[22;36;31;11];
X=[0,0,0,0];
maxit=6;
n = length(b)
177
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
A
b
X
maxit
for i = 1:n
j = 1:n;
j(i) = [];
D = abs(A(i,j));
Check(i) = abs(A(i,i)) - sum(D);
if Check(i) < 0
fprintf('Matricea nu este strict diagonal dominanta in
linia %2i\n\n',i)
else
fprintf('Matricea este strict diagonal dominanta in linia
%2i\n\n',i)
end
end
for m=1:maxit
disp('-----------------------------------------------')
disp(sprintf('Iteratia nr% d', m))
disp(' ')
disp(sprintf('Valorile vectorului solutie din iteratia
anterioara'))
Xanterior=X;
Xanterior
for i=1:n
suma=0;
for j=1:n
if (i<j)
suma=suma+A(i,j)*X(j);
end
if (i>j)
suma=suma+A(i,j)*X(j);
end
end
X(i)=(b(i)-suma)/A(i,i);
end
178
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
Exemplul 3.8
A=[14,2,3,5;3,32,9,6;3,1,23,2;3,6,4,16];
b=[22;36;31;11];
X=[0,0,0,0];
maxit=6;
n = length(b)
>> Gauss_Seidel
Datele de intrare
n = numarul ecuatiilor
[A] = nxn matricea coeficientilor
[b] = nx1 matricea termenilor liberi
n =
A =
14 2 3 5
3 32 9 6
3 1 23 2
3 6 4 16
b =
179
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
22
36
31
11
X =
0 0 0 0
maxit =
-----------------------------------------------
Iteratia nr 1
Xanterior =
0 0 0 0
X =
-----------------------------------------------
Iteratia nr 2
180
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
Xanterior =
X =
-----------------------------------------------
Iteratia nr 3
Xanterior =
X =
-----------------------------------------------
Iteratia nr 4
Xanterior =
X =
-----------------------------------------------
181
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
Iteratia nr 5
Xanterior =
X =
-----------------------------------------------
Iteratia nr 6
Xanterior =
X =
182
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
1p
xip
n
x l p - norma (3.42)
p
i 1
Norma unei matrice corespunzătoare unei norme vectoriale dată este definită prin
Ax 2
A 2 max 2 - norm (3.44)
x 0 x 2
Numărul de condiționare
183
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
1
Ax Ax
A A 1
max min
x 0 x
(3.46)
x 0 x
Ax Axc b b r
erez
Ax b b
1 r e r
cond ( A) (3.47)
cond ( A) b x b
184
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
x
x eroarea relativa a raspunsului
cond ( A) max max (3.48)
A b eroarea relativa a intrarii
A b
Exemplul 3.9
Fie sistemul liniar. Să se studieze acuratețea soluției la schimbări relativ mici ale
matricelor de intrare.
1 3
x 2 y 2
1 1
x y 1
2 3
A =
1.0000 0.5000
0.5000 0.3333
b =
1.5000
1.0000
185
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
>> ca=cond(A,2)
ca =
19.2815
>> d = det(A)
d =
0.0833
x =
0.0000
3.0000
b = b1 =
1.5000 1.5000
1.0000 0.8889
Obținem soluția:
>> x1=A\b1
x1 =
0.6667
1.6667
186
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
b = b2 =
1.5000 1.5000
1.0000 0.8333
x2 =
1.0000
1.0000
linf =
0.0048
lsup=ca* (norm(b-b2)/norm(b))
lsup =
1.7826
3.6 Probleme
187
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
x 2 x2 3 x 2 x2 3
(a) 1 (b) 1
x1 x 2 0 2 x1 4 x 2 6
P3.2 Rezolvați următoarele sisteme folosind metoda Gauss cu pivotare (une este
cazul):
4 1 3 x1 8
(a) 2 5 2 x 2 3
1 2 4 x3 11
1 1 3 x1 2
(b) 3 3 1 x 2 1
1 2 0 x3 3
1 1 1 1 x1 3
2 1 3 0 x 2 3
(c)
0 2 0 3 x3 1
1 0 2 1 x 4 0
1 1 a x1 2
1 2 a x
2 3
a 1 1 x3 2
188
CAPITOLUL 3 SISTEME DE ECUAȚII ALGEBRICE LINIARE - METODE NUMERICE
2 1 1 1 3 x1 7
1 0 2 1 1 x2 2
0 2 1 1 1 x3 5
3 1 4 0 5 x4 6
1 1 1 1 1 x5 3
6 1 2 x1 9
2 2 5 x 13
2
1 1 6 x3 6
P3.6 Folosiți Matlab pentru determinați eforturile din barele structurii de barea
articulate
189
CAPITOLUL 4 SISTEME DE ECUAȚII ALGEBRICE NELINIARE. METODE NUMERICE
4
SISTEME DE ECUATII ALGEBRICE
NELINIARE. METODE NUMERICE
metoda grafică
metoda Newton-Raphson
funcția Matlab fsolve
f1 ( x1, x2 ,.....,xn ) 0
f ( x , x ,.....,x ) 0
2 1 2 n
. (4. 1)
.
f n ( x1, x2 ,.....,xn ) 0
f1 ( x1 , x2 ) 0
(4.2)
f 2 ( x1 , x2 ) 0
190
CAPITOLUL 4 SISTEME DE ECUAȚII ALGEBRICE NELINIARE. METODE NUMERICE
Cele două ecuații din (4.2) reprezintă nişte suprafeţe. Soluţiile sistemului se vor
găsi la intersecţia linilor conturului celor doua suprafeţe, Figura 4.1.
Fig. 4.1
Exemplul 4.1
f1 ( x1 , x2 ) x12 x22 2 0
(4.3)
f 2 ( x1 , x2 ) 0.25 x1 0.75 x2 1 0
2 2
ex_4_1_grafic.m
% Solutia grafica
%
clear
clc
191
CAPITOLUL 4 SISTEME DE ECUAȚII ALGEBRICE NELINIARE. METODE NUMERICE
format compact
% informatii pentru axe si generarea matricelor cu valorile pe
contur
% axele
x1 = -2:0.1:2;
x2 = -2:0.1:2;
% matricele de valori
f2 = 0.25*X1.^2 + 0.75*X2.^2 - 1;
contour(x1,x2,f1,[0 0],'r')
axis square
hold on
contour(x1,x2,f2,[0 0],'k')
xlabel('\bfx_1 ','FontSize',12,'FontName','Arial', ...
'Color','b','VerticalAlignment','top')
ylabel('\bfx_2 ','FontSize',12,'FontName','Arial', ...
'Color','b')
title('\bf\itSolutia grafica a sistemului x1^2+x2^2-2=0;
0.25x1^2+0.75x2^2-1=0','Color','k')
grid
legend('f_1 = 0','f_2 = 0',1)
>> ex_4_1_grafic
192
CAPITOLUL 4 SISTEME DE ECUAȚII ALGEBRICE NELINIARE. METODE NUMERICE
0.5
x2
-0.5
-1
-1.5
-2
-2 -1.5 -1 -0.5 0 0.5 1 1.5 2
x1
Fig. 4.2
Punctele de intersecție ale celor două contururi sunt soluţiile sistemului (4.3):
x1 x2
1 1
-1 1
1 -1
-1 -1
Sintaxa:
a) x = fsolve(fun,x0)
b) [x, fval] = fsolve(fun,x0)
c) x = fsolve(fun,x0,options)
d) [x,fval] = fsolve(fun,x0,options)
options=optimset('Display','iter')
Exemplul 4.2
f 2 ( x1, x2 ) 0.25 x1 0.75 x2 1 0
2 2
Scriem o M-filă tip funcţie, pentru introducerea sistemului de ecuaţii, salvată ca:
fun_ex4_3
function f = fun_ex3_3(x)
f=[(x(1)^2+x(2)^2-2),(0.25*x(1)^2+0.75*x(2)^2-1)];
Pentru determinarea celor patru soluții apelăm funcția fsolve cu patru variante
pentru punctul inițial:
194
CAPITOLUL 4 SISTEME DE ECUAȚII ALGEBRICE NELINIARE. METODE NUMERICE
x =
1.0000 1.0000
f ( xi ) f ( xi )
xi1 xi sau x (4.4)
f ( xi ) f ( xi )
Pentru un sistem neliniar de doua ecuaţii cu două variabile, de forma (4.2) se poate
proceda la fel.
Fie sistemul
f 1 ( x1 , x 2 ) 0
(4.5)
f 2 ( x1 , x 2 ) 0
Pentru fiecare ecuaţie scriem formula Taylor de ordinul unu şi obţinem sistemul
f1,i f1,i
f1,i 1 f1,i ( x1,i 1 x1,i ) ( x 2,i 1 x 2,i )
x1 x 2
f f
(4.6)
f 2,i 1 f 2,i ( x1,i 1 x1,i ) 2,i ( x 2,i 1 x 2,i ) 2,i
x1 x 2
195
CAPITOLUL 4 SISTEME DE ECUAȚII ALGEBRICE NELINIARE. METODE NUMERICE
f 2,i f 1,i
f 1,i f 2 ,i
x 2 x 2
x1,i 1 x1,i (4.8a)
f 1,i f 2,i f 1,i f 2,i
x1 x 2 x 2 x1
f 1,i f 2,i
f 2i f 1,i
x1 x1
x 2,i 1 x 2,i (4.8b)
f 1,i f 2,i f 1,i f 2,i
x1 x 2 x 2 x1
f 1 f 1
x x 2
det J det 1 det grad ( X ) (4.9)
f 2 f 2
x1 x 2
196
CAPITOLUL 4 SISTEME DE ECUAȚII ALGEBRICE NELINIARE. METODE NUMERICE
Prin analogie cu relaţia (4.4), putem rescrie relaţiile (4.9) ȋn forma vectorială
unde
f1 f1
f ( X ) x x2
F(X ) 1 ; grad ( X ) f 1
f 2
(4.11)
f 2 ( X ) 2
x1 x2
197
CAPITOLUL 4 SISTEME DE ECUAȚII ALGEBRICE NELINIARE. METODE NUMERICE
X = X + valX';
end
Exemplul 4.3
function f=fun_ex3_3(x)
f=[(x(1)^2+x(2)^2-2),(0.25*x(1)^2+0.75*x(2)^2-1)];
function df = grad_sysnl_ex4_3(x)
% x is a vector of x's [x(1) x(2) .. .. x(n)]
% f1 = x1*x1 + x2*x2 - 2;
% f2 = 0.25*x1*x1 +0.75*x2*x2 -1;
df = [2*x(1) 2.0*x(2) ; ...
0.5*x(1) 1.5*x(2)];
>> metoda_newton_sysnl
198
CAPITOLUL 4 SISTEME DE ECUAȚII ALGEBRICE NELINIARE. METODE NUMERICE
4.5 Probleme
f1 ( x1 , x 2 ) x12 x 22 5 0
(1)
f1 ( x1 , x 2 ) x 2 e 1 0
x
f1 ( x1 , x 2 ) x12 x1 x 2 10 0
(2)
f1 ( x1 , x 2 ) x 2 3x1 x 2 57 0
2
xy z 2 2
xyz x y 4
2 2
x
e e z 7
y
199
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
5
INTERPOLAREA ŞI APROXIMAREA
FUNCŢIILOR
şi care să estimeze cât mai bine valorile intermediare (valorile dintre valorile date),
Fig. 5.1.
200
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
Tabel 5.1
x0 x1 x2 ... xn
f (x 0 ) f (x1 ) f (x 2 ) ... f (x n )
f(x)
f(x2)
f (x )
x1
x2
x
f(x1)
Fig.5.1
5. 2. INTERPOLARE POLINOMIALĂ
metoda directă;
metoda Newton;
metoda Lagrange
201
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
........................................................ (5.4)
an x nn an1x nn1 ....... a 2 x n2 a1x n a0 yn
det(V ) (x j x i )
1i jn1
x0 x1 x2
f (x 0 ) f (x1 ) f (x 2 )
y f x a2 x 2 a1x a0 (5.6)
a 2 x12 a1x1 a0 f x 0
a 2 x 2 a1x 2 a0 f x1
2
(5.7)
a 2 x 3 a1x 3 a0 f x 2
2
x 02 x 0 1 a 2 f x 0
2
x1 x1 1 a1 f x1 (5.8)
x 22
x 2 1 a0 f x 2
Tabel 5.2
t (s) d(t ) (m/s)
0 0
10 142.04
15 224.18
20 317.35
23.5 402.97
203
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
Să se determine:
a) Distanţa parcursă de automobil după t 18 secunde.
b) Viteza şi acceleraţia automobilului după t 18 secunde.
Avem nevoie de trei puncte de interpolare, din tabelul 5.2, puncte care
ȋncadrează valoarea t 18 . Aceste puncte sunt t0 10, t1 15, si t2 20 ,
pentru care avem
100 10 1 a 2 142.04
225 15 1 a 224.18 (5.9)
1
400 20 1 a0 317.35
>> Gauss_Pivot
204
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
Matricea extinsa
Ab =
100.0000 10.0000 1.0000 142.0400
225.0000 15.0000 1.0000 224.1800
400.0000 20.0000 1.0000 317.3500
a 2 0.2206
a1 10.9130
a 10.8500
0
şi polinomul de interpolare
>> p=A\b
p =
0.2206
10.9130
10.8500
>> d=polyval(p,18)
d =
278.7584
Ab =
>> AbR=rref(Ab)
AbR =
1.0000 0 0 0.2206
0 1.0000 0 10.9130
0 0 1.0000 10.8500
M =
>> R=rref(M)
R =
1.0000 0 0 0.2206
0 1.0000 0 10.9130
0 0 1.0000 10.8500
>> p=polyfit(x,y,2)
p =
0.2206 10.9130 10.8500
>> d=polyval(p,18)
d =
278.7584
207
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
x0 x1
f x 0 f x1
(x1 , y1 )
f1 (x )
(x 0 , y0 )
x
Figura 5.2
208
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
f1 x1 f1 x0
f1 x f1 x0 ( x x0 ) (5.11)
x1 x0
sau
f1 (x ) a 0 a1 x x 0 (5.12)
unde
f1 x1 f1 x 0
a0 f1 (x0 ) (a) , a1 (b) (5.13)
x1 x 0
f1 x1 f1 x0
Panta dreptei este o diferenţă finită care aproximează
x1 x0
prima derivată.
209
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
278.7584 280.1660
ea 100 0.5050 % .
278.7584
Cu cât este mai mic intervalul dintre x 0 şi x1 cu atât aproximaţia este mai
bună.
x0 x1 x2
f x 0 f x1 f ( x2 )
210
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
a0 f (x0 ) (5.15)
y
x1 , y1
x2 , y2
f2 x
x 0 , y0
x
Fig. 5.3
Pentru x x1 avem
f (x1 ) f (x 0 )
a1 (5.16)
x1 x 0
Pentru x x 2 avem
f (x1 ) f (x0 )
f (x 2 ) f (x 0 ) (x 2 x0 ) a2 (x 2 x 0 )(x 2 x1 )
x1 x0
f (x 2 ) f (x1 ) f (x1 ) f (x 0 )
x 2 x1 x1 x 0
a2 (5.17)
x 2 x0
211
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
f2 (x ) a0 a1 (x x0 ) a2 (x x0 )(x x1 ) (5.18)
f (x 2 ) f (x1 ) f (x1 ) f (x 0 )
f (x1 ) f (x 0 ) x 2 x1 x1 x 0
f (x 0 ) (x x 0 ) (x x 0 )(x x1 )
x1 x 0 x2 x0
a0 f x0 (5.19a)
f x1 f x 0
a1 (5.19b)
x1 x 0
f x 2 f x1 f x1 f x 0
x 2 x1 x1 x 0
a2 (5.19c).
x2 x0
a0 f [x0 ] ; (5.20a)
a1 f [x1, x0 ] ; (5.20b)
a2 f [x 2 , x1, x0 ] (5.20c)
f [x 0 ] f (x 0 ) (5.21a)
212
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
f (x1 ) f (x 0 )
f [x1 , x 0 ] (5.21b)
x1 x 0
f ( x 2 ) f ( x1 ) f ( x 1 ) f ( x 0 )
f [x 2 , x1 ] f [x1 , x 0 ] x 2 x1 x1 x 0
f [x 2 , x1 , x 0 ] (5.21c)
x2 x0 x2 x0
a0 a1
a2
x0 f x0
f x1 , x0
f x2 , x1 , x0
x1 f x1
f x2 , x1
x2 f x2
Fig.5.3
15 224.18
20 317.35
23.5 402.97
d(t) a0 a1 (t t0 ) a2 (t t0 )(t t1 )
Avem nevoie de trei puncte de date, din Tabelul 2, puncte care ȋncadrează
valoarea t 18 . Aceste puncte sunt t0 10, t1 15, si t2 20 .
Pentru aceste puncte avem
d (t 2 ) d (t1 ) d (t1 ) d (t 0 )
d [t 2 , t1 ] d [t1 , t 0 ] t 2 t1 t1 t 0
a2 d [t 2 , t1 , t 0 ]
t 2 t1 t2 t0
317.35 224.18 224.18 142.04
20 15 15 10 0.2206
20 10
d(t) a0 a1 (t t0 ) a2 (t t0 )(t t1 )
142,04 16,4280(t 10) 0,2206(t 10)(t 15)
214
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
a0 a1
a2
x0 f x0
a3
f x1 , x0
f x2 , x1 , x0
x1 f x1
f x2 , x1 f x3 , x2 , x1 , x0
x2 f x2 f x3 , x2 , x1
f x3 , x2
x3 f x3
Fig. 5.4
vectorul x:
x =
0 10.0000 15.0000 20.0000 23.5000
vectorul y:
215
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
y =
0 142.0400 224.1800 317.3500 402.9700
******Simulare ******
INTERPOLARE LINIARA:
a0 = 224.18, a1 = 18.634
INTERPOLARE PATRATICA:
f(18) = 275.968
216
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
INTERPOLARE CUBICA:
x punctele x de date alese:
f3(x) = 142.04+16.428(x-10)+0.2206(x-10)(x-15)+0.034455(x-
10)(x-15)(x-20)
217
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
300
valorile y
280
260
240
220
15 15.5 16 16.5 17 17.5 18 18.5 19 19.5 20
valorile x
Interpolare liniara (Full Data Set)
400
300
valorile y
200
100
0
0 5 10 15 20
valorile x
400
valorile y
350
300
250
200
15 16 17 18 19 20 21 22 23
valorile x
Interpolare patratica (Setul complet de date)
400
300
valorile y
200
100
0
0 5 10 15 20
valorile x
218
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
400
valorile y
300
200
100
10 12 14 16 18 20 22
valorile x
Interpolare cubica (Toate punctele de date)
400
300
valorile y
200
100
0
0 5 10 15 20
valorile x
250
200
150
100
50
0
5 10 15 20
Fig.5.5
219
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
x0 x1 x2 ... xn
f (x 0 ) f (x1 ) f (x 2 ) ... f (x n )
este
a0 f (x 0 )
a f [x , x ]
1 1 2
a2 f [x 2 , x1, x 0 ]
(5.25)
.
.
an f [x n , x n 1 ,.....,x1 , x 0 ]
f [x i , x j ] f [x j , x k ]
f x i , x j , x k (5.26)
xi x k
220
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
function f = intpol_newton_dfin(x,f)
n = length(x);
for i = 2:n
f(i:n) = (f(i:n) - f(i-1:n-1)) ./ ...
(x(i:n) - x(1:n+1-i));
end
x=[10,15,20];
f=[142.04,224.18,317.35];
>>x = [10,15,20];
>>f = [142.04,224.18,317.35];
>>a = intpol_newton_dfin(x,f)
c =
142.0400 16.4280 0.2206
% calculăm distanţa parcursă la t=18 şi graficul polinomului
>> t=8:0.05:24;
221
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
>> p=intpol_newton_val(x,a,t);
>> plot(x,f,'o',t,p,'r-')
>> d=intpol_newton_val(x,a,18)
d=
278.7584
Solutia Exemplu 6.1
400
350
300
250
200
150
100
8 10 12 14 16 18 20 22 24
Fig. 5.6
este de forma
n
Ln (x ) li (x ) f (x i ) l0 (x ) f (x 0 ) l1 (x ) f (x1 ) ....... ln (x ) f (x n ) (5.28)
i 0
n x xj ( x x0 ) ( x x1 ) ( x xi 1 ) ( x xi 1 ) ( x xn )
li ( x) (5.29)
j 0 xi xj ( xi x0 ) ( xi x1 ) ( xi xi 1 ) ( xi xi 1 ) ( xi xn )
j i
1 pentru j i
li (x j ) (5.30)
0 pentru j i
1
L1 ( x) li ( x) f ( xi ) l0 ( x) f ( x0 ) l1 ( x) f ( x1 )
i 0
(5.32)
x x1 x x0
f ( x0 ) f ( x1 )
x0 x1 x1 x0
Interpolare pătratică.
Pentru n 2 obţinem polinomul de interpolare de ordinul doi
2
L2 (x ) li (x ) f (x i ) l0 (x ) f (x 0 ) l1 (x ) f (x1 ) l2 (x ) f (x 2 ) (5.33)
i 0
223
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
2 x xj ( x x1 ) ( x x 2 )
l0 (x ) (5.34)
j 0 x0 x j ( x 0 x1 ) ( x 0 x 2 )
j 0
2 x xj (x x 0 ) (x x 2 )
l1 (x ) (5.35)
j 0 x1 x j ( x 1 x 0 ) ( x1 x 2 )
j 0
2 x xj ( x x 0 ) ( x x1 )
l2 (x ) (5.36)
j 0 x 2 x j ( x 2 x1 ) ( x 0 x 1 )
j 0
t 0 10, d t 0 142.04
t1 15, dt1 224.18
t2 20, dt2 317.35
2
d (t ) L2 (t ) l i (t ) f (t i ) l 0 (t )d (t 0 ) l1 (t ) d (t1 ) l 2 (t )d (t 2 )
i 0 (5.37)
l 0 (t ) (142.04) l1 (t ) (224.18) l 2 (t ) (317.35)
224
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
2 t tj (t t1 ) (t t2 )
l0 (t ) , (5.38 a)
j 0 t 0 tj (t0 t1 ) (t0 t2 )
j 0
2 t tj (t t0 ) (t t2 )
l1 (t ) , (5.38 b)
j 0 t1 tj (t1 t0 ) (t1 t2 )
j 0
2 t tj (t t0 ) (t t1 )
l2 (t ) (5.38 c)
j 0 t 2 tj (t2 t0 ) (t2 t1 )
j 0
if i ~= j
p = p*(xd-x(j))/(x(i)-x(j));
end
end
sum = sum+p;
end
yint = sum;
Exemplul 5.7
Pentru interpolarea din Exemplul 5.1 vom scrie in spaţiul de lucru Matlab
comenzile:
>> d=Lagrange_interp(x,y,xd)
d =
278.7584
INTERPOLARE LINIARA:
INTERPOLARE PATRATICA:
226
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
300
valorile y)
280
260
240
220
15 15.5 16 16.5 17 17.5 18 18.5 19 19.5 20
valorile x
300
250
L1(x)
200
150
10 11 12 13 14 15 16 17 18 19 20
valorile x
227
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
300
valorile y
250
200
150
100
10 11 12 13 14 15 16 17 18 19 20
valorile x
300
L2(x)
250
200
150
10 11 12 13 14 15 16 17 18 19 20
valorile x
Fig.5.7
Exemplu 5.8
Se dau următoarele date reprezentând valorile vitezei unui automobil
versus timp. Să se interpoleze viteza automobilului pentru timpul t=73 s,
folosind polinoame Lagrange.
t=[0 10 26 68 80 90 100](secunde);
v=[0 21 38 76 49 50 83] (m/s);
xd=73;
t = x = 0 10 26 68 80 90 100
valorile y:
v = y = 0 21 38 76 49 50 83
228
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
INTERPOLARE LINIARA:
Valorile y: y1 = 76, y2 = 49
l0 = 0.583333, l1 = 0.416667
INTERPOLARE PATRATICA:
229
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
70
valorile y)
60
50
40
68 70 72 74 76 78 80
valorile x
60
L1(x)
40
20
0
0 10 20 30 40 50 60 70 80 90 100
valorile x
70
valorile y
60
50
40
65 70 75 80 85 90
valorile x
60
L2(x)
40
20
0
0 10 20 30 40 50 60 70 80 90 100
valorile x
Fig. 6.8
5.4.4 Limitările interpolării polinomiale. Exemplul Runge
230
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
1
y
1 25x 2
1
x y
1 25x 2
–1.0 0.038461
–0.6 0.1
–0.2 0.5
0.2 0.5
0.6 0.1
1.0 0.038461
calc_coef_runge.m
% calc_coef_runge.m
x=[-1.0 -0.6 -0.2 0.2 0.6 1.0];
y=1./(1+25*x.^2);
cp5=polyfit(x,y,5)
cp12=polyfit(x,y,12)
cp19=polyfit(x,y,19)
231
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
contraex_poly_runge.m
x=-1:0.03:1;
y=1./(1+25*x.^2);
plot(x,y,'-k')
% p5=3.1378*10^-11*x.^5+1.2019*x.^4-3.3651*10^-11*x.^3+
% 1.7308*x.^2+1.0004*10^-11*x+0.5673
hold on
p5=1.2019*x.^4-1.7308*x.^2++0.5673;
plot(x,p5,'*g')
p12=92.2059*x.^12-301.4717*x.^10+384.0223*x.^8-...
240.8427*x.^6+77.6286*x.^4-12.3965*x.^2+0.9316
plot(x,p12,'--r')
p19=0.7387*x.^18-1.2502*x.^2+0.5500;
plot(x,p19,'+b')
232
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
0.6
0.4
0.2
-0.2
-0.4
-1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1
233
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
x0 x1 x2 ... xn
f (x 0 ) f (x1 ) f (x 2 ) ... f (x n )
(x3, y3)
(x2, y2)
(x0, y0)
x
Fig. 5.10
yi yi 1
f x fi x yi x x i , x x i ,x i1 (5. 40)
x i x i 1
234
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
f ( x1 ) f ( x0 )
f ( x ) ( x x0 ), x0 x x1
x1 x0
0
f ( x 2 ) f ( x1 )
f ( x1 ) ( x x1 ), x1 x x 2
f ( x) x 2 x1 (5.41)
f ( x n 1 ) f ( x n ) f ( x n 1 ) ( x x n 1 ), x n 1 x x n
x n x n 1
f ( x ) a1x 2 b1x c1 , x 0 x x1
a 2 x 2 b2 x c2 , x1 x x 2
.
. (5.42)
.
an x 2 bn x cn , x n1 x x n
a1x 0 2 b1x 0 c1 f ( x 0 )
a1x12 b1x1 c1 f ( x1 )
.
.
ai x i 12 bi x i 1 ci f ( x i 1 )
ai x i 2 bi x i ci f ( x i )
235
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
.
.
an x n12 bn x n1 cn f ( x n1 )
an x n 2 bn x n cn f ( x n )
20. Derivatele de ordinul ȋntâi ale celor două polinoame consecutive sunt
continue ȋn punctele interioare şi valorile lor sunt egale (funcţia spline este
netedă). Astfe, pentru primul punct interior obţinem o ecuaţie egalând cele două
derivate calculate ȋn x x1
Procedând la fel pentru toate cele n-1 puncte interioare vom obţine n-1
ecuaţii
2a1x1 b1 2a2 x1 b2 0
2a 2 x 2 b2 2a3 x 2 b3 0
.
.
2ai x i bi 2ai1x i bi1 0 (5.43)
.
.
2an1x n1 bn1 2an x n1 bn 0
236
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
ȋn punctele interioare atât pentru funcţiile spline cât şi pentru derivalele lor de
ordinul unu şi doi.
Nu mai prezentăm aici aceste calcule. Pentru interpolarea spline cubică se poate
folosi funcţia Matlab spline( >> help spline).
Sintaxa:
>> pp = spline(x,y)
%
clc
clf
clear all
% INPUTS:
% x-data
% y-data
% valoarea lui xd
% x=[ 0 20 40 56 68 80 84 96 104 110];
% y=[ 0 20 20 38 80 80 100 100 125 125];
% xd=60;
disp(sprintf('\n*****Simulare*****'))
% SOLUTIA
% sortarea crescatoare a datelor dupa datele x
xy=cat(1,x,y);
xy=xy';
xy=sortrows(xy,1);
for i = 1:numel(x)
x(i)=xy(i,1);
y(i)=xy(i,2);
end
% Datele de intrare
disp(sprintf('\n\n***Datele de intrare****'))
fprintf('\n');
disp(' valorile x:')
237
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
x
disp('valorile y:')
y
disp(sprintf('Valoarea x la care calculam y, xd = %g',xd))
z=sym('z');
for i = 1:numel(x)-1
m = (y(i+1)-y(i))/(x(i+1)-x(i));
f = m*(z-x(i))+y(i);
M = (-m*x(i) + y(i));
finalstr = [str1,str2];
disp(finalstr);
end
axis off
figure(1)
for i = 1:length(x)-1
m = (y(i+1)-y(i))/(x(i+1)-x(i));
z=sym('z');
f = m.*(z-x(i))+y(i);
X = x(i):0.1:x(i+1);
Y = subs(f,z,X);
plot(X,Y);
hold on
Y = 0;
X = 0;
end
hold on
plot(x,y,'ro','MarkerSize',10','MarkerFaceColor',[1,0,0])
plot(xd,fxld,'kx','Linewidth',2,'MarkerSize',12')
238
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
disp('---------------------------------------')
disp(sprintf('\nINTERPOLAREA SPLINE PATRATICA:'));
n=numel(x);
A=zeros(3*(n-1));
for i=1:n-1
for j=0:1
for k=0:2
A(2*i-1+j+1,3*i-3+k+1)=x(i+j)^k;
end
end
end
for i=1:n-2
for j=0:1
for k=0:1
A(2*(n-1)+i+1,3*i-2+k+j*3+1)=((-1)^j)*(2*x(i+1))^k;
end
end
end
A(1,3)=1;
% Genereaza matricea Y
Y=zeros(3*(n-1),1);
for i=0:n-2
for j=0:1
Y(2*(i+1)+j)=y(i+j+1);
end
end
for i = 0:n-2
f=C(3*i+1)+C(3*i+2)*z+C(3*i+3)*z^2;
str1 = ['f(x)_',num2str(i+1),' = ',num2str(C(3*i+1))];
if C(3*i+2) > 0
str2 = [' + ',num2str(C(3*i+2)),'x'];
else
str2 = [' ',num2str(C(3*i+2)),'x'];
239
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
end
if C(3*i+3) > 0
str3 = [' + ',num2str(C(3*i+3)),'x^2'];
else
str3 = [' ',num2str(C(3*i+3)),'x^2'];
end
finalstr = [str1,str2,str3];
disp(finalstr);
end
% graficele
figure(2)
title('\bfInterpolarea spline patratica','FontSize',14)
xlabel('\bfx data');
ylabel('\bff(x)');
grid
for i=0:n-2
f=C(3*i+1)+C(3*i+2).*z+C(3*i+3).*z.^2;
if xd < x(i+2) & xd >= x(i+1)
fxqd=subs(f,z,xd);
end
X = x(i+1):0.1:x(i+2);
Y = subs(f,z,X);
plot(X,Y)
X = 0;
Y = 0;
hold on
end
plot(x,y,'ro','MarkerSize',10','MarkerFaceColor',[1,0,0])
plot(xd,fxqd,'kx','Linewidth',2,'MarkerSize',12')
% Scrie f(x) pentru xd
text(0.1*(max(x)-min(x)),0.8*(max(y)-min(y)),['f(',num2str(xd),') =
',num2str(fxqd)])
title('\bfInterpolarea spline patratica','FontSize',14);
xlabel('\bfx data')
ylabel('\bff(x)')
xlim([min(x) max(x)])
grid
hold off
disp('-------------------------------------');
disp(sprintf('\nINTERPOLAREA SPLINE CUBICA:'))
disp(sprintf('\nVom folosi functia Matlab "spline"'))
ymax=max(y);
ymin=min(y);
xx=min(x):(max(x)-min(x))/1000:max(x);
yy=spline(x,y,xx);
axis on
figure(3)
hold on
plot(x,y,'ro','MarkerSize',10','MarkerFaceColor',[1,0,0])
plot(xx,yy,'b')
fxcd=spline(xx,yy,xd);
% Afiseaza f(x) la xd (in figura)
text(0.1*(max(x)-min(x)),0.8*(max(y)-min(y)),['f(',num2str(xd),') =
',num2str(fxcd)])
plot(xd,fxcd,'kx','Linewidth',2,'MarkerSize',12')
240
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
Exemplul 5.10
>> metode_interp_spline
*****Simulare*****
***Datele de intrare****
valorile x:
x =
0 20 40 56 68 80 84 96 104 110
valorile y:
y =
0 20 20 38 80 80 100 100 125 125
241
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
f(x)_1 = 1x 0
f(x)_2 = 0x + 20
f(x)_3 = 1.125x -25
f(x)_4 = 3.5x -158
f(x)_5 = 0x + 80
f(x)_6 = 5x -320
f(x)_7 = 0x + 100
f(x)_8 = 3.125x -200
f(x)_9 = 0x + 125
---------------------------------------
f(x)_1 = 0 + 1x 0x^2
f(x)_2 = -20 + 3x -0.05x^2
f(x)_3 = 272.5 -11.625x + 0.13281x^2
f(x)_4 = -78.6667 + 0.91667x + 0.020833x^2
f(x)_5 = -1620 + 46.25x -0.3125x^2
f(x)_6 = 14380 -353.75x + 2.1875x^2
f(x)_7 = -9140 + 206.25x -1.1458x^2
f(x)_8 = 20860 -418.75x + 2.1094x^2
f(x)_9 = -38008.3333 + 713.3333x -3.3333x^2
--------------------------------------------
242
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
100 f(60) = 52
80
f(x)
60
40
20
0
0 10 20 30 40 50 60 70 80 90 100 110
x data
Fig. 5.11
140
120
80
60
40
20
0
0 10 20 30 40 50 60 70 80 90 100 110
x data
Fig. 5.12
243
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
120
80
f(x)
60
40
20
0 10 20 30 40 50 60 70 80 90 100 110
x data
Fig. 5.13
Syntaxa:
yi = interp1(x,Y,xi)
yi = interp1(Y,xi)
yi = interp1(x,Y,xi,method)
yi = interp1(x,Y,xi,method,'extrap')
Descriere:
yi = interp1(x,Y,xi)
244
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
dacă xi este scalar sau vector, size(yi) este [length(xi), d1, d2, ..., dk].
dacă xi este un tabel de mărimea size [m1,m2,...,mj], yi va avea mărimea
size [m1,m2,...,mj,d1,d2,...,dk].
Descriere:
yi = interp1(x,Y,xi,method)
yi = interp1(x,Y,xi,method,'extrap')
245
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
Fig. 5.14
Exemplul 5.11
x_data = [0 75];
Y_data = [28 189];
xi = 48;
yi = interp1(x_data,Y_data,xi)
yi =
131.0400
Exemplul 5.12
xi = 20;
yi = interp1(x_forte,Y_alung,xi,'linear')
% extrapolare
x1i = 50;
y1i = interp1(x_forte,Y_alung,x1i,'linear','extrap')
246
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
p = polyfit(x_forte,Y_alung,1);
y2i = polyval(p,xi)
hold on
plot(xi,yi,'bo'); % solutia interpolare liniara
plot(xi,y2i,'g*'); % solutia cu polyfit
plot(x1i,y1i,'ko'); % valoarea extrapolata
xx1 = [0 60];
yy1 = polyval(p,xx1);
hold on;
plot(xx1,yy1,'b-');
% linia de extrapolare
xx1 = x_forte(end-1);
xx2 = 60;
yy1 = Y_alung(end-1);
yy2 = interp1(x_forte,Y_alung,60,'linear','extrap')
plot([xx1 xx2],[yy1 yy2],'k--');
xlabel('Forte');
ylabel('Alungirile');
legend('punctele de interpolare','val interpolata','valoarea
interp best','valoarea extrapolata','linia best fit','linia
extrapolare')
t 0 20 40 56 68 80 84 96 104 110
v 0 20 20 38 80 80 100 100 125 125
247
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
9
punctele de interpolare
val interpolata
8 valoarea interp best
valoarea extrapolata
linia best fit
7
linia extrapolare
6
Alungirile
0
0 10 20 30 40 50 60
Forte
Fig. 5.15
Vom folosi pentru interpolare funcţia Matlab interp1 cu cele trei opţiuni
pentru 'method'. Programul Matlab este salvat in fila test_drive_interp1.m
test_drive_interp1.m
% interpolare liniara
tt=linspace(0,110);
v1=interp1(t,v,tt,'linear');
figure(1);
plot(t,v,'o',tt,v1)
title('interpolare liniara')
% interpolare spline
vs=interp1(t,v,tt,'spline');
248
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
figure(2);
plot(t,v,'o',tt,vs)
title('interpolare spline')
vh=interp1(t,v,tt,'pchip');
figure(3);
plot(t,v,'o',tt,vh)
title('interpolare polinoame cubice Hermite')
Rezultatele grafice:
interpolare liniara
140
120
100
80
60
40
20
0
0 20 40 60 80 100 120
249
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
interpolare spline
140
120
100
80
60
40
20
0
0 20 40 60 80 100 120
120
100
80
60
40
20
0
0 20 40 60 80 100 120
250
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
>> test_drive_polyfit
coeff =
0.6953 -0.1996
251
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
80
70
60
50
v-data
40
30
20
10
0 Datele masurate
Lina de cea mai buna aproximatie
-10
0 20 40 60 80 100 120
t-data
252
CAPITOLUL 5 INTERPOLAREA ȘI APROXIMAREA FUNCȚIILOR
5.7 Probleme
P5.1 Determinați prin metoda directă un polinom P(x) de gradul 3 sau mai mic
care să treacă prin punctele (0, 0),(1, 1), (2, 2), (3, 7).
P5.2 Se datele
x 1 2 3 5 7 8
f (x) 3 6 19 99 291 444
P5.3 Repetați întrebările de mai sus (P5.2) pentru următoarele date numerice
x 1 2 3 5 6
f (x) 7 4 5.5 40 82
z, (m) 0 30 60 90 120
2
g ( m / s ) 9.8100 9.7487 9.6879 9.6278 9.5682
L
alungirea specifică reală ln .
L0
a) Folosind datele din tabel P5.5 și formulele de calcul să se traseze, în aceeași
fereastră grafică, curbele caracteristice, tensiunea versus alungire și tensiunea
reală versus alungirea reală.
b) Determinați tensiunea normală și alungirea pentru o forță de 41.325 N.
Fig. P5.5
Tabel P5.5
Forța (N) 0 13345 26689 40479 42703 43592 44482 44927 45372 46276
Lungimea 25 25.037 25.074 25.113 25.122 25.127 25.141 25.144 25.164 25.208
(mm)
F
P5.6 Coeficientul de frecare este determinat experimental, prin
mg
măsurarea forței necesară pentru a mișca corpul de masă m , figura P5.6.
Rezultatele măsurătorilor pentru șapte valori ale forțelor sunt date in tabelul
P5.6
Fig. P5.6
Tabel P5.6
Test nr. 1 2 3 4 5 6 7
Masa [kg] 3 5 6 9 15 25 50
Forta [N] 13.5 21.35 30 59 80 119 312
254
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ
6
DERIVARE ȘI INTEGRARE NUMERICĂ
255
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ
f ( x h) f ( x )
f ( x) (6.1)
h
h2
f ( x h) f ( x) h f ( x) f ( ) , ( x, x h) (6.2)
2
f ( x h) f ( x ) h
f ( x) f ( ) , ( x, x h) (6.3)
h 2
f ( x ) f ( x h)
f ( x) (6.4)
h
f ( x h) f ( x h)
f ( x) (6.5)
2h
256
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ
f ( x h) f ( x h ) h 2
f ( x) [ f (1 ) f ( 2 )] (6.6)
2h 12
unde
1 ( x, x h) , 2 ( x h, x) .
Folosind teorema valorii intermediare , pentru funcția este de clasă C 3 (a, b) există
un punct ( x h, x h) pentru care avem
1
f ( ) [ f (1 ) f ( 2 )]
2
f ( x h) f ( x h) h 2
f ( x) f ( ) (6.7)
2h 6
257
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ
>> u = diff(y)
Folosind relațiile (6.1), (6.4) sau (6.5) aproximația pentru derivata y f (x) se
obține în Matlab cu comanda
>> x = x(1:N)
>> y = y(1:N)
>> plot(x,yprim,x,y).
Exemplul 6.1
Să se determine numeric, derivata funcției y cos(x) dacă se dau valorile funcției
în 15 puncte dintr-o periadă a funcției ( [0, 2 ] ).
Vom scrie și vom executa M-fila:
258
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ
0.8
0.6
0.4
0.2
-0.2 yprim
-sin(x)
-0.4
-0.6
-0.8
-1
0 1 2 3 4 5 6
259
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ
y = cos(x);
deltax = 2*pi/100;
yprim = diff(y)/deltax;
x = x(1:100);
plot(x, yprim, x, -sin(x),'o')
0.8
0.6
0.4
0.2
-0.2 yprim
-sin(x)
-0.4
-0.6
-0.8
-1
0 1 2 3 4 5 6 7
Derivata exactă a unei funcții se poate obține folosind Symbolic Math Toolbox.
Declararea unor variabile ca variabile simbolice (vezi paragraful 1.10.1), de
exemplu variabilele a, x și y se face cu comanda
260
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ
>> syms a x y
Sintaxa: diff(f)
Exemplul 6.2
>> syms x
>> f=cos(x^2);
>> fprim=diff(f)
fprim =
(-2)*x*sin(x^2)
>> syms x
>> f=exp(x)*sin(x);
>> fprim = diff(f)
fprim =
exp(x)*cos(x) + exp(x)*sin(x)
f f
f ( x, y) şi
x y
>> syms x y
>> f
>> diff(f,x) sau diff(f,y)
2 f
>> diff(diff(f,y),x)
xy
Exemplul 6.3
>> syms x y
>> f=x^2+y^2-3*x*y-2*x-3*y-4
f =
>> diff(f,x)
ans =
2*x - 3*y - 2
>> diff(f,y,2)
ans = 2
Un exemplu comun este determinarea vitezei unui corp pentru o accelerație dată
analitic sau determinarea deplasării pentru funcția viteză dată.
Fie y f (x) o funcţie definită şi integrabilă pe intervalul [a, b] . Integrala
definită a funcției este
b
I f x dx (6.8)
a
a=x1 x2 x3 xn b=xn+1
b n xi 1
I f ( x)dx f ( x)dx (6.9)
a i 1 xi
b n
f ( x)dx ai f ( xi ) R (6.10)
a i 1
Metoda dreptunghiurilor este metoda cea mai simplă de integrare numerică. Dacă
nodurile intervalului sunt egal distanțate, astfel ca xi 1 xi x h const . , vom
263
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ
b n
I f x dx f ( i ) x (6.11)
a i 1
metdrep.m
Pentru introducerea funcției putem folosi metoda funcției inline sau putem scrie o
M-fila tip funcție cu expresia funcției de integrat numeric.
Exemplul 6.4
3 2
x2 x 2
a) xe dx ; b) x sin xdx ; c) e dx .
0 0 0
a) function y=a(x)
y=x.*exp(x.^2);
>> Imed=metdrept(0,3,15,'a')
264
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ
Imed =
3.8074e+003
b) b =
Inline function:
b(x) = x.*sin(x)
>> Imed=metdrept(0,pi/2,10,b)
Imed =
0.9990
c) c =
Inline function:
c(x) = exp(-x.^2)
>> Imed=metdrept(0,pi,15,c)
Imed =
0.8862
O altă metodă de aproximare a ariei de sub graficul curbei pe intervalul [a, b] este
de a construi trapeze folosind punctele adiacente. Suma ariilor trapezelor
aproximează aria de sub graficul funcției pe intervalul [a, b]
x n 1
I f ( x1 ) 2 f ( xi ) f ( x n ) (6.12)
2 i 1
265
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ
>> z=trapz(x,y)
Vectorul x este vectorul care conține nodurile diviziunii, iar y este vectorul
valorilor funcției în aceste puncte.
Variabila de ieșire ne da aproximarea valorii integralei cu metoda trapezelor.
Exemplul 6.5
>> x=0:0.1:pi/4;
>> f1=exp(x).*cos(x);
>> z=trapz(x,f1)
z =
0.9181
1 2
b) I e x sin x dx
0
>> x=0:0.01:1;
>> y=sin(x).*exp(-x.^2);
>> z=trapz(x,y)
z =
0.2947
266
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ
q = quad(f,a,b)
Exemplul 6.6
/4
a) I e
x
cos xdx
0
>> q=quad(@(x)exp(x).*cos(x),0,pi/4)
q =
1.0509
1 2
b) I e x sin x dx
0
>> q=quad(@(x)exp(-x.^2),0,1)
267
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ
q =
0.7468
Exemplul 6.7
(2 x 3 y xy )dxdy ;
2 2 3
D=[-2, 2]x[0, 4]
D
a)
>> q=dblquad(@(x,y)2*x.^2-3*y.^2-x*y.^3,-2,2,0,4)
q =
-213.3333
b) function f=integrant(x,y)
f = 2*x.^2-3*y.^2-x*y.^3
>> q=dblquad(@integrant,-2,2,0,4)
268
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ
>> syms x
>> f
>> int(f)
Exemplul 6.8
2
a) e
x
sin x dx ; b) e x dx
a)
>> syms x
>> f=exp(x)*sin(x)
f =
exp(x)*sin(x)
>> int(f)
ans =
-(exp(x)*(cos(x) - sin(x)))/2 + const.
>> pretty(ans)=
>> syms x
>> f=exp(-x^2)
269
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ
f =
1/exp(x^2)
>> int(f)
ans =
(pi^(1/2)*erf(x))/2 =
b
6.5.2 Calcul simbolic pentru integrala definită f ( x)dx
a
>> syms x
>> f
>> int(f,a,b)
Exemplul 6.8
/4
a) I e x cos xdx
0
>> syms x
>> f=exp(x)*sin(x)
f =
exp(x)*sin(x)
>> I=int(f,0,pi/4)
I =
1/2
270
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ
1 2
b) I e x sin x dx
0
>> syms x
>> f=exp(-x^2)*sin(x)
f =
sin(x)/exp(x^2)
>> int(f,0,1)
Warning: Explicit integral could not be found.
6.6 PROBLEME
>> x = 1.8:0.1:2.2
x=
1.8000 1.9000 2.0000 2.1000 2.200
și apoi aproximați valoarea derivatei funcției f (2.0) folosind formula celor trei
puncte (6.7). Comparați rezultatul cu valoarea exactă și determinați eroarea.
x f (x) f (x)
8.1 16.94410
8.3 17.56489
8.5 18.19056
8.7 18.82091
271
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ
P6.3 Fie funcția f ( x) sin( e x ) pentru 0 x 4 .
Asupra corpului din figura P6.5 acționează o forță variabilă F(x) pe o direcție ce
face unghiul variabi θ(x) cu orizontala. Prin măsurători experimentale cunoaștem
datele discrete pentru forță și unghiul θ măsurate la intervale de x =5 metri, tabelul
P6.5.
Tabel P6.5
x F(x) θ(x)
0 0.0 0.55
5 9.0 1.50
10 13.5 0.80
15 14.0 0.90
20 11.5 1.20
25 12.6 1.47
30 5 1.55
272
CAPITOLUL 6 DERIVARE ȘI INTEGRARE NUMERICĂ
F(x) F(x)
θ θ
x0 Fig. P6.5 x1
x1
Determinați lucrul mecanic L x0 xn F ( x) cos ( x)dx folosind:
x0
y f ( x) 1 x 2 , x [1, 1] .
Aria unei suprafețe 3-D formată prin rotația graficului unei curbe y f (x) în jurul
b b
axei Ox, x [a, b] este A 2 ydl 2 f ( x) 1 ( f ( x)) 2 dx .
a a
273
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
7
REZOLVAREA NUMERICĂ A
ECUAŢIILOR ŞI SISTEMELOR DE
ECUAŢII DIFERENŢIALE ORDINARE
dy (t )
f (t , y (t )) , t 0 t t f , (7.1)
dt
y(t 0 ) y0 . (7.2)
y1 f1 (t , y1 , y 2 , ..., y n )
y f (t , y , y , ..., y )
2 2 1 2 n
. (7.3)
.
y n f n (t , y1 , y 2 , ..., y n )
y1 (t 0 ) y10
y (t ) y
2 0 20
(7.4)
y n (t 0 ) y n 0
dy
y (t ) f (t , y ) cu condiţia iniţială y(t0 ) y0 (7.5)
dt
d2y dy
a2 2 a1 a0 y u (t ) (7.6)
dt dt
275
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
d2y a0 a1 dy 1
y a 0 u (t ) (7.7)
d t2 a2 a2 dt a2
x1 y
(7.8)
x2 y
x1 y x2
a0 a1` 1 (7.9)
x2 y a y a y a u (t )
2 2 2
sau
x1 x2
a0 a1` 1 (7.10)
x2 a x1 a x2 a u (t )
2 2 2
x1 a
0 1 x
0 a1 1 0
x 1 a u (t )
(7.11)
x2 a2 a2 2 2
dy
y y (7.12)
dt
( n) (n 1)
a y a y .... a y a y a u (t ) (7.14)
n n 1 2 1 0
n1 n1 1
n a a a
d y 0 1
y y y ut (7.15)
n a a a a
dt n n n n
x1 y ,
x y ,
2
x y ,
3
(7.16)
.
.
(n 1)
x
n y t
x x
1 2
x 2 x 3
. (7.17)
.
a0 a1 a2 a n 1 1
x
n x1 x 2 x 3
......... xn u (t )
a n a n a n a n a n
0 1 0 0 . . . 0
0 0 1 0 . . . 0
0 0 0 1 . . . 0
0 0 0 0 1 . . 0
A . . . . . . . . , (7.19)
0 0 . . . 1 0 0
0 0 . . . . 1 0
a0 a a a a a n2 a
1 2 3 4 . n 1
an an an an an an an
x1 0
x 0
2
. .
.
x ,
.
B . (7.20)
.
. .
.
. 1
x
n an
Sintaxa:
dsolve('eq1','eq2',...,'cond1','cond2',...,'v') (7.21)
Descriere:
278
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
Exemplul 7.1
dy y
y ay 0 adt ln at yo c e at (7.24)
y c
b
O soluție particulară este y p .
a
Obținem soluția generală:
b
y c e at (7.25)
a
b
Din conditia initiala y(0) y0 determinam constanta, c yo .
a
Astfel, soluţia care satisface ecuația, cu condiția iniţială, este:
279
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
b b
y ( yo )e at (7.26)
a a
>>sol=dsolve('Dy+a*y=b','y(0)=y0');
>>pretty(sol)
Exemplul 7.2
x1 y (poziţia) Fig.7.1
x2 y (viteza) (7.28)
280
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
x1 0 1 x 0
k c 1 u (t )
(7.30)
x 2 m m 2
x 1m
y 3 y 2 y 1 (7.31)
yo c1e 2t c2 e t
1
Observăm că o soluție particulară este y p .
2
Obţinem soluţia generală
1
y yo y p c1e 2t c2 e t
2
1 1
y e 2t e t .
2 2
281
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
1 1 1
1 1
y= ---------- - ------ + - e 2t e t
2 2
2 exp(2 t) exp(t) 2
>> t=0:0.1:2;
>> y=(1/2)*exp(-2*t)-exp(-t)+1/2;
>> plot(t,y)
0.5
0.45
0.4
0.35
0.3
0.25
0.2
0.15
0.1
0.05
0
0 1 2 3 4 5 6 7
Fig.7.2
x1 0 1 x1
(7.32)
x 2 2 3 x2
x (0) 1
cu condiţiile iniţiale 1 .
x2 (0) 0
282
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
ex7_2.m
[x1,x2] = dsolve('Dx1=0*x1+1*x2','Dx2=-2*x1-3*x2',...
'x1(0)=1','x2(0)=0')
t=0:0.01:2;
sol_analitica = [subs(x1,t) subs(x2,t)];
x1_val=eval(vectorize(x1));
x2_val=eval(vectorize(x2));
plot(t,x1_val,'-',t,x2_val,'r-.')
legend('x1','x2')
title('Exemplul 7.2 Solutia analitica spatiul starilor ')
Obținem soluția:
x1 =
2/exp(t) - 1/exp(2*t)
x2 =
2/exp(2*t) - 2/exp(t)
0.5
-0.5
0 0.5 1 1.5 2
Fig. 7.3
Exemplul 7.3
283
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
mx c( x y ) k ( x y) 0
% ex7_3_suspensia
ode2='D2x+5*Dx+6*x=12*sin(2*t)+10*cos(2*t)'
condinit='x(0)=2,Dx(0)=0'
ode2sol=dsolve(ode2,condinit);
simplify(ode2sol)
pretty(ode2sol)
t=0:0.1:4*pi;
x_val=eval(vectorize(ode2sol));
plot(t,x_val)
284
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
>> ex7_3_suspensia
ode2 =
D2x+5*Dx+6*x=12*sin(2*t)+10*cos(2*t)
condinit =
x(0)=2,Dx(0)=0
ans =
13 25 cos(2 t) 46 31 sin(2 t)
---------- - ----------- - ----------- + -----------
2 exp(2 t) 26 13 exp(3 t) 26
1.5
0.5
-0.5
-1
-1.5
-2
0 2 4 6 8 10 12 14
285
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
dy (t )
f (t , y (t )) (7.38)
dt
y(t0 ) y0 (7.39)
Sunt frecvente situatiile in care solutiile analitice sunt greu de obtinut, în special
pentru ecuatiile neliniare.
Metodele numerice constau în determinarea unor seturi de puncte (ti , yi )
Fig.7.5, care sa aproximeze punctele (ti , y(ti )) de pe graficul solutiei
y(t)
graficul soluţiei
( ti1 , y( ti1 ))
eroarea
( ti , y( ti )) ( ti1 , yi1 )
mărime pas hi
t
ti ti 1
286
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
Trebuie să observăm că, în general, nu putem aproxima integrala din (7.41) prin
cuadratură numerică deoarece funcţia y (u ) nu este cunoscută (ea fiind chiar
soluţia pe care vrem să o determinăm). Excepţie face situaţia în care funcţia
f (t , y) este o funcţie numai de t. În această situaţie simplă soluţia se obţine prin
cuadratură:
tn 1
y n1 y n f (t )dt (7.42)
tn
dy d2y
y , 2 y (7.43)
dt dt
Metoda Euler este una dintre cele mai simple metode de determinare numerică
a soluţiei problemei cu condiţii iniţiale. Metoda utilizează un pas h constant.
Este cunoscută şi sub denumirea de metoda tangentelor.
Fie ecuatia diferentiala cu conditia initială :
y f t , y , yt0 y0 (7.44)
287
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
y1 y 0
t 0 h t 0 y'0 y1 y 0 h y '0
(7.45)
unde
y 0 f t 0 ,y 0
y2 y1 h f t1 , y1
yi1 yi h f ti , yi ,
cu (7.47)
y0 yt0 , ti1 ti h .
y(t)
graficul soluţiei
eroarea ( t1 , y( t1 )
(valoarea exactă)
( t0 , y0 ) ( t1 , y1 )
(valoarea aproximată)
tangenta
mărime pas h
t
t0 t1
Fig.7.6
t=t0:tfinal;
y=y0;
while t<=h*tfinal
y=y+h*f(t,y)
t=t+h
end
ecdif_metoda_Euler.m
% input (intrare):
Observația 7.2 Pentru cazul în care funcția f este constantă se obține soluția
exactă (eroarea este zero). Daca nu, de exemplu dacă funcția este liniară,
obținem o aproximare a soluției, eroarea fiind proporțională cu pasul h.
Eroarea metodei este cu atat mai redusă cu cat valoarea pasului h este mai mic.
Metoda Euler nu permite o estimare apriorii a erorii.
Exemplul 7.4
289
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
f fr=cv
v
Fig.7.7
dvt
m f fr mv cv f , v0 v0 (7.48)
dt
Ecuaţia (7.48) se poate aduce la forma ecuației (7.23) din Exemplul 9.1
290
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
Inline function:
fex7_4(t,y) = -y + 1
max_eroare_euler.m
[teuler,yeuler] = ecdif_metoda_Euler(@ex7_4,[0,2],0,10);
t = 0:.01:3;
y = 1 -exp(-t);
plot(t,y,teuler,yeuler,'.-')
legend('Exact','Euler')
shg
z =1-exp(-teuler);
maxerror = max(abs(z - yeuler))
Prezentăm mai jos rezultatele obţinute pentru un pas h constant. Sunt listate
rezultatele pentru aproximaţiile soluţiei la fiecare pas, eroarea relativă şi
graficele soluţiilor analitice şi numerice.
291
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
tf = t final
n = numar de pasi
-----------------------------------------------------
-------------------------------------------------------
Pasul h este constant
h = (tf - t0 ) / n
= ( 3 - 0 ) / 10
= 0.3
Pasul 1
-------------------------------------------------------
1) Evaluarea functiei f pentru valorile anterioare t si y.
f( t0 , y0 ) = f( 0 , 0 ) = 1
2) Metoda Euler pentru estimarea y1
y1 = y0 + f( t0, y0 ) * h
= 0 + 1 * 0.3
= 0.3
la t1 = 0.3
Pasul 2
-------------------------------------------------------
1) Evaluarea functiei f pentru valorile anterioare t si y.
y2 = y1 + f( t1, y1 ) * h
= 0.3 + 0.7 * 0.3
= 0.51
la t2 = 0.6
Pasul 3
-------------------------------------------------------
1) Evaluarea functiei f pentru valorile anterioare t si y.
292
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
y3 = y2 + f( t2, y2 ) * h
= 0.51 + 0.49 * 0.3
= 0.657
la t3 = 0.9
Pasul 4
-------------------------------------------------------
1) Evaluarea functiei f pentru valorile anterioare t si y.
Pasul 5
-------------------------------------------------------
1) Evaluarea functiei f pentru valorile anterioare t si y.
y5 = y4 + f( t4, y4 ) * h
= 0.7599 + 0.2401 * 0.3
= 0.83193
la t5 = 1.5
Pasul 6
-------------------------------------------------------
1) Evaluarea functiei f pentru valorile anterioare t si y.
y6 = y5 + f( t5, y5 ) * h
= 0.83193 + 0.16807 * 0.3
= 0.882351
la t6 = 1.8
Pasul 7
-------------------------------------------------------
1) Evaluarea functiei f pentru valorile anterioare t si y.
293
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
y7 = y6 + f( t6, y6 ) * h
= 0.882351 + 0.117649 * 0.3
= 0.917646
la t7 = 2.1
Pasul 8
-------------------------------------------------------
1) Evaluarea functiei f pentru valorile anterioare t si y.
Pasul 9
-------------------------------------------------------
1) Evaluarea functiei f pentru valorile anterioare t si y.
y9 = y8 + f( t8, y8 ) * h
= 0.942352 + 0.057648 * 0.3
= 0.959646
la t9 = 2.7
Pasul 10
-------------------------------------------------------
1) Evaluarea functiei f pentru valorile anterioare t si y.
y10 = y9 + f( t9, y9 ) * h
= 0.959646 + 0.0403536 * 0.3
= 0.971752
la t10 = 3
Aproximata = 0.971752
Exacta = 0.950213
294
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
Eroarea in procente
0.9
0.8
0.7
Exacta
0.6 Aproximata
0.5
y
Aproximata = 0.964816
0.4 Exacta = 0.950213
Eroarea in procente = 1.5368
0.3
0.2
0.1
0
0 0.5 1 1.5 2 2.5 3
t
Fig. 7.8
Pentru a analiza influenţa pasului h asupra erorii faţă de soluţia exactă vom
rezolva problema anterioara pentru paşi de marime diferită.
Pentru aceasta executăm următoarea M-fila
%integrare numerica ex7_4_pas - metoda Euler
clear, clf
a = 1; b = 1; y0 = 0; tf = 3;
t = [0:0.01:tf];
295
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
Solutia exacta si aproximata prin metoda Euler h=0.3 Solutia exacta si aproximata prin metoda Euler h=0.42
1 1
0.9 0.9
0.8 0.8
Exacta
0.7 Aproximata 0.7 Exacta
Aproximata
0.6 0.6
0.5 0.5
y
0.2 0.2
0.1 0.1
0 0
0 0.5 1 1.5 2 2.5 3 0 0.5 1 1.5 2 2.5 3
t t
296
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
Solutia exacta si aproximata prin metoda Euler h=0.6 Solutia exacta si aproximata prin metoda Euler h=1.5
1 1.5
Exacta
0.9 Aproximata
0.8
0.7 Exacta
Aproximata 1
0.6
0.5
y
y
Aproximata = 0.98976
0.4 Exacta = 0.950213
Eroarea in procente = 4.16193
Aproximata = 0.75
0.5
0.3 Exacta = 0.950213
Eroarea in procente = 21.0703
0.2
0.1
0 0
0 0.5 1 1.5 2 2.5 3 0 0.5 1 1.5 2 2.5 3
t t
1.5
h=1,5
h=0.75
1
h=0.375
0.5
h=0.3
solutia analitica
0
0 0.5 1 1.5 2 2.5 3
t
Exemplul 7.5
297
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
dy 2
t y 2 , y(0) 1
dt
yi1 yi h f ti , yi ,
y0 yt0 , ti1 ti h .
h = 0.1;
t = [0:h:2];
y(1) = 1;
fprintf(' t y \n');
for i=2:length(t),
y(i) = y(i-1) + h*(t(i-1)^2 - y(i-1)^2);
fprintf('%7.4f %7.4f \n',t(i),y(i));
end
plot(t,y)
Obţinem:
t y
0.1000 0.9000
0.2000 0.8200
0.3000 0.7568
0.4000 0.7085
0.5000 0.6743
0.6000 0.6538
0.7000 0.6471
0.8000 0.6542
0.9000 0.6754
1.0000 0.7108
1.1000 0.7603
1.2000 0.8235
1.3000 0.8997
1.4000 0.9877
1.5000 1.0862
1.6000 1.1932
1.7000 1.3068
1.8000 1.4250
1.9000 1.5460
2.0000 1.6680
298
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
1.8
1.6
1.4
y
1.2
0.8
0 0.5 1 1.5 2
t
dy 1 d2y 1 d3y
yi 1 yi ti1 ti 2
ti1 ti
2
3
ti1 ti 3 ...
dt ti , yi 2! dt t , y 3! dt t , y
i i i i
1 1
yi f (ti , yi )(ti 1 ti ) f (ti , yi )ti 1 ti f ' ' (ti , yi )ti 1 ti ...(7.51)
2 3
2! 3!
yi 1 yi h f ti , yi
299
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
1 d2 y 1 d3 y
eroare e ti1 ti
2
ti1 ti 3 .....
2! dt t ,y
2
3! dt t ,y
3
i i i i
(7.52)
1 d2 y 1 d 3
y
h2 h 3 ...
2! dt t ,y
2
3! dt t ,y
3
i i i i
Oprind doar primul termen din sumă, putem aprecia că eroarea este
proporţională cu pătratul pasului h. Altfel , daca pasul se ȋnjumătăţeşte eroarea
ar trebui să se micşoreze la un sfert din valoare. Dar, aşa cum putem observa din
rezultatele prezentate ȋn Talelul 7.1, acestă concluzie nu este verificată. Aceasta
deoarece aproximarea erorii cu pătratul pasului h este la rândul ei o trunchiere
locală care generează erori.
Metoda Euler se poate utiliza pentru cazul mai general al sistemelor de ecuaţii
diferenţiale ordinare
. (7.53)
.
y n f n (t , y1 , y 2 , ..., y n ) y n (t 0 ) y n 0
dy
y (t ) f (t , y ) cu condiţia iniţială y(t 0 ) y0 .
dt
300
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
yi 1 yi f ti , yi h
1
f ti , yi h 2 (7.54)
2!
a1 a 2 1
1
a 2 a3 (7.58)
2
1
a2 a4
2
1
Pentru a 2 metoda este cunoscuta ca metoda Heun. Ȋn acest caz obţinem
2
1
constantele a1 , a3 1 şi a4 1 .
2
301
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
1 1
yi 1 yi k1 k2 h yi f ti , yi f ti h , yi k1h h
1
2 2 2
h
yi 1 yi f ti , yi f ti 1 , yi hf ( ti , yi (7.59)
2
ode_Heun.m
3
Pentru a 2 metoda este cunoscută ca metoda Ralston. Ȋn acest caz obţinem
2
1 3 3
constantele a1 , a3 şi a 4 .
3 4 4
1 2
yi 1 yi k1 k2 h (7.60)
3 3
unde
k1 f x i , yi
302
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
3 3
k2 f xi h, yi k1h (7.61)
4 4
Metoda Runge-Kutta de ordinul patru (RK4) este cea mai utilizată metoda
pentru rezolvarea ecuaţiilor diferenţiale deoarece are o eroare de trunchiere de
ordin O h 4 . Algoritmul metodei se deduce din dezvoltarea Taylor (7.51) ȋn
care se reţin primii cinci termeni
1 d2y 1 d3y
yi 1 yi
dy
ti1 ti 2
ti1 ti
2
3
ti1 ti 3
dt ti , yi 2! dt t , y 3! dt t , y
i i i i
(7.62)
4
1d y
4
ti1 ti 4
4! dt t , y
i i
Cu
dy
f x , y şi x i 1 x i h
dx
Pe baza relaţiei (7.63) descriem forma cea mai folosită pentru algoritmul
metodei RK4.
Algoritmul 7.3
y i 1 y i
h
6
f i1 2 f i 2 2 f i3 f i 4 (7.64)
unde:
f i1 f t i , y i (7.64a)
303
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
h h
f i 2 f t i , y i f i1 (7.64b)
2 2
h h
f i3 f t i , y i 2 f i 2 (7.64c)
2 2
f i 4 f x i h, y i f i 3 h (7.64d)
ode_RK4.m
Exemplul 7.6
0.9
0.8
0.7
0.6
0.5 analitic
Euler
Heun
0.4 RK4
0.3
0.2
0.1
0
0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2
305
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
[t,y] = ode23(fun,tspan,y0)
[t,y] = ode45(fun,tspan,y0)
Exemplul 7.7
fmck.m
306
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
yprime(1) = y(2);
yprime(2) = f/m - k/m * y(1) - c/m * y(2);
yprime = yprime';
masa_arc_amortizor.m
% conditiile initiale
% definim m k c
Răspunsul grafic pentru poziție și viteză, figura 7.13 respectiv figura 7.14:
307
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
-3
x 10
4.5
3.5
2.5
Pozitia (m)
1.5
0.5
0
0 5 10 15
Timp (seconde)
Fig.7.13 Poziția
-3
x 10
8
2
viteza (m/s)
-2
-4
-6
0 5 10 15
Timp (secunde)
Fig.7.14 Viteza
Exemplul 7.8
308
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
y1 2 y1 3 y 2 y1 (0) 1
cu condițiile inițiale:
y 2 7 y1 y 2 y 2 (0) 0
sys_ode.m
>> pretty(y2)
3
/ 1/2 \ -
1/2 | 83 t | 2
14 83 sin| ------- | exp(t)
\ 2 /
-------------------------------
83
309
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
Rezolvarea grafică pentru soluția numerică și eroare: figurile 7.15 respectiv 7.16
Solutia numerica y 1 si y 2
3
y1
y2
2
-1
-2
-3
-4
-5
-6
-7
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
t
Fig.7.15
0.5
-0.5
-1
-1.5
-2
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
Fig.7.16
Exemplul 7.9
mad_nic.m
310
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
% y1(0) = 2, y2(0) = 0.
> mad_nic
f =
Inline function:
f(t,y) = -[30 29;29 30]*y
y1 = 1/exp(t) + 1/exp(59*t)
y2 = 1/exp(59*t) - 1/exp(t)
Soltia numerica y 1 si y 2
2
y1
y2
1.5
0.5
-0.5
-1
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
t
Fig.7.17
311
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
-1
-2
-3
-4
-5
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
Fig.7.18
Exemplul 7.10
x1 y x2 x1 x2
sau
x 2 y 2 x1 3x 2 x2 2 x1 3x2
Pentru a introduce sistemul diferenţial vom scrie o m-filă Matlab de tip funcţie,
salvată ca a1.m, care este apelată de funcția ode 45 .
function xdot=a1(t,x)
xdot=zeros(2,1);
xdot(1)=x(2);
xdot(2)= -2*x(1)-3*x(2);
>> [t,x]=ode45(@a1,[0,20],[1,1]);
>> plot(t,x(:,1),'r',t,x(:,2),'b-.')
312
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
0.8
0.6
0.4
0.2
-0.2
-0.4
-0.6
0 2 4 6 8 10 12 14 16 18 20
timp
Fig.7.19
function xdot=a2(t,x)
xdot=zeros(2,1);
xdot(1)=x(2);
xdot(2)=-3*x(2)-2*x(1)+sin(t);
>> [t,x]=ode45(@a2,[0 20],[0 0])
>> plot(t,x(:,1),'r',t,x(:,2),'b-.')
x1dot=x2; x2dot=-2*x1-3*x2+sin(t)
0.4
x1
x2
0.3
0.2
0.1
-0.1
-0.2
-0.3
-0.4
0 2 4 6 8 10 12 14 16 18 20
timp
Fig.7.20
313
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
Exemplul 7.11
y (1 y 2 ) y y 0
function xdot=vdp1(t,x)
xdot=zeros(2,1);
xdot(1)=x(2);
xdot(2)=-x(1)+(1-x(1)^2)*x(2);
-1
-2
-3
0 2 4 6 8 10 12 14 16 18 20
timp
>> plot(x(:,1),x(:,2))
314
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
x2
0
-1
-2
-3
-2.5 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 2.5
x1
7.7 Probleme
315
CAPITOLUL 7 REZOLVAREA NUMERICĂ A ECUAȚIILOR ȘI SISTEMELOR
DE ECUAȚII DIFERENȚIALE ORDINARE
y1 5 y1 3 y 2 y1 (0) 1
cu condițiile inițiale:
y 2 y1 4 y 2 y 2 (0) 0
P7.5 Ecuațiile de mișcare ale unui pendul simplu, figura P7.5, dacă neglijăm
rezistența aerului, sunt
d 2 g O1
sin 0
dt 2 l
θ l
316
Dumitru.D.Nicoară METODE NUMERICE ÎN INGINERIE FOLOSIND MATLAB
BIBLIOGRAFIE
1. Burden, R. L., Fairs, J. D., Numerical Analysis, 7th ed., Brooks/, Cole Thomson, Pacific
Grove, CA, 2001.
2. Canale, R., Chapra, S., Numerical Methods for Engineers: with Software and Programming
Applications, McGraw-Hill, New York, 2002.
3. Chapra, S., Canale, R., Numerical Methods for Engineers, 5th Edition, McGraw-Hill, ISBN:
978-0071244299 , 2008 .
9. Mathews, J. H., and Fink, K. D., Numerical Methods Using MATLAB, Prentice-Hall, Upper
Saddle River, NJ, 1999.
10. Otto, S. R., Denier, J. P., An introduction to programming and numerical methods in
MATLAB Springer-Verlag London Limited, 2005
11. Recktenwald, G. W., Numerical Methods with MATLAB, Prentice-Hall, Upper Saddle
River, NJ, 2000.
12. Young T., Mohlenkamp, M., Introduction to Numerical Methode and MATLAB Programing
for Engineers, 2012, www.math.ohiou.edu/courses/math3600/
13. http://www.eng.ed.ac.uk/teaching/courses/matlab/getting-started.shtml
14. http://www.mathworks.com/access/helpdesk/help/helpdesk.html
15. http://mathews.ecs.fullerton.edu/numerical.html
317