Documente Academic
Documente Profesional
Documente Cultură
TOTAL ORE:
44 ore
1
Tema 1. Erori de calcul numeric. (2 ore)
a) Surse de erori: erori inerente, erori de trunchiere, erori de rotunjire. Erori absolute şi
relative.
b) Propagarea erorilor la adunare, scădere, înmulţire şi împărţire.
c) Evaluarea erorii în calcularea expresiilor matematice.
Surse de erori.
Erorile inerente sunt erorile legate de cunoaşterea aproximativă a unor valori provenite din
măsurători sau din faptul că avem de-a face cu numere iraţionale (algebrice sau
Erorile de metodă sau erorile de trunchiere sunt provenite din aproximaţiile făcute la
deducerea formulelor de calcul. Spre deosebire de erorile inerente, erorile de metodă pot fi
reduse, în principiu, oricât de mult.
Erorile de rotunjire sunt legate de posibilităţile limitate de reprezentare a numerelor în
calculatoarele numerice. În general, orice calculator poate reprezenta numerele cu un număr
redus de cifre semnificative, depinzînd de lungimea cuvîntului (numărul de biţi) utilizat la
stocarea unui număr. În mod curent se lucrează cu un echivalent de circa 7 cifre semnificative
în simplă precizie şi de circa 15 cifre semnificative în dublă precizie.
După cum se ştie, în memoria internă a calculatoarelor actuale se foloseşte reprezentarea în
virgulă mobilă, în forma normalizată. Astfel, orice număr real x se scrie:
unde m este un număr real denumit mantisă, b > 0 (b ≠ 1) este baza sistemului de numeraţie
utilizat, iar n (număr întreg) este exponentul. În forma normalizată, mantisa este cuprinsă în
intervalul [b-1, 1), unde b-1 ≤ |m|< 1. Singura excepţie de la această regulă de
reprezentare este numărul zero.
În consecinţă, un număr real cu mai multe cifre semnificative este “retunjit” la un număr de
cifre maxim. Acest lucru se realizează prin rotunjirea mantisei. Alte rotunjiri se efectuează în
decursul operaţiilor.
În general, notînd cu valoarea exactă a numărului şi cu valoarea calculată (aproximativă),
Fie t numărul de cifre semnificative. Dacă lucrăm în baza 10 (b = 10), atunci un număr x a
cărui valoare o presupunem inţial cunoscută cu exactitate, se va scrie:
2
unde g conţine cifrele care nu pot fi incluse în mantisa m. Rotunjirea se face de obicei
simetric, adică se înlocueşte dacă dacă .
Erorile cu marginea dată de formula de mai sus se fac la introducerea numerelor reale în
memoria calculatorului numeric. Ele afectează rezultatele în funcţie de operaţiile la care sunt
supuse valorile introduse.
unde s-a neglijat produsul considerat ca având un ordin de mărime suficient de mic.
Rezultă că la înmulţire erorile relative introduse iniţial se adună. În afară de aceste erori,
pot apărea însă noi erori, deoarece produsul poate avea, la rîndul său, un număr de cifre
semnificative mai mare decât cel admis (notat cu t), necesitând o nouă rotunjire (simetrică).
Notând cu această nouă eroare, vom obţine eroarea relativă totală la înmulţirea a două
Desigur această evaluare este acoperitoare deoarece erorile nu se adună, ci se compun după
legi mai complicate (probabilistice).
Propagarea erorilor la împărţire.
Dacă considerăm şi , atunci la împărţire vom scrie:
3
unde am neglijat termenii de grad superior lui 2 în şi . S-a folosit dezvoltarea în serie
adică este egală cu diferenţa erorilor relative introduse iniţial în valorile numărătorului şi
o vom nota cu , astfel încât eroarea relativă totală la împărţirea a două numere x şi y este:
la sumare este :
cu marginea :
4
O modalitate de calcul o reprezintă utilizarea unei relaţii de recurenţă (recursie):
Delphi 7 este:
Function Metoda1(n : integer) : single;
begin
if (n = 0) then
Metoda1 := 1 - 1 / exp(1)
else
Metoda1 := 1 - n * (Metoda1(n - 1));
end;
Se observă că, pentru n = 14, se obţine o valoare negativă a integralei, ceea ce nu este posibil,
funcţia integrată fiind pozitivă din intervalul [0, 1]. Rezultă că valorile obţinute sunt eronate,
începând cu o anumită valoare a lui n. Explicaţia o constituie faptul că valoarea integralei se
calculează cu o eroare care este amplificată prin aplicarea formulei de recurenţă astfel că,
Pentru a obţine o valoare corectă în cazul indicilor n mari se aplică formula sub forma :
în care erorile sunt reduse la fiecare etapă. Prin urmare, plecînd de la un N suficient de mare
eroarea introdusă din necunoaşterea valorii va fi redusă, astfel încât să obţinem rezultate
corecte. Observând că valoarea integralei scade cu n, vom alege N=50 şi vom aproxima
, calculînd integralele de indice mai mic din ce în ce mai precis. Funcţia recursivă este :
5
4 7
Single:
Turbo Pascal 7.1 Double:
Extended:
Float:
Visual Studio C#
Double:
Float:
Visual Studio C++
Double:
Float:
Turbo C++
Double:
Float:
C++ Bulder Double:
Extended:
...................................
...................................
Dacă şirul este convergent şi are limita s, atunci putem scrie :
6
Numerele se numesc termenii seriei iar se numesc şirul
Spunem că seria este converjentă, divergentă sau oscilantă, după cum şirul
sumelor parţiale este convergent (are o limită), divergent (are o limită infinită) sau
oscilant (nu are limită sau are mai multe puncte limită).
Teoremă: O condiţie necesară ca seria să fie convergentă este
criteriul raportului,
Dacă găsim o limită superioară a erorii pe care o facem asupra lui e oprindu-ne la primii
termeni, observăm că :
. Deci, sau ,
valoarea lui e cu 15 zecimale exacte, trebuie să calculăm suma a cel puţin 17 termeni: :
reprezentată astfel:
,
unde:
reprezintă polinomul lui Taylor de gradul n;
reprezintă restul.
este aproximativ egal cu dar există totuşi o diferenţă mică. Aceasta este restul
adică:
unde este factorialul lui şi este derivata de ori a funcţiei în punctul . Primul
termen al seriei rezultă din derivata zero a funcţiei , care este prin definiţie însăşi, şi
8
= , unde este cuprins între şi ;
adică:
,
1)
,
2)
,
3)
,
4)
,
5)
......................................................................
9
Deci
ε.
,
1)
,
2)
...................................
10
n) ,
...................................
,
1)
,
2)
,
3)
,
4)
,
5)
......................................................................
11
Din calculele de mai sus observăm că derivatele funcţiei sunt şi
Dacă vom reprezenta grafic funcţia şi şirul sumelor parţiale ale seriei
mai mult de funcţia corectă, cu cât creşte gradul. Imaginea de mai jos demonstrează graficul
funcţiei şi aproximările Taylor, cu polinomul de grad 1, 3, 5, 7, 9, 11 şi 13:
12
Această metodă de calculare a funcţiei este foarte nesigură. Din ecuaţia sumei:
împărţirea a două numere foarte mari, iar calculele de asemenea gen efectuate în calculatorul
numeric sunt însoţite de erori de calcul de asemenea foarte mari.
13
Pentru a simplifica calculele se poate de folosit o altă metodă de calculare a funcţiei .
Din formula sumei se observă că termenul curent (notat TC) se poate deduce din termenul
,
1)
,
2)
14
,
3)
,
4)
,
5)
......................................................................
ca sumă este:
,
2)
,
3)
15
,
4)
,
5)
......................................................................
Deci
;
a)
;
b)
;
c)
;
d)
;
e)
Rezolvare:
atunci obţinem:
17
Tema 3. Rezolvarea numerică a ecuaţiilor neliniare şi transcendente (4
ore)
a) Metode analitice, grafice şi numerice de localizare a soluţiilor ecuaţiilor neliniare.
b) Metoda înjumătăţirii intervalului. Descrierea algoritmului şi implementarea lui într-un
subprogram.
c) Metoda coardelor. Descrierea algoritmului şi implementarea lui într-un subprogram.
d) Metoda Newton. Descrierea algoritmului şi implementarea lui într-un subprogram.
e) Metoda iterativă. Descrierea algoritmului şi implementarea lui într-un subprogram.
f) Exemple de programe complexe pentru determinarea soluţiilor ecuaţiilor neliniare.
g) Determinarea rădăcinilor polinoamelor.
Sub noţiunea de ecuaţii algebrice neliniare se înţelege acele ecuaţii care conţin necunoscută
la puterea diferită de unu, de exemplu:
Sub noţiunea de ecuaţii algebrice transcendente se înţeleg acele ecuaţii din care nu poate fi
obţinută soluţie analitică în mod evident, se exemplu:
Ecuaţii exponenţiale:
;
Ecuaţiile logaritmice :
;
Ecuaţiile trigonometrice:
;
Pentru rezolvarea acestor ecuaţii este necesar mai întâi să se identifice printr-o anumită
metodă intervalele pe care se află exact o rădăcină a ecuaţiei.
Pentru ca ecuaţia să aibă o soluţie pe un interval este necesar ca funcţia să fie
18
;
Metodele cele mai utilizate în calculul numeric aproximativ al soluţiilor unei ecuaţii care
satisface ipotezele de mai sus sunt:
Metoda înjumătăţirii intervalului;
Metoda coardei;
Metoda tangentei (sau metoda Newton);
Metoda iteraţiilor;
reale. A izola cele rădăcini ale ecuaţiei înseamnă a pune în evidenţă puncte
Metodele utilizate pentru izolarea soluţiilor sunt metoda tabelării, metaoda grafică şi
metoda analitică de localizare a soluţiilor.
Metoda tabelării. Cu ajutorul acestei metode sunt separate numai rădăcinile reale ale
funcţiei din interiorul domeniului delimitat de marginile rădăcinilor. Intervalul ,
19
atunci în intervalul există un număr impar de rădăcini ale funcţiei
, adică dacă acest interval este suficient de mic, atunci pe acest interval există obligatoriu
o soluţie a funcţiei .
Dacă însă
,
dacă acest interval este suficient de mic, atunci pe acest interval funcţia are zero soluţii.
în intervalul .
21
Metoda analitică. Metoda analitică de determinare (localizare) a soluţiilor unei funcţii
Aceste transformări se realizează în aşa mod încât să fie simplu de construit calitativ graficul
funcţiilor . Punctele de intersecţie ale acestor două grafice reprezintă soluţiile
ecuaţiei neliniare. Prin această metodă putem să localizăm exact intervalele pe care se găsesc
cel mult o soluţie a funcţiei .
soluţia funcţiei este valoarea a punctului de intersecţie a celor două funcţii, unde
22
Metoda înjumătăţirii intervalului. Descrierea algoritmului şi implementarea lui într-un
subprogram.
Metoda înjumătăţirii intervalului (metoda biscţiei sau dihotomiei) este cea mai simplă
metodă de determinare a rădăcinii unei ecuaţii care se află în intervalul .
.
mijlocul intervalului: ;
care funcţia prezintă schimbarea de semn; acest subinterval este noul interval în care se află
rădăcina. Sunt posibile următoarele variante prezentate în tabelul următor:
3) pentru noul interval se procedează analog calculând valorile funcţiei la capetele lui şi la
mijloc, din semnele funcţiei în cele trei puncte rezultând subintervalul pentru care are loc
schimbarea de semn;
23
4) procesul este iterativ şi se încheie atunci când se obţine o eroare mai mică decât precizia
impusă rădăcinii: .
Rezolvare. Pentru determinarea soluţiei ecuaţiei se aplică algoritmul prezentat mai sus şi
rezultă valorile din tabelul următor:
Nr.
1. 1 1,5 2 -2 0,155465 3,693
2. 1 1,25 1,5 -2 -1,089 0,15546
5
3. 1,25 1,375 1,5 -1,089 -0,50967 0,15546
5
4. 1,375 1,4375 1,5 - -0,1878 0,15546
0,50967 5
5. 1,4375 1,46875 1,5 - -0,0189 0,15546
0,1878 5
6. 1,4687 1,484375 1,5 - 0,0676 0,15546
5 0,0189 5
7. 1,4687 1,476562 1,48437 - 0,024177
5 5 5 0,0189 2
Se observă din rezultatele obţinute că această metodă este slab convergentă. Soluţia
aproximativă a ecuaţiei este calculată cu o eroare:
Implementarea în Delphi 7:
function F(x: extended): extended;
begin
F:=ln(x)+3*sqr(x)-4*x-1;
end;
24
until abs(b-a)<eps;
rez:=(a+b)/2;
end;
care funcţia prezintă schimbarea de semn, acest subinterval este noul interval în care se află
rădăcina.
3) pentru noul interval se procedează analog: soluţia în a doua aproximare se poate egala
cu abscisa punctului de intersecţie a coardei care trece prin punctele şi
4) procesul este iterativ şi se încheie atunci când se obţine o eroare mai mică decât precizia
impusă rădăcinii: , unde – valoarea curentă calculată şi – valoarea
precedentă.
25
Formula de lucru o determinăm din asemănarea Δ şi Δ :
Rezolvare. Pentru determinarea soluţiei ecuaţiei se aplică algoritmul prezentat mai sus şi
rezultă valorile din tabelul următor:
Pas )
1. 1.00000 1.35130 2.00000 - - 3.69314
0 0 0 2.000000 0.626100 7
2. 1.35130 1.44533 2.00000 - - 3.69314
0 2 0 0.626100 0.146033 7
3. 1.44533 1.46643 2.00000 - - 3.69314
2 1 0 0.146033 0.031635 7
4. 1.46643 1.47096 2.00000 - - 3.69314
1 2 0 0.031635 0.006742 7
După numărul de paşi parcurşi, se observă că şi acestă metodă este slab convergentă însă
este mai rapidă decât în cazul metodei de înjumătăţire a intervalului. Soluţia aproximativă a
ecuaţiei calculată prin metoda coardei este calculată cu o eroare:
Implementarea în Delphi 7:
function F(x: extended): extended;
begin
F:=ln(x)+3*sqr(x)-4*x-1;
end;
procedure Metoda_Coardelor(a, b, eps: extended; var rez:
extended);
var vc, vp: extended;
begin
vc:=a;
repeat
vp:=vc;
26
vc:=(a*F(b)-b*F(a))/(F(b)-F(a));
if F(a)*F(vc)<0 then b:=vc else a:=vc;
until abs(vc-vp)<eps;
rez:=vc;
end;
Reţinând doar primii doi termeni ai dezvoltării (1.1) se obţine o relaţie aproximativă de calcul
a lui în funcţie de şi :
punctul :
forma:
(1.3)
27
Alegerea lui sau trebuie să se facă astfel încât să nu se obţină o valoare a lui în afara
, care nu este cuprins în intervalul . Pentru a satisface această condiţie, trebuie să fie
luat acel capăt al intervalului la care semnul funcţiei coincide cu semnul primei derivate.
Deci, dacă atunci punctul iniţial este limita dreaptă, adică , iar dacă
putem modifica această formulă înlocuind derivata funcţiei în punctul . După cum se ştie:
cunoaştem o valoare destul de mică , unde cu cât această valoare este mai mică, cu atât se
calculează mai exact derivata. În calitate de valoarea se poate utiliza precizia de rezolvare a
ecuaţiei neliniare. Formula finală este:
Procesul de calculare a rădăcinii ecuaţiei neliniare este unul iterativ şi calculul se opreşte
atunci când se realizează condiţia: .
Pentru determinarea soluţiei aproximative prin metoda Newton, vom construi în Delphi 7 trei
funcţii:
28
1) Funcţia denumită care returnează funcţia pentru care aproximăm soluţia într-
un anumit interval;
2) Funcţia denumită care returnează derivata funcţiei date;
date.
Pentru determinarea soluţiei ecuaţiei rezultă valorile din tabelul următor:
P
as
1 2,0000000000 3,693147180559 1,5655135659 0,538657839287
. 000 95 914 026
2 1,5655135659 0,538657839287 1,4762117109 0,022235354066
. 914 026 0188 8164
3 1,4762117109 0,022235354066 1,4721942711 4,482088759672
. 0188 8164 8359 37E-5
4 1,4721942711 4,482088759672 1,4721861403 4,08248314928E-
. 8359 37E-5 3879 10
5 1,4721861403 4,08248314928E-
. 3879 10
Implementarea în Delphi 7:
function Functie(x: extended): extended;
begin
Functie:=ln(x)+3*(x*x)-4*x-1;
end;
29
Dacă iniţial se cunoaşte care limită a intervalului trebuie luată, adică se satisface una
astfel:
function Metoda_Newton(x, eps:extended): extended;
var xc, xp: extended;
begin
xc:=x;
repeat
xp:=xc;
xc:=x-Functie(x)*eps/(Functie(x+eps)-Functie(x));
x:=xc;
until abs(xc-xp)<eps;
Metoda_Newton:=xc;
end;
Metoda Newton are o viteză de convergenţă mai superioară decât celelalte metode.
Principalul dezavantaj constă în faptul că această metodă nu poate fi aplicată la orice funcţie
sau pentru orice domeniu . Dacă punctul iniţial nu este ales în mod corespunzător,
atunci nu ava avea loc convergenţa spre rădăcina . De aceea în practică se recomandă să
înceapă căutarea rădăcinii folosind metoda înjumătăţirii sau metoda coardelor, iar după un
anumit număr de paşi pentru accelerarea convergenţei se trece la metoda Newton.
obţinând echivalenţa .
Formal acest lucru se poate de obţinut dacă adăugăm şi totodată scădem valoarea lui din
ecuaţia noastră iniţială:
30
Valoarea iniţială poate fi luată oricare punct din intervalul , cu condiţia ca el să fie cât
mai aproape de rădăcina exactă a ecuaţiei (adică în practică se recomandă să înceapă căutarea
rădăcinii folosind o altă metodă, iar după un anumit număr de paşi să se tracă la metoda
iterativă).
Rezolvare. În cazul acestei metode trebuie să indicăm valoarea lui . Deci, pentru simplitate
L n ( x ) y 0 0 ( x ) y11 ( x ) ... y n n ( x )
L n ( x i ) f ( x i ) y i , i 0, n .
n
y k k (x i ) y i , i 0, n .
k 0
k (x k ) 1
Implementarea în Delphi 7:
Function Lagrange(x, y : array of extended; a : extended) :
extended;
var j, i, n : integer;
p, s : extended;
Begin
n:=high(x); s:=0;
For i:=0 to n do
Begin
p:=1;
For j:=0 to n do
if j<>i then p:=p*(a-x[j])/(x[i]-x[j]);
S:=S+y[i]*p;
end;
Lagrange:=S;
end;
Pasul h al unei astfel de reţele de noduri reprezintă diferenţa dintre două puncte consecutive:
h x i 1 x i , i 0, n 1 .
33
y k y k 1 y k
2 y k (y k ) y k 2 2 y k 1 y k
................
n
n y k (1) j C nj y n k j
j0
Aceste diferenţe pot fi uşor determinate dacă se construişte următorul tabel diagonal:
34
Polinomul de interpolare Newton de speţa I
Acest tip de polinom foloseşte diferenţele finite la dreapta. Se pune problema determinării
unui polinom care să coincidă cu funcţia f în nodurile reţelei echidistante. Acest polinom se
consideră de forma:
N dn ( x ) c 0 c1 ( x x 0 ) c 2 ( x x 0 )( x x 1 )
... c n ( x x 0 )(x x1 )...( x x n 1 )
N dn ( x i ) f ( x i ) y i , i 0, n .
Rezultă:
c0 y0
y1 y 0 y 0
c1
h 1!h
y 2 2 y1 y 0 2 y 0
c2 .
h 2!h 2
.........
n y 0
cn
n!h n
În aceste condiţii, expresia polinomului devine:
35
y 0 2 y 0
N dn ( x ) y 0 (x x 0 ) ( x x 0 )( x x 1 )
1!h 2! h 2
n y 0
... ( x x 0 )( x x 1 )...(x x n 1 ).
n! h n
x x0
t .
h
Atunci:
( x x 0 )( x x1 )...(x x k 1 )
t ( t 1)...(t (k 1)), k 1, n .
hk
Rezultă pentru polinom expresia:
t ( t 1) 2
N dn ( x 0 th ) y 0 ty 0 y 0 ...
2!
t ( t 1)...(t (n 1)) n
y0.
n!
Dacă se doreşte interpolarea într-un punct oarecare x diferit de noduri, se calculează t şi apoi
se evaluează N dn ( x 0 th ) . Acest tip de polinom de interpolare se utilizează de obicei pentru
aproximarea funcţiei f într-un punct x situat în vecinătatea punctului x 0 .
Implementarea în Delphi 7:
36
function Newton1(xk, yk: array of extended; x: extended):
extended;
var m, n, i, k: integer;
Dif: array[0..99, 0..99] of extended;
h, P, D: extended;
begin
n := length(xk);
h := xk[2] - xk[1];
for k:=0 to 99 do
for i:=0 to 99 do
Dif[k,i] := 0;
P := yk[0];
D := 1;
for k:=1 to n-1 do
begin
D := D * (x - xk[k-1])/(k * h);
P := P + Dif[k-1,0] * D;
end;
Newton1 := P;
end;
Se porneşte de la:
N sn ( x ) c 0 c1 ( x x n ) c 2 ( x x n )( x x n 1 )
... c n ( x x n )( x x n 1 )...(x x 1 ).
N sn ( x i ) f ( x i ) y i , i 0, n .
y n 2yn
N sn ( x ) yn (x x n ) ( x x n )(x x n 1 )
1!h 2!h 2
n yn
... ( x x n )(x x n 1 )...( x x 1 ).
n!h n
x xn
t .
h
Se obţine:
y n 2 yn
N sn ( x n th ) y n t t ( t 1) ...
1! 2!
n yn
t ( t 1)...( t (n 1)).
n!
Acest polinom se utilizează de obicei pentru aproximarea funcţiei f într-un punct x situat
în vecinătatea punctului x n .
Exemplu: Să se implementeze un subprogram în Delphi 7 care foloseşte polinomul de
interpolare Newton de speţa a II-a.
Rezolvare. Forma principală în Delphi 7:
Implementarea în Delphi 7:
38
function Newton2(xk, yk: array of extended; x: extended):
extended;
var m, n, i, k: integer;
Dif: array[0..99, 0..99] of extended;
h, P, S: extended;
begin
n := length(xk);
h := xk[2] - xk[1];
for k:=0 to 99 do
for i:=0 to 99 do Dif[k,i] := 0;
P := yk[n-1];
S := 1;
for k:=1 to n-1 do
begin
S := S * (x - xk[n-k])/(k * h);
P := P + Dif[k-1,n-k-1] * S;
end;
Newton2 := P;
end;
f (x1 ) f (x 0 ) f (x 2 ) f (x1 ) f ( x n ) f ( x n 1 )
, ,...,
x1 x 0 x 2 x1 x n x n 1
poartă numele de diferenţe divizate de ordinul întâi ale lui f. Aceste diferenţe se notează
prin:
f ( x 0 , x 1 ), f ( x 1 , x 2 ),..., f ( x n 1 , x n ) .
39
Diferenţele divizate de ordinul I se constituie ca fiind operatori liniari faţă de f, fiind
simetrice în raport cu punctele x i , x j . Se pot defini recursiv diferenţele divizate de ordinul II
prin:
f (x j , x k ) f (x i , x j )
f (x i , x j , x k ) .
xk xi
Diferenţele divizate de ordinul k se scriu pornind de la diferenţele divizate de ordin (k-1)
astfel:
N n ( x ) c 0 c1 ( x x 0 ) c 2 ( x x 0 )( x x 1 ) ...
c n ( x x 0 )...(x x n 1 )
N n ( x i ) f ( x i ), i 0, n
c 0 f ( x 0 ) ; c1 f ( x 0 , x 1 )
......... ; c n f ( x 0 , x 1 ,..., x n ) .
Expresia finală a polinomului Newton cu diferenţe divizate este:
N n ( x ) f ( x 0 ) f ( x 0 , x1 )( x x 0 ) ...
f ( x 0 , x 1 ,..., x n )( x x 0 )...( x x n 1 ).
Diferenţele divizate de diverse ordine pot fi uşor calculate dacă se construieşte un tabel de
forma:
xk f (x k ) f (x i , x j ) f (x i , x j , x p )
x0 f (x 0 )
f (x 0 , x1 )
x1 f ( x1 ) f (x 0 , x1 , x 2 )
f ( x1 , x 2 ) f (x 0 , x1 , x 2 , x 3 )
x2 f (x 2 ) f ( x1 , x 2 , x 3 )
f (x 2 , x 3 )
x3 f (x 3 )
40
f ( x 2 , x 3 ) f ( x1 , x 2 )
De exemplu, f ( x1 , x 2 , x 3 ) ,
x 3 x1
Implementarea în Delphi 7:
function NewtonDD(xk, yk: array of extended; x: extended):
extended;
var DD: array[0..99, 0..99] of extended;
i, k, m, n: integer; T, P: extended;
begin
n := length(xk);
for k:=0 to 99 do
for i:=0 to 99 do DD[k,i] := 0;
41
T := T * (x - xk[k]);
P := P + DD[k,0] * T;
end;
NewtonDD := P;
end;
y i f ( x i ), i 0, n .
Se pune problema aproximării acestei funcţii printr-un polinom de grad m, m < n, de forma:
Fm ( x ) c 0 c1x ... c m x m
n
S f (x k ) Fm (x k ) 2
k 0
F1 ( x ) ax b .
Se impune condiţia ca suma:
n
S(a , b) y k (ax k b) 2
k 0
Aceste relaţii reprezintă un sistem de 2 ecuaţii cu 2 necunoscute care mai poate fi scris sub
forma:
a x k b n y k
a x k b x k x k y k
2 .
Pentru uşurinţa scrierii s-a renunţat la limitele de sumare.
Rezolvarea sistemului permite obţinerea necunoscutelor a şi b de forma:
n x k y k x k y k
a
n x k2 x k
2
xk y k xk xk y k
2
.
b
n x k2 x k
2
42
Se poate verifica uşor, folosind derivatele de ordinul al II-lea pentru S(a,b) că valoarea
obţinută este o valoare minimă.
Procedura descrisă poate fi generalizată căutând în locul funcţiei liniare o funcţie
polinomială de grad m, cu m<n.
Exemplu: Să se implementeze un subprogram în Delphi 7 care foloseşte metoda ce lor
mai mici pătrate.
Rezolvare. Forma principală în Delphi 7:
Implementarea în Delphi 7:
Procedure RegresieLiniara(x, y: array of extended;var a, b:
extended);
var n, i: integer;
Sx, Sxy, Sy, Sxx: extended;
begin
n := length(x);
Sx := 0; Sxy := 0; Sy := 0; Sxx := 0;
Derivarea numerică se reduce la calcule aritmetice, folosind formule relativ simple deduse
prin aproximarea funcţiei de derivat printr-un polinom de interpolare. În acest fel, din punct
de vedere teoretic, problema derivării numerice se reduce, practic, la problema interpolării
funcţiilor.
Problema derivării numerice se formulează diferit în următoarele două cazuri:
funcţia este definită prin cod (este cunoscută expresia ei analitică sau algoritmul de
evaluare pentru orice punct din domeniul de definiţie);
funcţia este definită prin date (este cunoscut tabelul valorilor funcţiei într-o reţea finită
de puncte din domeniul de definiţie, numite noduri).
Fie o reţea de discretizare:
Dacă se notează cu o funcţie care interpolează datele anterioare (de exemplu, polinomul
aproximativ, evaluând .
are derivata
În cazul când :
atunci:
Calculele pot fi continuate pentru grade superioare, prin folosirea polinomului Newton de
interpolare.
În cazul reţelei de noduri echidistante cu pasul , aceste relaţii catătă o formă
44
iar pentru :
Polinomul de interpolare de grad doi devine, după derivare, o funcţie de gradul întâi care, în
cele trei noduri ale reţelei are valorile:
Aceste trei relaţii reprezintă aproximări de ordinul doi ale primei derivate, cunoscute sub
numele de relaţii cu diferenţe finite progresive, centrate şi respectiv regresive.
Derivatele de ordin superior se pot evalua numeric prin aplicarea recursivă a formulelor de
notaţiile: , , se obţine:
aproximarea de ordinul doi. Acest rezultat are avantajul unei precizii maxime pentru reţeaua
considerată şi pentru trei evaluări a funcţiei .
45
evaluarea numerică este afectată de o eroare de trunchiere. Teoretic, eroarea de trunchiere
este cu atât mai mică cu cît ordinul aproximării este mai mare. În realitate formulele de
derivare de ordin superior sunt afectate, în anumite cazuri, de erori mari de trunchiere. În
acest caz se recomandă folosirea relaţiilor de ordin mic, cea mai indicată fiind relaţia cu
diferenţe finite centrate de ordinul doi.
Erorile care apar prin folosirea formulelor de derivare numerică depind de doi factori:
pasul de derivare ;
Exemplu:
1) Să se implementeze un subprogram în Delphi 7 care calculează numeric derivata de
ordinul I a unei funcţii.
Se poate de demonstrat că ultima formulă (simetrică) este mai eficientă pentru calculele
numerice ale derivatei de ordinul I.
Implementarea în Delphi 7:
type functie = function(x: extended): extended;
46
until abs(vc - vp) < eps;
Der_I := vc;
end;
Implementarea în Delphi 7:
function Der_II(x0, eps: extended; f: functie): extended;
var h, vc, vp: extended;
begin
h := eps;
vc := (f(x0 + 2*h) - 2*f(x0 + h) + f(x0))/sqr(h);
repeat
h := h/2;
vp := vc;
vc := (f(x0 + 2*h) - 2*f(x0 + h) + f(x0))/sqr(h);
until abs(vc - vp) < eps;
Der_II := vc;
end;
Metoda dreptunghiului
47
Pentru calcularea numerică a integralelor de ordinul I trebuie să reeșim din sensul geometric
al integralei de ordinul I, care reprezintă aria trapezului curbliniu:
într-un număr relativ mare de subintervale egale. Aria fiecărui trapez curbliniu elementar se
aproximează din punct de vedere geometric cu figuri geometrice pentru care aria este uşor de
calculat (dreptunghiuri, trapeze, trapeze parabolice ş.a.) după care ele se adună. Dacă aria
elementară se aproximează cu un dreptunghi, metoda de calculare numerică se numeşte
metoda dreptunghiului. Deoarece dreptunghiul respectiv poate fi ajustat la marginea de
stânga, la marginea de dreapta sau la centrul segmentului, astfel şi metodele se numesc:
metoda dreptunghiului ajustat la stânga, metoda dreptunghiului ajustat la dreapta şi metoda
dreptunghiului ajustat la centru.
În continuare deducem formula pentru calcularea numerică a integralei prin metoda
dreptunghiurilor ajustate la marginea de stînga. Aria trapezului curbliniu divizat în segmente
va fi egal cu suma ariilor trapezelor:
48
Formula pentru calcularea numerică a integralei prin metoda dreptunghiurilor ajustate la
centru (metoda dreptunghiurlor de mijloc sau medii) este:
Se poate observa că cu cât (adică numărul de diviziuni al segmentului ) este mai mare,
cu atât vom obţine un răspuns mai exact, deoarece se micşorează automat pasul .
Procedura pentru calcularea numerică a integralelor prin metoda dreptunghiurilor de stânga:
49
type fxrr = function(x:extended):extended;
function f1(x:extended):extended;
begin
f1:=x*x*x;
end;
50
Formula de lucru:
Metoda Simpson
Metoda Simpson aproximează ariile elementare prin trapeze parabolice:
51
Formula de lucru se deduce utilizând formula de calculare a ariei trapezului parabolic:
Se deduce:
Metoda Monte-Carlo
52
Această metodă se bazează pe noţiunea de valoarea medie aritmetică a funcţiei pe intervalul
folosind diferite distribuţii de repartizare a acestor numere. Cel mai frecvent şi cel mai simplu
se utilizrază funcţia de repartiţie uniformă. Pentru a obţine numere aleatoare uniform
repartizate pe intervalul , putem folosi generatorul de numere aleatoare uniform
random, care întoarce rezultat de tip extended. Pentru a obţine numere aleatoare din
intervalul utilizăm expresia . Deci, formula finală este:
.
În baza acestei formule se realizează subprogramul în Delphi:
procedure Monte_Carlo(a,b:extended;n:integer;f:fxrr;var
r:extended);
var i:integer;
s:extended;
begin
s:=0;
for i:=1 to n do s:=s+f(a+(b-a)*random);
r:=s*(b-a)/n;
end;
Neajunsul acestei metode constă în faptul că eroarea cu care se calculează integrala nu este
controlată. Pentru estimarea erorii ar trebui să calculăm integrala de mai multe ori obţinând
valori diferite, iar apoi să calculăm valoarea medie. În continuare se estimează eroarea prin
metode utilizate în teoria probabilităţilor pentru prelucrarea seturilor de date aleatoare:
1) Se calculează eroarea medie:
53
Aceste formule permit estimarea erorii. În continuare este realizat subprogramul ce
calculează numeric o integrală prin metoda Monte-Carlo şi estimează eroarea medie pătratică
în calitate de eroare a calculului integralei:
procedure Monte_Carlo2(a,b:extended;n1,n2:integer;f:fxrr;var r,
dr:extended);
//n1 - nr. de calculari a integralei
//n2 - nr. de valori a lui x pe [a,b]
//dr - estimarea erorii
var i,j:integer;
sx, s2x:extended;
vmf:extended; //valoarea medie a functiei
begin
randomize;
sx:=0;
s2x:=0;
for i:=1 to n1 do
begin
vmf:=0;
for j:=1 to n2 do vmf:=vmf+f(a+(b-a)*random);
vmf:=vmf/n2*(b-a);
sx:=sx+vmf;
s2x:=s2x+sqr(vmf);
end;
r:=sx/n1;
dr:=sqrt()s2x-n1*sqr(r)/n1);
end;
Pentru integralele cu o singură variabilă, metoda Monte-Carlo nu este foarte eficientă.
Prioritatea acestei metode constă în faptul că ea uşor poate fi modificată pentru integrale
multiple:
Subprogramul este:
procedure Monte_Carlo2(a,b,c,d:extended;n:integer;f:fxy;var
r:extended);
var i:integer;
s:extended;
begin
randomize;
s:=0;
for i:=1 to n do s:=s+f(a+(b-a)*random,c+(d-c)*random);
r:=s*(b-a)*(d-c)/n;
54
end;
Exemplu:
55
Pentru calcularea volumului paralelipipedului curbiliniu, îl împărţim în volume elementare pe
care le aproximăm cu figuri geometrice pentru care putem calcula volumul. Cel mai simplu
este să aproximăm volumele elementare prin paralelipipede ajustate la marginile figurii sau la
centru, la fel cum în cazul dreptunghiurilor am avut de ajustat la marinea din stânga, dreapta
sau la centru. Pentru aceasta, baza paralelipipedului curbiliniu o împărţim în suprafeţe
elementare:
56
unde reprezintă centrul suprafeţei elementare din baza paralelipipedului.
function f1(x,y:extended):extended;
begin
f1:=x+x*y;
end;
este .
Dacă ordinul matricei este 1, atunci matricea este formată dintr-un singur element .
59
ordinul 3, determinantul poate fi calculate folosind regula lui Sarrus
Astfel, pentru o matrice de ordinul 3 determinantul poate fi calculat direct după formula:
Exemplu: , unde
coloanei . Vom nota minorul elementului prin , unde indică rândul, iar – coloana la
Vom cerceta matricea din exemplul precedent. Pentru a calcula minorul a elementului
60
, .
În această formulă elementele necunoscute sunt minorii elementelor din prima linie. Fie un
minor arbitrar . El este determinantul unei matrice de ordinul . Pentru a-l calcula
Cazul elementar – dacă ordinul matricei este 1, atunci determinantul este egal cu
valoarea unicului element al matricei;
Cazul de reducere –
a) Se dezvoltă determinantul matricei după prima linie. Valoarea determinantului se
iniţializează cu 0.
b) Pentru de la 1 la :
function Determinant(x:matrice):extended;
var t,k,i,j:integer;
s:extended;
minor:matrice;
begin
t:=high(x);
setlength(minor,t,t);
if t=0 then Determinant:=x[0,0] {caz elementar}
61
else
begin
s:=0;
for k:=0 to t do
begin
{Se exclude prima linie si coloana k
pentru a forma matricea, care corspunde
minorului elementului x[0,k]}
for i:=0 to t-1 do
for j:=0 to k-1 do minor[i,j]:=x[i+1,j];
for i:=0 to t-1 do
for j:=k to t-1 do minor[i,j]:=x[i+1,j+1];
if odd(k) {apelul recursiv}
then s:=s-x[0,k]*Determinant(minor)
else s:=s+x[0,k]*Determinant(minor);
end;
Determinant:=s;
end;
end;
label1.Caption:=FloatToStr(Determinant(a));
end;
62
Pentru determinarea elementelor matricei inverse se untilizează formula:
A1,1 A1, 2 A1,n
...
A2,1 A2, 2 A2,n
A
-1 ...
,
... ... ... ....
A An, 2 An,n
n,1 ...
unde este minorul elementului al matricei , iar .
Formulele Cramer
Se consideră un sistem de ecuaţii liniare cu necunoscute de forma:
a 11 x 1 a 12 x2 .. . a 1n xn b 1
a .. .
21 x 1 a 22 x 2 a 2 n xn b2
. .. .. .. ..... .. .. .. ..... .. .. .. .. ... .. .. .... ... ..
a n1 x
1 a n 2 x2 .. . a nn x n bn
Această formulă permite calculul soluţiilor sistemului de ecuaţii liniare în cazul în care
matricea a sistemului este nesingulară. În formă detaliată putem scrie formula astfel:
63
x1 A1,1 A1, 2 A1,n b1
...
x2 A2,1 A2, 2 A
... 2,n b2 ,
... ... ... ....
An ,1 An , 2 An ,n
x ...
n bn
de unde:
şi .
Aceste formule permit calculul direct al soluţiilor sistemului de ecuaţii liniare, deoarece
conţin doar mărimi calculate prin utilizarea matricei coeficienţilor sistemului şi a vectorului
termenilor liberi a acestui sistem. Ele sunt numite formulele Cramer pentru calculul soluţiilor
unui sistem de ecuaţii liniare.
Algoritmizarea metodei
Fie dat un sistem din ecuaţii liniare cu necunoscute. Pentru realizarea metodei Cramer de
rezolvare a acestui sistem vor fi necesare anumite structuri de date:
a) Un tablou bidimensional cu elemente de tip real sau întreg –tabelul al
coeficienţilor sistemului;
b) Un tablou unidimensional cu elementele de tip real sau întreg – vectorul al termenilor
liberi ai sistemului;
c) Un tablou unidimensional cu elementele de tip real – vectorul soluţiilor .
Determinarea soluţiilor unui sistem de ecuaţii liniare utilizând metoda Cramer se bazează pe
calculul determinanţilor. Prin urmare, este necesar să se realizeze în program o funcţie, care
determină valoarea determinantului unei matrice. Paşii necesari de parcurs sunt:
Pas 1. Se calculează . Dacă , se trece la Pas 2, în caz contrar se afişează un
64
b) Se calculează determinantul al matricei modificate, apoi componenta a soluţiei:
Pas 4. Dacă după care se revine la Pas 3, în caz contrar este afişat vectorul
65
procedure TForm1.Button1Click(Sender: TObject);
var a:matrice;
b,x:array of extended;
n:integer;
begin
n:=4;
setlength(a,n,n);
setlength(b,n);
setlength(x,n);
if (Determinant(a)<=0) then
ShowMessage('Nu se poate de calculat solutiile!')
else
begin
Cramer(a,b,x);
Label1.Caption:=FloatToStr(x[0]);
Label2.Caption:=FloatToStr(x[1]);
Label3.Caption:=FloatToStr(x[2]);
Label4.Caption:=FloatToStr(x[3]);
end;end;
Una din metodele eficiente de determinare a soluţiei unui sistem de ecuaţii liniare este
metoda excluderii consecutive a necunoscutelor. Această metodă este cunoscută şi sub
numele metodei Gauss. Ea poate fi utilizată în cazul când sistemul cercetat are o soluţie unică
(matricea coeficienţilor sistemului este nesingulară).
Fie dat sistemul (1) din ecuaţii liniare cu necunoscute:
După aceste transformări, soluţiile unui sistem de tipul (2) pot fi determinate începând cu :
67
penultima soluţie se determină din penultima ecuaţie, în care se înlocuieşte
procesul este iteraticv şi continuă până cînd se determină prima necunoscută din
Descrierea matematică
Etapa 1 – excluderea din ecuaţiile . în matricea supusă transformării,
Din această matrice conform metodei Gauss determinăm coeficienţii . Petru aceasta linia
coeficienţii:
- ;
- ,
unde .
68
Etapa 2 – din ultima ecuaţie a sistemului (4) se determină : , iar în caz general
, unde .
începând cu .
Algoritmizarea metodei
Pas 1. Determinarea pivotului la etapa şi schimbarea ecuaţiei care conţine acest coeficient
pe primul loc;
Pas 2. Eliminarea coeficienţilor de sub diagonala principală cu ajutorul formulelor deduse;
Pas 3. Determinarea soluţiilor în ordinea .
Implementarea în Delphi:
type mnr=array of array of extended;
69
for m:=k to n do
begin
p:=a[h,m];
a[h,m]:=a[k,m];
a[k,m]:=p;
end;
{se schimba si termenii liberi cu locul}
p:=b[h];
b[h]:=b[k];
b[k]:=p;
end;
for i:=k+1 to n do {se calculeaza termenii la etapa k}
begin
for j:=k+1 to n do
a[i,j]:=a[i,j]*a[k,k]-a[k,j]*a[i,k];
b[i]:=b[i]*a[k,k]-b[k]*a[i,k];
end;
for i:=k+1 to n do {se anuleaza termenii de sub diagonala
principala}
a[i,k]:=0;
end;{k}
70
label1.Caption:=floattostr(s[0]);
label2.Caption:=floattostr(s[1]);
label3.Caption:=floattostr(s[2]);
label4.Caption:=floattostr(s[3]);
end;
ecuaţia având indicele din sistemul de la pasul anterior. Necunoscuta este eliminată din
toate celelalte ecuaţii, printr-un procedeu asemănător celui de la metoda lui Gauss.
Matricea sistemului va purta la finele fiecărui pas un indice superior egal cu numărul
pasului care urmează. În cadrul fiecărui pas toate elementele matricei sistemului îşi indexează
indicele superior cu o unitate.
Relaţiile de recurenţă ce permit trecerea de la matricea la matricea pot fi
scrise mai uşor dacă se evidenţiază, pe elementele matricei operaţiile care se execută,
aşa cum este prezentat mai jos:
( k 1) C o lo a n ele
A :
k -1 j
ă
Linia (k-1) r ămâne
k -1 a (k k1 1, k) 1 a (k k1 1, )j
nemodificat
L in i il e
i a i( ,kk 11) a i( ,kj 1 )
P r im e l e ( k -2 ) C o lo a n e
coloa n e răm ân m o d i f ic a t e
n e m o d i fi c a t e C o l o a n a ( k - 1 ) v a a v e a z e r o u r i în
( k 1)
a fa r a e l e m e n t u lu i a k 1 , k 1
- ;
71
- ,
unde iar .
- ;
- ,
unde .
Implementarea în Delphi:
type mnr=array of array of extended;
72
if h<>k then {se aduce ecuatia ce contine pivotul pe primul
loc}
begin
for m:=k to n do
begin
p:=a[h,m];
a[h,m]:=a[k,m];
a[k,m]:=p;
end;
{se schimba si termenii liberi cu locul}
p:=b[h];
b[h]:=b[k];
b[k]:=p;
end;
c:=a[k,k];
for i:=k-1 downto 0 do {se calculeaza termenii la etapa k
pentru i<k}
begin
for j:=k+1 to n do
a[i,j]:=-(a[i,k]*a[k,j]-a[k,k]*a[i,j])/c;
b[i]:=-(a[i,k]*b[k]-a[k,k]*b[i])/c;
a[i,k]:=0;
end; {k}
for i:=k+1 to n do {se calculeaza termenii la etapa k pentru
i>k}
begin
for j:=k+1 to n do
a[i,j]:=(c*a[i,j]-a[i,k]*a[k,j])/c;
b[i]:=(c*b[i]-a[i,k]*b[k])/c;
a[i,k]:=0; {se anuleaza termenii de sub diagonala
principala}
end;
for j:=k to n do a[k,j]:=a[k,j]/c;
b[k]:=b[k]/c;
end;
for i:=0 to n do {se calculeaza necunoscutele}
x[i]:=b[i];
end;
Metoda Gauss-Jordan permite şi calculul matricei inverse dacă se procedează în felul
următor:
- se formează o matrice de dimensiuni compusă din:
73
pe ultima coloană vectorul ;
- se aplică procedeul de rezolvare dat de metoda Gauss-Jordan numai că operaţiile
descrise pentru matricea sistemului se extind asupra întregii matrice de dimensiuni
Se efectuează aceste operaţii până când în locul matricei apare matricea diagonală.
Ultima operaţie care se efectuează asupra acestei matrice extinse este aceea de a împărţi
fiecare linie la elementul situat pe diagonala principală a matricei de pe primele coloane. Ca
urmare, în locul matricei diagonale cu elemente oarecare ce se află pe primele coloane, vom
obţine matricea unitate . Pe următoarele coloane vom obţine matricea inversă iar pe
74
x1 b 1 a1, 2 x 2 .. . a1, n x n a1,1
x2 b2 a 2 ,1 x1 a 2 , 3 x3 . .. a 2,n x n a 2 , 2
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
xn bn a n ,1 x1 a n, 2 x2 .. . a n , n 1 x n 1 a
.
Pentru uşurinţa scrierii se trece la forma matriceală, notând:
a1, 2 a1,n b1
0
a1,1 a1,1 x1 a1,1
a 2,1 a 2,n b2
A a
0 ; x x2 ; u .
2, 2 a 2, 2 a 2 , 2
x
an ,1 an, 2 n bn
0 a
a n ,n a n ,n n ,n
Sistemul se scrie sub forma: x Ax u
Metoda Jacobi constă în faptul că pune acest sistem într-o formă ce permite calculul iterativ:
x ( k 1) Ax ( k ) u ,
pornind de la o aproximaţie iniţială a soluţiei sistemului.
În practică, este mai utilă scrierea relaţiei de recurenţă referitoare la componente:
1
.
n
xi( k 1) bi
a i ,i
a i, j x (j k ) , i 1, n, k 0,1,....
j 1
j i
Pentru stabilirea condiţiilor în care algoritmul metodei Jacobi converge, se dau valori lui în
relaţia de calcul iterativ:
x (1) Ax ( 0 ) u
x ( 2 ) Ax (1) u A 2 x ( 0 ) ( A I )u
.
.........................
x ( k ) A k x ( 0 ) ( A k 1 ... A I )u
Se poate demonstra că dacă toate valorile proprii ale matricei A sunt mai mici decât unitatea,
în modul, seria matriceală este convergentă şi are suma:
I A A 2 ... A k ... ( I A) 1 .
Condiţia de convergenţă a metodei Jacobi cere ca:
lim Ak 0 .
k
x 0 ( I A) 1 u
Implementarea în Delphi:
type mnr=array of array of extended;
procedure Jacobi(A:mnr;b:array of
extended;max_er:extended;max_it:integer;var x0:array of
extended);
var S,max:extended;
n,i,j,k:integer;
cc:boolean;
x:mnr;
err:array of extended;
begin {programul principal}
n:=high(b);
SetLength(x,n+1,20);
for i:=0 to n do
for j:=0 to 19 do x[i,j]:=0;
SetLength(err,n+1);
for i:=0 to n do x0[i]:=0;
cc:=true;
for i:=0 to n do
begin
S:=0;
for j:=0 to n do
if i<>j then S:=S+abs(A[i,j]);
if S>abs(A[i,i]) then cc:=false;
end;
if not(cc) then
begin
Application.MessageBox('Sistemul nu indeplineste conditia de
convergenta!', 'Eroare');
Exit;
end;
k:=0;
for i:=0 to n do
x[i,k]:=x0[i];
while (k<(max_it+1)) do
begin
k:=k+1;
max:=0;
76
for i:=0 to n do
begin
S:=0;
for j:=0 to n do
if i<>j then S:=S+A[i,j]*x[j,k-1];
x[i,k]:=(b[i]-S)/a[i,i];
err[i]:=abs(x[i,k]-x[i,k-1]);
if err[i]>max then max:=err[i];
end;
for i:=0 to n do x0[i]:=x[i,k];
if max<max_er then Exit;
end;
end;
Metoda Gauss-Seidel
Această metodă de rezolvare este asemănătoare cu metoda iterativă Jacobi, ea putând fi
aplicată doar sistemelor care îndeplinesc condiţia de convergenţă dată de relaţia :
n ai ,
j
1, i 1, n
j 1
j i
a i ,i .
din ecuaţia :
1 n
xi bi
a i ,i
a i, j x j ; ai ,i 0, i 1, n
j 1
j i
77
În contrast cu metoda Jacobi, care nu foloseşte în calculul lui decât componente ale
Implementarea în Delphi:
type mnr=array of array of extended;
78
if not(cc) then
begin
Application.MessageBox('Sistemul nu indeplineste conditia de
convergenta!', 'Eroare');
Exit;
end;
k:=0;
for i:=0 to n do
x[i,k]:=x0[i];
while (k<(max_it+1)) do
begin
k:=k+1;
max:=0;
for i:=0 to n do
begin
S:=0;
for j:=0 to n do
begin
if i<j then S:=S+A[i,j]*x[j,k-1];
if i>j then S:=S+A[i,j]*x[j,k];
end;
x[i,k]:=(b[i]-S)/a[i,i];
err[i]:=abs(x[i,k]-x[i,k-1]);
if err[i]>max then max:=err[i];
end;
for i:=0 to n do x0[i]:=x[i,k];
if max<max_er then Exit;
end;
end;
79
Descrierea generală a metodelor de rezolvare analitică şi numerică a ecuaţiilor diferenţiale
ordinare de ordinul unu. Problema Cauchy
După cum se cunoaşte din algebră, de obicei soluţiile ecuaţiilor se exprimă prin valori
numerice concrete. Soluţia ecuaţiei diferenţiale este o funcţie.
O ecuaţie diferenţială este o ecuaţie în care necunoscuta este o funcţie şi în care intervine
funcţia necunoscută, derivatele ei de diverse ordine şi variabilele independente de care
depind aceste funcţii.
În cazul în care funcţia necunoscută depinde de o singură variabilă independentă, ecuaţia se
numeşte ecuaţie diferenţială ordinară, iar în situaţia în care funcţia necunoscută depinde de
mai multe variabile independente, ecuaţia se numeşte ecuaţie cu derivate parţiale.
Ordinul unei ecuaţii diferenţiale este cel mai înalt ordin a derivatei funcţiei necunoscute ce
figurează în ecuaţia respectivă.
Expresia generală a unei ecuaţii diferenţiale, sub formă implicită este:
sau
sau
Graficul unei soluţii a ecuaţi ei diferenţiale se mai numeşte şi curbă integrală a acestei
ecuaţii diferenţiale.
Ecuaţiile diferenţiale ordinare sunt acele ecuaţii diferenţiale în care necunoscuta este o
funcţie de o singură variabilă independentă. Ecuaţiile cu derivate parţiale sunt acele ecuaţii în
care necunoscuta este o funcţie de două sau mai multe variabile independente.
Prin ecuaţia diferenţială de ordinul întâi înţelegem o ecuaţie de forma:
,
derivabilă pe şi , .
80
Prin soluţie generală a unei ecuaţii diferenţiale de ordinul întâi înţelegem o familie de
Cea mai simplă ecuaţie diferenţială se întâlneşte la calculul integral şi constă în aflarea
primitivei unei funcţii. Fiind dată funcţia continuă , dacă notăm cu primitiva
unde este o primitivă a lui pe . Constatăm că soluţia căutată nu este unică, ci există o
arbitrară , se numeşte soluţia generală iar fiecare soluţie particulară se obţine din soluţia
polinoame, dată fiind importanţa lor teoretică fundamentală), şi care aproximează “suficient
de bine” soluţia exactă ;
81
b) Determinarea valorilor aproximative ale soluţiei exacte , într-o mulţime de
puncte date .
Teoremă (de existenţă şi unicitatea soluţiei): dacă funcţia este continuă într-un
încât . Mai mult ca atât, dacă este continuă şi derivata parţială după , atunci
82
Dacă integrăm partea stângă şi dreaptă a egalităţii de mai sus, atunci obţinem:
iniţiale: , atunci .
Metoda lui Euler propune aproximarea soluţiei printr-o linie poligonală în care fiecare
segment este coliniar cu direcţia câmpului definită de extremitatea sa stângă. Astfel se
consideră un punct care foloseşte un pas constant . Conform
83
Erorile de trunchiere şi de rotunjire se propagă de la un pas la altul.
. Deci:
84
Soluţia particulară, reeşind din condiţiile iniţiale date, este:
Implementarea în Delphi:
type fxy = function(x,y:extended):extended;
function f1(x,y:extended):extended;
begin
f1:=x*x+1;
end;
85
Metoda Runge-Kutta. Formulele de lucru. Implementare algoritmilor Runge-Kutta în
subprograme de rezolvare numerică a ecuaţiilor diferenţiale ordinare de ordinul unu.
Metodele de tip Euler prezentate sunt explicite şi nu necesită valori de start. Faptul că au un
ordin scăzut al erorii de consistenţă conduce la o aplicabilitate limitată. In scopul obţinerii
unor metode de ordin ridicat trebuie renunţat fie la proprietatea de a fi unipas şi pastrată
liniaritatea, fie viceversa. Metodele de tip Runge-Kutta sunt neliniare şi conservă
caracteristicile metodelor unipas, având un ordin ridicat. Ele au trei proprietăţi principale:
a) Sunt metode directe, adică pentru determinarea aproximării soluţiei la pasul avem
b) Sunt identice cu seriile Taylor până la termenii , unde este pasul curent iar este
diferit pentru metode diferite din această familie şi defineşte ordinul metodei.
c) În procesul de calcul nu necesită decât evaluarea funcţiei din memebrul drept pentru
diverse valori şi . Nu este nevoie de calculul derivatelor acesteia.
Pentru rezolvarea ecuaţiilor diferenţiale ordinare de ordinul întâi cu condiţii iniţiale trebuie
rezolvată problema Cauchy:
).
86
în care au valorile:
iar .
Înlocuind aceste valori ale coeficienţilor şi ponderilor în relaţia se obţine formula genrală
Aceasta este cea mai utilizată dintre formulele metodei Runge Kutta, fiind cunoscută sub
numele de metoda Runge-Kutta.
Implementarea în Delphi:
procedure RungeKuttaOrdin1(x0,y0,eps:extended; f:fxy;
x:extended; var y:extended);
var h,k1,k2,k3,k4,yc,yp,xx0,yy0:extended;
m,i:integer;
begin
h:=x-x0;
m:=1;
k1:=f(x0,y0);
k2:=f(x0+h/2,y0+h/2*k1);
k3:=f(x0+h/2,y0+h/2*k2);
k4:=f(x0+h,y0+h*k3);
yc:=y0+h/6*(k1+2*k2+2*k3+k4);
repeat
yp:=yc;
h:=h/2;
m:=m*2;
xx0:=x0;
yy0:=y0;
for i:=1 to m do
begin
k1:=f(xx0,yy0);
k2:=f(xx0+h/2,yy0+h/2*k1);
k3:=f(xx0+h/2,yy0+h/2*k2);
k4:=f(xx0+h,yy0+h*k3);
yc:=yy0+h/6*(k1+2*k2+2*k3+k4);
87
xx0:=xx0+h;
yy0:=yc;
end;
until abs(yc-yp)<=eps;
y:=yc;
end;
88
89