Sunteți pe pagina 1din 89

METODE NUMERICE DE CALCUL

Tema 1. Erori de calcul numeric.....................................................................................................(2 ore)


Tema 2. Calcularea numerică a şirurilor şi seriilor.........................................................................(2 ore)
Tema 3. Rezolvarea numerică a ecuaţiilor neliniare şi transcendente...........................................(4 ore)
Tema 4. Aproximarea funcţiilor de o variabilă...............................................................................(4 ore)
Tema 5. Derivarea numerică a funcţiilor........................................................................................(2 ore)
Tema 6. Integrarea numerică a funcţiilor......................................................................................(4 ore)
Tema 7. Calcularea numerică a determinanţilor............................................................................(2 ore)
Tema 8. Rezolvarea sistemelor de ecuaţii liniare...........................................................................(6 ore)
Tema 9. Rezolvarea numerică a ecuaţiilor diferenţiale..................................................................(6 ore)
Tema 10. Rezolvarea numerică a ecuaţiilor diferenţiale în derivate parţiale.................................(4 ore)
Tema 11. Metode de optimizare...................................................................................................(4 ore)
Tema 12. Exemple de modelare matematică şi rezolvare numerică a problemelor.......................(4 ore)

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

transcendente: numerele ş.a. ). Evident, rezultatul oricăror calcule depinde şi de


precizia datelor introduse iniţial. Ca erori inerente pot fi considerate şi erorile de conversie
făcute la trecerea în baza 2 a unor numere care se introduc în memoria calculatoarelor
numerice actuale. Spre exemplu, numărul 0.1 reprezentat printr-un număr finit în baza 10,
devine o fracţie zecimală periodică în baza 2 ( ).

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ă),

eroarea absolută se defineşte ca diferenţa dintre valoarea exactă şi cea aproximativă:

. Raportu se numeşte eroare relativă, notată deseori cu εx: .

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ă .

În acest fel, marginea erorii relative este:


.

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.

Propagarea erorilor în calcule.


 Propagarea erorilor la înmulţire.
Vom considera două numere x şi y, introduse cu erorile e x şi ey : şi

. Presupunem că se efectuează produsul numerelor:

unde s-a neglijat produsul considerat ca având un ordin de mărime suficient de mic.

Rezultă eroarea la înmulţire .

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ă

numere: , iar ca margine a erorii: .

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

Tylor pentru . rezultă că eroarea relativă la împărţire, datorită erorilor de

reprezentare în calculator ( şi ), este :

adică este egală cu diferenţa erorilor relative introduse iniţial în valorile numărătorului şi

numitorului. La acestea se adaugă eroarea de rotunjire la prezentarea raportului , pe care

o vom nota cu , astfel încât eroarea relativă totală la împărţirea a două numere x şi y este:

 Propagarea erorilor la adunare.


În acest caz, suma a două numere este , astfel încât eroarea relativă

la sumare este :

adică o sumă ponderată a erorilor introduse la reprezentarea în calculator a cantităţii


sumate. Şi în acest caz se introduce o eroare suplimentară la reprezentarea sumei ,a

cărei valoare relativă o vom nota cu . Ca urmare, eroarea relativă la sumare, , va fi :

Exemplu: Scrieţi eroarea totală la calculul expresiei . Rezultă :

cu marginea :

Evaluarea erorii în calcularea expresiilor matematice.


Ca rcomandare generală, în calculul numeric trebuie studiată şi propagarea erorilor. În
anumite cazuri, acumularea erorilor poate conduce la rezultate complet eronate. Pentru a
ilustra această posibilitate, să considerăm calculul integralei :

4
O modalitate de calcul o reprezintă utilizarea unei relaţii de recurenţă (recursie):

plecând de la valoarea . Funcţia recursivă ce implementează această metodă în

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ă,

la calculul eroarea este :

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 :

Function Metoda2(n : integer) : single;


begin
if (n = 50) then
Metoda2 := 0
else
Metoda2 := 1/n * (1 - Metoda2(n + 1));
end;

Tabelul cu rezultatele calculelor pentru n = 14 sunt:


Compilatorul Tipul de date – metoda 1 – metoda 2
Borland Delphi 7 Single: -797,597290039063 0,066947698593139
6
Double: 0,062731080423873 0,066947702575615
2 7
Extended: 0,062732167391139 0,066947702575615

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:

Tema 2. Calcularea numerică a şirurilor şi seriilor (2 ore)


a) Calcularea numerică a sumelor şi produselor. Calcularea numerică a expresiilor
matematice cu sume şi produse imbricate.
b) Calcularea numerică a seriilor Taylor.
c) Exemple de calculare a unor funcţii speciale.
d) Exemple de calculare a funcţiilor trigonometrice, exponenţiale, logaritmice.

Calcularea numerică a sumelor şi produselor. Calcularea numerică a expresiilor matematice


cu sume şi produse imbricate.
Fie şirul de numere reale: . Cu ajutorul lor putem să formăm şirurile:

...................................

...................................
Dacă şirul este convergent şi are limita s, atunci putem scrie :

. Se obişnuieşte a scrie această egalitate astfel:

. Partea dreaptă a egalităţii respective se numeşte serie şi

operaţia de adunare reprezentată de o infinitate de ori capătă astfel un sens. Rezultatul


acestei operaţii care este numărul s se numeşte suma seriei. O serie se notează astfel:

6
Numerele se numesc termenii seriei iar se numesc şirul

sumelor parţiale ale seriei

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

ca şirul format cu termenii seriei să fie convergent către 0.


Exemplu: Numărul e este definit ca sumă a seriei:

. Fie că limita şirului este . Să considerăm mai întâi de toate

numărul e ca suma seriei care este convergentă deoarece, după

criteriul raportului,

Dacă notăm şi rezultă că .

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 ,

cu . Pentru avem , deci rezultă că . Pentru a calcula

valoarea lui e cu 15 zecimale exacte, trebuie să calculăm suma a cel puţin 17 termeni: :

. În Delphi 7 funcţiile sunt:

function factorial(n: integer): integer;


begin
if (n = 1) then
factorial := 1
else
factorial := n * factorial(n - 1);
end;
7
function fe(n: integer): extended;
begin
if (n = 0) then
fe := 1
else
begin
fe := 1/factorial(n) + fe(n - 1);
end;
end;
În final trebuie să obţinem .

Calcularea numerică a seriilor Taylor.


În matematică, o serie Taylor este o reprezentare a unei funcții ca o sumă infinită de termeni
calculați din valorile derivatelor acelei funcții într-un punct şi poate fi privită ca limită a
polinoamelor Taylor. În matematică se demonstrează că orice funcţie continuă poate fi

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

Polinomul lui Taylor de grad pentru un punct este:

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

şi 0! Sunt amândouă prin definiţie 1. Cu cât este mai aproape de cu atât

este mai aproape de , adică

Restul în formula lui Lagrange are forma:

8
= , unde este cuprins între şi ;

Şi restul în formula lui Cauchy are forma:

= , unde este cuprins între şi ;

Pentru cazul particular când se obţine formula lui MacLaurin:

adică:

Exemple de calculare a unor funcţii speciale.

Problema 1: Să se dezvolte în serie Taylor funcţia , pentru şi .

Creaţi subprogramul respectiv în Delphi 7.


Rezolvare:

Conform formulei lui MacLaurin

efectuăm calculele următoare :

,
1)

,
2)
,
3)
,
4)
,
5)
......................................................................

9
Deci

Reprezentarea funcţiei ca sumă este: , unde

Deoarece în această problemă se cere de calculat o sumă cu un număr infinit de termeni, se


introduce noţiunea de eroare (sau precizie), în baza căreia avem posibilitatea de a limita
numărul de termeni care se calculează în sumă. De regulă în problemele de acest tip termenii
se sumează pînă când valoarea curentă (de obicei notată cu vc) sau diferenţa absolută dintre
valoarea curentă şi cea precedentă (notat în Delphi ) devine mai mică decât precizia

ε.

Subprogramul creat în Delphi 7 este:


Procedure Polinom1(x, eps: extended; var rez: extended);
var vc, vp, p: extended;
i, k: integer;
begin
vc:=1; k:=1;
repeat
p:=x;
vp:=vc;
for i:=1 to k do p:=p*x;
vc:=vc+p;
k:=k+1;
until abs(vc-vp) < eps;
rez:=vc;
end;

Problema 2: Să se dezvolte în serie Taylor funcţia pentru şi . Creaţi

subprogramul respectiv în Delphi 7.


Rezolvare:

Conform formulei lui MacLaurin

efectuăm calculele următoare :

,
1)
,
2)
...................................

10
n) ,

...................................

Şi deci . Fromula de dezvoltare în serie Maclaurin este:

Subprogramul creat în Delphi 7 este:


function ExpLaPutereX(x, eps: extended): extended;
var s, p: extended;
i, j, f: integer;
begin
s:=1; i:=1;
repeat
p:=1; f:=1;
for j:=1 to i do
begin
p:=p*x; f:=f*j;
end;
s:=s+p/f;
i:=i+1;
until abs(p/f)<= eps;
ExpLaPutereX:=s;
end;
Problema 3: să se dezvolte în serie Taylor funcţia pentru şi .

Creaţi subprogramul respectiv în Delphi 7.


Rezolvare:

Conform formulei lui MacLaurin

efectuăm calculele următoare :

,
1)
,
2)
,
3)
,
4)
,
5)
......................................................................

11
Din calculele de mai sus observăm că derivatele funcţiei sunt şi

, iar pentru obţinem şi

. Deci, seria Tayor asociată este . Sub

formă de sumă putem scrie:

Subprogramul în Delphi 7 este:


Function SinMetoda1(x,eps:extended):extended;
var s, p, f, TC: extended;
j, i, k: integer;
begin
s:=x;
i:=1;
repeat
P:=1;
for j:=1 to (2*i+1) do
P:=P*x;
f:=1;
for k:=1 to(2*i+1) do
f:=f*k;
if odd(i) then TC:=-P/f
else TC:=P/f;
s:=s+TC;
i:=i+1;
until (abs(TC)<=eps);
SinMetoda1:=s;
end;

Dacă vom reprezenta grafic funcţia şi şirul sumelor parţiale ale seriei

, atunci vom observa că seriile taylor se apropie din ce în ce

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:

se observă că pentru şi dacă se calculează atunci

pentru ultima valoare a lui se obţine raportul , ceea ce reprezintă

î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

precedent (notat TP). Dacă efectuăm raportul , atunci obţinem:

Deci, putem scrie:

Subprogramul în Delphi 7 este:


function SinMetoda2(x:extended;eps:extended):extended;
var TC, TP, s:extended;
n:integer;
begin
TP:=x;
s:=x;
n:=1;
repeat
TC:=-TP*sqr(x)/2/n/(2*n+1);
s:=s+TC;
TP:=TC;
n:=n+1;
until abs(TC)<=eps;
SinMetoda2:=s;
end;

Problema 4: să se dezvolte în serie Taylor funcţia pentru şi .

Creaţi subprogramul respectiv în Delphi 7.


Rezolvare:

Conform formulei lui MacLaurin

efectuăm calculele următoare :

,
1)
,
2)

14
,
3)
,
4)
,
5)
......................................................................

Deci, seria Tayor asociată este . Reprezentarea funcţiei

ca sumă este:

Subprogramul în Delphi 7 este:


Function SinMetoda1(x,eps:extended):extended;
var s, p, f, TC: extended;
j, i, k: integer;
begin
s:=x; i:=1;
repeat
P:=1;
for j:=1 to (2*i+1) do P:=P*x;
f:=1;
for k:=1 to(2*i+1) do f:=f*k;
if odd(i) then TC:=-P/f else TC:=P/f;
s:=s+TC;
i:=i+1;
until (abs(TC)<=eps);
SinMetoda1:=s;
end;

Problema 5: să se dezvolte în serie MacLaurin funcţia , unde

Creaţi subprogramul respectiv în Delphi 7.


Rezolvare:
,
1)

,
2)
,
3)

15
,
4)
,
5)
......................................................................
Deci

. Fromula de dezvoltare în serie Maclaurin este: , unde

Subprogramul creat în Delphi 7 este:


function LogNatural(x, eps: extended): extended;
var s, sf, v, p: extended;
i, j: integer;
begin
s:=0; i:=1;
repeat
p:=1; sf:=s;
for j:=1 to i do p:=p*x;
if odd(i) then v := p/i else v := -p/i;
s:=s+v;
i:=i+1;
until abs(s-sf)<= eps;
LogNatural:=s;
end;
Exemple de calculare a funcţiilor trigonometrice, exponenţiale, logaritmice.
Dezvoltaţi în serie Taylor următoarele funcţii reieşind din exemplele de mai sus şi scrieţi
subprogramale pentru fiecare exemplu în Delphi:

;
a)

;
b)

;
c)
;
d)
;
e)
Rezolvare:

a) Reieşind din exemplul , înlocuim pe cu în polinomul de dezvoltare în

serie Taylor şi obţinem:


16
.

Reprezentarea funcţiei ca sumă este: , unde .

b) Reieşind din exemplul , înlocuim pe cu în polinomul de dezvoltare în

serie Taylor şi obţinem:

Reprezentarea funcţiei ca sumă este: , unde .

c) Reieşind din exemplul , înlocuim pe cu în polinomul de dezvoltare în

serie Taylor şi obţinem:

d) Reieşind din exemplul , şi înmulţind fiecare termen din

această sumă cu , obţinem:

e) Pentru a dezvolta în serie Taylor funcţia , putem utiliza formula

. Reieşind dina această formulă deducem că:

Respectiv, dacă înlocuim pe cu în polinomul de dezvoltare în serie Taylor:

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 iraţionale de tipul:

 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

continuă, strict monotonă, adică să aibă acelaşi semn pe intervalul şi funcţia să

prezinte schimbarea de semn: . Aceste condiţii pentru determinarea soluţiilor

sunt echivalente cu următoarele ipoteze:


 este o funcţie continuă şi derivabilă;

18
 ;

 are numai o singură soluţie pe .

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;

Metode analitice, grafice şi numerice de localizare a soluţiilor ecuaţiilor neliniare.


Izolarea soluţiilor prezintă o importanţă practică deosebită, deoarece nu ne interesează
găsirea tuturor soluţiilor, ci numai a acelor soluţii care prezintă interes pentru problema
tehnică respectivă.
Fie ecuaţia , unde este o funcţie continuă pe intervalul al axei

reale. A izola cele rădăcini ale ecuaţiei înseamnă a pune în evidenţă puncte

consecutive , unde astfel încât în

fiecare interval să existe cel mult o rădăcină a ecuaţiei.

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 ,

unde a şi b reprezintă marginile rădăcinilor, se divide într-un număr n de subintervale egale,

de lungime h, unde , după care sunt calculate valorile funcţiei în punctele

Dacă există un număr , pentru care

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ă
,

atunci în intervalul există cel mult un număr par de rădăcini, adică

dacă acest interval este suficient de mic, atunci pe acest interval funcţia are zero soluţii.

Exemplu: Să se izoleze rădăcinile funcţiei

în intervalul .

Rezolvare. Se tabelează funcţai în 20 de puncte, cu pasul . Programul

Delphi ce ne poate ajuta la tabelarea funcţiei este:


function f(x: extended): extended;
begin
f:=-0.02268*power(x, 3)+0.3108724*sqr(x)-0.6668459*x+0.209308;
end;
procedure TForm1.Button1Click(Sender: TObject);
var a, b, k: integer; x, h: extended;
begin
a:=-5; b:=15; h:=(b-a)/20;
for k:=0 to 20 do
begin
x:=a+k*h;
Memo1.Lines.Add(FloatToStr(x));
Memo2.Lines.Add(FloatToStr(f(x)));
end;
end;

Rezultatele sunt prezentate în tabelul de mai jos:


x f(x) x f(x)
- 14,1503475 6 2,500759
5
- 9,30217 7 2,9948943
4
- 5,6200573 8 3,1582144
3
- 2,9679294 9 2,8546393
2
20
- 1,2097063 10 1,948089
1
0 0,209308 11 0,3024835
1 -0,1693455 12 -2,2182572
2 -0,0623342 13 -5,7502131
3 0,3942619 14 -10,4294642
4 1,0643628 15 -16,3920905
5 1,8118885
Se observă că funcţia are toate cele trei rădăcini reale situate în intervalele:

 Metoda grafică. Această metodă presupune construirea graficului funcţiei ce reprezintă


partea stângă a ecuaţiei neliniare. Punctele de intersecţie a acestui grafic cu axa de
coordonate reprezintă soluţiile ecuaţiei neliniare, pe care din grafic le putem determina
foarte aproximativ, însă putem determina foarte exact care sunt intervalele concrete pe care
este situată o soluţie şi numai una singură.
Exemplu: Să se izoleze rădăcinile funcţiei .

Rezolvare. Dacă desenăm graficul fucţiei , atunci obţinem parabola:

Se observă că funcţia are o singură rădăcină reală situată în intervalul: .

21
 Metoda analitică. Metoda analitică de determinare (localizare) a soluţiilor unei funcţii

, presupune transformarea acestie funcţii astfel: .

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 .

Exemplu: Aflaţi soluţiile ecuaţiei .

Rezolvare. Dacă egalăm această ecuaţie neliniară cu zero, atunci obţinem şi


se observă foarte uşor că transformarea se poate de realizat doar prin trecerea unui termen
din dreapta egalităţii în stînga: . Conform acestor transformări am obţinut că

şi . Reprezentarea grafică a funcţiilor şi este simplă:

După analiza graficelor funcţiilor şi se vede că ele se intersecteză numai odată şi

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 .

Pentru aplicarea acestei metode se verifică dacă:


 este o funcţie continuă şi derivabilă;

 .

Această metodă se bazează pe următorul algoritm:


1) se calculează valoarea funcţiei la capetele intervalului şi într-un punct situat la

mijlocul intervalului: ;

2) se verifică semnele funcţiei în cele trei puncte ale intervalului şi subintervalul în

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:

f(a) f(c) f(b) Rădăcina ξ (xi)


- + +
- - +
+ + -
+ - -

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: .

Exemplu: Să se afle rădăcina ecuaţiei algebrice: , cu o eroare mai

mică de ştiind că se află în intervalul .

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;

procedure Metoda_Dihotomiei(a, b, eps: extended; var rez:


extended);
var c: extended;
begin
repeat
c:=(a+b)/2;
if F(a)*F(c)<0 then b:=c
else a:=c;

24
until abs(b-a)<eps;
rez:=(a+b)/2;
end;

Metoda coardelor. Descrierea algoritmului şi implementarea lui într-un subprogram.


Fie o funcţie continuă şi derivabilă având pe intervalul o singură rădăcină

. Această metodă se bazează pe următorul algoritm:

1) deoarece , soluţia în prima aproximare se paote egala cu abscisa

punctului de intersecţie a coardei (secantei) care trece prin punctele şi

cu axa (soluţia în prima aproximare este punctul ).

2) se verifică semnele funcţiei în cele trei puncte ale intervalului şi subintervalul în

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

cu axa (soluţia în a doua aproximare este punctul ).

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 Δ :

Respectiv, dacă atunci noul subinterval va cuprinde soluţia ecuaţiei,

în caz contrar soluţia se află în subinterval . Procedeul de aproximare se repetă în


acelaşi mod pentru noul subinterval.

Exemplu: Să se afle rădăcina ecuaţiei algebrice: , cu o eroare mai

mică de ştiind că se află în intervalul .

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;

Metoda Newton. Descrierea algoritmului şi implementarea lui într-un subprogram.


Fie o funcţie continuă şi derivabilă pe intervalul , care satisface condiţia

şi are o singură rădăcină pe intervalul .

Dacă se dezvoltă în serie Taylor funcţia în jurul punctului se obţine:

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 :

Această funcţie reprezintă tangenta la graficul funcţiei în punctul respectiv în

punctul :

Punând condiţia se obţine intersecţia cu axa şi rezultă o soluţie aproximativă de

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

intervalului . În exemplul nostru se observă că tangenta dusă din punctul la

funcţia se intersectează cu axa în punctul , care este cuprins în intervalului .

Pe când tangenta dusă din punctul la funcţia intersectează axa în punctul

, 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ă

atunci punctul iniţial va fi limita stângă, adică .

Formula de recurenţă a metodei tangentelor utilizată este . De asemenea

putem modifica această formulă înlocuind derivata funcţiei în punctul . După cum se ştie:

Din (1.4) rezultă că pentru calcularea numerică a derivatei în punctul trebuie să

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: .

Exemplu: Să se afle rădăcina ecuaţiei algebrice: , cu o eroare mai

mică de ştiind că se află în intervalul .

Rezolvare. Dacă notăm , atunci derivata funcţiei este:

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;

3) Funcţia denumită care aplică metoda lui Newton asupra funcţiei

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;

function Derivata(x: extended): extended;


begin
Derivata:=1/x+6*x-4;
end;
function Metoda_Newton(a, b, eps:extended): extended;
var xc, xp, x: extended;
begin
if (Functie(a)*Derivata(a)>0) then x:=a else x:=b;
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;

29
Dacă iniţial se cunoaşte care limită a intervalului trebuie luată, adică se satisface una

din condiţiile sau , atunci funcţia principală se modifică

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.

Metoda iterativă. Descrierea algoritmului şi implementarea lui într-un subprogram.


Fie o funcţie continuă şi derivabilă pe intervalul . Deoarece ,

presupunem că ecuaţia are o singură rădăcină . O rădăcină aproximativă a

ecuaţiei se poate obţine dacă aceasta se poate scrie ca o relaţie de recurenţă

echivalentă cu . Variabila de obicei se extrage din ecuaţia funcţiei , astfel

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ă:

Dezavantajul acestei metode este că ea nu conduce întotdeauna la relaţii iterative


convergente. Relaţia de recurenţă a metodei se scrie:

Respectiv, dacă iniţial este valoarea , atunci:

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ă).

Exemplu: Să se afle rădăcina ecuaţiei algebrice: , cu o eroare mai mică

de ştiind că se află în intervalul .

Rezolvare. În cazul acestei metode trebuie să indicăm valoarea lui . Deci, pentru simplitate

putem scrie . Implementarea în Delphi 7:

function Functie(x: extended): extended;


begin
Functie:= x-sin(x)-0.25;
end;
function Metoda_Iterativa(x, eps: extended): extended;
var dx: extended;
begin
repeat
dx:=Functie(x);
x:=x-dx;
if (x<>0) then dx:=dx/x;
until abs(dx)<eps;
Metoda_Iterativa:=x; end;

Tema 4. Aproximarea funcţiilor de o variabilă (4 ore)


a) Aproximarea prin interpolare. Interpolarea liniară şi parabolică.
b) Interpolarea polinomială globală. Convergenţa interpolării polinomiale globale.
c) Forma Newton şi Lagrange a polinoamelor de interpolare globală. Descrierea algoritmului
şi implementarea lui într-un subprogram.
d) Interpolarea cu funcţii spline de ordinul unu, doi şi trei. Descrierea algoritmului şi
implementarea lui într-un subprogram.
e) Interpolarea cu funcţii trigonometrice. Convergenţa interpolării trigonometrice.
Descrierea algoritmului şi implementarea lui într-un subprogram.
f) Aproximare funcţiilor în sensul celor mai mici pătrate. Regresia liniară şi parabolică.
Descrierea algoritmului şi implementarea lui într-un subprogram.
31
Problema aproximării unei funcţii de o variabilă se poate pune în următoarele situaţii:
 funcţia este continuă, dar are o formă complicată, dificil de manipulat în calcule (spre
exemplu pentru operaţii de derivare, integrare, etc.);
 funcţia nu este complet cunoscută, fiind date numai valorile ei pe o mulţime discretă de
puncte.

Polinomul de interpolare Lagrange


Considerăm că funcţia f este cunoscută pe baza unui ansamblu de valori într-o reţea de
noduri x 0 , x 1 ,..., x n nu neapărat echidistante:
y i  f ( x i ), i  0, n .
Se pune problema determinării unui polinom de grad n, de forma:

L n ( x )  y 0  0 ( x )  y11 ( x )  ...  y n  n ( x )

care să coincidă cu funcţia f în nodurile de interpolare:

L n ( x i )  f ( x i )  y i , i  0, n .

Funcţiile  0 , 1 ,...,  n sunt polinoame de grad n ce urmează a fi determinate,


y 0 , y1 ,..., y n fiind valorile funcţiei în punctele x 0 , x 1 ,..., x n .

Aceste relaţii pot fi puse sub forma:

n
 y k  k (x i )  y i , i  0, n .
k 0

Acest ansamblu de relaţii poate fi satisfăcut dacă:


0, i  k
 k (x i )  
1, i  k .

Polinomul  k se anulează în toate punctele x i , i  k , deci este de forma:


n
 k ( x )  a k  (x  x i ), k  0, n
i0
ik
.

Determinarea coeficientului a k se poate face din condiţia

 k (x k )  1

rezultând pentru  k o expresie de forma:


n
x  xi
k (x)  
x
i 0 k
ik
 xi
, k  0, n
.

În aceste condiţii, polinomul Lagrange capătă forma:


32
n n
x  xi
 yk  x
L n (x ) 
k 0 i0
ik
k  xi .

Exemplu: Să se implementeze un subprogram în Delphi 7 care foloseşte polinomul de


interpolare Lagrange.
Rezolvare. Forma principală în Delphi 7:

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;

Polinoame de interpolare Newton cu pas constant

Dacă nodurile de interpolare x 0 , x 1 ,..., x 3 sunt echidistante, se pot construi polinoame de


interpolare Newton, de speţa I şi a II-a, folosind diferenţele finite.

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 .

Pentru aceste polinoamele se folosesc diferenţele finite la dreapta definite de relaţiile :

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
j0

Aceste diferenţe pot fi uşor determinate dacă se construişte următorul tabel diagonal:

Diferenţele finite la stânga sunt date de relaţiile:


y k  y k  y k 1
 2 y k  (y k )  y k  2 y k 1  y k 2
............
n
n yk   (1) j C nj y k  j
j0

Tabelul corespunzător pentru aceste diferenţe este :

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 )

Determinarea coeficienţilor c 0 , c1 ,..., c n se face impunând condiţia:

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

Coeficienţii y 0 , y 0 ...n y 0 se iau din primul tabel de pe latura de sus.


Expresia acestui polinom poate fi pusă sub formă mai comodă pentru aplicaţii care să nu
depindă în mod explicit de nodurile reţelei de interpolare, dacă se notează:

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  ty 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 .

Exemplu: Să se implementeze un subprogram în Delphi 7 care foloseşte polinomul de


interpolare Newton de speţa I-a.
Rezolvare. Forma principală în Delphi 7:

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;

for i:=0 to n-2 do


Dif[0,i] := yk[i+1]-yk[i];

for k:=1 to n-2 do


begin
m := n - k - 1;
for i:=0 to m - 1 do
Dif[k,i] := Dif[k-1,i+1] - Dif[k-1,i];
end;

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;

Polinomul de interpolare Newton de speţa a II-a


Acest tip de polinom utilizează diferenţele finite la stânga. Modul de construcţie al
polinomului este oarecum asemănător.

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 ).

Se impune condiţia de coincidenţă a polinomului cu funcţia în nodurile de interpolare:

N sn ( x i )  f ( x i )  y i , i  0, n .

Se dau pe rând lui x valorile x n , x n 1 ,..., x 0 pentru determinarea coeficienţilor


c 0 , c1 ,..., c n :
37
c0  yn
y n  y n 1 y n
c1  
h 1! h
......... .
n yn
cn 
n!h n
Polinomul are deci forma:

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

Coeficienţii y n , y n ,...,  n y n se iau din tabelul al doilea de pe latura de jos. Şi această


expresie a polinomului poate fi pusă într-o formă care să nu depindă în mod explicit de
nodurile reţelei de interpolare, dacă se notează:

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;

for i:=0 to n-2 do


Dif[0,i] := yk[i+1]-yk[i];

for k:=1 to n-2 do


begin
m := n - k - 1;
for i:=0 to m - 1 do
Dif[k,i] := Dif[k-1,i+1] - Dif[k-1,i];
end;

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;

Polinomul de interpolare Newton cu diferenţe divizate


Se consideră o funcţie f ale cărei valori se cunosc într-un ansamblu de noduri x i , i  0, n ,
nu neapărat echidistante.
Expresiile:

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:

f ( x i ,..., x i k )  f ( x i1 ,..., x i k 1 )


f ( x i1 , x i ,..., x i  k )  .
x i k  x i1
Pentru aproximarea funcţiei f printr-un polinom Newton cu diferenţe divizate se
porneşte de la:

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 )

Se impune coincidenţa polinomului cu funcţia în nodurile de interpolare:

N n ( x i )  f ( x i ), i  0, n

relaţii din care se pot determina coeficienţii c k , k  0, n şi anume:

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

relaţie ce se determină urmărind liniile îngroşate din tabelul anterior.


Avantajul utilizării acestui tip de polinom este dat de faptul că nu se porneşte de la început cu
o anumită valoare a lui n ci se creşte treptat gradul polinomului până când se atinge precizia
dorită.
Exemplu: Să se implementeze un subprogram în Delphi 7 care foloseşte polinomul de
interpolare Newton cu diferenţe divizate.
Rezolvare. Forma principală în Delphi 7:

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;

for i:=0 to n-2 do DD[0,i] := (yk[i+1] - yk[i])/(xk[i+1] -


xk[i]);
for k:=1 to n do
begin
m := n – k - 1;
for i:=1 to m do
DD[k,i-1] := (DD[k-1,i] - DD[k-1,i-1])/(xk[i+k] - xk[i-1]);
end;
P := yk[0]; T := 1;

for k:=0 to n-1 do


begin

41
T := T * (x - xk[k]);
P := P + DD[k,0] * T;
end;
NewtonDD := P;
end;

Dreapta de regresie (metoda celor mai mici pătrate)


Se consideră funcţia f cunoscută într-un ansamblu de noduri x 0 , x 1 ,..., x n având valorile:

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

astfel încât abaterea medie pătratică şi deci suma:

n
S   f (x k )  Fm (x k ) 2
k 0

să aibă o valoare minimă.


Această metodă, imaginată mai întâi de Gauss, poartă numele de metoda celor mai mici
pătrate. Cazul cel mai simplu îl constituie aproximarea funcţiei f printr-un polinom de gradul I
reprezentând geometric o dreaptă (dreapta de regresie), de ecuaţie

F1 ( x )  ax  b .
Se impune condiţia ca suma:

n
S(a , b)    y k  (ax k  b) 2
k 0

să aibă o valoare minimă.


Condiţiile necesare de extrem se scriu:
 S(a , b ) n
  2   y k  (ax k  b )   x k  0
 a

 S(a , b )
k 0
n .
  2   y k  (ax k  b )   0
 b 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;

for i:=0 to n-1 do


begin
Sx := Sx + x[i];
Sxy := Sxy + x[i] * y[i];
Sy := Sy + y[i];
Sxx := Sxx + x[i] * x[i];
end;

a := (n * Sxy - Sx * Sy)/(n * Sxx - Sx * Sx);


b := (Sxx * Sy - Sx * Sxy)/(n * Sxx - Sx * Sx);
end;

Tema 5. Derivarea numerică a funcţiilor (2 ore)


a) Caracterizarea metodelor de calculare a derivatelor. Formule de derivare numerică cu
noduri echidistante. Formule centrate.
b) Subprograme de calculare a derivatelor de ordinul unu, doi, trei şi patru de la funcţii
definite în formă analitică şi tabelar.
43
c) Analiza erorilor de calcul numeric a derivatelor.
d) Programe complexe cu elemente de calcul numeric al derivatelor de ordinul unu şu doi.

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

de interpolare de gradul n), atunci derivata funcţiei în punctul poate fi calculată

aproximativ, evaluând .

De exemplu, în cazul , polinomul de interpolare

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ă

mult mai simpă. Pentru ordinul obţinem:

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

calcul pentru prima derivată. De exemplu, folosind succesiv relaţia a

diferenţelor finite centrate de ordinul doi, pentru o discretizare locală cu pasul şi cu

notaţiile: , , se obţine:

rezultat care corespunde derivării directe a polinomului de interpolare , pentru

aproximarea de ordinul doi. Acest rezultat are avantajul unei precizii maxime pentru reţeaua
considerată şi pentru trei evaluări a funcţiei .

În cazul unei reţele neuniforme cu : rezultă:

Formulele de derivare numerică obţinute se pot aplica şi în cazul derivatelor parţiale.


Rezultatele obţinute pentru cazul funcţiilor definite tabelar se aplică şi în cazul funcţiilor
definite prin cod, cu observaţia că: şi , în care se allege astfel

încât erorile numerice să fie cât mai mici.


Analiza erorilor
Deoarece valoarea exactă a derivatei se obţine printr-un proces infinit de trecere la lmită:

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 ;

 gradul polinomului de interpolare .


Pasul de derivare are o valoare optimă, finită, pentru care eroarea este minimă.

Exemplu:
1) Să se implementeze un subprogram în Delphi 7 care calculează numeric derivata de
ordinul I a unei funcţii.

Rezolvare. După cum se ştie de unde rezultă că aproximativ

De asemenea sunt valabile şi următoarele formule:

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;

function f1(x: extended): extended;


begin
f1 := 2*x*x*x;
end;

function Der_I(x0, eps: extended; f: functie): extended;


var h, vc, vp: extended;
begin
h := eps;
vc := (f(x0 + h/2) - f(x0 - h/2))/h;
repeat
h := h/2;
vp := vc;
vc := (f(x0 + h/2) - f(x0 - h/2))/h;

46
until abs(vc - vp) < eps;
Der_I := vc;
end;

procedure TForm1.Button1Click(Sender: TObject);


begin
label1.Caption := FloatToStr(Der_I(2, 0.00001, f1));
end;

2) Să se implementeze un subprogram în Delphi 7 care calculează numeric derivata de


ordinul II a unei funcţii.
Rezolvare. După cum se ştie:

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;

Tema 6. Integrarea numerică a funcţiilor (4 ore)


a) Principiul metodei de calculare numerică a integralelor definite. Caracterizarea
metodelor de calculare numerică a integralei definite.
b) Deducerea formulelor pentru calcularea numerică a integralei definite: metoda
dreptunghiurilor, metoda trapezului secant, metoda Simpson.
c) Calcularea numerică a integralei definite cu pas variabil: metodele Gauss şi Monte-Carlo.
d) Implementarea subprogramelor de calculare numerică a integralei definite.
e) Deducerea formulelor pentru calcularea numerică a integralei definite de ordinul doi şi
teri.
f) Analiza eficienţii algoritmilor şi estimarea erorilor de calcul numeric a integralelor.
Formulele Romberg.

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:

Pentru calcularea numerică a ariei trapezului curbliniu, de regulă intervalul se împarte

î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:

Formula pentru calcularea numerică a integralei prin metoda dreptunghiurilor ajustate la


marginea de dreapta este:

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;

procedure MDAS(a,b,eps:extended;f:fxrr;var r:extended);


var n,i:integer;
vc,vp,s,h:extended;
begin
n:=2;
h:=(b-a)/n;
s:=0;
for i:=0 to n-1 do s:=s+f(a+i*h);
vc:=s*h;
repeat
n:=n*2;
h:=(b-a)/n;
vp:=vc;
s:=0;
for i:=0 to n-1 do s:=s+f(a+i*h);
vc:=s*h;
until abs(vc-vp)<eps;
r:=vc;
end;

procedure TForm1.Button1Click(Sender: TObject);


var r:extended;
begin
MDAS(0,1,0.000001,f1,r);
label1.Caption:=FloatToStr(r);
end;

Metoda trapezului secant


În cazul acestei metode ariile elementare se aproximează prin trapeze secante:

50
Formula de lucru:

În baza acestei formule se realizează subprogramul în Delphi:


procedure MTS(a,b,eps:extended;f:fxrr;var r:extended);
var n,i:integer;
vc,vp,s,h:extended;
begin
n:=2;
h:=(b-a)/n;
vc:=((f(a)+f(b))*h)/2;
repeat
n:=n*2;
h:=(b-a)/n;
vp:=vc;
s:=0;
for i:=1 to n-1 do s:=s+f(a+i*h);
vc:=(f(a)+f(b)+2*s)*h/2;
until abs(vc-vp)<eps;
r:=vc;
end;

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:

În baza acestei formule se realizează subprogramul în Delphi:


procedure MSimpson(a,b,eps:extended;f:fxrr;var r:extended);
var n,i:integer;
vc,vp,s1,s2,h:extended;
begin
n:=2;
h:=(b-a)/n;
vc:=h/3*(f(a)+4*f(a+h)+f(b));
repeat
n:=n*2;
h:=(b-a)/n;
vp:=vc;
s1:=0; s2:=0;
for i:=0 to (n div 2)-1 do s1:=s1+f(a+(2*i-1)*h);
for i:=1 to (n div 2) do s2:=s2+f(a+2*i*h);
vc:=h/3*(f(a)+f(b)+4*s1+2*s2);
until abs(vc-vp)<eps;
r:=vc;
end;

Metoda Monte-Carlo

52
Această metodă se bazează pe noţiunea de valoarea medie aritmetică a funcţiei pe intervalul

În prima aproximaţie . Pentru

calcule concrete trebuie să cunoaştem şi ele ar putea fi echidistante pe

intervalul . Metoda Monte-Carlo determină valorile lui prin metode aleatoare,

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

repartizate încorporat în Pascal şi Delphi.


Pentru generarea de numere aleatoare din intervalul în Delphi se utilizează funcţia

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:

2) Se estimează valoare medie pătratică:

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;

Calcularea numerică a integralelor definite de ordinul II


Pentru a calcula numeric integrala definită de ordinul II trebie să reeşim din sensul geometric
al integralei de ordinul doi, care coincide numeric cu volumul:

Exemplu:

Grafic, rezolvarea numerică a integralei duble s-ar putea de reprezentat astfel:

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.

Reeşind din aceasată concepţie şi efectuând notificaţiile şi ,

putem deduce formula generală astfel:

De obicei, în procesul de implementare al programului ce utilizează această metodă, variabila


şi au aceeaşi valoare. Din această cauză vom utiliza numai variabila . Subprogramul în
Delphi este:
type fxy=function(x,y:extended):extended;

function f1(x,y:extended):extended;
begin
f1:=x+x*y;
end;

procedure CNI2(a,b,c,d,eps:extended;f:fxy;var r:extended);


var i,j,n:integer;
hx,hy,s,vc,vp:extended;
begin
n:=1;
hx:=(b-a)/n;
hy:=(d-c)/n;
vc:=hx*hy*f(a+hx/2,c+hy/2);
repeat
vp:=vc;
n:=n*2;
57
s:=0;
hx:=(b-a)/n;
hy:=(d-c)/n;
for i:=1 to n do
for j:=1 to n do
s:=s+f(a+hx/2*(2*i-1),c+hy/2*(2*j-1));
vc:=hx*hy*s;
until abs(vc-vp)<eps;
r:=vc;
end;

procedure TForm1.Button1Click(Sender: TObject);


var r:extended;
begin
CNI2(0,1,0,1,0.00001,f1,r);
label1.Caption:=FloatToStr(r);
end;
Analogic pot fi calculate integralele de ordinul III, IV, V ... . Integrala multiplă de ordinul II mai
poate fi calculată utilizând procedura de calculare a integralei de ordinul I. Deosebirea este că
trebuie să apelăm această procedură de mai multe ori:

procedure CNI2_v2(a,b,c,d,eps:extended;f:fxy;var r:extended);


var j,n:integer;
hx,s,vc,vp:extended;
function F1(x:extended):extended;
var n,i:integer;
vc,vp,s,hy:extended;
begin
n:=1;
hy:=(d-c)/n;
vc:=((f(x,c)+f(x,d))*hy)/2;
repeat
n:=n*2;
hy:=(d-c)/n;
vp:=vc;
s:=0;
for i:=1 to n-1 do s:=s+f(x,c+i*hy);
vc:=(f(x,c)+f(x,d)+2*s)*hy/2;
until abs(vc-vp)<eps;
F1:=vc;
end;
begin
n:=1;
hx:=(b-a)/n;
58
vc:=(F1(a)+F1(b))*hx/2;
repeat
n:=n*2;
hx:=(b-a)/n;
vp:=vc;
s:=0;
for j:=1 to n-1 do s:=s+F1(a+j*hx);
vc:=(F1(a)+F1(b)+2*s)*hx/2;
until abs(vc-vp)<eps;
r:=vc;
end;

Tema 7. Calcularea numerică a determinanţilor (2 ore)


a) Implementarea algoritmului recursiv de calculare numerică a determinanţilor prin
metoda minorilor.
b) Rezolvarea numerică a sistemelor de ecuaţii liniare. Metoda Cramer.
c) Calculare numerică a matricei inverse.

Calcularea numerică a determinanţilor prin metoda minorilor


Fie dată o matrice pătratică de ordin :

 a11 a12 ... a1n 


 
a a22 ... a2 n 
A   21 .
... ... ... .... 
 
a an 2 ... ann 
 n1
Fiecărei din matricele de acest tip îi este asociată o valoare numerică, numită determinant.
Determinantul poate fi definit în mod inductiv. Notaţia folosită pentru determinantul matricei

este .

Dacă ordinul matricei este 1, atunci matricea este formată dintr-un singur element .

Determinantul matricei va fi chiar valoarea elementului . Pentru o matrice de ordinul 2,

determinantul va fi egal cu valoarea expresiei (diferenţa

produselor elementelor de pe diagonala principală şi cea secundară). Pentru o matrice de

59
ordinul 3, determinantul poate fi calculate folosind regula lui Sarrus

(regula diagonalelor şi a triunghiurilor). Termenii cu semnul în suma ce corespunde valorii

determinantului se obţin înmulţind elementele de pe diagonala principală şi cele din vârfurile


triunghiurilor, care au bazele paralele cu diagonala principală:

Termenii cu semnul se obţin înmulţind numerele de pe diagonala secundară şi cele din

vârfurile triunghiurilor, care au bazele paralele cu diagonala secundară:

Astfel, pentru o matrice de ordinul 3 determinantul poate fi calculat direct după formula:

Exemplu: , unde

Pentru definiţia determinantului unei matrice de ordinul se va folosi noţiunea de minor.

Definiţie: Se numeşte minor de ordin al elementului al matricei de rang ( )

determinantul matricei de rang , obţinută din matricea prin excluderea rândului şi a

coloanei . Vom nota minorul elementului prin , unde indică rândul, iar – coloana la

intersecţia cărora se află elementul .

Vom cerceta matricea din exemplul precedent. Pentru a calcula minorul a elementului

se exclude din matrice linia 1 şi coloana 2:

60
, .

Definiţie: Se numeşte determinant al matricei de rang valoarea expresiei

Î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

urmează să rezolvăm o problemă echivalentă cu problema iniţială, dar de dimensiune mai


mică. Deoarece la un moment dat se ajunge la calculul unui determinant de ordinul 1, 2 sau 3,
care poate fi calculat direct, se respectă regula de consistenţă şi poate fi aplicat un algoritm
recursiv (pentru matricea de ordinul ):

 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 :

- Se formează matricea prin excluderea din matricea a liniei 1 şi coloanei (ordinul

este , care corespunde minorului ).

- Se calculează determinantul al matricei utilizând algoritmul curent.

- Se actualizează valoarea determinantului .

Implementarea în Delphi este:


type matrice=array of array of extended;

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;

procedure TForm1.Button1Click(Sender: TObject);


var a:matrice;
n:integer;
begin
n:=4;
setlength(a,n,n);

a[0,0]:=1; a[0,1]:=0; a[0,2]:=-1; a[0,3]:=2;


a[1,0]:=1; a[1,1]:=-2; a[1,2]:=0; a[1,3]:=0;
a[2,0]:=0; a[2,1]:=1; a[2,2]:=1; a[2,3]:=-1;
a[3,0]:=1; a[3,1]:=-1; a[3,2]:=0; a[3,3]:=0;

label1.Caption:=FloatToStr(Determinant(a));
end;

Rezolvarea numerică a sistemelor de ecuaţii liniare. Metoda Cramer


Definiţie: Matricea pătratică se numeşte nesingulară, dacă determinantul ei este diferit de
0.
Definiţie: Matricea inversă a matricei este matricea, care fiind înmulţită la (fie la stânga,

fie la dreapta) dă în rezultat matricea unitară E. Matricea inversă matricei va fi notată .

Teoremă: Pentru orice matrice nesingulară există matricea inversă.

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

Dacă se fac notaţiile:


 a11 a12 ... a1n   x1   b1 
     
a a22 ... a2 n   x2  b 
A   21 ; x   ; b   2  ,
... ... ... ....  
     
a an 2 ... ann     
 n1  xn   bn 
sistemul poate fi scris în formă matriceală: A  x  b ( – matricea coeficienţilor sistemului,

– vectorul soluţiilor şi – vectorul termenilor liberi ai sistemului).

În cazul când determinantul este diferit de 0, există matricea inversă . Înmulţind

ambele părţi ale egalităţii de mai sus la , obţinem:

ceea ce este echivalent cu:

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

mesaj de imposibilitate de utilizare a metodei;


Pas 2. Se consideră ;
Pas 3.
a) În matricea coeficienţilor sistemului coloana cu numărul de ordine este înlocuită cu

vectorul termenilor liberi ;

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

Implementarea în Delphi este:


Procedure Cramer(a:matrice; b:array of extended; var x:array of
extended);
var mi:matrice;
n,i,j,l,m:integer;
det:extended;
begin
n:=high(b);
setlength(mi,n+1,n+1);
det:=Det (a);
for j:=0 to n do
begin
for l:=0 to n do
for m:=0 to n do mi[l,m]:=a[l,m]; // se copie matricea a in
mi
for i:=0 to n do mi[i,j]:=b[i]; //se inlocuiesc termenii din
coloana j cu val. b
x[j]:=Det(mi)/det;
end;
end;

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);

a[0,0]:=1; a[0,1]:=1; a[0,2]:=1; a[0,3]:=1;


a[1,0]:=1; a[1,1]:=-1; a[1,2]:=1; a[1,3]:=-1;
a[2,0]:=2; a[2,1]:=-3; a[2,2]:=4; a[2,3]:=1;
a[3,0]:=3; a[3,1]:=4; a[3,2]:=-3; a[3,3]:=9;

b[0]:=10; b[1]:=-2; b[2]:=12; b[3]:=38;

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;

Tema 8. Rezolvarea sistemelor de ecuaţii liniare (6 ore)


a) Descrierea generală a metodelor directe de rezolvare numerică a sistemelor de ecuaţii
liniare.
b) Implementarea algoritmului Gauss de rezolvare a sistemelor de ecuaţii liniare. Calcularea
determinanţilor.
c) Implementarea algoritmului Gauss-Jordan de rezolvare a sistemelor de ecuaţii liniare.
Calcularea matricei inverse.
d) Analiza eficienţii algoritmilor Cramer, Gauss, Gauss-Jordan.
e) Metode iterative de rezolvare numerică a sistemelor de ecuaţii liniare. Metoda Jacobi şi
Gauss-Seidel.
f) Compararea metodelor iterative de rezolvare nunerică a sistemelor de ecuaţii liniare.
Metode de accelerare a convergenţei.
g) Programe complexe cu elemente de rezolvare numerică a sistemelor de ecuaţii liniare.
66
Implementarea algoritmului Gauss de rezolvare a sistemelor de ecuaţii liniare
Matricea extinsă a unui sistem de ecuaţii liniare cu necunoscute se va numi matricea din

linii şi coloane, formată din coeficienţii sistemului şi vectorul termenilor liberi,


amplasaţi după cum urmează:
 a11 a12 ... a1n b1 
 
 a21 a22 ... a2 n b2 
 ... ... ... ... ... 
 
 b 
 an1 an 2 ... ann n

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:

cu matricea extinsă (1a):

Metoda Gauss presupune transformarea matricei coeficienţilor sistemului de ecuaţii liniare în


aşa fel, încât coeficienţii de sub diagonala principală să devină egali cu 0. În termeni
matematici, trebuie să se construiască un sistem de ecuaţii echivalent cu matricea extinsă (2):

După aceste transformări, soluţiile unui sistem de tipul (2) pot fi determinate începând cu :

 se determină din ultima ecuaţie ultima necunoscută ;

67
 penultima soluţie se determină din penultima ecuaţie, în care se înlocuieşte

soluţia din ultima ecuaţie ;

 procesul este iteraticv şi continuă până cînd se determină prima necunoscută din

prima ecuaţie, în care se înlocuiesc soluţiile .

Descrierea matematică
Etapa 1 – excluderea din ecuaţiile . în matricea supusă transformării,

elementele urmează să devină 0. La pasul se determină pivotul

(determinarea pivotului reprezintă determinarea coeficientului maximal în valoare absolută


din coloana k). Ecuaţia care are acest coeficient se aduce pe primul loc. Sistemul este:

Din această matrice conform metodei Gauss determinăm coeficienţii . Petru aceasta linia

trebie înmulţită la . După scădere obţinem formulele în baza cărora se deduc

coeficienţii:

- ;

- ,

unde .

După etapa de anulare a coeficienţilor, sistemul de ecuaţii liniare are forma:

68
Etapa 2 – din ultima ecuaţie a sistemului (4) se determină : , iar în caz general

, unde .

Conform formulei obţinute componentele vectorului soluţie se calculează recurent

î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;

procedure Gauss(a:mnr;b:array of extended;var x:array of


extended);
var p,s,maxa:extended;
h,m,l,k,i,j,n:integer;
begin {programul principal}
n:=high(b);
for k:=0 to n do
begin {etapa k}
maxa:=abs(a[k,k]);
h:=k;
for l:=k to n do
if abs(a[l,k])>maxa then {se cauta pivotul}
begin
maxa:=a[l,k];
h:=l;
end;
if h<>k then {se aduce ecuatia ce contine pivotul pe primul
loc}
begin

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}

x[n]:=b[n]/a[n,n]; {se calculeaza ultima necunoscuta}


for i:=n-1 downto 0 do {se calculeaza celelalte necunoscute}
begin
s:=0;
for j:=1 to n do s:=s+a[i,j]*x[j];
x[i]:=(b[i]-s)/a[i,i];
end;
end;

procedure TForm1.Button1Click(Sender: TObject);


var a:mnr;
s,b:array of extended;
n:integer;
begin
n:=4;
setlength(a,n,n);
setlength(b,n);
setlength(s,n);

a[0,0]:=1; a[0,1]:=1; a[0,2]:=1; a[0,3]:=1; b[0]:=10;


a[1,0]:=1; a[1,1]:=-1; a[1,2]:=1; a[1,3]:=-1; b[1]:=-2;
a[2,0]:=2; a[2,1]:=-3; a[2,2]:=4; a[2,3]:=1; b[2]:=12;
a[3,0]:=3; a[3,1]:=4; a[3,2]:=-3; a[3,3]:=9; b[3]:=38;
Gauss(a,b,s);

70
label1.Caption:=floattostr(s[0]);
label2.Caption:=floattostr(s[1]);
label3.Caption:=floattostr(s[2]);
label4.Caption:=floattostr(s[3]);
end;

Implementarea algoritmului Gauss-Jordan de rezolvare a sistemelor de ecuaţii liniare


Această metodă permite rezolvarea sistemului iniţial, prin transformarea sa într-un sistem
echivalent a cărui matrice este diagonală.
Rezolvarea presupune parcurgerea a paşi. În cadrul pasului generic se transcrie numai

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 k1 1, k)  1 a (k k1 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

Formulele în baza cărora se deduc coeficienţii (la etapa ):

a) Pentru coeficienţii se calculează după formulele:

- ;

71
- ,

unde iar .

b) Pentru coeficienţii se calculează după formulele:

- ;

- ,

unde .

În final sistemul de ecuaţii liniare are forma:

Se observă că prin metoda Gauss-Jordan elementele obţinute în vectorul termenilor liberi


sunt tocmai soluţiile sistemului de ecuaţii:
, unde .

Implementarea în Delphi:
type mnr=array of array of extended;

procedure Gauss_Jordan(a:mnr;b:array of extended;var x:array of


extended);
var p,maxa,c:extended;
h,m,l,k,i,j,n:integer;
begin {programul principal}
n:=high(b);
for k:=0 to n do
begin
maxa:=abs(a[k,k]); {se cauta pivotul}
h:=k;
for l:=k to n do
if abs(a[l,k])>maxa then
begin
maxa:=a[l,k];
h:=l;
end;

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:

 pe primele coloane matricea ;

 pe următoarele coloane matricea ;

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

ultima coloană, coloana cu numărul , vom obţine chiar soluţia sistemului.

Sintetic, metoda poate fi descrisă astfel:


 A I n b  I n A 1 x  ,
unde este soluţia sistemului cu componentele .

Metode iterative de rezolvare numerică a sistemelor de ecuaţii liniare. Metoda Jacobi şi


Gauss-Seidel.
Aceste metode permit rezolvarea sistemelor de ecuaţii prin determinarea, pornind de la o
aproximaţie iniţială a soluţiei, a unui şir de vectori soluţie care converg (sau nu) către soluţia
sistemului. Nu toate sistemele de ecuaţii pot fi rezolvate prin aceste metode ci numai acelea
care îndeplinesc o anumită condiţie de convergenţă ce va fi prezentată în continuare.
Se consideră un sistem de n ecuaţii cu n necunoscute de forma:

Metoda iterativă Jacobi


Se consideră sistemul de ecuaţii dat, pentru care avem îndeplinită condiţia:
ai ,i  0, i  1, n .
Rezolvarea sistemului prin metoda Jacobi începe prin a pune în evidenţă în partea stângă a
semnului egal a necunoscutei din ecuaţia :

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 

Dacă această condiţie este îndeplinită, notând x  lim


(k )
x se poate scrie:
k 

x  0  ( I  A) 1 u

adică, după înmulţirea la stânga cu , x  Ax  u . Rezultă că vectorul obţinut

reprezintă chiar soluţia sistemului.


Dar, condiţia ca toate valorile proprii ale matricei să fie mai mici decât unitatea în modul,
cere ca:
n aij
 j 1 a ii
 1, i  1, n
.
j i

Această relaţie reprezintă pentru metoda iterativă Jacobi o condiţie necesară de


convergenţă.
75
În matricea sistemului iniţial, trebuie ca fiecare element de pe diagonala principală, în modul,
să fie mai mare decât suma modulelor celorlalte elemente din linia respectivă. Este posibil ca
sistemul, în forma sa iniţială să nu respecte această condiţie necesară de convergenţă. Înainte
de a începe aplicarea algoritmului metodei, este necesară o reordonare şi renumerotare a
ecuaţiilor în sistem astfel încât condiţia de convergenţă să fie îndeplinită.
Sistemele pentru care se pretează metoda Jacobi au matricea diagonal dominantă.

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;

procedure TForm1.Button1Click(Sender: TObject);


var a:mnr;
s,b:array of extended;
n:integer;
begin
n:=4;
setlength(a,n,n);
setlength(b,n);
setlength(s,n);
a[0,0]:=8; a[0,1]:=-2; a[0,2]:=1; a[0,3]:=1; b[0]:=8;
a[1,0]:=1; a[1,1]:=-9; a[1,2]:=3; a[1,3]:=2; b[1]:=-3;
a[2,0]:=2; a[2,1]:=-1; a[2,2]:=10; a[2,3]:=2; b[2]:=13;
a[3,0]:=1; a[3,1]:=0; a[3,2]:=-3; a[3,3]:=6; b[3]:=4;
Jacobi(a,b,0.00001,20,s);
label1.Caption:=floattostr(s[0]);
label2.Caption:=floattostr(s[1]);
label3.Caption:=floattostr(s[2]);
label4.Caption:=floattostr(s[3]);
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 .

Etapele de calcul presupun evidenţierea în partea stângă a semnului egal a necunoscutei

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

vectorului , metoda Gauss-Seidel foloseşte pentru determinarea diferitelor componente

ale vectorului atât componente ale vectorului de la pasul anterior cât şi

componente ale vectorului din pasul prezent , pe măsură ce acestea au fost


determinate, accelerând astfel convergenţa procesului.

Astfel, pentru calculul lui se folosesc componentele noi , deja

calculate în cadrul acestui pas, cât şi componentele de la pasul anterior,

necalculate încă în pasul prezent.


În aceste condiţii, relaţia de recurenţă pentru metoda Gauss-Seidel este de forma:
1  i 1 n 
xi( k 1)   bi   ai , j  x (jk 1)  a  x (jk )  .
ai ,i  i, j
 j 1 j i 1 
Se apreciază că, la acelaşi nivel de precizie impus în calculul soluţiei sistemului, metoda
Gauss-Seidel este de două ori mai rapidă decât metoda Jacobi.

Implementarea în Delphi:
type mnr=array of array of extended;

procedure Gauss_Seidel(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;

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;

Tema 9. Rezolvarea numerică a ecuaţiilor diferenţiale (6 ore)


a) Descrierea generală a metodelor de rezolvare analitică şi numerică a ecuaţiilor
diferenţiale ordinare de ordinul unu. Problema Cauchy.
b) Metoda Euler. Deducerea formulelor de lucru. Implementare algoritmilor Euler în
subprograme de rezolvare numerică a ecuaţiilor diferenţiale ordinare de ordinul unu.
c) Metoda Runge-Kutta. Formulele de lucru. Implementare algoritmilor Runge-Kutta în
subprograme de rezolvare numerică a ecuaţiilor diferenţiale ordinare de ordinul unu.
d) Analiza eficienţii metodelor Euler şi Runge-Kutta.
e) Metode numerice de rezolvare a ecuaţiilor diferenţiale ordinare de ordinul doi.
Deducerea formulelor de lucru şi implementarea algoritmilor în subprograme.
f) Metode numerice de rezolvare a sistemelor de ecuaţii diferenţiale ordinare de ordinul
unu. Implementarea algoritmilor în subprograme.

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

unde este variabila independentă, este funcţia necunoscută,

sunt derivatele funcţiei şi este o funcţie reală continuă definită pe un domeniu .

Forma explicită (sau forma normală a ecuaţiei ) se poate scrie:

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:
,

unde este o funcţie reală definită pe o mulţime deschisă , este funcţia

necunoscută, iar este derivata de ordinul întâi a acesteia.

O funcţie se numeşte soluţie pentru ecuaţia diferenţială dacă este

derivabilă pe şi , .

80
Prin soluţie generală a unei ecuaţii diferenţiale de ordinul întâi înţelegem o familie de

soluţii , unde este o constantă arbitrară. Prin particularizarea constantei

obţinem diferite soluţii particulare ale soluţiei ecuaţiei diferenţiale .

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

sa, atunci obţinem ecuaţia diferenţială:

Soluţia ecuaţiei diferenţiale este:

unde este o primitivă a lui pe . Constatăm că soluţia căutată nu este unică, ci există o

infinitate de soluţii ale ecuaţiei . Soluţia a ecuaţiei , care depinde de o constantă

arbitrară , se numeşte soluţia generală iar fiecare soluţie particulară se obţine din soluţia

generală dacă dăm constantei o valoare numerică concretă.


Privitor la condiţiile la limită există două tipuri:
- Condiţii Cauchy: se cunosc într-un punct atât valoarea funcţiei necunoscute cât şi

valorile derivatelor, până la ordinul cel mai mare ce figurează în ecuaţie.


Definiţie: Se numeşte problema Cauchy pentru eduaţia diferenţială de ordinul întâi

şi punctul , problema care constă în determinarea unei soluţii

, care verifică condiţia iniţială .

De asemenea, în matematică este demonstrat că rezolvarea problemei Cauchy este


echivalentă cu rezolvarea ecuaţiei integrale:

- Condiţii la limită: se cunosc valorile funcţiei necunoscută în puncte diferite.


Rezolvarea numerică a unei probleme asociate unei ecuaţii diferenţiale poate fi privită sub
două aspecte:
a) Determinarea unei funcţii , aparţinând unei anumite clase de funcţii (în general

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 .

Metodele numerice pentru rezolvarea numerică a ecuaţiilor diferenţiale se pot clasifica în


două mari tipuri:
- Metode unipas (de tip Euler, Runge-Kutta) în care determinarea valorii aproximative a
soluţiei în fiecare punct se va obţine direct, pe baza informaţiilor din punctul precedent;
- Metode multipas, în care valoarea soluţiei exacte în fiecare punct este aproximativă
folosind informaţiile din mai multe puncte anterioare.
Evident este vorba de soluţii aproximative pe care nu avem cum să le comparăm cu o soluţie
exactă, deoarece practic aceasta este practic imposibil de găsit. De aceea în practică trebuie să
procedăm cu atenţie pentru alegerea algoritmilor cei mai potriviţi pentru problema concretă
de rezolvat.

Metoda Euler. Deducerea formulelor de lucru de ordinul unu. Implementare algoritmilor


Euler în subprograme de rezolvare numerică a ecuaţiilor diferenţiale ordinale de ordinul
unu.
Se consideră ecuaţia diferenţială:

– forma implicită, unde .

Forma explicită a acestei ecuaţii diferenţiale este:

Condiţiile iniţiale sunt , adică:

Expresiile şi constitue o problemă Cauchy.

Teoremă (de existenţă şi unicitatea soluţiei): dacă funcţia este continuă într-un

domeniu ce conţine punctul , atunci ecuaţia conţine soluţia

încât . Mai mult ca atât, dacă este continuă şi derivata parţială după , atunci

această soluţie este unică.


Exemplu: Fie următoarea ecuaţie diferenţială:

cu condiţiile iniţiale . Această ecuaţie poate fi rezolvată prin metoda separării


variabilelor:

82
Dacă integrăm partea stângă şi dreaptă a egalităţii de mai sus, atunci obţinem:

de unde . Dacă în acestă egalitate înlocuim valorile condiţiilor

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

polinomului de descompunere în serie Tylor:

Dacă efectuăm înlocuirile necesare şi utilizăm numai partea ce reprezintă polinomul de


ordinul I, obţinem:

Repetăm procedeul şi presupunând că în s-a calculat valoarea aproximativă , atunci pe

intervalul se aproximează soluţia cu:

iar în punctul se obţine valoarea aproximativă:

În metoda Euler soluţia exactă se aproximează cu o linie poligonală. Grafic se poate


reprezenta:

83
Erorile de trunchiere şi de rotunjire se propagă de la un pas la altul.

Exemplu: Fie ecuaţia diferenţială de ordinul întâi şi condiţiile iniţiale

. Deci:

Din condiţiile iniţiale se poate de aflat constanta :

84
Soluţia particulară, reeşind din condiţiile iniţiale date, este:

Pentru valoarea , obţinem soluţia .

Implementarea în Delphi:
type fxy = function(x,y:extended):extended;

function f1(x,y:extended):extended;
begin
f1:=x*x+1;
end;

procedure EulerOrdin1(x0,y0,eps:extended; f:fxy; x: extended;


var y:extended);
var n,i:integer;
h,yc,yp,xx0,yy0:extended;
begin
h:=x-x0;
n:=1;
yc:=y0+h*f(x0,y0);
repeat
yp:=yc;
h:=h/2;
n:=n*2;
xx0:=x0;
yy0:=y0;
for i:=1 to n do
begin
yc:=yy0+h*f(xx0,yy0);
yy0:=yc;
xx0:=xx0+h;
end;
until abs(yc-yp)<eps;
y:=yc;
end;

procedure TForm1.Button1Click(Sender: TObject);


var y:extended;
begin
EulerOrdin1(2,3,0.0001,f1,1,y);
Label1.Caption:=FloatToStr(y);
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

nevoie de informaţiile existente în punctul precedent .

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:

Metoda Runge-Kutta constă în aproximarea soluţiei problemei de mai sus astfel:

şi . Valorile urmând a fi determinaţi (

).

Observaţie: Pentru a fi consisentă, metoda Runge-Kutta trenuie să satisfacă condiţia:

În funcţie de numărul de termeni ai relaţiei se obţin formule particulare de calcul a

soluţiei prin metoda Runge-Kutta. Pentru se obţine relaţia particulară:

86
în care au valorile:

iar .

Înlocuind aceste valori ale coeficienţilor şi ponderilor în relaţia se obţine formula genrală

pentru metoda Runge Kutta de ordinul IV:

Aceasta este cea mai utilizată dintre formulele metodei Runge Kutta, fiind cunoscută sub
numele de metoda Runge-Kutta.

Exemplu: Fie ecuaţia diferenţială de ordinul întâi şi condiţiile iniţiale

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;

Metode numerice de rezolvare a ecuaţiilor diferenţiale ordinare de ordinul doi. Deducerea


formulelor de lucru şi implementarea algoritmilor în subprograme.

88
89

S-ar putea să vă placă și