Sunteți pe pagina 1din 144

Metode numerice în ingineria electrică

Cuvânt-înainte

Lucrarea bilingvă română-franceză „Metode numerice în ingineria electrică.


Aplicaţii în C++ şi Turbo Pascal” prezintă o viziune proprie a autorilor asupra
teoriei şi aplicării metodelor numerice cu algoritmi şi exemple de calcul din
ingineria electrică. În această primă parte a lucrării sunt incluse capitole privind
rezolvarea numerică a ecuaţiilor şi sistemelor de ecuaţii liniare şi neliniare.
Metodele numerice sunt, exclusiv, iterative iar soluţiile ecuaţiilor si sistemelor
de ecuaţii liniare si neliniare se obţin ca limite ale unor şiruri convergente. Calitatea
şi eficienţa fiecărei metode în parte este apreciată prin două criterii: criteriul
utilizării optime a memoriei calculatorului necesară pentru date şi programe,
respectiv criteriul micşorării timpului de calcul necesar obţinerii soluţiei.
Autorii, cadre didactice şi studenţi de la Facultatea de Inginerie Electrică din
Universitatea Valahia Târgovişte şi de la Facultatea de Inginerie cu Predare în
Limbi Străine din Universitatea Politehnica Bucureşti, au încercat o prezentare
intuitivă, fără demonstraţii, a teoriei ce stă la baza metodelor numerice considerate,
ceea ce uşurează înţelegerea materialului. Locul demonstraţiilor riguroase este luat
de exemple de calcule numerice, şi, respectiv, de algoritmii care însoţesc fiecare
metodă şi de aplicaţiile software în limbajele C++ şi TurboPascal, cititorul fiind
astfel introdus în lumea modernă şi pasionantă a aplicaţiilor software.
Această primă ediţie bilingvă se adresează în special studenţilor de la
facultăţile de profil electric şi studenţilor de la departamentele de inginerie electrică
cu limbă de predare franceza, dar poate fi utilizată de orice specialist care parcurge
disciplina de metode numerice. Pe tot parcursul prezentării elementele teoretice
sunt completate cu exemple detaliat rezolvate, care îşi au provenienţa din domeniul
ingineriei electrice. Sperăm ca această modalitate de realizare a lucrării să fie utilă
tuturor celor care o citesc.

Autorii

5
Methodes de calcul numerique en ingenierie electrique

6
Metode numerice în ingineria electrică

Cuprins

Capitolul 1
Metode numerice de rezolvare a ecuaţiilor / 9
1.1. Metode numerice de rezolvare a ecuaţiilor neliniare cu o necunoscută / 10
1.1.1. Metoda bisecţiei sau a înjumătăţirii intervalului / 11
1.1.2. Metoda coardei sau metoda părţilor proporţionale / 13
1.1.3. Metoda lui Newton / 14
1.2. Metode numerice de rezolvare a ecuaţiilor algebrice / 16
1.2.1 Metode de separare a rădăcinilor ecuaţiilor algebrice / 17
1.2.1.2. Metoda şirului lui Rolle / 17
1.2.1.2. Metoda şirului lui Sturm / 18
1.2.2. Metode de determinare a rădăcinilor ecuaţiilor algebrice / 18
1.2.2.1. Metoda Lobacevski – Graeffe / 18
1.2.2.2. Schema lui Horner / 27
1.2.2.3. Metoda lui Bairstow / 30

Capitolul 2
Metode numerice de rezolvare a sistemelor de ecuaţii liniare / 33
2.1. Metode de eliminare utilizate în rezolvarea
numerică a sistemelor liniare de ecuaţii / 33
2.1.1. Metoda lui Gauss / 35
2.1.2. Metoda Gauss-Jordan sau metoda matricială formală / 38
2.1.3. Metoda lui Jacobi / 40
2.1.4 Metoda Gauss-Seidel / 42
2.2. Metode de rezolvare numerică a sistemelor
de ecuaţii prin factorizare / 42
2.3. Metode de rezolvare numerică a sistemelor de ecuaţii simetrice / 54
2.3.1. Factorizarea prin metoda rădăcinii pătrate (metoda lui Cholesky) / 54
2.3.2. Factorizarea matricelor simetrice, nepozitive definite / 57
2.4. Tehnici de adaptare la matricele rare / 59

Chapitre 3
Méthodes numériques de résolution des équations / 61
3.1. Méthodes numériques de résolution des équations non linéaires
avec une seule inconnue / 62
3.1.1. La méthode de la dichotomie / 63

7
Methodes de calcul numerique en ingenierie electrique

3.1.2. La méthode de la corde ou des parties proportionnelles / 65


3.1.3. La méthode de Newton / 66
3.2. Méthodes numériques de résolution des équations algébriques / 68
3.2.1 Méthodes de séparation des racines des équations algébriques / 69
3.2.1.1. La méthode de la suite de Rolle / 69
3.2.1.2. La méthode de la suite de Sturm / 70
3.2.2. Méthodes de détermination des racines des équations algébriques / 70
3.2.2.1. La méthode Lobacevski – Graeffe / 70
3.2.2.2. La méthode de Horner / 79
3.2.2.3. La méthode de Bairstow / 82

Chapitre 4.
Méthodes numériques pour la résolution
des systemes lineaires d’équations / 85
4.1. Méthodes directes de résolution des systèmes linéaires d’équations / 85
4.1.1. La méthode de Gauss / 87
4.1.2. La méthode de Gauss-Jordan / 91
4.1.3. La méthode de Jacobi / 92
4.1.4. La méthode de Gauss-Seidel / 94
4.2. Méthodes de résolution des systèmes d’équations par factorisation / 95
4.3. Méthodes de résolution des systèmes d’équations symétriques / 106
4.3.1. Factorisation par la méthode
de la racine carrée (méthode de Cholesky) / 107
4.3.2. Factorisation des matrices symétriques, non positives définies / 110
4.4. Techniques adaptées aux matrices creuses / 112

Anexa 1
Exemple de calcul numeric / 114

Anexa 2
Algoritmi în C++ şi Turbo Pascal / 142

Bibliografie / 164

8
Metode numerice în ingineria electrică

Capitolul 1

Metode numerice
de rezolvare a ecuaţiilor

Algebra dispune de metode şi formule de calcul pentru determinarea soluţiilor


ecuaţiilor algebrice cu gradul cel mult patru. Toate celelalte tipuri de ecuaţii
algebrice, cele cu gradul mai mare decât patru şi cele transcendente care fac parte
din categoria ecuaţiilor neliniare necesită pentru determinarea soluţiilor lor metode
de rezolvare numerică.
Metodele numerice sunt, exclusiv, interative şi soluţiile ecuaţiilor neliniare se
obţin ca limite ale unor şiruri convergente. Calitatea şi eficienţa fiecărei metode în
parte este apreciată prin două criterii: criteriul utilizării optime a memoriei
calculatorului necesară pentru date şi programe, respectiv criteriul micşorării
timpului de calcul necesar obţinerii soluţiei.
Primul criteriu ţine seama de complexitatea datelor cu care se lucrează (de
exemplu pentru un polinom de gradul n se introduc n coeficienţi reali) şi de
numărul de linii ale programului care rezolvă respectiva problemă. În ceea ce
priveşte evaluarea timpului de calcul necesar calculatorului pentru obţinerea
soluţiei, se adoptă ca referinţă timpul necesar efectuării unei operaţii elementare
(adunare sau înmulţire de numere reale) şi apoi se determină numărul acestor spaţii
(de exemplu pentru evaluarea unei funcţii polinomiale de gradul n se fac n
înmulţiri şi n +1 adunări).
O parte a metodelor numerice poate fi aplicată pentru toate tipurile de ecuaţii
algebrice iar altă parte este specifică doar rezolvării ecuaţiilor algebrice
polinomiale. În ingineria electrică metodele de rezolvare numerică a ecuaţiilor
neliniare are o aplicabilitate diversă, cum ar fi determinarea punctelor de
intersecţie a graficelor a două funcţii, determinarea punctelor de funcţionare în
circuitele electrice şi electronice, rezolvarea ecuaţiilor circuitelor electrice
neliniare etc.

9
Methodes de calcul numerique en ingenierie electrique

1.1. Metode numerice de rezolvare


a ecuaţiilor neliniare cu o necunoscută

Se consideră ecuaţia neliniară sau transcendentă

f (x ) = 0 (1.1)

în care f : [a, b] → ℜ este o funcţie continuă iar x r ∈ (a, b ) este soluţia exactă a
ecuaţiei. Pentru determinarea numerică a acestei soluţii se utilizează metode
iterative care constau în construirea unui şir de numere reale
x0 , x1 ,......., x k ... convergent către soluţia exactă x r a ecuaţiei. Orice metodă
iterativă pentru determinarea soluţiei x r constă în găsirea unei ecuaţii de forma

xr = F (x ) (1.2)

echivalentă cu ecuaţia dată în intervalul [a, b] :

f (x ) = 0 ⇔ xr = F (x ) (1.3)

astfel încât şirul de numere ( x k )k ≥0 să aibă limita x r adică

lim xk = xr , (1.4)
k →∞

unde termenii şirului se determină recurent în funcţie de termenul precedent, cu relaţia:

x k = F ( x k −1 ) (1.5)

Iteraţiile se opresc atunci când distanţa dintre doi termeni consecutiv ai şirului
este mai mică decât o valoare impusă ε .

x k − x k −1 < ε (1.6)

După modul în care este construită funcţia de iteraţie F ( x ) se prezintă în


continuare câteva dintre metodele numerice de rezolvare a ecuaţiilor neliniare.
1.1.1. Metoda bisecţiei sau a înjumătăţirii intervalului este una dintre
cele mai simple metode utilizate pentru rezolvarea unei ecuaţii neliniare, care se
bazează pe proprietatea funcţiei f ( x ) de a avea semne diferite la capetele

10
Metode numerice în ingineria electrică

intervalului [a, b] , dacă soluţia unică x r a ecuaţiei f ( x ) = 0 există în intervalul


(a,b). Atunci:

f (a ) ⋅ f (b ) < 0 (1.7)

şi într-o prima iteraţie, se calculează

a+b
x m0 ≡ x0 = (1.8)
2
jumătatea intervalului [a, b ] . Dacă x 0 nu este rădăcină a ecuaţiei, adică dacă
valoarea funcţiei în acest punct nu este mai mică decât eroarea impusă ε pentru
determinarea rădăcinii

f (x0 ) < ε (1.9)

atunci se evaluează dintre cele două subintervale (a, x0 ) şi ( x0 , b ) pe acela care


conţine soluţia. Evaluarea se face după semnul produsului valorilor funcţie la
capetele subintervalelor, adică:

f (a ) ⋅ f (x0 ) < 0 (1.10)

şi

f ( x0 ) ⋅ f (b ) < 0 (1.11)

Dacă este satisfăcută inegalitatea (1.10) atunci soluţia se caută în intervalul


(a, x0 ) , algoritmul continuând cu înjumătăţirea acestuia
a + x0
x m1 ≡ x1 = , ş.a.m.d (1.12)
2
Dacă inegalitatea (1.10) nu este satisfăcută, atunci în mod obligatoriu este
satisfăcută (1.11) şi soluţia se află în intervalul ( x0 , b ) , prin urmare algoritmul va
continua cu înjumătăţirea acestuia:

x0 + b
x m1 ≡ x1 = , ş.a.m.d.
2
Şirul valorilor succesive ale jumătăţilor de subintervale: x m0 , x m1 , x m2 ,.....
este convergent către soluţia exactă x r (figura1.1).

11
Methodes de calcul numerique en ingenierie electrique

Fig. 1.1. Prima iteraţie în metoda înjumătăţirii intervalului

Algoritmul iterativ de înjumătăţire se opreşte atunci când lungimea


subintervalelor obţinute în iteraţia n devine mai mică decât eroarea impusă soluţiei

bn − a n < ε (1.13)

Metoda înjumătăţirii intervalului este uşor de aplicat şi este sigur convergentă,


dar necesită un număr mare de evaluări ale funcţiei.
1.1.2. Metoda coardei sau metoda părţilor proporţionale determină
soluţia unică x r a ecuaţiei f ( x ) = 0 pe un interval (a,b), cu f : [a.b ] → ℜ continuă
pe [a, b] şi f (a ) ⋅ f (b ) < 0 , împărţind intervalul [a, b ] în două părţi proporţionale
cu valorile f (a ) şi f (b) .

12
Metode numerice în ingineria electrică

Fig. 1.2. Primele interaţii în metoda corzii

Astfel într-o primă aproximaţie se determină abscisa corespunzătoare


intersecţiei dintre coarda (dreapta) care uneşte punctele de coordonate (0, f (a )) şi
(b, f (b )) cu axa 0x:
a ⋅ f (b ) − b ⋅ f (a )
x1 = (1.14)
f (b ) − f (a )
Procesul iterativ de divizare proporţională a intervalului continuă în funcţie de poziţia
coardei faţă de grafic. Dacă coarda se află la stânga graficului, ca în figura 1.2 adică dacă

f (a ) ⋅ f ( x1 ) < 0 (1.15)
atunci se împarte în continuare subintervalul [a, x1 ] în părţi proporţionale iar
soluţia aproximativă în următorul pas este:
a ⋅ f (x1 ) − x1 ⋅ f (a )
x2 = (1.16)
f ( x1 ) − f (a )

În acest caz punctul de pornire al aproximaţiilor este punctul a = x0 , punctul b


rămâne fix iar deplasarea aproximaţiilor succesive se face de la stânga la dreapta.
Dacă coarda se află la dreapta graficului, adică dacă
f ( x1 ) ⋅ f (b ) < 0 (1.17)

13
Methodes de calcul numerique en ingenierie electrique

atunci se împarte în continuare subintervalul [x1 , b] în părţi proporţionale iar


soluţia aproximativă în următorul pas este:
x1 ⋅ f (b ) − b ⋅ f (x1 )
x2 = (1.18)
f (b ) − f ( x1 )

În acest caz punctul de pornire al aproximaţiilor este punctul b = x0 , punctul a


rămâne fix iar deplasarea aproximaţiilor succesive se face de la dreapta la stânga.
În final, valoarea x k este soluţie a ecuaţiei date dacă f ( x k ) < ε , ε fiind
eroarea impusă. Convergenţa metodei depinde de alegerea optimă a punctului de
pornire x0 . Condiţia de convergenţă (numită şi condiţia Fourier) este

f ( x0 ) ⋅ f '' ( x0 ) < 0 (1.19)

şi impune alegerea lui a sau b ca punct de pornire al algoritmului. Utilizarea acestei


condiţii presupune calcularea celei de-a doua derivate a funcţiei, ceea ce creşte
complexitatea calculului.
1.1.3. Metoda lui Newton rezultă în modul cel mai natural dintr-un
procedeu de liniarizare, în care se reţin din dezvoltarea în serie Taylor a funcţiei
f(x), f : [a, b] → ℜ, continuă pe [a, b] şi cu derivata continuă pe [a, b] , în jurul
punctului x0 , doar primii doi termeni. Astfel ecuaţia neliniară iniţială f ( x ) = 0 se
înlocuieşte cu ecuaţia liniară
f ( x0 ) = (x − x0 ) ⋅ f ' ( x0 ) (1.20)

a cărei soluţie este:

f ( x0 )
x1 = x0 − (1.21)
f ' (x0 )

Din punct de vedere geometric (figura 1.3) în metoda lui Newton x1 reprezintă
abscisa punctului de intersecţie a tangentei dusă la graficul funcţiei f(x) în punctul
de coordonate ( x0 , f ( x0 )) cu axa 0x. Rezultă relaţia recursivă pentru aproximaţia
soluţiei la pasul k+1:

f (xk )
x k +1 = x k − (1.22)
f ' (xk )

14
Metode numerice în ingineria electrică

Fig.1.3. Primele iteraţii în metoda Newton

Convergenţa metodei lui Newton depinde de alegerea punctului de plecare x0 .


Pentru ca algoritmul Newton să fie convergent către soluţia x r este necesar ca
punctul de pornire x0 să verifice condiţia:

f ( x0 ) ⋅ f '' ( x0 ) > 0 (1.23)

ceea ce conduce la necesitatea determinării derivatei de ordinul doi a funcţiei. În


plus, la fiecare pas al iteraţiei conform relaţiei (1.22) trebuie evaluată derivata de
ordinul unu a funcţiei, ceea ce necesită un efort mare de calcul.

1.2. Metode numerice de rezolvare


a ecuaţiilor algebrice

Se consideră ecuaţia algebrica polinomială de gradul n cu coeficienţi reali sau


complecşi scrisă în formă canonică:
n
Pn (x ) = ∑ an −i ⋅ xi = 0, an ≠ 0; Pn : ℜ → ℜ (1.24)
i =0

În algebra clasică se arată că este posibil să rezolvăm cu mijloace elementare doar


ecuaţiile cu grad n ≤ 3 . Pentru ecuaţiile al căror grad este mai mare decât 3 se folosesc
metode numerice care permit determinarea tuturor rădăcinilor fără a fi nevoie de o

15
Methodes de calcul numerique en ingenierie electrique

aproximaţie iniţială. În elaborarea algoritmilor iterativi se ţine seama de regulile legate


de existenţa rădăcinilor unei ecuaţii algebrice. Astfel, o ecuaţie de gradul n are
întotdeauna n rădăcini reale şi/sau complexe, iar rădăcinile reale pot avea un anumit
ordin de multiplicitate. Rădăcinile complexe sunt două câte două complex conjugate.
Dacă gradul n al ecuaţiei este impar, există cel puţin o rădăcină reală.
Pentru rezolvarea numerică a ecuaţiilor algebrice trebuiesc parcurse două etape:
1. Determinarea celor mai mici intervale [a, b] în interiorul cărora se găseşte o
singură soluţie a ecuaţiei date, etapă care se numeşte separarea rădăcinilor;
2. Calculul iterativ al rădăcinilor ecuaţiei, care vor fi limitele unor şiruri
convergente de numere: ( x k )k ≥0

lim ( x k )k ≥0 = x r (1.25)
k →∞

şi care se numesc metodele numerice de determinare a rădăcinilor ecuaţiilor algebrice.


Iteraţiile se opresc şi x k este considerată drept soluţiei a ecuaţiei date dacă
distanţa dintre doi termeni consecutivi ai şirului este mai mică decât o eroare impusă:

x k − x k −1 < ε 1 (1.26)

sau dacă valoarea polinomului în punctul respectiv este mai mică decât o altă
valoare impusă:

P(xk ) < ε 2 (1.27)

1.2.1 Metode de separare a rădăcinilor ecuaţiilor algebrice


1.2.1.1. Metoda şirului lui Rolle este o consecinţă a teoremei lui Rolle: dată
fiind ecuaţia algebrică Pn ( x ) = 0, Pn : ℜ → ℜ, Pn continuă şi derivabilă pe
ℜ , între două rădăcini reale şi consecutive ale ecuaţiei Pn' −1 ( x ) = 0 există cel mult
o rădăcină a ecuaţiei considerate.
Astfel, mai întâi se formează şirul crescător al rădăcinilor reale ale ecuaţiei
Pn' −1 = 0, x1 < x2 < .....xn −1 şi, apoi, se calculează şirul lui Rolle (şirul valorilor
funcţiei Pn ( x ) în punctele date de rădăcinile derivatei, la care se adaugă limitele la
± ∞ ): P(− ∞ ), P( x1 ), P(x 2 ),.......P( x n −1 ), P(∞ ) . În fiecare dintre intervalele
(− ∞, x1 ), (x1 x2 ),....., (xn−1 ,+∞ ),
există o rădăcină a ecuaţiei date, dacă şi numai
dacă la capetele intervalului considerat, funcţia P(x) ia valori de semne contrare.
Metoda şirului lui Rolle poate fi utilizată eficient doar pentru ecuaţii de grad cel mult
4, deoarece determinarea rădăcinilor ecuaţiei Pn' −1 ( x ) = 0 devine dificilă de rezolvat.

16
Metode numerice în ingineria electrică

1.2.1.2. Metoda şirului lui Sturm determină numărul de rădăcini reale dintr-un
interval şi separarea acestora pentru ecuaţia algebrică Pn(x) =0, cu Pn : ℜ → ℜ. Fie
a, b ∈ ℜ continuă şi derivabilă pe (a, b) . Se formează şirul lui Sturm asociat
funcţiei Pn ( x ) , ca fiind polinoamele p0 ( x), p1 ( x),.... pn ( x) continue pe (a,b) şi
care satisfac urm[toarele patru condiţii:
•) p 0 (x ) = Pn ( x )
• •) p1 ( x ) = Pn' −1 ( x )
• ••) pi ( x) = pi −1 ( x) ⋅ qi ( x) − pi − 2 ( x), i = 2, n (adică, polinomul pi (x ) este
restul cu semn schimbat al împărţirii polinomului pi − 2 ( x ) la pi −1 ( x ) ,
qi ( x ) fiind câtul acestei împărţiri)
• • • •) p n ( x ) ≠ 0, (∀)x ∈ [a, b] .
Metoda şirului lui Sturm este o consecinţă a următoarei teoreme: dacă funcţia
polinomială Pn ( x ) este derivabilă pe (a,b) şi cu derivata continuă,
Pn (a ) ≠ 0, Pn (b ) ≠ 0 şi admite un şir Sturm asociat: p0 ( x), p1 ( x),......., pn ( x),
atunci numărul rădăcinilor reale ale ecuaţiei Pn ( x ) = 0 în intervalul (a,b) este egal
cu diferenţa dintre numerele schimbărilor de semn ale şirurilor de numere
pi (a ) si pi (b ), i = 0, n .
Prin urmare teorema permite atât determinarea numărului rădăcinilor reale într-
un interval dar şi separarea acestora prin micşorarea lungimii subintervalelor
conţinute în intervalul dat.

1.2.2. Metode de determinare a rădăcinilor ecuaţiilor algebrice


1.2.2.1. Metoda Lobacevski-Graeffe determină rădăcinile reale şi complexe
ale ecuaţiei polinomiale Pn ( x ) = 0 . Polinomul Pn ( x ) se poate exprima cu două
relaţii echivalente:

( )
n n
Pn (x ) = ∑ a n−i x i = a 0 ∏ x − x j = 0, a 0 ≠ 0, ai ∈ ℜ, i = 0, n (1.28)
i =0 j =1

unde x j , j = 1, n sunt rădăcinile reale sau complex conjugate ale polinomului


considerat, care vor verifica relaţiile lui Vièta. Astfel, prima relaţie a lui Vièta este

a1
x1 + x 2 + ......... + x n = − (1.29)
a0

17
Methodes de calcul numerique en ingenierie electrique

Dacă una dintre rădăcini, să presupunem x1, este mult mai mare în modul decât
toate celelalte

x1 >> x j , j = 2, n (1.30)

atunci se poate accepta următoarea aproximaţie, ca rezultat al relaţiei (1.29)

a1
x1 ≅ − (1.31)
a0

În acest caz se spune că rădăcina x1 este preponderentă. Este evident că în


realitate nu vom putea accepta presupunerea că un polinom are o rădăcină
preponderentă. În schimb, se poate afirma întotdeauna ca una dintre rădăcini, fie
aceasta tot x1, este mai mare în modul decât toate celelalte x1 > x j , j = 2, n .
Dacă vom ridica la o putere m suficient de mare această inegalitate, atunci rădăcina
x1 va deveni preponderentă, adică

x1m >> x mj (1.32)

şi se va putea utiliza cu suficient de bună aproximaţie relaţia (1.31).


Algoritmul Lobacevski- Graeffe stabilişte o procedură de obţinere a relaţiei
(1.32), prin ridicarea succesivă la pătrat a rădăcinilor ecuaţiei date, adică
m = 2 p , p ∈ N * , ceea ce conduce la găsirea rădăcinii preponderente.
Procedura de calcul începe cu observaţia că dacă în expresia (1.28) a
polinomului Pn ( x ) se schimbă necunoscuta x cu –x se obţine:
n
(
Pn (− x ) = (− 1) ⋅ a 0 ⋅ ∏ x + x j
n
) (1.33)
j =1

Se efectuează produsul

(− 1)n ⋅ Pn (x ) ⋅ Pn (− x ) = a02 ⋅ ∏ (x 2 − x 2j )
n
(1.34)
j =1

şi se obţine un polinom de gradul n în variabilă x 2 , având rădăcini pe x12 , x22 ,... .


Se repetă acest procedeu de p ori se obţine un nou polinom de gradul m = 2 p
în variabilă x

18
Metode numerice în ingineria electrică

( )
n n
Q( x ) = a 0m ⋅ ∏ x m − x mj = ∑ (− 1) Ai( p ) ⋅ xi2 m
i
(1.35)
j =1 i =0

unde p = 1,2,.... Noii coeficienţi Ai( p ) obţinuţi în fiecare etapă de calcul p, rezultă
recursiv prin înmulţirea directă a polinoamelor Pn ( x ) şi Pn (− x ) , adică în
funcţie de coeficienţii iniţiali ai . În prima etapă de calcul rezultă:

A0(1) = a 02 ; A1(1) = a12 − 2a 0 a 2 ,...., An(1−)1 = − a n2−1 + 2a n −2 (1.36)

Dacă se notează cu Ai( p +1) valorile acestor coeficienţi obţinuţi în etapa p+1,
atunci prin procedeul de identificare a coeficienţilor prezentat anterior se obţine
relaţia recursivă

( )
Ai( p +1) = Ai( p )
2 n
+ 2 ∑ (− 1) ⋅ Ai(−pk) ⋅ Ai(+pk) , i = 0, n
k =0
k
(1.37)

unde se convine ca toţi termenii cu indicele inferior i + k > n şi, respectiv,


i − k < 0 să fie consideraţi nuli.
Pentru cele trei cazuri posibile de existenţă a rădăcinilor polinomului iniţial
Pn ( x ) , identificate cu ajutorul semnului şi valorilor noilor coeficienţi Ai( p ) în
diverse etape de ridicare succesivă la pătrat, se va prezenta aplicarea metodei
Lobacevski- Graeffe.

a) Cazul rădăcinilor reale şi distincte. Deci toate rădăcinile x j , j = 1, n ale


polinomului Pn ( x ) sunt reale şi distincte atunci ele se pot ordona descrescător
după module şi indici în forma:

x1 > x 2 > ....... > x n (1.38)

Relaţiile lui Vièta pentru polinomul Q( x ) obţinut în etapa p de calcul sunt:

A1( p )
x1m + x 2m + ............ + x nm = (1.39)
A0( p )
A2( p )
x1m ⋅ x2m + x1m ⋅ x3m + .... + xnm−1 ⋅ xnm = (1.40)
A0( p )
M
19
Methodes de calcul numerique en ingenierie electrique

An( p )
x1m ⋅ x 2m ....................... ⋅ x nm = (1.41)
A0( p )

în care termenii din dreapta sunt întotdeauna pozitiv, fiind pătrate perfecte.
p
Presupunând că în etapa p rădăcina x1m = x12 a devenit preponderentă, atunci
termenii x1m , x1m
⋅ x 2m , .........ş.a.m.d.
vor deveni preponderenţi în relaţiile
(1.39), (1.40),....... Prin urmare, se pot utiliza cu suficient de bună
aproximaţie relaţiile:

A1( p )
x1m ≅ (1.42)
A0( p )
A2( p )
x1m ⋅ x 2m ≅ (1.43)
A0( p )
M
An( p ) (1.44)
x1m ⋅ x 2m .... ⋅ x nm ≅
A0( p )

din care se obţin, succesiv – începând cu prima rădăcină x1 găsită a fi


prepondrentă– modulele rădăcinilor:

A (j p )
x j = ±m , j = 1, n (1.45)
A (j −p1)

Determinarea semnului rădăcinii se face prin introducerea celor două valori


date de relaţia (1.45) şi verificarea acestora în ecuaţia iniţială Pn ( x ) = 0 , ceea ce
suplimentează efortul de calcul.
Este necesar un criteriu care să oprească algoritmul de ridicarea succesivă la
pătrat, la o anumită etapă p în care se realizează preponderenţa celei mai mari
rădăcini în modul. Pentru acesta, în fiecare etapă de calcul se calculează rapoartele:

rj ( p)
=
( A( ) )
j
p −1 2
, j = 1, n − 1 (1.46)
A (j p )

20
Metode numerice în ingineria electrică

Dacă separarea rădăcinii preponderente s-ar fi produs în etapa p − 1 , adică


m
= 2 p −1 , atunci conform relaţiei (1.42)
2

A1( p −1)
m
p −1
x12 = x12 ≅ (1.47)
A0( p −1)

şi cu atât mai mult în etapa următoare

p A1( p )
x12 = x1m ≅ (1.48)
A0( p )

Ţinând seama de relaţia de recurenţă (1.37) şi de relaţiile (1.47), (1.48), se


calculează raportul

r1( p ) ≅ 1 (1.49)

Dacă se repetă procedura de calcul a acestor raportate pentru toţi ceilalţi


coeficienţi în fiecare etapă de calcul, atunci criteriul de oprire al algoritmului este:
dacă toate rapoartele r j( p ) , j = 1, n − 1 tind către 1 atunci s-a produs separarea
rădăcinilor polinomului.
b) Cazul rădăcinilor reale şi multiple în modul. Dacă se consideră că cea mai
mare rădăcină în modul a polinomului Pn ( x ) are ordinul de multiplicitate M,
atunci ordinea descrescătoare a rădăcinilor polinomului este:

x1 = x 2 = ........ = x M > x M +1 > ....... > x n (1.50)

Prima relaţie a lui Vièta va avea un termen preponderent:

A1( p )
x1m + x 2m + ....... + x M
m m
+ xM m m
+1 + .. + x n ≅ M ⋅ x1 ≅ (1.51)
A0( p )

iar în M-a relaţia lui Vièta va avea ca termen preponderent:

x1m ⋅ x 2m ...... ⋅ x M
m
+ x1m ⋅ x 2m ..... ⋅ x M
m m m m
−1 ⋅ x M +1 + ...... + x n − M ⋅ .... ⋅ x n ≅

AM( p ) (1.52)
≅ x1m ⋅ x 2m ⋅ .... ⋅ x M
m
= ( x1 )m⋅M ≅ ( p)
A0

21
Methodes de calcul numerique en ingenierie electrique

Calculul rădăcinii M-multiple în modul se face utilizând relaţia (1.52) prin care
se obţine o aproximaţie de calcul mai bună având în vedere exponentul mai mare:

AM( p )
x1 = ± mM (1.53)
A0( p )

iar determinarea semnului se face prin verificarea ecuaţiei iniţiale Pn ( x ) = 0 .


Criteriul de separare se determină asemănător cu cel din cazul rădăcinilor reale
şi distincte. Dacă separarea rădăcinilor preponderente, M-multiple în modul, s-ar fi
realizat în iteraţia p-1, atunci conform relaţiei (1.51) ar trebui ca

An( p −1)
m
p −1
x12 = x12 ≅ (1.54)
M ⋅ A0( p −1)

şi, cu atât mai mult, în iteraţia următoare p este valabilă aproximaţia

p A1( p )
x12 = x1m ≅ (1.55)
M ⋅ A0( p )

Din relaţiile (1.37), (1.54) şi (1.55) rezultă că raportul r1( p ) tinde către M

r1p ≅ M (1.56)

ceea ce va constitui şi criteriul de separare a rădăcinilor multiple în modul: dacă un


raport r j( p ) tinde într-o etapă oarecare p către un număr întreg M, atunci s-a
produs separarea rădăcinii preponderente M- multiple în modul.
În cazul în care rădăcina M- multiplă în modul nu este şi cea mai mare în
modul, adică şirul descrescător al rădăcinilor ecuaţiei Pn ( x ) = 0 se constituie în:

x1 > x 2 > ..... > x k = x k +1 . = .. = x k + M −1 > x k + M > ...... > x n (1.57)

atunci în relaţiile anterioare (1.53) ÷ (1.56) se aplică o deplasare spre dreapta cu k a


indicilor inferiori. Astfel, calculul rădăcinii M- multipli în modul se face cu relaţia:

Ak( +p )M
x k = ± m⋅M (1.58)
Ak( p )

iar criteriul de separare se aplică asupra raportului

22
Metode numerice în ingineria electrică

rk( p ) ≅ M (1.59)

care dacă tinde către numărul întreg M arată că s-a separat rădăcina M- multiplă.
c) Cazul rădăcinilor complexe. Se presupunem că rădăcinile complexe şi
conjugate x1 şi x2 ale ecuaţiei Pn ( x ) = 0 au şi cel mai mare modul adică:

x1 = x 2 > x3 > ....... > x n (1.60)

Rădăcinile x1 şi x2 complex conjugate se scriu ca

x1 = ρ ⋅ e jθ , x 2 = ρ ⋅ e − jθ (1.61)

unde ρ = x1 = x 2 este modulul rădăcinilor iar θ = arg x1 = − arg x 2 este


argumentul acestora. Prima relaţie a lui Vièta pentru pasul p al iteraţiilor devine

A1( p )
2 ρ m ⋅ cos mθ + x3 + ..... + x nm = (1.62)
Ao( p )

dar termenul 2 ρ m ⋅ cos mθ nu poate fi considerat preponderent din cauza


factorului cos mθ cu semn oscilant. Cea de a doua relaţia a lui Vièta este

A2( p )
x1m ⋅ x 2m + x1m ⋅ x3m + ..... + x nm−1 ⋅ x nm ≅ ρ 2 m ≅ (1.63)
A0( p )

ceea ce conduce la găsirea termenului preponderent ρ 2 m şi la determinarea


modului rădăcinilor complexe şi conjugate în mod asemănător unei rădăcini reale
2- multiple în modul

A( p )
ρ = 2 m 2( p ) (1.64)
A 0

semnul fiind evident.


Determinarea criteriului de separare se face astfel: dacă separarea s-ar fi
realizat în etapa p-1, atunci ar trebui ca

23
Methodes de calcul numerique en ingenierie electrique

m
2 p −1 A2( p −1)
ρ = ρ2 ≅ (1.65)
A0( p −1)

şi cu atât mai mult în iteraţia următoare

A2( p )
ρ 2p = ρ m ≅ ( p) (1.66)
A0

Ca atare raportul r2( p ) trebuie să tindă către 1

r2( p ) ≅ 1, (1.67)

iar raportul

( p)
r1 =
(A( ) )1
p −1 2
(1.68)
A0( p )

are semn oscilant datorită schimbărilor de semn ale termenului 2 ρ m ⋅ cos mθ .


Prin urmare, prezenţa rădăcinilor complexe şi conjugate va fi identificată prin
apariţia unui raport cu semne oscilante, iar separarea modulului unei perechi de
astfel de rădăcini se produce atunci când raportul imediat următor celui oscilant
tinde către unu.
Determinarea argumentului rădăcinilor complexe şi conjugate se face utilizând
relaţiile lui Vièta pentru ecuaţia iniţială Pn ( x ) = 0.

1.2.2.2. Schema lui Horner foloseşte proprietatea unui polinom de a fi


divizibil cu x − α , dacă α este o rădăcină simplă a polinomului. În acest sens,
polinomul de gradul n, Pn (x) se poate aproxima în forma:

n n −1
Pn ( x) = ∑ an − j x j = ( x − α ) ∑ bn −1− j x j + bn (1.69)
j =0 j =0

unde noii coeficienţi bj, j = 0,..., n se determină recursiv prin identificarea


termenilor cu aceeaşi putere a lui x.

b0 = a0 , bk = ak + αbk −1 , k = 1,..., n (1.70)

24
Metode numerice în ingineria electrică

relaţii ce definesc schema Horner. Aceste relaţii permit determinarea valorii


polinomului în x = α , adica Pn (α ) , prin ,,n’’ operaţii de înmulţire şi ,,n-1’’ operaţii
de adunare, ceea ce rezultă chiar din (1.69) când pentru x = α , Pn (α ) = bn .
Schema lui Horner poate fi adaptată şi pentru evaluarea derivatelor unui polinom.
Folosind observaţia că Pn (α ) = bn , se poate considera pentru fiecare aproximaţie a
rădăcinii α că Pn (α ) = bn (α ) , şi din relaţiile recursive (1.70), prin derivare rezultă:

dbk db
= bk −1 + α k −1 , k = 1,.., n (1.71)
dα dα
Se obţin pentru noii coeficienţi ai derivatei polinomului, notaţi cu

dbk −1
ck = , k = 1,..., n (1.72)

următoarele relaţii recursive

c0 = b0 , ck = bk + αck −1 , k = 1,..., n - 1 (1.73)

iar valoarea derivatei polinomului în x = α este

Pn (α ) = cn −1 (1.74)

Dacă se consideră că polinomul are în x = α o rădăcină simplă, atunci dată


fiind aproximaţia iniţială α 0 a rădăcinii simple (obţinută spre exemplu cu metoda
Lobacevski Graeffe), procedeul Newton-Raphson de creştere a preciziei
aproximaţiei iniţiale se exprimă în fiecare etapă de calcul

bn (α m )
α m +1 = α m − (1.75)
cn −1 (α m )

unde bn, cn-1 sunt calculaţi folosind (1.71) şi (1.73). Algoritmul se încheie dacă
valoarea polinomului este mai mică decât o eroare impusă ε .
Dacă α este o rădăcină multiplă, atunci derivata polinomului în α va fi nulă
Pn' (α ) = 0 , iar bn şi cn-1 vor tinde spre 0 simultan. În acest caz convergenţa
procedeului Newton-Raphson dat de relaţia (1.74) se înrăutăţeşte.
Pentru îmbunătăţirea convergenţei se utilizează o modificare simplă, şi anume
1
se aplică procedeul Newton-Raphson funcţiei f ( x ) = [ Pn ( x)] M , unde M este

25
Methodes de calcul numerique en ingenierie electrique

1− M
1 '
ordinul de multiplicitate al rădăcinii α . Deoarece f ( x) = '
[ Pn ( x)] M iteraţia
M
Newton-Raphson se exprimă

bn (α m )
α m +1 = α m − M (1.76)
cn −1 (α m )

ceea ce este similar cu algoritmul (1.75). Determinarea lui M se face prin evaluarea
derivatelor polinomului Pn (x) , iar prima derivată ce este nenulă va furniza
multiplicitatea rădăcinii.
Pentru evaluarea derivatelor se foloseşte schema lui Horner completă, adică
determinarea tuturor derivatelor lui Pn (x) în x = α este echivalentă cu
dezvoltarea în serie Taylor a polinomului Pn (x) în jurul punctului x = α

Pn ( x) = C0 + C1 ( x − α ) + C2 ( x − α ) 2 + ... + Cn ( x − α ) n (1.77)

unde s-a notat cu

Pn( k ) (α )
Ck = (1.78)
k!
Din relaţiile (1.69) şi (1.70) se obţin coeficienţii polinomului Pn−1 ( x)

Pn ( x) = ( x − α ) Pn −1 ( x) + Co (1.79)

iar

C0 = Pn (α ) (1.80)

Prin urmare coeficienţii polinomului Pn−1 ( x) sunt chiar b0,b1,….bn-1 daţi de


relaţia (1.69). În continuare celelalte derivate ale polinomului se evaluează analog.
Astfel se mai aplică o dată schema lui Horner asupra polinomului Pn−1 ( x) şi se vor
obţine coeficienţii lui Pn− 2 ( x) din factorizarea:

Pn −1 ( x) = ( x − α ) Pn − 2 ( x) + C1 (1.81)

26
Metode numerice în ingineria electrică

1.2.2.3. Metoda lui Bairstow permite determinarea rădăcinilor reale şi


complex conjugate ale ecuaţiei Pn ( x ) = 0, prin calculul iterativ al unui divizor de
ordinul doi al polinomului considerat.
Polinomul Pn ( x ) se poate scrie

n
( )n−2
Pn (x ) = ∑ ai x i = x 2 + px + q ∑ b j ⋅ x j + Rx + S
i =o j =2
(1.82)

unde x 2 + px + q este un trinom oarecare de ordinul doi iar Rx+S este restul
împărţirii lui Pn ( x ) la x 2 + px + q . Dacă extindem notaţiile şi pentru coeficienţii R
şi S, adică notăm R = bn−1 şi S = bn + pbn −1 , atunci din identificarea termenilor
cu acelaşi puteri ale lui x, va rezulta relaţia de recurenţă pentru noii coeficienţi

bk = a k − pbk −1 − qbk −2 , k = 0, n (1.83)

unde vom considera b− 2 = b−1 = 0 . Evident că dacă x 2 + px + q divide pe Pn ( x )


trebuie ca restul să fie nul, adică

R ( p, q ) = 0
(1.84)
S ( p, q ) = 0

unde R şi S depind de p şi q. Sistemul neliniar (1.84) este echivalent cu:

bn ( p, q ) = 0
(1.85)
bn−1 ( p, q ) = 0

Fiecare ecuaţie a sistemului (1.85) este neliniară şi pentru rezolvare se vor


dezvolta în serie Taylor funcţiile bn ( p, q ) şi bn −1 ( p, q ) în jurul aproximaţiei
curente ( p m , q m ) . Dacă se păstrează numai termenii liniari se obţine sistemul:

⎛ ∂b ⎞ ⎛ ∂b ⎞
bn ( p, q ) ≅ bn ( p m , q m ) + ( p − p m )⎜⎜ n ⎟⎟ + (q − q m )⎜⎜ n ⎟⎟ =0
⎝ ∂p ⎠ p = pm ⎝ ∂q ⎠ q = qm
⎛ ∂b ⎞ ⎛ ∂b ⎞
bn −1 ( p, q ) ≅ bn −1 ( p m −1 , q m −1 ) + ( p − p m −1 )⎜⎜ n−1 ⎟⎟ + (q − q m −1 )⎜⎜ n −1 ⎟⎟ =0
⎝ ∂p ⎠ p = pm −1 ⎝ ∂q ⎠ q = qm −1

(1.86)

27
Methodes de calcul numerique en ingenierie electrique

Calculul derivatelor parţiale se poate face folosind relaţia de recurenţă (1.83)

∂bk ∂b ∂b
= −bk −1 − p k −1 − q k −2
∂p ∂p ∂p
(1.87)
∂bk ∂b ∂b
= −bk −2 − p k −1 − q k − 2
∂q ∂q ∂q

Ideea ingenioasă a metodei constă în faptul că derivatele parţiale necesare


iteraţiei următoare se pot calcula cu ajutorul unor formule recursive de tipul relaţiei
∂bk ∂bk
(1.83). Astfel dacă notăm cu c k = şi dk = , rezultă că relaţiile
∂p ∂q
(1.87) se pot scrie în forma:

c k = −bk −1 − pc k −1 − qc k −2
(1.88)
d k = −bk −2 − pd k −1 − qd k − 2 , k = 0, n

unde se consideră c − 2 = c −1 = d − 2 = d −1 = 0
Sistemul liniarizat numai după prima relaţie (1.88) devine:

( pm +1 − pm ) ⋅ cn + (qm+1 − qm ) ⋅ cn −1 = −bn
(1.89)
( pm +1 − pm ) ⋅ cn −1 + (qm +1 − qm ) ⋅ cn − 2 = −bn −1
În mod analog se obţine sistemul de liniarizat şi dacă se foloseşte cea de-a doua
relaţie (1.88).
⎡ cn c n−1 ⎤
Matricea sistemului J = ⎢ se numeşte şi matricea Jacobiană şi este
⎣c n−1 c n −2 ⎥⎦
nesingulară dacă det J ≠ 0 . În acest caz se calculează soluţia sistemului (1.89).

bn−1 ⋅ c n −1 − bn ⋅ c n− 2
δp = p m+1 − p m = (1.90)
c n ⋅ c n− 2 − c n2
bn ⋅ c n−1 − bn −1 ⋅ c n
δq = q m+1 − q m = (1.91)
c n ⋅ c n −2 − c n2

unde c n ⋅ c n − 2 − c n2 = det J .
Întregul proces de calcul se poate relua pentru polinomul de gradul n-2

28
Metode numerice în ingineria electrică

n
Pn− 2 (x ) = ∑ b j ⋅ x j (1.92)
j =2

unde coeficienţii acestui polinom sunt tocmai ultimele valori calculate cu ajutorul
relaţiei (1.83). Algoritmul continuă până la factorizarea polinomului Pn ( x ) în
produse de polinoame de grad cel mult doi şi se obţin perechi de soluţii de forma:

− p± p 2 − 4q
x1, 2 = (1.93)
2
În ceea ce priveşte alegerea aproximaţiei iniţiale ( p 0 , q0 ) aceasta se poate
obţine printr-un procedeu de localizare a rădăcinilor, cum ar fi de exemplu metoda
Lobacevski-Graeffe. Asupra convergenţei metodei Bairstow, din punct de vedere
practic se poate prezenta un caz de neconvergenţă: dacă Pn ( x ) are o singură
rădăcină reală şi r 2 + rp 0 + q 0 = 0 , atunci metoda Bairstow nu converge pentru
valorile iniţiale ( p 0 , q0 ) .

29
Methodes de calcul numerique en ingenierie electrique

Capitolul 2

Metode numerice de rezolvare


a sistemelor de ecuaţii liniare

Rezolvarea numerică a sistemelor liniare de ecuaţii reprezintă un domeniu de


mare interes teoretic şi aplicativ, care elimină dificultăţile regulii de Cramer mai
ales când numărul ecuaţiilor sistemului este mare.
Metodele de rezolvare a sistemelor liniare de ecuaţii sunt de două tipuri:
a) metode exacte (metode directe) sunt cele la care soluţia exactă a sistemului
se obţine printr-un număr finit şi dinainte cunoscut de operaţii aritmetice;
b) metode aproximative (iterative) care sunt caracterizate prin aceea că soluţia
rezultă în urma unui proces pas cu pas, iterativ, ca limită a unui şir convergent şi
care porneşte de la o aproximaţie iniţială.
În cele ce urmează se va prezenta o parte a metodelor directe de rezolvare a
sistemelor de ecuaţii liniare.
În ingineria electrică problema rezolvării numerice a sistemelor liniare de
ecuaţii este foarte des întâlnit, ca de exemplu în interpolarea cu funcţiile spline
cubice a caracteristicilor elementelor de circuit, la rezolvarea sistemelor de
ecuaţii ale circuitelor electrice şi electronice, la discretizarea ecuaţiilor
diferenţiale neliniare cu condiţii la limită utilizate în analiza câmpului
electromagnetic etc.

2.1. Metode de eliminare utilizate în rezolvarea


numerică a sistemelor liniare de ecuaţii

Fie funcţia f : ℜ 2 → ℜ n şi f ( x ) = 0 un sistem de ecuaţii. Dacă termenii


ecuaţiilor sistemului sunt de gradul întâi sistemul este liniar iar dacă există ecuaţii
ce conţine cel puţin un termen de grad mai mare ca unu sistemul este neliniar.

30
Metode numerice în ingineria electrică

Un sistem liniar cu n necunoscute poate fi scris în formă canonică dezvoltată

a11x1 + a12 x2 + ... a1n xn = b`1


a21x1 + a22 x2 + .... a2 n xn = b2
. . . .
(2.1)
. . . .
. . . .
an1x1 + an 2 x2 + .... ann xn = bn

sau în formă matriceală restrânsă

AX = B (2.2)
unde A este matricea pătrată a sistemului (a coeficienţilor) de dimensiuni nxn

⎛ a11 a12 a1n ⎞


⎜ . . . ⎟⎟

A=⎜ . . . ⎟ (2.3)
⎜ ⎟
⎜⎜ . . . ⎟
⎝ a n1 a n 2 ... a nn ⎟⎠
⎛ x1 ⎞
⎜ . ⎟
⎜ ⎟
X este vectorul coloană 1xn al necunoscutelor X = ⎜ . ⎟ (2.4)
⎜ ⎟
⎜⎜ . ⎟⎟
⎝ xn ⎠

⎛ b1 ⎞
⎜ . ⎟
⎜ ⎟
şi B este vectorul coloană 1xn al termenilor liberi B = ⎜ . ⎟ (2.5)
⎜ ⎟
⎜⎜ . ⎟⎟
⎝ bn ⎠

2.1.1. Metoda lui Gauss rezolvă sistemele de ecuaţii liniare care au


matricea sistemului pătrată şi nesingulară (det A ≠ 0 ) , printr-un algoritm de
eliminare succesivă a necunoscutelor. Asfel, dacă se înmulţeşte prima ecuaţie a

31
Methodes de calcul numerique en ingenierie electrique

ai1
sistemului (2.1), pe rând cu factorii − , pentru i = 2, n şi apoi se adună la
a11
ecuaţia cu numărul i, se va elimina necunoscuta x1 din fiecare ecuaţie, evident cu
excepţia primei ecuaţii. Se obţine sistemul echivalent:

a11 x1 a12 x 2 ..........a1n x n = b1


(1) (1)
a 22 x 2 ...............a 2(1n) x n = b2 (2.6)
.
.
(1) (1)
(1)
a n 2 x 2 ...............a nn x n = bn

unde s-au notat noii coeficienţi obţinuţi în această primă etapă de calcul cu indice
superior(1). De asemenea este evident că în prima ecuaţie a sistemului coeficienţii
nu se modifică. Algoritmul se continuă prin înmulţirea celei de-a doua ecuaţii a
ai 2
sistemului (2.6) cu − , pentru i = 3, n şi apoi adunându-o la fiecare ecuaţie i a
a 22
sistemului se va elimina necunoscuta x2. Se obţine sistemul echivalent:

a11 x1 + a12 x 2 + ........ + a1n x n = b1


(1)
a 22 x 2 + .......... + a 2(1n) x n = b2(1)
(2 )
a33 x3 + ..... + a3(2n) x n = b3(2 )
(2.7)
.
.
(2 ) (2 )
a n3 x3 + ...... + a nn x n = bn(2 )
Procedeul de eliminare a necunoscutelor continuă până când se aduce sistemul
la forma:

a11 x1 + .................... + a1n x n = b1


(1)
a 22 x 2 + ........... + a 2(1n) x n = b2(1) (2.8)
a n(n1−1) x n = bn(n −1)

ceea ce este echivalent cu reducerea matricei A la o matrice superioar


triunghiulară. În acest caz ecuaţia matriceală a sistemului devine

32
Metode numerice în ingineria electrică

⎛ a11 .. . . a1n ⎞ ⎛ x1 ⎞ ⎛ b1 ⎞
⎜ (1) ⎟ ⎜ ⎟ ⎜ ⎟
⎜ 0.. a 22 . a 2(1n) ⎟ ⎜ . ⎟ ⎜ b2(1) ⎟
⎜ 0.. ⋅ = (2.9)
. ai(,i −j 1) .. ai(,in−1) ⎟ ⎜ . ⎟ ⎜ . ⎟
⎜ ⎟ ⎜ ⎟ ⎜ ⎟
⎜ 0.. . . ( n −1) ⎟ ⎜
a nn x ⎟ ⎜ b (n −1) ⎟
⎝ ⎠ ⎝ n⎠ ⎝ n ⎠
unde indicii superiori indică etapa în care a fost obţinut respectivul element.
Această etapă de aducere a matricii A la forma triunghiulară se numeşte
eliminare sau triangularizare iar fiecare din elementele akk, cu k = 1, n aflate pe
diagonala principală se numeşte pivot. Este evident că în cursul algoritmului pentru
a putea opera, trebuie ca toţi pivoţii să fie nenuli. Mai mult, pentru reducerea
erorilor de rotunjire se recomandă ca valoarea pivotului, în modul să fie cât mai
mare posibilă. Pentru rezolvarea acestor două cerinţe se utilizează procedura de
pivotare, adică de permutare (schimbare) a liniilor (sau a liniilor şi coloanelor).
Pivotarea, efectuată într-o anumită etapă de calcul nu modifică zerourile deja
obţinute în matricea A. Mai multe explicaţii în ceea ce priveşte procedurile de
pivotare şi de alegere a pivotului se dau la capitolul 2.2, paragraful iii.
Necunoscutele se determină după n-1 etape de eliminare şi din (2.8) rezultă, pe
rând, începând cu ultima

bn(n −1)
xn = ( n −1)
a nn
bn(n−1− 2 ) − a nn−−12 ⋅ x n
x n −1 =
a n(n−−1,2n)−1
⋅ (2.10)

n n
bi(i −1) − ∑ ai(,i −j 1) ⋅ x j
j =i +1
b1 − ∑ a1, j ⋅ x j
j =2
xi = x1 =
aii(i −1) a11

Această etapă de determinare a necunoscutelor se numeşte retrosubstituţie.


Este interesant să se analizeze complexitatea metodei Gauss. Astfel, în ceea ce
priveşte efortul de calcul, trecerea de la pasul k la pasul k+1 al algoritmului
presupune efectuarea a:

(n − k )(n − k + 1) înmulţiri, (n − k )(n − k + 1) adunări şi (n − k ) împărţiri.

33
Methodes de calcul numerique en ingenierie electrique

Prin urmare, la sfârşitul etapelor de calcul se vor efectua în total:


n −1
n(n 2
−1 ) înmulţiri
∑ (n − i )(n − i + 1) =
i =1 3
n −1
n(n 2
−1 ) adunări
∑ (n − 1)(n − i + 1) =
i =1 3
n −1
n(n − 1)
∑ (n − 1)
i =1
=
2
împărţiri

operaţii pentru triangularizarea matricei A, iar pentru retrosubstituire se vor efectua:


n −1
n(n − 1)
∑ (n − i ) =
i =1 2
înmulţiri

(n − i ) = n(n − 1) adunări
n −1


i =1 2
Adunând tipurile de operaţii efectuate în total în cele două etape se obţine
pentru metoda Gauss un total de:

n(n − 1)(2n + 5) n(n − 1)(2n + 5) n(n + 1)


înmulţiri, adunări şi împărţiri.
6 6 2
Considerând că timpul necesar calculatorului pentru a efectua o înmulţire sau o
împărţire este mult mai mare decât cel consumat pentru o adunare, atunci se poate
presupune că efortul de calcul necesar calculatorului în metoda Gauss este
proporţional numai cu numărul de înmulţiri şi împărţiri, adică:

n(2n 2 + 6n − 2)
ϑG ≅ (2.11)
6
Acest număr este foarte mic, începând cu n ≥ 3 , faţă de numărul de operaţii
cerute de regula lui Cramer (cu determinanţii calculaţi după minori):

θ C = n ⋅ n! (2.12)

Adică ϑG << ϑC (2.13)


În ceea ce priveşte necesarul de memorie utilizat în metoda Gauss, pentru
memorarea matricei A şi a vectorilor B şi X necesare: n 2 + n + n = n(n + 2 )
locaţii de memorie, fiecare locaţie fiind rezervată unui număr real. Locaţii egale de
memorie sunt necesare şi în regula lui Cramer.

34
Metode numerice în ingineria electrică

2.1.2. Metoda Gauss-Jordan sau metoda matricială formală este


similară metodei precedente, cu deosebirea că matricea A a sistemului A este adusă
la o matrice diagonală (cu elemente nenule numai pe diagonala principală).
Producerea de zerouri deasupra şi dedesubturi diagonalei principale se face prin
transformări elementare aplicate ecuaţiei matriceale iniţiale (2.2). Astfel noii
coeficienţi ai matricei A sunt:

în prima etapă de calcul: a ij(1) = aij (2.14)

ai(,kk−−11)
iar în etapa k: aij(k ) = aij(k −1) − (k −1) ⋅ a k(k−−11) i ≠ k − 1, j ≥ k − 1 (2.15)
a k −1, k −1

a k(k−)1, j = a k(k−−11,j) j ≥ k −1
ai(,kj) = aij(k −1) j < k −1

Noii coeficienţi ai matricei B sunt:

în prima etapă de calcul: bi(1) = bi (2.16)

ai(,kk−−11)
bi(k ) = bi(k −1) − i ≠ k −1
iar în etapa k: a k(k−−11,k)−1 (2.17)
(k ) ( k −1)
bk −1 = bk −1 k = 2, n

Determinarea necunoscutelor nu se mai face prin retrosubstituire ci direct,


printr-o singură împărţire.
Numărul de operaţii în metoda Gauss-Jordan este cu circa 50% mai mare faţă
de metoda Gauss, deoarece în fiecare etapă k se calculează n-1 multiplicatori:
n
n3 3n
ϑG − J = ∑ [(n − 1) + (n − 1)(n + 1 − k )] = + n2 − (2.18)
k =1 2 2

Din cauza numărului mărit de operaţii, metoda Gauss-Jordan se utilizează


mai ales la calculul numeric al matricei inverse, ceea ce presupune aducerea
matricei A la o matrice unitate (elementele nenule de pe diagonala principală să
fie egale cu 1).

35
Methodes de calcul numerique en ingenierie electrique

2.1.3. Metoda lui Jacobi


Sistemul de ecuaţii:

a1,1x1 + a1,2 x2 + .... + a1, n xn = b1


a2,1 x1 + a2,2 x2 + .... + a2, n xn = b2
(2.19)
..................................................
an,1 x1 + an,2 x2 + .... + an, n xn = bn

se rescrie în sensul exprimării fiecărei necunoscute x1,x2,…..xn în funcţie de toate


celelalte şi se obţine:

b1 a a
x1 = − − 0 − 1, 2 x2 − ......... − 1, n xn
a1,1 a1,1 a1,1
b2 a a
x2 = − − 2,1 x1 − 0........... − 2, n xn
a2, 2 a2, 2 a2, 2 (2.20)
................................................................
b a a
xn = − n − n,1 x1 − ... − n, n −1 xn − 0
an, n an, n an, n

Dacă se alege ca aproximare iniţială o soluţie ( x1(0) , x2(0) ,...., xn(0) ) a sistemului,
atunci soluţiile (2.20) vor reprezenta formulele de recurenţă pentru calculul iterativ
al tuturor soluţiilor sistemului. Compact aceste relaţii se pot pune pentru
exprimarea necunoscutei xi în iteraţia k

bi ai1 ( k −1) ai 2 ( k −1) a a a


xi( k ) = − x1 − x2 − ... − i ,i −1 xi(−k1−1) − i ,i +1 xi(+k1−1) − ... in xn( k −1)
aii aii aii aii aii aii
(2.21)

Dacă şirurile iteraţiilor succesive pentru determinarea necunoscutei xi


unde i = 1, n , sunt convergente pentru k → ∞ , atunci limitele
( xi(0) , xi(0) ,...., xi( k ) ) ,
şirului dat de (2.21) reprezintă chiar soluţiile sistemului considerat.
Pentru obţinerea condiţiei de convergenţă a şirurilor (2.21) se exprimă, la
început, ecuaţia matriceală asociată sistemului (2.20)

X (1) = CX (0) + D (2.22)

36
Metode numerice în ingineria electrică

unde
⎛ b1 ⎞
⎛ 0 − a1, 2 .......... − a1,n ⎞ ⎜ ⎟
⎜ a1,1 a1,1 ⎟ ⎜ a1,1 ⎟
⎛ x1 ⎞ ⎜ ⎟ ⎜ b ⎟
⎜ ⎟ ⎜ a 2,1 a 2,n ⎟
⎜ x2 ⎟ − 0 .......... .. − ⎜ 2 ⎟
X = ⎜ ⎟ , C = ⎜ a 2, 2 a 2 , 2 ⎟ , D = ⎜ a 2, 2 ⎟ (2.23)
... ⎜ ⎟ ⎜ ⎟
⎜ ⎟ ⎜ ................................. ⎟
⎜x ⎟ ⎜ ...... ⎟
⎝ n⎠ ⎜ a n ,1 ⎟ ⎜ b ⎟
⎜ − a ......................0 ⎟ ⎜⎜ n ⎟⎟
⎝ n ,n ⎠
⎝ an, n ⎠

Continuând procedura iterativă se obţin succesiv ecuaţiile matriceale:

X ( 2) = CX (1) + D = C 2 X (0) + CD
..................................................... (2.24)
(k ) k ( 0) k −1 k −2
X =C X + (C +C + ... + C + I ) D

unde I este matricea unitate nxn. Seria matriceală geometrică

S = C k −1 + C k − 2 + ... + C + I (2.25)

este convergentă atunci când norma sau toate valorile proprii ale matricei C sunt
subunitare. Condiţia ca toate valorile proprii ale matricei sa fie subunitare este ca

ai , j
qi = ∑ ai ,i
〈1, i = 1,..., n (2.26)
j =1
j ≠i
iar relaţia (2.26) este necesar a fi îndeplinită pentru ca metoda Jacobi să fie
aplicată.
În condiţia (2.26) suma seriei este:

S = ( I − C ) −1 (2.27)

ceea ce implică

lim C k -1 = 0, X = (I - C) -1 D, X = CX + D
k→∞

unde X este vectorul tuturor soluţiilor ecuaţiei (2.22).

37
Methodes de calcul numerique en ingenierie electrique

2.1.4 Metoda Gauss-Seidel diferă de metoda lui Jacobi prin faptul că la


fiecare iteraţie se utilizează valorile calculate la pasul anterior pentru variabilele ale
căror valori nu sunt cunoscute la pasul curent şi valorile de la pasul curent pentru
variabilele calculate.
În acest caz relaţia (2.21) se scrie în forma:

bi i −1 a n a
i, j (k ) i , j ( k −1)
xi( k ) = −∑ xj − ∑ xj pentru i = 1,..., n, k = 1,.., n. (2.28)
ai ,i j =1 ai ,i j = i +1 ai ,i

În rest, metoda Gauss-Seidel este similară cu metoda Jacobi. Pentru acelaşi


grad de precizie viteza de convergenţă a metodei Gauss-Seidel este de două ori mai
mare decât viteza de convergenţă a metodei lui Jacobi.

2.2. Metode de rezolvare numerică


a sistemelor de ecuaţii prin factorizare

Fie sistemul

[A][X] = [Y] (2.29)

unde [X] este vectorul de N necunoscute, [Y] este vectorul de termeni liberi, şi [A]
este matricea pătratică (de dimensiune NxN) a coeficienţilor;
Factorizarea constă în reprezentarea matricei coeficienţilor [A] prin produsul
de două matrici

[ A] = [ L ][U ] (2.30)

unde [L]este o matrice inferioară-stânga („Lower” - în engleză), ai cărei termeni non


nuli se găsesc exclusiv sub diagonala principală şi pe aceasta, iar [U] este o matrice
superioară-dreapta („Upper” - în engleză), ai cărei termeni non nuli se găsesc exclusiv
sub diagonala principală. Termenii de pe diagonala principală a lui [U] sunt 1.

⎛x ⎞ ⎛1 x x x x⎞
⎜ ⎟ ⎜ ⎟
⎜x x ⎟ ⎜ 1 x x x⎟
[ L] = ⎜ x x x ⎟ [U ] = ⎜ 1 x x⎟ (2.31)
⎜ ⎟ ⎜ ⎟
⎜x x x x ⎟ ⎜ 1 x⎟
⎜x x x x x ⎟⎠ ⎜ 1 ⎟⎠
⎝ ⎝

38
Metode numerice în ingineria electrică

După factorizare, sistemul devine:

[L][U][X]=[Y] (2.32)

Putem introduce un vector auxiliar:

[U][X]=[Z] (2.33)

Astfel, sistemul se descompune în două etape:


Etapa 1 – „parcurs direct”: pentru a calcula [Z], soluţie a sistemul:

[L][Z]=[Y] (2.34)

Etapa 2 – „parcurs invers”: pentru a calcula [X], soluţie a sistemului:

[U][X]=[Z] (2.35)

La prima vedere, cele două etape par să complice procedura. În realitate, vom
constata că nu este adevărat.
i) Prima etapă – factorizarea matricei coeficienţilor sistemului
Există mai multe variante de factorizare. Vom studia principalele două metode:
factorizarea lui Crout şi cea a lui Doolittle.

• Factorizarea lui Crout


Să începem printr-un exemplu. Fie o matrice de mărime 4x4 şi factorizarea sa LU:

⎛ A11 A12 A13 A 14 ⎞ ⎛ L11 0 0 0 ⎞ ⎛ 1 U12 U13 U 14 ⎞


⎜ ⎟ ⎜ ⎟
⎜ A21 A22 A23 A 24 ⎟ ⎜ L21 L22 0 0 ⎟ ⎜⎜ 0 1 U 23 U 24 ⎟⎟
= * (2.36)
⎜ A31 A32 A33 A34 ⎟ ⎜ L31 L32 L33 0 ⎟ ⎜0 0 1 U 34 ⎟
⎜⎜ ⎟ ⎜ ⎟ ⎜ ⎟
⎝ A41 A42 A43 A44 ⎟⎠ ⎜⎝ L41 L42 L43 L44 ⎟⎠ ⎜⎝ 0 0 0 1 ⎟⎠

Produsul celor doi factori L şi U ne dă:

⎛ L11 L11U12 L11U13 L11U14 ⎞


⎜ ⎟
L L21U12 + L22 L21U13 + L22U 23 L21U 14 + L22U 24
( A) = ⎜⎜ 21 ⎟ (2.37)
L31 L31U12 + L 32 L31U13 + L32U 23 + L33 L31U14 + L32U 24 + L33U 34 ⎟
⎜⎜ ⎟
⎝ L41 L41U12 + L42 L41U13 + L42U 23 + L43 L41U14 + L42U 24 + L43U 34 + L44 ⎟⎠

Prin comparaţie cu matricea de origine [A] constatăm că:


a) Prima coloană a lui L este identică cu aceeaşi coloană a lui A, deci nicio
prelucrare nu este necesară:

39
Methodes de calcul numerique en ingenierie electrique

Li1 = A i1 pentru i=1 la N.


b) Prima linie a lui U, în afară de primul element, care este 1, se obţine
divizând elementele lui A prin elementul de pe diagonala principală L11.
U1j = A 1j / L11 pentru j =2 la N.
c) Continuăm cu a doua coloană a lui L. Elementele Li1=Ai1 şi U12 care
figurează în expresie, sunt cunoscute. În consecinţă:
Li2 = A i2 – Li1U12, pentru i=2 la N.
d) Continuăm cu a doua linie a lui U. Elementele Li1=Ai1 şi U12 care figurează
în expresie, sunt cunoscute. În consecinţă:
U2j = (A 2j – L21U1j)/L22, pentru j = 2 la N.
e) Algoritmul continuă la fel, alternând coloanele lui L şi liniile lui U. Astfel, la
etapa m (pentru m=2 la N), obţinem:

k −1
Lim = Aim − ∑ LijU jm ;
j =1
(2.38)
k −1
U mj = ( Amj − ∑ LmiU ij ) / Lmm ; m = 2, N
i =1

Putem ilustra aceasta prin figura următoare:

Fig. 2.1 Succesiunea operaţiilor în factorizarea Crout

40
Metode numerice în ingineria electrică

În principiu, algoritmul este următorul (a se vedea de asemenea şi diagrama


din figura 2.2, cu referinţele la diverşii paşi din cod):

//PROGRAM Factorizare Crout


//Prima coloană a lui L (etapa 1):
Pentru i=1 la N {
L(i,1)=A(i,1)
}//i
// Prima linie a lui U (etapa 2):
Pentru j=2 la N {
U(1,j)=A(1,j)/L(1,1)
}//j
//Liniile şi coloanele următoare (etapa 3):
Pentru m=2 la N {
//Coloana m a lui L (étape 4):
Pentru i=m la N {
//L(i,m)=A(i,m)-<v1,v2>
L(i,m)=A(i,m)-Σj=1la m-1[L(i,j)U(j,m)]
}//i
Dacă j=N, atunci SFÂRŞIT
//Linia m a lui U (etapa 5):
Pentru j=m+1 la N {
//U(m,j)=[A(m,j)-<v3,v4>]/L(m,m)
U(m,j)=(A(m,j)-Σi=1 la m-1[L(m,i)U(i,j)])/L(m,m)
}//j
}//m
unde <vm, vn> este l „produsul scalar” între „vectorii” vm et vn.
m j
2
V j V i
3

V 5
i U(
4
1
V
i L(i
j

Fig. 2.2 Ilustrarea metodei de factorizare Crout

41
Methodes de calcul numerique en ingenierie electrique

• Factorizarea lui Doolittle


Această variantă câteva avantaje în comparaţie cu metoda lui Crout, ceea ce o
face mai bună în cazul „matricelor creuses”, despre care vom vorbi mai târziu.
Să luăm, pentru moment, exemplul precedent (relaţiile 2.37 şi 2.38), dar
urmând o procedură diferită.
a) Determinăm mai întâi L11=A11, apoi prima linie a lui U:
U1j = A 1j/L11, pentru j=2 la N.
b) Continuăm cu a doua linie a lui L şi a lui U. Astfel:
L21=A21 ; L22 = A22 – L21U12.
U2j = (A2j –L21U1j)/ L22 pentru j=3 la N.
c) Algoritmul continuă la fel, prelucrând succesiv liniile celor două matrice,
mai întâi a lui L, apoi a lui U. Astfel, la etapa m (pentru m = 2 la N), obţinem:
j −1
Lmj = Amj − ∑ LmiU ij ; j = 1, m
i =1
(2.39)
k −1
U mj = ( Amj − ∑ LmiU ij ) / Lmm ; j = m + 1, N
i =1

1 2

3 4

Fig. 2.3 Succesiunea operaţiilor în factorizarea Doolittle

Această metodă este mai bine adaptată la prelucrarea sistemelor mari. În


particular, în cazul factorizării „matricelor creuses”, parcurgerea pe linii poate fi
mai performantă, după cum vom vedea mai târziu.
În principiu, algoritmul este următorul (a se vedea de asemenea diagrama din
figura 2.4, cu referinţele la diverşii paşi din cod):

42
Metode numerice în ingineria electrică

//PROGRAM Factorizare Doolittle


//Parcurgere pe linii (etapa 1):
Pentru m=1 la N {
//Linia m a lui L (etapa 2):
Pentru j=1 la m {
//L(m,j)=A(m,j)-<v1,v2>
L(m,j)=A(m,j)-Σi=1à j-1[L(m,i)U(i,j)]
}//j
//Linia m a lui U (etapa 3):
Pentru j=m+1 la N {
//U(m,j)=[A(m,j)-<v3,v4>]/L(m,m)
U(m,j)=(A(m,j)-Σi=1 à m-1[L(m,i)U(i,j)])/L(m,m)
}//j
}//m

Este un avantaj dacă matricele sunt păstrate în memorie pe linii. Acest fapt
poate fi util atunci când folosim tehnici adaptate „matricelor creuses”.

V i i V

2 3
V
m
V L(m U(m j
i j j

Fig. 2.4. Ilustrarea metodei de factorizare a lui Doolittle

Putem constata că, pentru cele două metode de factorizare precedente:


• Numărul de calcule semnificative (înmulţiri şi împărţiri) este de ordinul de
mărime O(N3/3), ca şi pentru metoda lui Gauss.
• Tablourile L şi U pot împărţi memoria cu tabloul de origine A. Într-adevăr, în
calcule, elementele factorilor [L] şi [U] înlocuiesc treptat şi măsura calculelor
acelea ale matricei de origine [A].

43
Methodes de calcul numerique en ingenierie electrique

• Putem calcula uşor determinantul matricei [A]. Într-adevăr, valoarea sa este


produsul termenilor diagonalei lui [L] (pentru că termenii diagonalei lui U sunt unitari):
N
Det ( A ) = ∏ Lii (2.40)
i =1

În linii mari, factorizarea conţine trei cicluri imbricate:


• Un ciclu „exterior”, fie urmând diagonala matricei (metoda lui Crout), fie
liniile (metoda lui Doolittle). Acest ciclu se execută o singură dată şi el are N paşi.
• Un al doilea tip de ciclu, în interiorul primului. Acesta se desfăşoară fie în
alternanţă, pe părţile încă neprelucrate ale coloanelor lui L şi pe liniile lui U
(metoda lui Crout), fie pe linia care se află în curs de prelucrare (metoda lui
Doolittle). „Lungimea medie” a unui astfel de ciclu este de N elemente (între 2N şi
0 pentru metoda lui Crout, N pentru metoda lui Doolittle).
• Un ciclu „intern”, reprezentat prin „produsele scalare” între doi vectori, pus
în evidenţă în programele 2.1 şi 2.2 prin <vm,vn>. Aceste cicluri sunt executate cel
mai adesea de N2 ori. În consecinţă, ei sunt cei mai criticaţi în termeni de
performanţă, şi ei sunt aceia care ar trebui sa fie optimizaţi în primul rând. Astfel,
putem, la limita, să le scriem în limbaj de asamblare, chiar dacă această abordare
poate pune probleme de programare şi de portabilitate.
ii ) Etapa doua – determinarea soluţiei sistemului
După cum s-a demonstrat mai sus, această a doua parte a rezolvării
sistemuluim este realizată prin metoda „dublului parcurs”, care se execută, la
rândul său în două etape:
• Parcurs direct. Să rezolvăm sistemul auxiliar:

⎛ L11 ⎞ ⎛ Z1 ⎞ ⎛ Y1 ⎞
⎜ ⎟⎜ ⎟ ⎜ ⎟
[ L][ Z ] = [Y ] ⇒ ⎜ x x ⎟ ⎜ ... ⎟ = ⎜ ... ⎟ ↓ ⇒ [ Z ] (2.41)
⎜ x x LNN ⎟⎠ ⎜⎝ Z N ⎟⎠ ⎜⎝ YN ⎟⎠

Elementele vectorului [Z] sunt calculate succesiv în sensul indicat de săgeată.
Această etapă cere O(N2/2) operaţii.

În principiu, algoritmul este următorul:

//PROGRAM Parcurs direct


//Primul element al lui Z:
Z(1)=Y(1)/L(1,1)
//Elementele următoare:
Pentru m=2 la N {
Z(m)={Y(m)- Σj=1à m-1[L(m,j)Z(j)]}/L(m,m)
}

44
Metode numerice în ingineria electrică

Parcursul direct poate fi executat în acelaşi timp ca şi factorizarea.


• Parcursul invers. Să rezolvăm un alt sistem, auxiliar:

⎛ 1 x x ⎞ ⎛ X 1 ⎞ ⎛ Z1 ⎞
⎜ ⎟⎜ ⎟ ⎜ ⎟
[U ][ X ] = [ Z ] ⇒ ⎜ 1 x ⎟ ⎜ ... ⎟ = ⎜ ... ⎟ ↑ ⇒ [ X ] (2.42)
⎜ 1 ⎟⎠ ⎜⎝ X N ⎟⎠ ⎜⎝ Z N ⎟⎠

Elementele vectorului [X] sunt calculate, succesiv în sensul indicat de săgeată.


Această etapă cere O(N2/2) operaţii.
În principiu, algoritmul este următorul:

//PROGRAM Parcurs invers


//Ultimul element al lui X:
X(N)=Z(N)

//Elementele următoare
Pentru m=N-1 la 1 cu pasul -1 {
X(m)=Z(m)- Σj=m+1 à N[U(j,m)X(j)]
}
Observaţii:
• Constatăm că partea cea mai „costisitoare” în termeni de timp de calcul este
cea a factorizării, cu un număr de calcule semnificative de ordinul O(N3/3). Dublul
parcurs care urmează cere, în total, în jur de O(N2) calcule.
• Metoda de factorizare devine şi mai performantă când un sistem trebuie să fie
rezolvat pentru mai mulţi termeni liberi. Într-adevăr, într-o astfel de situaţie, este
suficientă o singură factorizare a matricei de coeficineţi.
iii) Probleme numerice
După cum putem constata, când factorizăm, prin oricare dintre metode, există o
operaţie de diviziune a elementelor unei linii prin elementele diagonalei de la
matricea L, situată pe linia în curs de prelucrare. Numim acest termen „pivot”.
Problema survine atunci când întâlnim un pivot nul (Lkk = 0 pentru o anumită
valoare a lui k).
Soluţia constă în adoptarea unui pivot convenabil, obligatoriu non nul. În plus,
argumente numerice arată că este avantajos să se aleagă un pivot cât mai mare cu
putinţă, caz în care erorile sunt mai mici.
Pivotul poate fi ales dintre termenii matricei care încă nu au fost prelucraţi în
timpul factorizării, deci dintre cei situaţi „deasupra” şi la „dreapta” termenului în
cauză.

45
Methodes de calcul numerique en ingenierie electrique

Acest fapt este echivalent cu o permutare a ecuaţiilor (deci a liniilor), sau cu o


permutare a coloanelor (deci o renumerotare a necunoscutelor).
În practică, permutarea (liniilor sau coloanelor) este doar „virtuală”. De fapt,
elementele îşi păstrează locurile, dar sunt accesate pe cale indirectă, prin
intermediarul unui „vector de permutare”.
• În cazul „pivotării parţiale”, doar liniile sunt permutate. Pivotul care trebuie
să înlocuiască un element A(m,n) nul este ales dintre candidaţii situaţi pe aceeaşi
coloană, şi pe una dintre liniile care îi urmează:

A(m, m) = 0 ⇒ pivot = A(i p , m) i p ∈ (m + 1, N ) (2. 43)

Un vector PL de mărime N conţine indicii celor N linii ale matricei A. La


început, conţinutul său este:

PL(i)=i, i=1,N (2.44)


„Permutarea” a două linii i1 şi i2 se traduce prin:
PL(i1)=i2, PL(i2)=i1 (2.45)
Accesul la elementele matricei A se face în realitate, în această situaţie, în
modul următor:

A(i, j ) ⇒ A( PL(i ), j ) (2.46)

• În cazul „pivotării totale”, sunt permutate în acelaşi timp şi liniile şi


coloanele. Pivotul care trebuie să înlocuiască un element L(k,k) nul este ales dintre
candidaţii situaţi pe una dintre liniile şi coloanele care urmează:

A(m, m) = 0 ⇒ pivot = A(i p , j p ) i p ∈ (m + 1, N ), j p ∈ (m + 1, N ) (2.47)

În consecinţă, folosim doi vectori de permutare, unul (PL) pentru linii (deci
pentru ecuaţii), celălalt (PC) pentru coloane (deci pentru necunoscute). La început,
ei conţin:

PL(i)=i ; i=1,N (2.48)

PC(j)=j ; j=1,N (2.49)

„Permutarea” a două linii i1 şi i2 şi a două coloane j1 şi j2 se traduce prin:

PL(i1)=i2, PL(i2)=i1 (2.50)

46
Metode numerice în ingineria electrică

PC(j1)=j2, PC(j2)=j1 (2.51)

Accesul la elementele matricei A se face, în această situaţie, în modul indirect


următor:

A(i, j ) ⇒ A( PL(i ), PC ( j )) (2.52)

2.3. Metode de rezolvare numerică


a sistemelor de ecuaţii simetrice

O matrice simetrică [A] este aceea pentru care:

( A) = ( A)
T
Aij = Aji ⇒ (2.53)

Astfel de matrice se găsesc, de exemplu, în sistemele de ecuaţii date de


metodele numerice de modelare a câmpurilor. Simetria matricei ar putea fi
exploatată, pentru a simplifica prelucrările, şi pentru a le face mai performante.

2.3.1. Factorizarea prin metoda rădăcinii pătrate


(metoda lui Cholesky)
Această metodă este utilizată doar dacă matricea simetrică este de asemenea
pozitivă definită. Este, în principiu, cazul ecuaţiilor date de metodele diferenţelor
finite sau ale elementelor finite, pentru rezolvarea numerică a sistemelor de ecuaţii
cu derivate parţiale.
Factorizarea unei astfel de matrice poate avea forma:

[ A] = [U ] [U ]
T
(2.54)

unde [U] este o matrice superioară-dreapta („Upper”, în engleză), ai cărei termeni


non nuli se găsesc doar deasupra diagonalei principale. Termenii diagonali ai lui
[U] nu mai sunt 1.
De exemplu, fie cazul unei matrice simetrice de ordin 4:

⎛ A11 A12 A13 A14 ⎞ ⎛ U11 0 0 0 ⎞ ⎛U11 U12 U13 U 14 ⎞


⎜ ⎟ ⎜ ⎟ ⎜ ⎟
⎜ A12 A22 A23 A 24 ⎟ ⎜U12 U 22 0
=
0 ⎟ ⎜ 0 U 22 U 23
*
U 24 ⎟
(2.55)
⎜ A13 A23 A33 A34 ⎟ ⎜ U13 U 23 U33 0 ⎟ ⎜ 0 0 U33 U34 ⎟
⎜⎜ ⎟⎟ ⎜⎜ ⎟⎟ ⎜⎜ ⎟
⎝ A14 A24 A34 A44 ⎠ ⎝U14 U 24 U34 U 44 ⎠ ⎝ 0 0 0 U 44 ⎟⎠

47
Methodes de calcul numerique en ingenierie electrique

Algoritmul este următorul:


a) Determinăm mai întâi U11 = A11 , apoi prima linie a lui U:
U1j = A 1j/L11, pentru j = 2 la N.
b) Algoritmul continuă în acest fel, prelucrând succesiv celelalte linii ale
matricei U. Astfel, la etapa m (pentru m = 2 la N), obţinem:

m −1
U mm = Amm − ∑ U im2 = Amm − < v1 , v1 > ; m = 2, N
i =1
(2.56)
m −1
U mj = (U mj − ∑ U imU ij ) / U mm = (U mj − < v1 , v2 >) / U mm ; j = m + 1, N
i =1

Ca şi mai sus, <vm,vn> este produsul scalar a doi vectori figuraţi pe diagrama
următoare. Trebuie totuşi să ţinem cont de simetria matricei (de exemplu, vectorii
v1 et v1T care sunt echivalenţi).

1
V V
i i

3
V
m
U(m j
U(m j

Fig. 2.5. Ilustrarea metodei de factorizare a rădăcinii pătrate (Cholesky)

În principiu, algoritmul este următorul (a se vedea de asemenea diagrama din


figura 2.5, cu referinţele la diverşii paşi din cod):

48
Metode numerice în ingineria electrică

//PROGRAM Factorizarea Cholesky


//Prima linie a lui U (etapa 1):
U(1,1)=sqrt(A(1,1))
Pentru j=2 la N {
U(1,j)=A(1,j)/U(1,1)
}//j
//Liniile urmatoare (etapa 2):
Pentru m=2 la N {
//U(m,m)=sqrt[A(m,m)-<v1,v1>]
U(m,m)=sqrt[A(m,m)-Σi=1 à m-1(uim2)]
//Ligne m de U (etapa 3):
Pentru j=m+1 la N {
//U(m,j)=[A(m,j)-<v1,v2>]/U(m,m)
U(m,j)=(A(m,j)-Σi=1 à m-1[U(i,m)U(i,j)])/U(m,m)
}//j
}//m

Momentul „critic” este acela al calculului rădăcinii pătrate, pentru elementele


diagonalei. Dacă matricea este cu adevărat pozitivă definită, acest calcul este posibil.
Din contră, dacă matricea nu este pozitivă definită, algoritmul se blochează. În astfel
de situaţii, trebuie ales algoritmul care va fi prezentat mai departe, care este utilizabil
de asemenea pentru matricele simetrice, dar ne pozitive definite.
Este evident că „pivotarea” riscă să distrugă simetria matricei. În consecinţă,
este de evitat.
Totuşi, putem demonstra că, dacă matricea A este simetrică şi pozitivă definită,
toţi „pivoţii” vor fi pozitivi (în aşa fel încât algoritmul să poată fi construit), deci
pivotarea nu este necesară din acest punct de vedere. În ciuda acestui lucru, rămâne
problema de a şti dacă pivoţii sunt suficient de mari, astfel încât erorile de rotunjire
să nu fie prea mari. Răspunsul este, din nou, favorabil acestei metode. În
consecinţă, putem considera că permutările nu sunt necesare în metoda lui
Cholesky, chiar dacă erorile de rotunjire nu sunt total excluse.

2.3.2. Factorizarea matricelor simetrice, nepozitive definite


Dacă matricea coeficienţilor [U] nu este pozitivă definită, algoritmul precedent
nu mai este utilizabil, pentru că la un moment dat o rădăcină pătrată care este
prezentă în calculul elementului situat pe diagonala principală, nu mai este posibil.
Însă, există o metodă capabilă de a ocoli acest inconvenient.
Ea constă în reprezentarea matricei simetrice prin produsul a trei matrice:

[ A] = [ L][ D][U ] = [U ]T [ D][U ] , cu [ L] = [U ]T (2.57)

49
Methodes de calcul numerique en ingenierie electrique

unde [D] este o matrice diagonală, ai cărei termeni sunt Dm=±1, şi [U] este o
matrice triunghiulară superioară, cu termeni diagonalei diferiţi de 1:

⎛ U11 x x x x ⎞ ⎛ ±1 ⎞
⎜ ⎟ ⎜ ⎟
⎜ U22 x x x ⎟ ⎜ ±1 ⎟
[U ] = ⎜ Umm x x ⎟ [ D] = ⎜ ±1 ⎟ (2.58)
⎜ ⎟ ⎜ ⎟
⎜ Unn x ⎟ ⎜ ±1 ⎟
⎜ U NN ⎠⎟ ⎜ ±1⎟
⎝ ⎝ ⎠

Un termen diagonal al matricei coeficienţilor [A] este, după regulile de


înmulţire a matricelor:
m m m m
Amm = ∑∑ L mi DikU km = ∑∑ U imU km Dik ; m = 2, N (2.59)
i =1 k =1 i =1 k =1

Dar, din moment ce matricea D este diagonală, rămân doar termenii care au
i=k, şi obţinem:
m m −1
Amm = ∑ U im2 Dii = ∑ U im2 Di + U mm
2
Dm ; ( Dii = Di ) (2.60)
i =1 i =1

Astfel, putem determina cei doi termeni diagonali necunoscuţi:

⎛ m −1

Dm = sgn ⎜ Amm − ∑ U im2 Di ⎟ = ±1
⎝ i =1 ⎠
(2.61)
m −1
U mm = Amm − ∑ U Di 2
im ; m = 2, N
i =1

În cazul particular al primului termen (m=1), sumele sunt nule. În consecinţă:

D1 = sgn ( A11 ) = ±1
(2.62)
U11 = A11

Termenii non diagonali pe linia (m) a matricei coeficienţilor sunt, la rândul lor:

50
Metode numerice în ingineria electrică

m m m m
Amj = ∑∑ L mi DikU km = ∑∑ U imU km Dik ; j = m + 1, N (2.63)
i =1 k =1 i =1 k =1

Ca şi înainte, matricea [D] este diagonală, deci rămân doar termenii cu i=k, şi
obţinem:

m m −1
Amj = ∑ U imU ij Di = ∑ U imU ij Di + U mmU mj Dm (2.64)
i =1 i =1

Astfel, putem determina:

⎛ m −1

U mj = ⎜ Amj − ∑ U imU ij Di ⎟ / (U mm Dm ) ; j = m + 1, N (2.65)
⎝ i =1 ⎠
Pentru prima linie (m=1), sumele sunt nule, şi obţinem:

U1 j = ( A1 j ) / (U11 D1 ) ; j = 2, N (2.66)

În consecinţă, algoritmul este următorul:

//PROGRAM Factorizarea Cholesky


//matrice non pozitive definite
//Prima linie a lui U (etapa 1):
D(1)=sgn(A(1,1))
U(1,1)=sqrt(abs(A(1,1)))
Pentru j=2 la N {
U(1,j)=A(1,j)/(U(1,1)D(1))
}//j
//Liniile următoare (etapa 2):
Pentru m=2 la N {
D(m)=sgn[A(m,m)-Σi=1 à m-1(u(i,m)2 D(i))]
U(m,m)=sqrt(abs(A(m,m)-Σi=1 à m-1(u(i,m)2 D(i))))
//Linia m a lui U (etapa 3):
Pentru j=m+1 la N {
U(m,j)=(A(m,j)-
- Σi=1 à m-1[U(i,m)U(i,j)D(i)])/(U(m,m)D(m))
}//j
}//m

51
Methodes de calcul numerique en ingenierie electrique

2.4. Tehnici de adaptare la matricele rare

O matrice rară conţine puţini termeni non nuli. Putem să o caracterizăm


printr-un „grad de umplere”, definit ca raport între numărul de termeni non nuli şi
numărul total de termeni (deci N2, pentru o matrice pătratică cu N linii şi coloane).
Adesea, mai ales pentru matricele mari, acest grad poate fi de câteva procente.
Astfel de matrice pot apărea în probleme de modelare numerică a câmpului
(prin metoda diferenţelor finite sau a elementelor finite), ca şi în cazul simulării
numerice a reţelelor electrice mari. În cazul cel mai favorabil, matricele sunt
simetrice şi pozitive definite. Însă, situaţii unde ieşim din acest cadru sunt întâlnite
în problemele curente.
Este clar că:
– Tehnicile curente de stocaj al matricelor (tablouri) sunt puţin adaptate,
pentru că „risipim” memoria.
– Metodele curente de factorizare şi de rezolvare a sistemelor de ecuaţii sunt
puţin adaptate, pentru că ele implică un număr mare de calcule inutile.
Putem estima că în cazul sistemelor de ecuaţii mari a căror matrice a
coeficienţilor este creuse, utilizarea tehnicilor adaptate la matricele creuses este
greu de ocolit.
Numărul de operaţii şi timpul de calcul ar putea fi reduse drastic. În practică,
pentru sistemele mari, utilizarea tehnicilor matricelor creuses poate conduce la un
număr de operaţii aproape proporţional cu N (~O(N)) mai degrabă decât cu N3.
Bineînţeles, preţul de plătit constă într-o implementare mai complexă, dar
există deja instrumente informatice adecvate.
O problemă care se pune este aceea a „umplerilor”. De fapt, odată cu
factorizarea pot apărea elemente noi. Tehnica de stocare utilizată trebuie să permită
inserarea cu uşurinţă a noilor termeni în locurile potrivite.
În consecinţă, gradul de umplere al matricei în curs de factorizare creşte.
Tehnici speciale au fost dezvoltate, pentru a reduce numărul de umpleri.

52
Metode numerice în ingineria electrică

Chapitre 3

Méthodes numériques
de résolution des équations

L’algèbre dispose de méthodes et formules de calcul pour déterminer les


solutions des équations algébriques de degré plus petit ou égal a quatre. Tous autres
types d’équations algébriques, avec le degré plus grand que quatre et les équations
transcendantes qui font partie de la catégorie des équations non linéaires
nécessitent pour déterminer les solutions une résolution numérique.
Les méthodes numériques son exclusivement, interactives et les solutions des
équations non linéaires sont obtenues comme limites des suites convergentes. La
qualité et l’efficacité de chaque méthode est calculée par deux critères: le critère
d’utilisation optime de la mémoire de l’ordinateur nécessaire pour les dates et les
programmes, respectivement le critère de la diminution du temps de calcul
nécessaire pour le calcul des solutions.
Le première critère tient compte de la complexité des données avec lesquelles
on travaille (par exemple pour un polynôme de degré n on introduit les
cœfficients réels) et de nombre de lignes de programme nécessaires pour
résoudre le problème. En ce qui concerne l’évaluation du temps de calcul
nécessaire pour que l’ordinateur donne la solution, on adopte comme référence le
temps nécessaire pour l’exécution d’une opération élémentaire (addition ou
multiplication des numéros réels) et puis on détermine le numéro de ces espaces
(par exemple pour évaluer une fonction polynomiale de degré n, on fait n
multiplication et n+1 additions).
Une partie des méthodes numériques peut être appliquée pour tous types des
équations algébriques et des autres méthodes sont spécifiques seulement pour les
équations algébriques polynomiales. Dans l’ingénierie électrique les méthodes de
résolution numérique des équations non linéaires ont une applicabilité diversifiée,
comme par exemple la détermination des points d’intersection des graphiques des
deux fonctions, la détermination des points de fonctionnement dans les circuits
électriques et électroniques, la résolution des équations des circuits électriques
non linéaires etc.

53
Methodes de calcul numerique en ingenierie electrique

3.1. Méthodes numériques de résolution des équations


non linéaires avec une seule inconnue

On considère l’équation non linéaire transcendante

f (x ) = 0 (3.1)

où f : [a, b] → ℜ est une fonction continue et x r ∈ (a, b ) est la solution exacte de


l’équation. Pour la détermination numérique de cette solution on utilise des méthodes
itératives qui consistent dans la construction d’une suite de numéros réelles
x0 , x1 ,......., x k ... convergente vers la solution exacte de l’équation. Toute méthode
itérative pour déterminer la solution x consiste en trouver une équation de la forme

xr = F (x ) (3.2)

équivalente avec l’équation donnée dans l’intervalle [a,b]

f (x ) = 0 ⇔ xr = F (x ) (3.3)

tel que la suite de numéros ( x k )k ≥0 aie la limite x r c’est-à-dire

lim = x r , (3.4)
k →∞

où les termes de la suite se déterminent par récurrence en fonction de le terme


précèdent, avec la relation
x k = F ( x k −1 ) (3.5)
Les équations s’arrêtent quand la distance entre deux termes consécutifs de la
suite est plus petite que une valeur imposée ε .

x k − x k −1 < ε (3.6)

D’après la construction de la fonction itérative F ( x ) , dans la suite on présente


quelques méthodes numériques pour la résolution des équations non linéaires.

3.1.1. La méthode de la dichotomie est l’une des plus simples méthodes


pour résoudre une équation non linéaire, qui est basée sur la propriété de la
fonction f ( x ) d’avoir différentes signes aux extrémités de l’intervalle [a,b], si la
solution unique x de l’équation f ( x ) = 0 existe dans l’intervalle (a,b). Alors:

54
Metode numerice în ingineria electrică

f (a ) ⋅ f (b ) < 0 (3.7)

Dans une première itération on calcule:

a+b
xm0 ≡ x0 = (3.8)
2
le milieu de l’intervalle [a,b]. Si x0 n’est pas racine de l’équation, la vérification
ne peut pas être faite par comparaison:

f ( x0 ) < ε (3.9)

alors on évalue parmi les deux mi-intervalles (a, x0 ) et ( x0 , b ) l’un qui contient la
solution. L’évaluation se fait d’après le signe du produit des valeurs de la fonction
à les extrémités de mi-intervalles, c’est-à-dire:

f (a ) ⋅ f (b ) < 0 (3.10)

et

f ( x0 ) ⋅ f (b ) < 0 (3.11)

Si l’inégalité (3.9) est satisfaite alors on cherche la solution dans l’intervalle


(a, x0 ) , l’algorithme continuant par sa dichotomie:
a + x0
x m1 ≡ x1 = etc. (3.12)
2

Donc l’inégalité (10) n’ést pas satisfaite, alors, obligatoirement (10) est
satisfaite et la solution se trouve dans l’intervalle ( x0 , b ) . Par conséquent
l’algorithme continue avec la dichotomie de cet intervalle:

x0 + b
x m1 ≡ x1 = etc.
2
La suite des valeurs successives des moitiés des sous intervalles:
x m0 , x m1 , x m2 ,..... est convergente vers la solution exacte x r (fig.3.1).

55
Methodes de calcul numerique en ingenierie electrique

Fig. 3.1. La première itération pour la méthode de la division de l’intervalle

L’algorithme itératif de la dichotomie s’arrêt quand la longueur des sous


intervalles obtenues dans l’itération devient plus petite que la valeur ε imposé sur
la solution.

bn − a n < ε (3.13)

La méthode de la dichotomie est facile a appliquer et elle est obligatoirement


convergente, mais elle nécessite un grand nombre d’évaluations de la fonction. On
présente un exemple d’implémentation de cette méthode.

3.1.2. La méthode de la corde ou des parties proportionnelles


détermine la solution unique de l’équation f ( x ) = 0 sur un intervalle (a,b), avec
f : [a.b] → ℜ continue sur [a, b] et f (a ) ⋅ f (b ) < 0 .

Fig. 3.2. Premières itérations pour la méthode de la corde

56
Metode numerice în ingineria electrică

Ainsi, dans une première approximation on détermine l’abscisse


correspondante à l’intersection de la corde (droite) qui joins les points des
coordonnées (0, f (a )) et (b, f (b )) avec l’axe 0x:

a ⋅ f (b ) − b ⋅ f (a )
x1 = (3.14)
f (b ) − f (a )
L’inverse itératif de division proportionnelle de l’intervalle continue en
fonction de la position de la corde vers le graphique.
Si la corde se trouve a la gauche du graphique (fig. 3.2), c’est-à-dire:

f (a ) ⋅ f (b ) < 0 (3.15)

alors on continue a diviser le sous intervalle [a, x1 ] en parties proportionnelles et la


solution approximative dans le prochaine pas est:
a ⋅ f (x1 ) − x1 ⋅ f (a )
x2 = (3.16)
f ( x1 ) − f (a )

Dans ce cas le point de départ des approximations est le point a = x0 , le point b


reste fixé et le déplacement des approximations successives se fait de gauche à droite.
Ainsi, la corde se trouve a droite du graphique, c’est-à-dire:
f ( x1 ) ⋅ f (b ) < 0 (3.17)

alors on continue a diviser l’intervalle [x1 , b] en parties proportionnelles et la


solution approximative dans le prochaine pas est:
x1 ⋅ f (b ) − b ⋅ f (x1 )
x2 = (3.18)
f (b ) − f ( x1 )

Dans ce cas le point de départ des approximations est le point b = x0 , le point


a reste fixé et le déplacement des approximations successives se fait de droite à
gauche. Enfin, la valeur x k est la solution de l’équation donnée, soit f ( x k ) < ε , ε
étant la valeur imposée.
La convergence de la méthode dépend de la choix optime du point de départ
x0 . La condition de convergence (nommée la condition Fourier) est:

f ( x0 ) ⋅ f '' ( x0 ) < 0 (3.19)

On impose la choix de a ou b comme point de départ de l’algorithme.

57
Methodes de calcul numerique en ingenierie electrique

3.1.3. Par la méthode de Newton on obtient le mode le plus naturel


par un procédé de linéarisation, dans lequel on retient de le développement de
f(x) en série Taylor autour du point x0 , seulement les premiers deux termes, ou
la fonction f : [a, b] → ℜ est continué et avec la première dérivée continue sur
[a, b] Ainsi, l’équation non linéaire initiale f ( x ) = 0 est remplacée par
l’équation linéaire

f ( x0 ) ≠ (x − x0 ) ⋅ f ' ( x0 ) = 0 (3.20)

qui a comme solution

f ( x0 )
x1 = x0 − (3.21)
f ' ( x0 )

De point de vue géométrique (fig. 3.3), dans la méthode de Newton x1


représente l’abscisse du point d’intersection de la tangente tracée au graphique de
la fonction f et le point de coordonnées ( x0 , f ( x0 )) avec l’axe 0x. Il résulte la
relation récursive pour l’approximation de la solution au pas k+1:

f (xk )
xk +1 = xk − (3.22)
f ' (xk )

Fig.3.3. Les premières itérations de la méthode de Newton

58
Metode numerice în ingineria electrică

La convergence dépend du choix du point de départ x0 . Pour que l’algorithme


de Newton soit convergent vers la solution x r il est nécessaire que le point de
départ x0 vérifie la condition:

f ( x0 ) ⋅ f '' ( x0 ) > 0 (3.23)

qui conduit à la détermination de la seconde dérivée de la fonction. De plus, a


chaque pas de l’itération, en conformité avec la relation (3.22), doit être évalué la
dérivée de second ordre de la fonction, fait qui nécessite un grand effort de calcul.

3.2. Méthodes numériques de résolution


des équations algébriques

On considère l’équation algébrique polynomiale de dégrée n avec coefficients


réels ou complexes écrit sous forme canonique:
n
Pn (x ) = ∑a ⋅ x
i =0
i
i
= 0, avec an ≠ 0; Pn : ℜ ← ℜ (3.24)

Dans l’algèbre classique on montre qu’il est possible a résoudre en employant


les méthodes élémentaires seulement les équations de dégrée n ≤ 3 . Pour les
équations ayant le dégré plus grand ou égal a quatre on emploi les méthodes
numériques qui permet la détermination de toutes les racines sans avoir besoin
d’une approximation initiale. Dans la conception des algorithmes itératives on tien
compte des règles liés de l’existence des racines d’une équation algébrique. Ainsi,
une équation de dégrée n a toujours n racines réelles et/ou complexes, et les racines
réelles peut avoir un certain ordre de multiplicité. Les racines complexes sont deux
par deux complexes conjuguées. Il résulte que le dégrée n de l’équation est impair.
Il existe au moins une racine réelle.
Pour la résolution numérique des équations algébriques on doit parcourir
deux étapes:
1. La détermination des plus petits intervalles [a,b] dans lesquelles on trouve
une seule solution de l’équation donnée, étape appelle séparation des racines.
2. Le calcul itératif des racines de l’équation, lesquels seront les limites des
suites convergentes des numéros: ( x k )k ≥0

lim ( x k )k ≥0 = x r (3.25)
k →∞

59
Methodes de calcul numerique en ingenierie electrique

Les équations s’arrêt et x k est considérée solution de l’équation donnée si la


distance entre deux termes consécutifs de la suite est plus petit que une erreur imposé:

x k − x k −1 < ε 1 (3.26)

ou si la valeur du polynôme dans le point respectif est plus petite que une valeur
imposée:

P(xk ) < ε 2 (3.27)

3.2.1 Méthodes de séparation des racines des équations algébriques


3.2.1.1. La méthode de la suite de Rolle est une conséquence de la théorème
du Rolle: étant donnée l’équation algébrique Pn ( x ) = 0, Pn : ℜ → ℜ, Pn
contient les dérivées sur ℜ , entre deux racines réelles et consécutives de l’équation
Pn' −1 ( x ) = 0 il existe tout au plus une racine de l’équation considérée.
On forme la suite croissante des racines de l’équation
Pn' −1 = 0 > x1 < x 2 < .....x n−1 et on calcule la suite de Rolle (la suite des valeurs de
la fonction Pn ( x ) dans les points données par les racines de la dérivée, à laquelle on
ajoute les limites a ± ∞ ): P(− ∞ ), P( x1 ), P( x 2 ),.......P( x n−1 ), P(∞ ) . Dans
chaque intervalle (− ∞, x1 ), ( x1 x 2 ),....., ( x n −1 ,+∞ ), il existe une racine de l’équation
donnée, si et seulement si aux extrémités de l’intervalle considéré, la fonction P(x)
prend des valeurs de signes contraires.
La méthode de la suite du Rolle est efficace seulement pour des équations de
dégrée maximum 4, parce que la détermination des racines de l’équation
Pn' −1 ( x ) = 0 devient difficile a résoudre.

3.2.1.2. La méthode de la suite de Sturm détermine le nombre des


racines réelles dans un intervalle et leur séparation pour l’équation algébrique
Pn ( x ) = 0, avec Pn : ℜ → ℜ. Fie a, b ∈ ℜ . Soit a, b ∈ ℜ et Pn (x ) ,
continue et dérivable sur (a, b) . On forme la suite du Sturm associée à la
fonction Pn ( x ) , les polynômes p 0 , p1 ,.... p n continues sur (a, b) et lesquelles
satisfait les conditions:

•) p 0 (x ) = Pn ( x )
• •) p1 ( x ) = Pn' −1 ( x )

60
Metode numerice în ingineria electrică

• ••) pi ( x) = pi −1 ( x) ⋅ qi ( x) − pi − 2 ( x), i = 2, n (c’ést-à-dire, le polynôme


pi ( x ) est le reste avec signe changé de la division du polynôme
pi − 2 ( x ) à pi −1 ( x ) , et qi (x ) est le quotient)
• • • •) p n ( x ) ≠ 0, (∀)x ∈ [a, b] .

La méthode de la suite du Sturm est une conséquence du théorème suivant: si


la fonction polynomiale Pn ( x ) est dérivable sur (a,b) avec la dérivée continue et
Pn (a ) ≠ 0, Pn (b ) ≠ 0 , de plus elle admet une suite Sturm associée:
p 0 , p1 ,......., p n , alors le nombre des racines réelles de l’équation Pn (x ) = 0 dans
l’intervalle (a,b) est égal à la différence entre le nombre de changement de signe de
la suite de numéros pi (a ) si pi (b ), i = 0, n .
Par conséquent, la théorème permet aussi la détermination du nombre des
racines réelles aussi que leur séparation par la réduction de la longueur des sous
intervalles contenues dans l’intervalle donné.

3.2.2. Méthodes de détermination


des racines des équations algébriques
3.2.2.1. La méthode Lobacevski-Graeffe détermine les racines réelles
et complexes de l’équation polynomiale Pn ( x ) = 0 . Le polynôme Pn ( x ) peut
être exprime:
n n
Pn ( x ) = ∑ ai x1 = a 0 ∏ ( x − y ) = 0, a 0 ≠ 0, ai ∈ ℜ, i = 0, n (3.28)
i =0 j =1

ou x j , j = 1, n sont les racines réelles ou complexes conjuguées du polynôme


considéré, lesquelles vont vérifier les relations du Vieta. Ainsi, la première relation
du Vieta est:

a1
x1 + x 2 + ......... + x n = − (3.29)
a0

Si une des racines, par exemple x1, est plus grande en module que toutes les autres

x1 >> x j , j = 2, n (3.30)

alors l’approximation résultant de la relation (3.29) est acceptable:

61
Methodes de calcul numerique en ingenierie electrique

a1
x1 ≅ − (3.31)
a0

Dans ce cas on dit que la racine x1 est prépondérante. Il est évident qu’en
réalité on ne purait pas jamais accepter la supposition que un polynôme a une
racine prépondérante. Par contre, on peut toujours affirmer que un polynôme a une
racine, soit x1, plus grande en module que toutes les autres x1 > x j , j = 2, n . Si
on va mètre a une puissance pas trop grande cette inégalité, alors la racine x1
deviendra prépondérante, c’est-à-dire

x nm >> x mj (3.32)

et on pourrait utiliser avec précision suffisante la relation (3.31).


L’algorithme Lobacevsky-Graeffe établit une procédure d’obtention de la
relation (3.32), par la mise successive au carrée, c’est-à-dire m = 2 p , p ∈ , des
racines de l’équation donnée, ce qui conduit à la racine prépondérante.
Si dans l’expression (3.28) du polynôme Pn ( x ) on change l’inconnue x avec –
x on obtient:
n
(
Pn (− x ) = (− 1)n ⋅ a 0 ⋅ ∏ x + x j ) (3.33)
j =1

En faisant le produit:

(− 1)n ⋅ Pn (x ) ⋅ Pn (− x ) = a02 ⋅ ∏ (x 2 − x 2j )
n
(3.34)
j =1

on obtient un polynôme de degré n en variable x2, ayant comme racines


x12 , x 22 ,........ . On répète ce procédé p fois et on obtient un nouveau polynôme de
degré m = 2 p en variable x:

( )
n n
Q( x ) = a 0m ⋅ ∏ x m − x mj = ∑ (− 1) Ai( p ) ⋅ xi2 m
i
(3.35)
j =1 i =0

ou p = 0,1,.... , et les nouveaux coefficients Ai( p ) obtenus en chaque étape de calcul


de p sont obtenus, récursivement par la multiplication directe des nouveaux

62
Metode numerice în ingineria electrică

polynômes Pn ( x ) et Pn (− x ) , c’est-à-dire la fonction des coefficients initiales


ai . Dans la première étape de calcul il résulte:

A0(1) = a 02 ; A1(1) = a12 − 2a 0 a 2 ,...., An(1−)1 = − a n2−1 + 2a n −2 (3.36)

Si on note avec Ai( p +1) les valeurs de ces fonctions, les coefficients obtenues
dans l’étape p+1, alors par le procédé d’identification des coefficients présenté
antérieur on obtient la relation récursive:

( )
n
Ai( p +1) = Ai( p ) + 2 ∑ (− 1)k ⋅ Ai(−pk) ⋅ Ai + k , i = 0, n
2
(3.37)
k =0
ou on convient que tous les termes d’indice inférieur i + k > n et i − k < 0
soit nuls.
Pour trois cas d’existence des racines du polynôme initial Pn ( x ) , identifies a
l’aide du signe et des valeurs des nouveaux coefficients A ( p ) en diverses étapes de
i
mis successive au carrée, on va présenter la méthode de Lobacevski-Graeffe.

a) Cas des racines réelles et distinctes. Soit toutes les racines x j , j = 1, n du


polynôme Pn ( x ) sont distinctes alors elles peut être ordonnées décroissant d’après
les modules et les indices dans la forme:

x1 > x 2 > ....... > x n (3.38)

Les relations Vieta pour le polynôme Q( x ) obtenu dans l’étape p de calcul sont:

A1( p )
x1m + x 2m + ............ + x nm = (3.39)
A0( p )
A2( p )
x1m ⋅ x2m + x1m ⋅ x3m + .... + xnm−1 ⋅ xnm =
A0( p ) 1
M (3.40)
( p)
An
x1m ⋅ x2m ....................... ⋅ xnm =
A0( p )

dans lesquelles les termes de la partie droite sont toujours positifs, étant carrées
parfaites. En supposant que dans l’étape p la racine x1m = x12 p est devenue

63
Methodes de calcul numerique en ingenierie electrique

prépondérante, alors les termes x1m , x1m ⋅ x 2m , … deviendront prépondérants dans


les relations (3.39, 3.40),… Par conséquent, on peut utiliser avec coefficient de
bonne approximation les relations:

A1( p )
x1m ≅ (3.41)
A0( p )

A2( p )
x1m ⋅ x 2m ≅ (3.42)
A0( p )

M
An( p ) (3.43)
x1m ⋅ x 2m .... ⋅ x nm ≅ ( p)
A0
desquelles on obtient, successivement – en commencent par x1 – les modules des
racines:

A (j p )
x j = ±m , j = 1, n (3.44)
A (j −p1)

La détermination du signe de la racine se fait par l’introduction et vérification


dans l’équation initiale Pn ( x ) = 0 , ce qui augmente l’effort de calcul.
Il est nécessaire un critère qui arrêt l’algorithme (la mise successive au carrée)
à une certaine étape p dans laquelle on réalise la prépondérance de la plus grande
racine en module. Pour cela, en chaque étape de calcul on calcule les rapports:

rj ( p)
=
(A ( ) )
j
p −1 2
, j = 1, n − 1 (3.45)
A (j p )

Si la séparation des racines prépondérantes s’était produite dans l’étape p − 1 ,


m
c’est-à-dire = 2 p −1 , alors en conformité avec la relation (3.42)
2

A1( p −1)
m
p −1
x12 = x12 ≅ (3.46)
A0( p −1)

64
Metode numerice în ingineria electrică

et de plus dans l’étape suivante

A1( p )
x12 p = x1m ≅ (3.47)
A0( p )

Compte tenant de la relation de récurrence (3.37) et des relations (3.47) et


(3.48), le rapport:

r1( p ) ≅ 1 (3.48)

Si on répète la procédure de calcul de ces rapports pour tous autres


coefficients, dans la première étape de calcul, alors le critère d’arrêt de l’algorithme
est: donc toutes les rapports r j( p ) , j = 1, n − 1 tend vers 1 quand la séparation des
racines du polynôme soit produite
b) Cas des racines réelles et multiples en module. Si on considère que la plus
grande racine en module du polynôme Pn ( x ) aie l’ordre de multiplicité M, alors
l’ordre décroissante des racines du polynôme est:

x1 = x 2 = ........ = X M > X M +1 > ....... > X n (3.49)

La première relation Vieta aura un terme prépondérant:

A1( p )
x1m + x 2m + ....... + x M
m m
+ xM m
+1 ≅ M ⋅ x1 ≅ (3.50)
A0( p )

et dans la Meme relation Vieta on aura un terme prépondérant:

x1m ⋅ x 2m ...... ⋅ x M
m
+ x1m ⋅ x 2m ..... ⋅ x M
m m m m
−1 ⋅ x M +1 + ...... + x n − M ⋅ .... ⋅ x n ≅

AM( p ) (3.51)
≅ x1m ⋅ x 2m ⋅ .... ⋅ x M
m
= ( x1 )m⋅M ≅ ( p)
A0

Le calcul des racines M-multiples en module se fait en employant la relation


(3.52) par laquelle on obtient une approximation de calcule meilleure vu l’exposant
plus grand:

65
Methodes de calcul numerique en ingenierie electrique

AM( p )
x1 = ± m⋅M (3.52)
A0( p )

et la détermination du signe se fait par la vérification de l’équation initiale


Pn ( x ) = 0 .
Le critère de séparation est déterminé comme dans le cas des racines réelles et
distinctes. C’est-à-dire que la séparation des racines prépondérantes, M-multiples
en module, s’était réalisé lors de l’itération p-1, alors en conformité avec la relation
(3.51) il fallait:

An( p −1)
m
p −1
x12 = x12 ≅ (3.53)
M ⋅ A0( p −1)

et, de plus, dans l’itération suivante p il est valable l’approximation:

p A1( p )
x1q = x1m ≅ (3.54)
M ⋅ A0( p )

De la relation (3.37), (3.54), (3.55) il résulte que le rapport r1( p ) tend vers M

r1p ≅ M (3.55)

ce que va constitue le critère de séparation des racines multiples en module. Si un


rapport rj, dans une étape quelconque p, tend vers un nombre entier M, alors il s’est
produit la séparation prépondérantes M-multiples en module.
Dans le cas où la racine M-multiple en module n’est pas la plus grande en
module, c’est-à-dire la suite décroissante des racines de l’équation Pn ( x ) = 0 est:

X 1 > X 2 > ..... > X k = X k +1 = X k + M −1 > X k + M ...... > X n (3.56)

alors dans les relations (3.53) ÷ (3.56) on applique un déplacement vers droit avec k
des racines inférieures. Ainsi, le calcul des racines M-multiples en module se fait
avec la relation:

Ak( +p M
)
x k = ± m⋅M (3.57)
Ak( p )

et le critère de séparation s’applique au rapport:

66
Metode numerice în ingineria electrică

rk( p ) → M (3.58)

qui s’il tend vers le nombre entier M il montre que la séparation de la racine M-
multiple s’est produite.
c) Le cas des racines complexes. On suppose que les racines complexes et
conjugues x1 et x2 d’équation Pn ( x ) = 0 ont le plus grand module:

x1 = x 2 > x3 > ....... > x n (3.59)

Les racines x1 et x2 complexes et conjugues s’écrit:

x1 = ρ ⋅ e jθ si x 2 = ρ ⋅ e − jθ (3.60)

ou ρ = x1 = x 2 est le module des racines et θ = arg x1 = − arg x 2 est leur


l’argument.
La première relation Vieta pour le pas p de l’itération devient:

A1( p )
2 ρ m ⋅ cos mθ + x3 + ..... + x nm = (3.61)
Ao( p )

Mais le terme 2 ρ m ⋅ cos mθ ne peut pas être considéré prépondérant à cause


du facteur cos mθ avec signe oscillant. La seconde relation Vieta est:

A2( p )
x1m ⋅ x 2m + x1m ⋅ x3m + ..... + x nm−1 ⋅ x nm ≅ ρ 2 m ≅ (3.62)
A0( p )

ce qui conduit à la découverte du terme précèdent ρ 2 m et à la détermination du


module des racines complexes conjuguées en mode similaire avec une racine réelle
2-multiple en module:

A2( p )
ρ= 2m (3.63)
A0( p )

le signe étant évident.


Pour déterminer le critère de séparation on procède de la manière suivante: si la
séparation s’était réalisée dans l’étape p-1 alors il fallait:

67
Methodes de calcul numerique en ingenierie electrique

m
2 p −1 A2p −1
ρ =ρ 2 ≅ (3.64)
A0( p −1)
davantage:

A2( p )
ρ 2p = ρ m ≅ ( p) (3.65)
A0

Par conséquent le rapport r2( p ) doit tendre vers 1

r2( p ) ≅ 1, (3.66)
et le rapport:

( p)
r1 =
(A( ) )
1
p −1 2
(3.67)
A0( p )

a le signe oscillant dû à les changements du signe du terme 2 ρ m ⋅ cos mθ . Ainsi,


la présence des racines complexes et conjuguées sera identifiée par l’apparition
d’un rapport avec signes oscillantes, et la séparation du module d’une paire de
telles racines se produit quand le rapport suivant à celui oscillant tend vers 1.
La détermination de l’argument des racines complexes et conjuguées se fait en
employant les relations Vieta pour l’équation initiale Pn ( x ) = 0.

3.2.2.2. La méthode de Horner utilise la propriété d’un polynôme d’être


divisible avec x − α si α est une racine simple du polynôme. Ainsi, le polynôme de
degré n, Pn (x) peut être approximé sur la forme:

n n −1
Pn ( x) = ∑ an − j x j = ( x − α ) ∑ bn −1− j x j + bn (3.68)
j =0 j =0

ou, les nouveaux coefficients bj, j = 0,..., n sont déterminés récursivement par
identification du termes avec la même puissance de x.
b0 = a0 , bk = ak + αbk −1 , k = 1,..., n

relations qui define le schéma de Horner. Cette relations permet de déterminer les valeurs
du polynôme en x = α , c'est-à-dire Pn (α ) , par « n » opérations de multiplication et
« n-1 » opérations d’adition, ce qui résulte de (3.69) quand x = α , Pn (α ) = bn .

68
Metode numerice în ingineria electrică

Le schéma de Horner peut être adapté pour l’évaluation des dérivâtes d’un
polynôme. En utilisant l’observation que Pn (α ) = bn , on peut considérer pour chaque
approximation de la racine α des relations récursives (3.70), par dérivation il résulte:

dbk db
= bk −1 + α k −1 , k = 1,.., n (3.69)
dα dα

On obtient pour les nouveaux coefficients de la dérivé du polynôme, notés avec:

dbk −1
ck = , k = 1,..., n

les suivantes relations de récursivité:

c0 = b0 , ck = bk + αck −1 , k = 1,..., n - 1 (3.70)

et la valeur du polynôme x = α est

Pn (α ) = cn −1 (3.71)

Si on considère que l polynôme a un racine simple en x = α , alors étant donné


l’approximation initiale α 0 de la racine simple (obtenue par exemple avec la
méthode Lobacevski Graeffe), le procédé Newton-Raphson d’augmentation de la
précision de l’approximation initiale este exprimé en chaque étape de calcul:

bn (α m )
α m +1 = α m − (3.72)
cn −1 (α m )

ou bn, cn-1 sont calcules en utilisant (3.71) şi (3.73). L’algorithme se termine si la


valeur du polynôme est plus petite que l’erreur imposé ε .
Si α est une racine multiple, alors la dérivé du polynôme en α va être nule
Pn' (α ) = 0 , et bn et cn-1 vont tendre simultanément vers 0. En ce cas la, la
convergence du procède Newton-Raphson est mauvaise.
Pour l’amélioration de la convergence on applique le procédé de Newton-Raphson
1
à la fonction f ( x) = [ Pn ( x)] M , ou M este l’ordre de multiplicité de la racine α . Parce
1− M
' 1 '
que f ( x) = [ Pn ( x)] M l’itération Newton-Raphson s’exprime par
M

bn (α m )
α m +1 = α m − M (3.73)
cn −1 (α m )

69
Methodes de calcul numerique en ingenierie electrique

ce qui est similaire avec l’algorithme (3.75). La détermination de M se fais par


l’évaluation des dérivées du polynôme Pn (x) , ou la première dérivée non nulle
donne l’ordre de multiplicité de la racine.
Pour l’évaluation des dérivées on utilise le schéma de Horner complète, c’est-
à-dire la détermination des toutes les dérivées de Pn (x) en x = α est équivalente
avec le développement en série Taylor du polynôme Pn (x) autur du x = α :

Pn ( x) = C0 + C1 ( x − α ) + C2 ( x − α ) 2 + ... + Cn ( x − α ) n (3.74)

ou on a noté

Pn( k ) (α )
Ck = (3.75)
k!
Des itérations (3.69) et (3.70) on obtient les coefficients du polynôme Pn−1 ( x)

Pn ( x) = ( x − α ) Pn −1 ( x) + Co (3.76)

et
C0 = Pn (α ) (3.77)

Par conséquent les coefficients du polynôme Pn−1 ( x) sont b0,b1,….bn-1 donnés


par la relation (3.69). En suite les autres dérivées du polynôme sont évalue de la
même façon. Ainsi on applique encore une foi le schéma de Horner sur le
polynôme Pn−1 ( x) et on obtient les coefficients de Pn− 2 ( x) de la factorisation:

Pn −1 ( x) = ( x − α ) Pn − 2 ( x) + C1 (3.78)

L’application n fois du schéma du Horner va fournir tous le coefficients


Ck , k = 0,..., n - 1 , donc les valeurs des dérivés Pn( k ) (α ) = k!Ck .
Aplicarea de n ori a schemei lui Horner va furniza toţi coeficienţii
Ck , k = 0,..., n - 1 , deci valorile tuturor derivatelor Pn (α ) = k!Ck .
(k )

3.2.2.3. La méthode de Bairstow permet a déterminer les racines réelles et


complexes conjuguées de l’équation Pn ( x ) = 0, par calcul itératif d’un diviseur de
second ordre du polynôme considéré.
Le polynôme Pn ( x ) peut être écrit:

70
Metode numerice în ingineria electrică

( )∑ b
n n−2
Pn (x ) = ∑ ai x i = x 2 + px + q j ⋅ x j + Rx + S (3.79)
i =o j =2

ou x 2 + px + q est un trinom quelconque d’ordre deux et Rx+S est le reste de la


division de Pn ( x ) à x 2 + px + q . Si on élargit les notations pour les coefficients R
et S, c’est-à-dire on note R = bn −1 et S = bn + pbn −1 , alors par identification des
termes avec les mêmes puissances de x, il résulte une relation récursif pour les
nouveaux coefficients:

bk = a k − pbk −1 − qbk −2 , k = 0, n (3.80)

ou on va considérer b− 2 = b−1 = 0 . Evidement pour que x 2 + px + q divise


Pn ( x ) il faut que le reste soit nul:

R ( p, q ) = 0
(3.81)
S ( p, q ) = 0

ou R et S dépendent de p et q. Le système non linéaire (3.71) est équivalent avec:

bn ( p, q ) = 0
(3.82)
bn−1 ( p, q ) = 0

Chaque équation du système (3.82) est non linéaire et pour la résoudre on va


développer en série Taylor les fonctions bn ( p, q ) et bn−1 ( p, q ) autour de
l’approximation courante ( p m , q m ) . Si on garde seulement les termes linéaires on
obtient le système:

⎛ ∂b ⎞ ⎛ ∂b ⎞
bn ( p, q ) ≅ bn ( p m , q m ) + ( p − p m )⎜⎜ n ⎟⎟ + (q − q m )⎜⎜ n ⎟⎟ = 0 (3.83)
⎝ ∂p ⎠ p = pm ⎝ ∂q ⎠ q = qm

Le calcul des dérivées partielles peut se faire en employant la relation de


récurrence (3.80):

71
Methodes de calcul numerique en ingenierie electrique

∂bk ∂b ∂b
= −bk −1 − p k −1 − q k −2
∂p ∂p ∂p
(3.84)
∂bk ∂b ∂b
= −bk −2 − p k −1 − q k − 2
∂q ∂q ∂q

L’idée ingénieuse de la méthode consiste dans le fait que les dérivées partielles
nécessaires a l’itération prochaine peut se calculer a l’aide des formules récursives
∂bk ∂bk
de type (3.80). Ainsi, si on note avec c k = si d k = , il résulte que les
∂p ∂q
relations (3.74) peuvent s’écrire de la manière:

c k = −bk −1c k −1 − q ⋅ c k − 2
(3.85)
d k = −bk −2 − pd k −1 − qd k − 2 , k = 0, n

où on considère c − 2 = c −1 = d − 2 = d −1 = 0 .
Le système linéarisé seulement après la première relation (3.85) devient:

( pn +1 − pm ) ⋅ cn + (qm +1 − qm ) ⋅ cn −1 = −bn
(3.86)
( pm +1 − pm ) ⋅ cn −1 + (qm +1 − qm ) ⋅ cn − 2 = −bn −1
Par analogie on obtient le système a linéarité et ainsi on utilise la seconde
relation (3.85).
⎡ cn
c n−1 ⎤
La matrice du système J = ⎢ est appelée la matrice Jacobienne et
c n −2 ⎥⎦
⎣c n−1
elle est non singulière c’est-à-dire det J ≠ 0, pour les racines complexes et
simples. Dans ce cas on calcule la solution du système (3.86):

bn−1 ⋅ c n −1 − bn ⋅ c n− 2
δ p = p m+1 − p m = (3.87)
c n ⋅ c n− 2 − c n2

bn ⋅ c n−1 − bn −1 ⋅ c n
δq = q m+1 − q m = (3.88)
c n ⋅ c n −2 − c n2

ou c n ⋅ c n − 2 − c n2 = det J .
L’entier procès peut être repris pour le polynôme de dégrée n-2

72
Metode numerice în ingineria electrică

n
Pn− 2 (x ) = ∑ b j ⋅ x j (3.89)
j =2

où les coefficients du cet polynôme sont justement les dernières valeurs calculées à
l’aide de la relation (3.80). L’algorithme continue tant que la factorisation de
Pn ( x ) en produits des polynômes de degré tout au plus deux soit obtenue et on
obtient de paires de solutions de la forme:

− p± p 2 − 4q
x1, 2 = (3.90)
2
En ce qui concerne la choix de l’approximation initiale ( p 0 , q0 ) cella peut être
obtenue par un procédé de localisation des racines, comme par exemple la méthode
de Lobacevski-Graeffe. Sur la convergence de la méthode de Bairstow, du point de
vu pratique on peut présenter un cas de non convergence: si Pn ( x ) à une seule
racine réelle et r 2 + rp 0 + q 0 = 0 , alors la méthode de Bairstow ne converge pas
pour les valeurs initiales ( p 0 , q0 ) .

73
Methodes de calcul numerique en ingenierie electrique

Chapitre 4

Méthodes numériques pour la résolution


des systèmes linéaires d’équations

La résolution numérique des systèmes linéaires d’équations représente un


domaine de grand intérêt théorique et applicatif, qui exclue les difficultés de la
règle de Cramer notamment quand le nombre d’équations est grand.
Les méthodes de résolution des systèmes linéaires d’équations sont de deux types:
a) méthodes exactes (méthodes d’élimination ou méthodes directes) sont celles qui
fournissent la solution par un nombre d’opérations arithmétiques finit et connu à priori;
b) méthodes approximatives (itératives) qui sont caractérisées par ce que la
solution résultée a la suite d’un procès itératif, comme limite d’une suite
convergente et qui a comme point de départ une approximation initiale.
Dans l’ingénierie électrique le problème du résolution numérique des systèmes
linéaires d’équations est souvent rencontré, comme par exemple dans
l’interpolation avec les fonctions spline cubiques des caractéristiques des éléments
du circuit, la résolution de systèmes d’équations des circuits électriques et
électroniques, l’orientation des équations différentielles non linéaires avec des
conditions à la limite utilisée dans l’analyse du champ électromagnétique etc.

4.1. Méthodes directes de résolution


des systèmes linéaires d’équations

Soit la fonction f : ℜ 2 → ℜ n et f ( x ) = 0 un système d’équations. Si les


termes des équations du système sont de premier degré alors le système est linéaire
et si il existe des équations qui contiennent des termes ayant le degré plus grand
que 1, alors le système n’est pas linéaire.
Un système linéaire avec n inconnu peut être écrit sous forme canonique
développée:

74
Metode numerice în ingineria electrică

a11x1 + a12 x2 + ... a1n xn = b`1


a21x1 + a22 x2 + .... a2 n xn = b2
. . . .
(4.1)
. . . .
. . . .
an1x1 + an 2 x2 + .... ann xn = bn
ou sous forme matricielle restreinte:
Ax = B (4.2)
où: A est la matrice du système (des coefficients) de dimension nxn
⎛ a11 a12 a1n ⎞
⎜ . . . ⎟⎟

A=⎜ . . . ⎟ (4.3)
⎜ ⎟
⎜⎜ . . . ⎟
⎝ a n1 a n 2 ... a nn ⎟⎠

⎛ x1 ⎞
⎜ . ⎟
⎜ ⎟
X est le vecteur colonne 1xn des inconnues: X = ⎜ . ⎟ (4.4)
⎜ ⎟
⎜⎜ . ⎟⎟
⎝ xn ⎠
⎛ b1 ⎞
⎜ . ⎟
⎜ ⎟
et B este le vecteur colonne 1xn des termes libres: B = ⎜ . ⎟ (4.5)
⎜ ⎟
⎜⎜ . ⎟⎟
⎝ bn ⎠
4.1.1. La méthode de Gauss résout les systèmes des équations linéaires qui
ont la matrice du système carrée et non singulière (det A ≠ 0 ) , par un algorithme
d’élimination successive des inconnues. Ainsi, si on multiplie la première équation
ai1
du système (4.1), chacune à son tour avec − pour i = 2, n et puis on l’ajoute a
a11
l’équation numéro i, on va éliminer l’inconnue x1 de chaque équation, évidemment
avec l’exception de la première équation. On obtient le système équivalent:

75
Methodes de calcul numerique en ingenierie electrique

a11 x1 + a12 x2 + ....... + a1n xn = b1


(1)
a22 x2 + ........ + a2(1n) x2 = b2(1) (4.6)
.
.
an(12) x2 + ......... + ann
(1)
xn = bn(1)
ou on a noté les nouveaux coefficients obtenus dans cette première étape de calcul
avec l’indice supérieur. Aussi il est évident que dans la première équation du
système les coefficients ne se modifient pas. L’algorithme continue par la
ai 2
multiplication de la seconde équation du système (4.6) par − , pour i = 3, n et
a 22
puis en l’ajoutant a chaque équation i du système on va éliminer l’inconnue x2. On
obtient le système équivalent:
a11 x1 + a12 x 2 + ........ + a1n x n = b1
(1)
a 22 x 2 + .......... + a 2(1n) x n = b2(1)
(2 )
a33 x3 + ..... + a3(2n) x n = b3(2 )
(4.7)
.
.
(2 ) (2 )
a n3 x3 + ...... + a nn x n = bn(2 )
Le procédé d’élimination des inconnues continue tant qu’on arrive à la forme
du système:
a11 x1 + .................... + a1n xn = b1
(1)
a22 x2 + ........... + a2(1n) xn = b2(1)
. (4.8)
.
an(n1−1) xn = bn(n −1)
Ce qui est équivalent avec la réduction de la matrice A à une matrice supérieure
– triangulaire et l’équation matricielle du système devient:
⎛ a11 .. . . a1n ⎞ ⎛ x1 ⎞ ⎛ b1 ⎞
⎜ (1) ⎟ ⎜ ⎟ ⎜ ⎟
⎜ 0.. a 22 . a 2(1n) ⎟ ⎜ . ⎟ ⎜ b2(1) ⎟
⎜ 0.. ⋅ = (4.9)
. ai(,i −j 1) .. ai(,in−1) ⎟ ⎜ . ⎟ ⎜ . ⎟
⎜ ⎟ ⎜ ⎟ ⎜ (n −1) ⎟
⎜ 0.. . . ( n −1) ⎟ ⎜
a nn ⎟ ⎜ ⎟
⎝ ⎠ ⎝ x n ⎠ ⎝ bn ⎠
76
Metode numerice în ingineria electrică

ou les indices supérieurs indiquent l’étape dans laquelle on a obtenu l’élément


respectif. Cette étape par laquelle on amène la matrice A à une forme triangulaire
s’appelle triangularisation et chaque élément akk, avec k = 1, n , points sur la
diagonale principale s’appelle pivot. Evidement, dans le cours de l’algorithme pour
opérer, il faut que tous les pivots soient non nuls. Davantage, pour réduire les
erreurs d’arrondissement on recommande que la valeur du pivot soit la plus grand
possible. Pour résoudre ces deux demandes on utilise la procédure de pivotage,
c’est-à-dire de permutation (échange) des lignes (ou des lignes et colonnes). Le
pivotage, effectué dans une certaine étape de calcul ne modifie pas les décimales
déjà obtenues dans la matrice A. Nous donnons beaucoup des explications pour
cette procedure dans le chapitre 4.2, “Problèmes numériques“.
Les inconnues sont déterminées après (n-1) étapes d’élimination et de (4.8) on
détermine, l’une après l’autre, en commencent par la dernière:

b (n −1)
xn = n(n −1)
ann
bn(n−−1 2 ) − ann−−12 ⋅ xn
xn −1 =
an(n−−1,2n)−1


n (4.10)
bi(i −1) − ∑ a(
j = i +1
ij
i −1)
⋅ xj
xi =
aii(i −1)
.
n
b1 − ∑a
j =2
1j ⋅ xj
x1 =
a11

L’étape de détermination des inconnues est appelée retrosubstitution.


Il est intéressant a analyser la complexité de la méthode du Gauss. Ainsi, en ce
qui concerne l’effort de calcul, le passage de pas k à pas k+1 de l’algorithme
implique l’exécution de:
(n − k )(n − k + 1) multiplications, (n − k )(n − k + 1) additions, (n − k ) divisions
Par conséquent, à la fin des étapes de calcul on va effectuer:
n −1
n(n 2
) multiplications
−1
∑ (n − i )(n − i + 1) =
i =1 3

77
Methodes de calcul numerique en ingenierie electrique

n −1
n(n 2
) additions
−1
∑ (n − 1)(n − i + 1) =
i =1 3
n −1
n(n − 1)
∑ (n − 1)
i =1
=
2
divisions

opérations pour la triangularisation de A, et pour la retrosubstitution on va


effectuer:

n −1
n(n − 1) n −1
n(n − 1)
∑ (n − i ) =
i =1
multiplications, ∑ (n − i ) =
2 i =1 2
additions.

En ajoutant les types d’opérations n divisions effectuées en total dans les deux
étapes on obtient pour la méthode de Gauss un total de:

n(n − 1)(2n + 5) n(n − 1)(2n + 5) n(n + 1)


multiplications, additions et divisions.
6 6 2
Vu que le temps nécessaire à l’ordinateur pour effectuer une multiplication est
beaucoup plus important que le temps consommé pour une addition, alors on peut
supposer que l’effort de calcul nécessaire à l’ordinateur pour la méthode de Gauss est
proportionnel seulement avec le nombre de multiplications et divisions, c’est-à-dire:

ϑG ≅
(
n 2n 2 + 6n − 2 ) (4.11)
6
Ce nombre est très petit, a partir de n ≥ 3 , comparé au nombre d’opérations
requises par la méthode de Cramer (avec les detérminnats calculés d’après les
mineurs):

θ C = n ⋅ n! (4.12)

c’est-à-dire ϑG << ϑC (4.13)

En ce qui concerne le nécessaire de mémoire utilisé dans la méthode de Gauss,


pour mémoriser la matrice A et les vecteurs B et X ils sont
nécessaires n 2 + n + n = n(n + 2 ) locations de mémoire, chacune location étant
réservée pour un nombre réel.
Les locations égales de mémoire sont nécessaires aussi pour la règle de Cramer.

78
Metode numerice în ingineria electrică

4.1.2. La méthode de Gauss-Jordan ou la méthode matricielle formelle


est similaire avec la méthode précédente, avec la différence que la matrice A du
système est amenée à une forme diagonale (avec des éléments non nuls
seulement sur la diagonale principale). La production de zéros dessus et dessous
de la diagonale principale se fait par transformations élémentaires appliquées a
l’équation matricielle initiale (4.2). Ainsi, les nouveaux coefficients de la matrice
A sont:

dans la première étape de calcul: aij(1) = aij (4.14)

dans l’étape k de calcul:


ai(,kk−−11)
aij(k ) = aij(k −1) − (k −1) ⋅ a k(k−−11) i ≠ k − 1, j ≥ k − 1 (4.15)
a k −1,k −1
a k(k−)1, j = a k(k−−11,j) j ≥ k −1
ai(,kj) = aij(k −1) j < k −1

Les nouveaux coefficients de la matrice B sont:

dans la première étape de calcul: bi(1) = bi (4.16)

ai(,kk−−11)
bi(k ) = bi(k −1) − i ≠ k −1
dans l’étape k de calcul: a k(k−−11,k) −1 (4.17)
(k ) ( k −1)
bk −1 = bk −1 k = 2, n

La détermination des inconnues ne se fait pas par retrosubstiution mais


directement, par une seule division.
Le numéro d’opérations dans la méthode Gauss-Jordan est avec environ 50%
plus grand que dans la méthode Gauss, parce que dans chaque étape k on calcule n-
1 multiplicateurs:
n
n3 3n
ϑG − J = ∑ [(n − 1) + (n − 1)(n + 1 − k )] = + n2 − (4.18)
k =1 2 2

A cause du grand nombre d’opérations, la méthode de Gauss-Jordan est utilisée


notamment dans le calcul numérique de la matrice inverse, ce qui suppose la
transformation de la matrice A dans une matrice unité (les éléments non nulles de
la diagonale principale soit égaux a 1).

79
Methodes de calcul numerique en ingenierie electrique

4.1.3. La méthode de Jacobi. Le système d’équations:

a11 x1 + a12 x2 + .... + a1n xn = b1


a21x1 + a22 x2 + .... + a2 n xn = b2
(4.19)
..................................................
an1 x1 + an 2 x2 + .... + ann xn = bn

se transforme dans le sens de l’écriture de chaque inconnue x1,x2,…..xn en fonction de


toutes autres et on obtient:

b1 a a
x1 = − − 0 − 12 x2 − ......... − 1n xn
a11 a11 a11
b2 a21 a
x2 = − − x1 − 0........... − 2 n xn
a22 a22 a22 (4.20)
................................................................
b a a
xn = − n − n1 x1 − ... − n, n −1 xn − 0
ann ann ann

Si on choit comme approximation initiale une solution ( x1(0) , x2(0) ,...., xn(0) ) du
système, alors les solutions (4.20) seront les formules de récurrence pour le calcul
itératif des solutions du système. Toutes ensemble, ces relations peut être pose pour
exprimer l’inconue xi dans l’itération k:

bi ai1 ( k −1) ai 2 ( k −1) ai ,i −1 ( k −1) a a (4.21)


xi( k ) = − x1 − x2 − xi −1 − 0 − i ,i +1 xi(+k1−1) ... − in xn( k −1) , i = 1,.., n
aii aii aii aii aii aii

Donc les suites d’itérations successives pour la détermination de l’inconnue xi


( x , xi( 0 ) ,...., xi( k ) ) sont convergentes pour k → ∞ , alors les limites de la suite
(0)
i
donné par (4.21) représente les solutions du système considéré.
Pour obtenir la condition de convergence des suites (4.21) s’exprime en
commencement par l’équation matricielle associé au système (4.20):

X (1) = CX (0) + D (4.22)

ou:

80
Metode numerice în ingineria electrică

⎛ b1 ⎞
⎜ ⎟
⎛ 0 − .......... − a12
⎞ ⎜ a1,1 ⎟
a1n

⎛ x1 ⎞ ⎜ a11⎟ ⎜b ⎟
a11
⎜ ⎟ ⎜ a 21 a ⎟
⎜ 2 ⎟
⎜ x2 ⎟ ⎜ − a 0............ − a2 n ⎟
X = ⎜ ⎟, C =

22 22
⎟ , D = ⎜ a22 ⎟ (4.23)
... ................................. ⎟ ⎜ ⎟
⎜ ⎟ ⎜ ...... ⎟
⎜x ⎟ ⎜
⎝ n⎠ ⎜⎜ − n1 ......................0 ⎟⎟
a
⎜ bn ⎟
⎝ a nn ⎠ ⎜ ⎟
⎝ ann ⎠

Continuant la procédure itérative on obtient successivement les équations


matricielles:

X ( 2) = CX (1) + D = C 2 X (0) + CD
..................................................... (4.24)
(k ) k ( 0) k −1 k −2
X =C X + (C +C + ... + C + I ) D

ou I est la matrice unité nxn. La série matricielle géométrique

S = C k −1 + C k − 2 + ... + C + I (4.25)

est convergente quand la norme ou toutes les valeurs propres de la matrice C sont
sous unitaires. La condition que toutes les valeurs propres de la matrice soient sous
unitaires est:


aij
qi = aii
〈1, i = 1,..., n (4.26)
j =1
j ≠i

et la relation (4.26) est obligatoirement accomplie pour que la méthode de Jacobi


puisent être applique.
Dans la condition (4.26) la somme de la série est:

S = ( I − C ) −1 (4.27)

ce qui implique

lim C k -1 = 0, X = (I - C) -1 D, X = CX + D
k→∞

ou X est le vecteur des toutes les solutions de l’équation (4.22).

81
Methodes de calcul numerique en ingenierie electrique

4.1.4. La méthode de Gauss-Seidel diffère de la méthode de Jacobi par


le fait que à chaque itération on utilise les valeurs calculées au pas antérieur pour
les variables pour lesquelles on ne connaît pas les valeurs au pas curent et les
valeurs du pas curent pour les variables calculées.
Dans ce cas la relation (4.21) s’ecrit sous la forme:
i −1
bi aij n
aij
xi( k ) =
aii
− ∑a
j =1 ii
x (jk ) − ∑a
j = i +1 ii
x (jk −1) que i = 1,..., n, k = 1,.., n. (4.28)

Au reste, la méthode Gauss-Seidel est similaire avec la méthode de Jacobi. Pour


le même dégrée de précision la vitesse de convergence de la méthode Gauss-Seidel
est deux fois plus grande que la vitesse de convergence de la méthode Jacobi.

4.2. Méthodes de résolution des systèmes


d’équations par factorisation

Soit le système d’équations algébriques:


[A][X] = [Y] (4.29)

où [X] est le vecteur des N inconnues, [Y] est le vecteur des termes libres, et [A]
est la matrice carrée (de taille N*N) des coefficients.
La factorisation consiste dans la représentation de la matrice des coefficients
[A] par le produit de deux matrices:

[ A] = [ L ][U ] (4.30)

où:
[L] est une matrice inférieure - gauche (« Lower », en anglais), dont les
termes non nuls se trouvent seulement en dessous de la diagonale
principale, et sur celle-ci.
[U] est une matrice supérieure - droite (« Upper », en anglais), dont les termes
non nuls se trouvent seulement en dessus de la diagonale principale. Les
termes diagonaux de [U] sont tous 1.

⎛x ⎞ ⎛1 x x x x⎞
⎜ ⎟ ⎜ ⎟
⎜x x ⎟ ⎜ 1 x x x⎟
[ L] = ⎜ x x x ⎟ [U ] = ⎜ 1 x x⎟ (4.31)
⎜ ⎟ ⎜ ⎟
⎜x x x x ⎟ ⎜ 1 x⎟
⎜x x x x x ⎟⎠ ⎜ 1 ⎟⎠
⎝ ⎝

82
Metode numerice în ingineria electrică

Après la factorisation, le système devient:


[L][U][X]=[Y] (4.32)

On peut introduire un vecteur auxiliaire:

[U][X]=[Z] (4.33)

Ainsi, le système se decompose en deux étapes:


Etape 1 - « parcours direct »: pour calculer [Z], résoudre le système:
[L][Z]=[Y] (4.34)
Etape 2 - « parcours inverse »: calculer [X], solution du système:
[U][X]=[Z] (4.35)
A la première vue, il semblerait que les deux étapes pourraient compliquer la
procédure. En réalité, on va constater que ceci n’est pas vrai.
i) Première étape – factorisation de la matrice des coefficients du système
Il existe plusieures variantes de factorisation. Nous allons étudieur les deux
principales: la factorisation de Crout et celle de Doolittle.
• Factorisation de Crout
Commençons tout d’abord par un exemple. Soit une matrice de taille 4x4, et sa
factorisation LU:

⎛ A11 A12 A13 A 14 ⎞ ⎛ L11 0 0 0 ⎞ ⎛ 1 U12 U13 U 14 ⎞


⎜ ⎟ ⎜ ⎟
⎜ A21 A22 A23 A 24 ⎟ ⎜ L21 L22 0 0 ⎟ ⎜⎜ 0 1 U 23 U 24 ⎟⎟
= * (4.36)
⎜ A31 A32 A33 A34 ⎟ ⎜ L31 L32 L33 0 ⎟ ⎜0 0 1 U 34 ⎟
⎜⎜ ⎟ ⎜ ⎟ ⎜ ⎟
⎝ A41 A42 A43 A44 ⎟⎠ ⎜⎝ L41 L42 L43 L44 ⎟⎠ ⎜⎝ 0 0 0 1 ⎟⎠

Le produit des deux facteurs L et U donne:

⎛ L11 L11U12 L11U13 L11U14 ⎞


⎜ ⎟
L L U +L L21U13 + L22U23 L21U 14 +L22U24
( A) = ⎜⎜ 21 21 12 22 ⎟ (4.37)
L31 L31U12 + L 32 L31U13 + L32U23 + L33 L31U14 + L32U24 + L33U34 ⎟
⎜⎜ ⎟⎟
⎝ L41 L41U12 + L42 L41U13 + L42U23 + L43 L41U14 + L42U24 + L43U34 + L44 ⎠
Par comparaison avec la matrice d’origine [A] on constate que:

83
Methodes de calcul numerique en ingenierie electrique

a) La première colonne de L est identique à la même colonne de A, donc aucun


traitement n’est pas nécessaire:
Li1 = A i1 pour i=1 à N.
b) La première ligne de U, sauf le pemier élément qui est 1, s’obtient en
divisant les éléments de A par l’élément sur la diagonale L11:
U1j = A 1j / L11 pour j=2 à N.
c) On continue par la deuxième colonne de L. Les éléments Li1=Ai1 et U12 qui
figurent dans les expresions sont connues. Par conséquent:
Li2 = A i2 – Li1U12, pour i=2 à N.
d) On continue par la deuxième ligne de U. Les éléments Li1=Ai1 et U12 qui
figurent dans les expresions sont connues. Par conséquent:
U2j = (A 2j – L21U1j)/L22, pour j=2 à N.
e) L’algorithme continue de la même manière, en alternant les colonnes de L et
les lignes de U. Ainsi, à l’étape (m, pour m=2 à N), on obtient:
k −1
Lim = Aim − ∑ LijU jm ;
j =1
(4.38)
k −1
U mj = ( Amj − ∑ LmiU ij ) / Lmm ; m = 2, N
i =1

On peut illustrer ceci par la figure suivante:

Fig. 4.1. Succéssion des opérations dans la factorisation de Crout.

84
Metode numerice în ingineria electrică

En principe, l’algorithme est le suivant (voir aussi le diagramme de la figure


4.2, avec les références aux divers pas dans le code):
//PROGRAMME Factorisation de Crout
//Première colonne du L (étape 1):
Pour i=1 à N {
L(i,1)=A(i,1)
}//i
//Première ligne de U (étape 2):
Pour j=2 à N {
U(1,j)=A(1,j)/L(1,1)
}//j
//Lignes et colonnes suivantes (étape 3):

Pour m=2 à N {
//Colonne m de L (étape 4):
Pour i=m à N {
//L(i,m)=A(i,m)-<v1,v2>
L(i,m)=A(i,m)-Σj=1à m-1[L(i,j)U(j,m)]
}//i
Si j=N, alors FIN
//Ligne m de U (étape 5):
Pour j=m+1 à N {
//U(m,j)=[A(m,j)-<v3,v4>]/L(m,m)
U(m,j)=(A(m,j)-Σi=1 à m-1[L(m,i)U(i,j)])/L(m,m)
}//j
}//m
où <vm, vn> est le « produit scalaire » entre les « vecteurs » vm et vn.
m j
2
V j V i
3

V 5
i U(
4
1
V
i L(i
j

Fig. 4.2. Illustration de la méthode de factorisation de Crout

85
Methodes de calcul numerique en ingenierie electrique

• Factorisation de Doolittle
Cette variante présente quelques avantages par rapport avec la méthode de
Crout, ce qui la rend mieux adaptée dans le cas des « matrices creuses », dont on va
parler plus loin.
Prenons, pour l’instant, l’exemple précédent (relations 4.27 et 4.28), mais en
suivant une procédure différente.
On détérmine d’abord L11=A11, puis la première ligne de U:
U1j = A 1j/L11, pour j=2 à N.
On continue par la deuxième ligne de L et de U. Ainsi:
L21=A21 ; L22 = A22 – L21U12.
U2j = (A2j –L21U1j)/ L22 pour j=3 à N.
L’algorithme continue de la même manière, en traitant succéssivement les lignes des
deux matrices, d’abord de L, puis de U. Ainsi, à l’étape (m, pour m=2 à N), on obtient:
j −1
Lmj = Amj − ∑ LmiU ij ; j = 1, m
i =1
(4.39)
k −1
U mj = ( Amj − ∑ LmiU ij ) / Lmm ; j = m + 1, N
i =1

1 2

3 4

Fig. 4.3. Succéssion des opérations dans la factorisation de Doolittle.

Cette méthode est mieux adaptée au traitement de systèmes de grande taille.


En particulier, lors de la factorisation des matrices « creuses », le parcours par
lignes peut être plus performant, comme on le verra plus tard.
En principe, l’algorithme est le suivant (voir aussi le diagramme de la figure
4.4, avec les références aux divers pas dans le code):

86
Metode numerice în ingineria electrică

//PROGRAMME Factorisation de Doolittle


//Parcours par lignes (étape 1):
Pour m=1 à N {
//Ligne m de L (étape 2):
Pour j=1 à m {
//L(m,j)=A(m,j)-<v1,v2>
L(m,j)=A(m,j)-Σi=1à j-1[L(m,i)U(i,j)]
}//j
//Ligne m de U (étape 3):
Pour j=m+1 à N {
//U(m,j)=[A(m,j)-<v3,v4>]/L(m,m)
U(m,j)=(A(m,j)-Σi=1 à m-1[L(m,i)U(i,j)])/L(m,m)
}//j
}//m
C’est un avantage lorsque les matrices sont gardées en mémoire par lignes.
Ceci peut être utile lorsque on utilise des techniques adaptées aux matrices creuses.

V i i V

2 3
V
m
V L(m U(m j
i j j

Fig.4.3. Illustration de la méthode de factorisation de Doolittle

On peut constater que, pour les deux méthodes de factorisation présentées:


• Le nombre des calculs significatifs (multiplications et divisions) est de l’ordre
de grandeur O(N3/3), comme, par ailleurs, pour l’algorithme de Gauss.
• Les tableaux L et U peuvent partager la mémoire avec le tableau d’origine A.
En effet, dans les calculs, les éléments des facteurs [L] et [U] remplacent au fur et à
mesure des calculs ceux de la matrice d’origine [A].

87
Methodes de calcul numerique en ingenierie electrique

• On peut calculer facilement le détérminant de la matrice [A]. En effet, sa


valeur est le produit les termes diagonaux du [L] (car les termes diagonaux de U
sont unitaires):
N
Det ( A ) = ∏ Lii (4.40)
i =1

En grandes lignes, la factorisation contient trois cycles imbriqués:


• Un cycle « extérieur », soit suivant la diagonale de la matrice (méthode de
Crout), soit les lignes (méthode de Doolittle). Ce cycle s’exécute une seule fois, et
il contient N pas.
• Un deuxième type de cycle, à l’intérieur du premier. Celui-ci se passe soit en
alternance, sur les parties encore non traitées des colonnes de L et des lignes de U
(méthode de Crout), soit au long de la ligne en cours de traitement (méthode de
Doolittle). La « longueur moyenne » d’un tel cycle est de N éléments (entre 2N et 0
pour la méthode de Crout, N pour la méthode de Doolittle).
• Un cycle « interne », représenté par les « produits scalaires » entre deux
vecteurs, mis en évidence dans les programmes 4.1 et 4.2 par <vm,vn>. Ces cycles
sont exécutés le plus souvent (N² fois). Par conséquent, ils sont les plus critiques en
termes de performance, et ils sont ceux qui devront être optimisés en premier lieu.
Ainsi, on peut, à la limite, les coder en langages assembleurs, même si cette
approche peut poser des problèmes de programmation et de portabilité.

ii) Deuxième etape - Solution du système


Comme il a été montré plus haut, cette deuxième partie de la résolution du
système, est réalisée par la méthode du « double parcours », qui se passe, à son
tour, en deux étapes:
a) Parcours direct: on résout le système auxiliaire

⎛ L11 ⎞ ⎛ Z1 ⎞ ⎛ Y1 ⎞
⎜ ⎟⎜ ⎟ ⎜ ⎟
[ L][ Z ] = [Y ] ⇒ ⎜ x x ⎟ ⎜ ... ⎟ = ⎜ ... ⎟ ↓ ⇒ [ Z ] (4.41)
⎜ x x LNN ⎟⎠ ⎜⎝ Z N ⎟⎠ ⎜⎝ YN ⎟⎠

Les éléments du vecteur auxiliaire [Z] sont calculés successivement dans le


sens indiqué par la flèche. Cette étape exige environ O(N2/2) calculs.
En principe, l’algorithme est le suivant:

88
Metode numerice în ingineria electrică

//PROGRAMME Parcours direct


//Premièr élément de Z:
Z(1)=Y(1)/L(1,1)
//Eléments suivants:
Pour m=2 à N {
Z(m)={Y(m)- Σj=1à m-1[L(m,j)Z(j)]}/L(m,m)
}
Le parcours direct peut être exécuté en même temps que la factorisation.
b) Parcours inverse: on résout un autre système auxiliaire

⎛ 1 x x ⎞ ⎛ X 1 ⎞ ⎛ Z1 ⎞
⎜ ⎟⎜ ⎟ ⎜ ⎟
[U ][ X ] = [ Z ] ⇒ ⎜ 1 x ⎟ ⎜ ... ⎟ = ⎜ ... ⎟ ↑ ⇒ [ X ] (4.42)
⎜ 1 ⎟⎠ ⎜⎝ X N ⎟⎠ ⎜⎝ Z N ⎟⎠

Les éléments du vecteur des inconnues [X] sont calculés successivement dans
le sens indiqué par la flèche. Cette étape exige aussi environ O(N2/2) calculs.
En principe, l’algorithme est le suivant:
//PROGRAMME Parcours inverse
//Dernier élément de X:
X(N)=Z(N)
//Eléments suivants:
Pour m=N-1 à 1 avec pas -1 {
X(m)=Z(m)- Σj=m+1 à N[U(j,m)X(j)]
}
Remarques:
• On constate que la partie la plus « coûteuse » en terme de temps de calcul est
celle de la factorisation, avec un nombre de calculs significatifs de l’ordre O(N3/3).
Le double parcours qui s’ensuit demande, en total, environ O(N2) calculs.
• La méthode de la factorisation devient encore plus performante lorsque un
système doit être résolu pour plusieurs termes libres. En effet, dans une telle
situation, il suffit une seule factorisation de la matrice des coefficients.
iii) Problèmes numériques
Comme on peut constater, lors de la factorisation, par n’importe quelle
méthode, il existe un opération de division des éléments d’une ligne par le terme
diagonal de la matrice L, situé sur la ligne en cours de traitement. On appelle ce
terme « pivot ».

89
Methodes de calcul numerique en ingenierie electrique

Le problème arrive lorsque on tombe sur un pivot nul (Lkk = 0 pour une
certaine valeur de k).
La solution consiste dans l’adoption d’un pivot convenable, obligatoirement
non nul. En plus, des raisons numériques montrent qu’il est avantageux de choisir
un pivot le plus grand possible, dans quel cas les erreurs sont moindres.
Le pivot peut être choisi parmi les termes de la matrice pas encore traités
pendant la factorisation, donc parmi ceux situés « en dessous » et « à droite » du
terme concerné.
Ceci équivaut à une permutation des équations (donc des lignes), ou à une
permutation des colonnes (donc une renumérotation des inconnues).
En pratique, la permutation (des lignes ou des colonnes) est seulement
«virtuelle ». En effet, les éléments gardent leurs places, mais ils sont accédés par
voie indirecte, par l’intermédiaire de « vecteurs de permutation ».
• Dans le cas du « pivotage partiel », seulement les lignes sont permutées.
Le pivot qui doit remplacer un élément A(m,m) nul est choisi parmi les
candidats situés sur la même colonne, et sur une des lignes qui suivent:

A(m, m) = 0 ⇒ pivot = A(i p , m) i p ∈ (m + 1, N ) (4.43)

Un vecteur PL de taille N contient les indices des N lignes de la matrice A. Au


début, son contenu est:

PL(i)=i, i=1,N (4.44)

La « permutation » de deux lignes i1 et i2 se traduit par:

PL(i1)=i2, PL(i2)=i1 (4.45)

L’accès aux éléments de la matrice A se fait en réalité, dans cette situation, de


la manière suivante:

A(i, j ) ⇒ A( PL(i ), j ) (4.46)

• Dans le cas du « pivotage total », à la fois les lignes et les colonnes sont
permutées.
Le pivot qui doit remplacer un élément L(k,k) nul est choisi parmi les
candidats situés sur une des lignes et colonnes qui suivent:
A(m, m) = 0 ⇒ pivot = A(i p , j p ) i p ∈ (m + 1, N ), j p ∈ (m + 1, N ) (4.47)

90
Metode numerice în ingineria electrică

Par conséquent, on utilise deux vecteurs de permutation, un (PL) pour les


lignes (donc les équations), l’autre (PC) pour les colonnes (donc les inconnues). Au
début, ils contiennent:
PL(i)=i ; i=1,N (4.48)

PC(j)=j ; j=1,N (4.49)

La « permutation » de deux lignes i1 et i2 et de deux colonnes j1 et j2 se traduit par:

PL(i1)=i2, PL(i2)=i1 (4.50)

PC(j1)=j2, PC(j2)=j1 (4.51)

L’accès aux éléments de la matrice A se fait, dans cette situation, de la manière


indirecte suivante:

A(i, j ) ⇒ A( PL(i ), PC ( j )) (4.52)

4.3. Méthodes de résolution des systèmes


d’équations symétriques

Une matrice symétrique [A] est celle pour laquelle:

( A) = ( A)
T
Aij = Aji ⇒ (4.53)

Des telles matrices figurent, par exemple, dans les systèmes d’équations
fournis par les méthodes numériques de modélisation des champs. La symétrie de
la matrice pourrait être exploitée, afin de simplifier les traitements, et les rendre
plus performants.

4.3.1. Factorisation par la méthode


de la racine carrée (méthode de Cholesky)
Cette méthode est utilisable seulement si la matrice symétrique est aussi
positive définie. C’est, en principe, le cas des équations fournies par les méthodes
des différences finies ou des éléments finis, pour la résolution numérique des
systèmes d’équations aux dérivées partielles.

91
Methodes de calcul numerique en ingenierie electrique

La factorisation d’une telle matrice peut être de la forme:

[ A] = [U ] [U ]
T
(4.54)

où [U] est une matrice supérieure - droite (« Upper », en anglais), dont les termes
non nuls se trouvent seulement en dessus de la diagonale principale. Les termes
diagonaux de [U] ne sont plus 1.
Par exemple, soit le cas d’une matrice symétrique d’ordre 4:

⎛ A11 A12 A13 A14 ⎞ ⎛U11 0 0 0 ⎞ ⎛U11 U12 U13 U 14 ⎞


⎜ ⎟ ⎜ ⎟ ⎜ ⎟
⎜ A12 A22 A23 A 24 ⎟ = ⎜U12 U22 0 0 ⎟ ⎜ 0 U22 U23
*
U 24 ⎟
(4.55)
⎜ A13 A23 A33 A34 ⎟ ⎜U13 U23 U33 0 ⎟ ⎜ 0 0 U33 U34 ⎟
⎜⎜ A A A A ⎟⎟ ⎜⎜U U U U ⎟⎟ ⎜⎜ 0 0 0

U44 ⎟⎠
⎝ 14 24 34 44 ⎠ ⎝ 14 24 34 44 ⎠ ⎝

L’algorithme est le suivant:


a) On détérmine d’abord U11 = A11 , puis la première ligne de U:

U1j = A 1j/L11, pour j=2 à N.


b) L’algorithme continue de la même manière, en traitant succéssivement les
autres lignes de la matrice U. Ainsi, à l’étape (m, pour m=2 à N), on obtient:

m −1
U mm = Amm − ∑ U im2 = Amm − < v1 , v1 > ; m = 2, N
i =1
(4.56)
m −1
U mj = (U mj − ∑ U imU ij ) / U mm = (U mj − < v1 , v2 >) / U mm ; j = m + 1, N
i =1

Comme plus haut, <vm,vn> est le produit scalaire des deux vecteurs figurés sur
le diagramme suivant. Il faut cependant tenir compte de la symétrie de la matrice
(voir, par exemple, les vecteurs v1 et v1T qui sont équivalents).

92
Metode numerice în ingineria electrică

1
V V
i i

3
V
m
U(m j
U(m j

Fig. 4.5. Illustration de la méthode de factorisation de la racine carrée (Cholesky)

En principe, l’algorithme est le suivant (voir aussi le diagramme de la figure


4.5, avec les références aux divers pas dans le code):
//PROGRAMME Factorisation Cholesky
//Première ligne de U (étape 1):
U(1,1)=sqrt(A(1,1))
Pour j=2 à N {
U(1,j)=A(1,j)/U(1,1)
}//j
//Lignes suivantes (étape 2):
Pour m=2 à N {
//U(m,m)=sqrt[A(m,m)-<v1,v1>]
U(m,m)=sqrt[A(m,m)-Σi=1 à m-1(uim2)]
//Ligne m de U (étape 3):
Pour j=m+1 à N {
//U(m,j)=[A(m,j)-<v1,v2>]/U(m,m)
U(m,j)=(A(m,j)-Σi=1 à m-1[U(i,m)U(i,j)])/U(m,m)
}//j
}//m

Le moment « critique » est celui du calcul de la racine carrée, pour les


éléments diagonaux. Si la matrice est vraiment positive définie, ce calcul est
possible. Par contre, lorsque la matrice n’est pas positive définie, le terme dont il
faut calculer la racine carrée est négatif, ce qui bloque l’algorithme. Dans des telles

93
Methodes de calcul numerique en ingenierie electrique

situations, il faut choisir l’algorithme sui sera présenté plus loin, qui est utilisable
aussi pour les matrices symétriques, mais non positives définies.
Il est, par contre, évident que le « pivotage » risque de détruire la symétrie de
la matrice. Par conséquent, il est à éviter.
Cependant, on peut démontrer que si la matrice A est symétrique et positive
définie, tous les « pivots » seront positifs (de sorte que l’algorithme puisse être mis
en œuvre) , donc le pivotage n’est pas nécessaire de ce point de vue. Il reste,
néanmoins, le problème de savoir si les pivots sont suffisamment grands, de sorte
que les erreurs d’arrondi ne soient pas trop grandes. La réponse est, de nouveau,
favorable à cette méthode. Par conséquent, on peut considérer que les permutations
ne sont pas nécessaires dans la méthode de Choleski, bien que les erreurs d’arrondi
ne soient pas totalement exclues.

4.3.2. Factorisation des matrices symétriques, non positives définies


Si la matrice des coefficients [A] n’est pas positive définie, l’algorithme
précédent n’est plus utilisable, car à un certain moment la racine carrée qui figure
dans le calcul de l’élément situé sur la diagonale, n’est plus possible.
Cependant, il existe une méthode capable de contourner cet inconvénient.
Elle consiste dans la représentation de la matrice symétrique par le produit de
trois matrices:

[ A] = [ L ][ D ][U ] = [U ] [ D ][U ] , avec [ L ] = [U ]


T T
(4.57)

où [D] est une matrice diagonale, dont les termes sont Dm=±1, et [U] est une
matrice triangulaire supérieure, avec des termes diagonaux différents de 1:

⎛ U11 x x x x ⎞ ⎛ ±1 ⎞
⎜ ⎟ ⎜ ⎟
⎜ U22 x x x ⎟ ⎜ ±1 ⎟
[U ] = ⎜ Umm x x ⎟ [ D] = ⎜ ±1 ⎟ (4.58)
⎜ ⎟ ⎜ ⎟
⎜ Unn x ⎟ ⎜ ±1 ⎟
⎜ UNN ⎠⎟ ⎜ ±1⎠⎟
⎝ ⎝
Un terme diagonal de la matrice des coefficients [A] est, selon les règles de
multiplication des matrices:
m m m m
Amm = ∑∑ L mi DikU km = ∑∑ U imU km Dik ; m = 2, N (4.59)
i =1 k =1 i =1 k =1

Mais, comme la matrice D est diagonale, seulement les termes avec i=k
demeurent, et on obtient:

94
Metode numerice în ingineria electrică

m m −1
Amm = ∑ U im2 Dii = ∑ U im2 Di + U mm
2
Dm ; ( Dii = Di ) (4.60)
i =1 i =1

Ainsi, on peut déterminer les deux termes diagonaux inconnus:


⎛ m −1

Dm = sgn ⎜ Amm − ∑ U im2 Di ⎟ = ±1
⎝ i =1 ⎠
(4.61)
m −1
U mm = Amm − ∑ U Di 2
im ; m = 2, N
i =1

Dans le cas particulier du premier terme (m=1), les sommes sont nulles. Par
conséquent:

D1 = sgn ( A11 ) = ±1
(4.62)
U11 = A11

Les termes non diagonaux sur la ligne (m) de la matrice des coefficients sont, à
leur tour:

m m m m
Amj = ∑∑ L mi DikU km = ∑∑ U imU km Dik ; j = m + 1, N (4.63)
i =1 k =1 i =1 k =1

Comme avant, la matrice [D] est diagonale, donc seulement les termes avec
i=k demeurent, et on obtient:

m m −1
Amj = ∑ U imU ij Di = ∑ U imU ij Di + U mmU mj Dm (4.64)
i =1 i =1

Ainsi, on peut déterminer:

⎛ m −1

U mj = ⎜ Amj − ∑ U imU ij Di ⎟ / (U mm Dm ) ; j = m + 1, N (4.65)
⎝ i =1 ⎠

Pour la première ligne (m=1), les sommes sont nulles, et on obtient:

U1 j = ( A1 j ) / (U11 D1 ) ; j = 2, N (4.66)

95
Methodes de calcul numerique en ingenierie electrique

Par conséquent, l’algorithme est le suivant:


//PROGRAMME Factorisation Cholesky
//matrices non positives definies
//Première ligne de U (étape 1):
D(1)=sgn(A(1,1))
U(1,1)=sqrt(abs(A(1,1)))
Pour j=2 à N {
U(1,j)=A(1,j)/(U(1,1)D(1))
}//j
//Lignes suivantes (étape 2):
Pour m=2 à N {
D(m)=sgn[A(m,m)-Σi=1 à m-1(u(i,m)2 D(i))]
U(m,m)=sqrt(abs(A(m,m)-Σi=1 à m-1(u(i,m)2 D(i))))
//Ligne m de U (étape 3):
Pour j=m+1 à N {
U(m,j)=(A(m,j)-
- Σi=1 à m-1[U(i,m)U(i,j)D(i)])/(U(m,m)D(m))
}//j
}//m

4.4. Techniques adaptées aux matrices creuses

Une matrice « creuse » contient peu de termes non nuls. On peut la caractériser
par un « taux de remplissage », défini comme le rapport entre le nombre de termes
non nuls et le nombre total des termes (donc N², pour une matrice carrée avec N
lignes et colonnes). Souvent, surtout pour les matrices de grande taille, ce taux peut
être de quelques pourcents.
De telles matrices peuvent apparaître dans des problèmes de modélisation
numérique des champs (par les méthodes des différences finies ou éléments finis),
ainsi que lors de la simulation numérique des réseaux électriques de grande taille.
Dans le cas le plus favorable, les matrices sont symétriques et positives-définies.
Cependant, des situations où on sort de ce cadre sont rencontrées dans des
problèmes courants.
Il est clair que:
• Les techniques courantes de stockage des matrices (tableaux) sont peu
adaptées, car on « gaspille » la mémoire.
• Les méthodes courantes de factorisation et de résolution des systèmes
d’équations sont peu adaptées, car elle impliquent un grand nombre de
calculs inutiles.

96
Metode numerice în ingineria electrică

On peut estimer que dans le cas des systèmes d’équations de grande taille et
dont la matrice des coefficients est creuse, l’utilisation des techniques adaptées aux
matrices creuses est presque incontournable.
Le nombre d’opérations et le temps de calcul pourront être réduits d’une
manière drastique. En pratique, pour des systèmes de grande taille, l’utilisation des
techniques de matrices creuses peut conduire à un nombre d’opérations presque
proportionnel à N (~O(N)) plutôt qu’au N3.
Bien sûr, le prix à payer consiste dans une mise en œuvre plus complexe, mais
il existe déjà de outils informatiques adéquats.
Un problème qui se pose est celui de « remplissages ». En effet, lors de la
factorisation, des éléments nouveaux peuvent apparaître. Les technique de
stockage utilisées doivent permettre l’insertion facile des nouveaux termes aux
bons endroits.
Par conséquent, le taux de remplissage de la matrice en cours de factorisation
augmente. Des techniques spéciales ont été développées, afin de réduire le nombre
de remplissages.

97
Methodes de calcul numerique en ingenierie electrique

Anexa I

Exemple de calcul numeric

1. Metode numerice pentru rezolvarea ecuaţiilor

1.1. Metoda înjumătăţirii intervalului

Fie funcţia f ( x ) = x 3 − 2 , f : ℜ → ℜ şi ecuaţia ataşata ei


x3 − 2 = 0
Alegem intervalul (1,2) şi dăm valori
f (1) = −1
f (2) = 6
Există o schimbare de semn, deci în intervalul (1,2) există o rădăcină a ecuţiei
date. Procedăm la înjumătăţirea acestuia şi calculăm
1+ 2
= 1,5
2
f (1,5) = 1,375
Dintre intervalele (1; 1,5) şi (1,5; 2), alegem intervalul (1; 1,5).
1 + 1,5
= 1,25
2
f (1,25) = −0,04
Dintre intervalele (1; 1,25) şi (1,25; 1,5), alegem intervalul (1,25; 1,5).
1,25 + 1,5
= 1,375
2
f (1,375) = 0,59
Dintre intervalele (1,25; 1,375) et (1,375; 1,5), alegem intervalul (1,25; 1,375).
1,25 + 1,375
= 1,312
2
f (1,312) = 0,026
Dintre intervalele (1,25; 1,312) şi (1,312; 1,375), alegem intervalul (1,25; 1,312).
1,25 + 1,312
= 1,281
2
f (1,281) = 0,10

98
Metode numerice în ingineria electrică

Dintre intervalele (1,25; 1,281) şi (1,281; 1,312), alegem intervalul (1,25; 1,281).
1,25 + 1,281
= 1,265
2
f (1,265) = 0,02

1.2. Metoda coardei, sau a părţilor proporţionale

Fie f ( x) = x 3 + 3 x 2 − 3 , f : [0,1] → ℜ
f (0) = −3
f (1) = 1
f ' ( x) = 3 x 2 + 6 x ⇒ f crescătoare
f " ( x) = 6 x + 6 ⇒ f concavă
x0 = a = 0
b =1
x f (b) − bf ( xn )
xn+1 = n
f (b) − f ( xn )
x1 = 0,75
x2 = 0,86
x3 = 0,87

1.3. Metoda lui Newton

1
Fie funcţia f ( x) = ln x − , f : [1,2] → ℜ
x
f (1) = −1
f (2) = 0,19
1 1
f ' ( x) = + 2 > 0 ⇒ f crescătoare
x x
1 2
f " ( x) = − 2 − 3 > 0 ⇒ f concave
x x
Deducem formula de iteraţie:

99
Methodes de calcul numerique en ingenierie electrique

1 xn ln xn 1
ln xn − − 2
xn xn xn ( x ln xn − 1) xn xn (1 − ln x)
xn+1 = xn − = xn − = xn − n =
1 1 xn 1 xn + 1 xn + 1
+ 2 2
+ 2
xn xn xn xn
Alegem x0 = 1
⇒ x1 = 1,5
x2 = 1,73
x3 = 1,761

1.4. Metoda şirului lui Rolle

Se consideră funcţia polinomialaă de gradul 4, f : ℜ → ℜ , şi ecuţia ataşată


f ( x0 = 3 x 4 − 8 x 3 − 6 x 2 + 24 x − 1 = 0
f ( x) = 3 x 4 − 8 x 3 − 6 x 2 + 24 x − 1 derivabilă pe ℜ
f ' ( x) = 12 x 3 − 24 x 3 − 12 x + 24 = 12( x − 2)( x − 1)( x + 1)
cu rădăcinile x1 = 2 , x2 = 1
lim f ( x) = ∞ , f (−1) = −20 , f (1) = 12 , f (2) = 7 , lim f ( x) = ∞
x →∞ x → −∞
X −∞ -1 1 2 ∞
f ' ( x) 0 0 0
f (x) ∞ -20 12 7 ∞
Şirul lui
+ - + + +
Rolle

Şirul lui Rolle are două schimbări de semn. Atunci ecuaţia are două rădăcini reale:
x1 ∈ (−∞;−1) şi x2 ∈ (−1;1)

1.5. Metoda şirului lui Şturm

a) Considerăm ecuaţia polinomială P( x) = x 3 + 6 x 2 − 16 = 0 şi constituim şirul


lui Sturm ataşat acestui polinom
p0 = x 3 + 6 x 2 − 16
p1 = 3x 2 + 12 x
p2 = −( p0 mod p1 ) = 8 x + 16

100
Metode numerice în ingineria electrică

p3 = −( p1 mod p2 ) = 12
S = ( p0 ; p1; p2 ; p3 ) = ( x 3 + 6 x 2 − 16;3 x 2 + 12 x;8 x + 16;12)
x=-7
⇒ S = (−65;63;−40;12)
⇒ N1 = 3 (număr de schimbări de semn)
x=2
⇒ S = (16;36;32;12)
⇒ N2 = 0
N1 − N 2 = 3 ⇒ P are cele trei rădăcini în intervalul (− 7;2 )

b) Fie ecuaţia polinomială x 5 − 5 x 4 + 16 = 0 . Şirul lui Sturm este prezentat în


tabelul următor
x p0 ( x) p1 ( x) p2 ( x) p3 ( x) p4 ( x) N (x)
x − 5 x + 16 x − 4x
5 4 4 3
x −4
3 −x+4 -1
−∞ - + - + - 3
-1 + + - + - 3
1 + - - + - 2
0 - - + + - 2
1 - 0 + 0 - 1
∞ + + + - - 1
x1 ∈ (−∞;−1)
x2 ∈ (1;2)
x3 ∈ (4; ∞)

1.6. Metoda Lobacevski-Graeffe


a) rădăcini reale
Fie ecuaţia x 3 − 3 x + 1 = 0 . Calculul noilor coeficienţi, ai polinomului obţinut
prin ridicări succesive la pătrat este prezentat în tabelul următor
x3 x2 x1 x0
1 0 -3 1
b 0j 1 0 9 1
6 0
1 6 9 1
b1j 1 36 81 1
-18 -12
b 2j 1 18 69 1

101
Methodes de calcul numerique en ingenierie electrique

b 3j 1 1,86 ⋅ 10 2 4725 1
4
b j 1 2,5 ⋅ 10 4
2,2 ⋅ 10 7
1
b 5j 1 5,9 ⋅ 108 4,9 ⋅ 1014 1
b 6j 1 3,44 ⋅ 1017 2,5 ⋅ 10 29 1

x1 = − 2 3,44 ⋅ 1017 = −1,88


6

2,5 ⋅ 10 29
x2 = 26 = 1,535
3,44 ⋅ 1012
1
x2 = 26 = 0,35
2,5 ⋅ 10 29

b) rădăcini complexe
Pentru ecuaţia cu rădăcini complexe x 4 + x − 1 = 0 noii coeficienţi sunt
x4 x3 x2 x1 x0
1 0 0 1 -1
b 0 1 0 0 1 1
j
0 0 0
-2
1 0 -2 1 1
b 1 1 0 4 1 1
j
4 0 4
2
1 4 6 5 1
b 2 1 16 36 25 1
j
-12 -40 -12
2
1 4 -2 13 1
b 3 1 16 4 169 1
j
4 -104 4
2
b 4j 1 20 -98 173 1

4
x1 = 2 20 = 1,206
x1 = −1,206

102
Metode numerice în ingineria electrică

1
x4 = 24 = 0,725
173
x4 = 0,725
173
x1 + x4 + 2u = 0 ⇒ u = 0,2405 ⇒ r 2 = 24 = 1,144
20
v = ± (1,144) 2 − (0,2405) 2 = ±1,11
x2,3 = 0,2405 ± 1,11i

2. Metode numerice pentru rezolvarea


sistemelor liniare de ecuaţii

2.1. Metoda Crout. Fie sistemul de ecuaţii liniare

⎧ x + y + z + t = 10 ⎧x = 1
⎪ x + 5 y + 5 z + 5t = 46 ⎪y = 2
⎪ ⎪
⎨ ⇔ ⎨
⎪ x + 5 y + 14 z + 14t = 109 ⎪z = 3
⎪⎩ x + 5 y + 14 z + 15 z = 113 ⎪⎩t = 4

2.2. Metoda Cholesky. Pentru sistmul de ecuaţii soluţiile sunt

⎧ x + y + z + t = 10 ⎧x = 1
⎪ x + 5 y + 5 z + 5t = 46 ⎪y = 2
⎪ ⎪
⎨ ⇔⎨
⎪ x + 5 y + 14 z + 14t = 109 ⎪z = 3
⎪⎩ x + 5 y + 14 z + 15 z = 113 ⎪⎩t = 4

2.3.Metoda Gauss

⎧ x + y + z = 14 ⎧x = 1
⎪ ⎪
⎨ 2 x + 5 y + 4 z = 24 ⇔ ⎨ y = 2
⎪ 4 x + y + 3 z = 15 ⎪z = 3
⎩ ⎩

103
Methodes de calcul numerique en ingenierie electrique

2.4. Metoda Gauss-Jordan

⎧ x + y + z = 14 ⎧x = 1
⎪ ⎪
⎨ 2 x + 5 y + 4 z = 24 ⇔ ⎨ y = 2
⎪ 4 x + y + 3 z = 15 ⎪z = 3
⎩ ⎩

2.5. Factorizarea LU

⎧x = 1 ⎧x = 1
⎪ ⎪
⎨2 x + 3 y = 8 ⇔ ⎨y = 2
⎪ x + 2 y + 3z = 14 ⎪z = 3
⎩ ⎩

104
Metode numerice în ingineria electrică

Anexa II

Algoritmi în C++ şi Turbo Pascal

1. Metode numerice pentru rezolvarea ecuaţiilor

1.1. Metoda înjumătăţirii intervalului


program injumatatire;

function functie(x:real):real;
begin
functie:=x*x*x-2;
end;

var a,b,c,eps,f: real;


done:boolean;

begin
writeln('Dati limita inferioara a intervalului in care calculam radacina: ');
write('Donez la limite inferieure de l intervale dans lequel on cherche la racine: ');
readln(a);
writeln('Dati limita superioara a intervalului in care calculam radacina: ');
write('Donez la limite superieure de l intervale dans lequel on cherche la racine: ');
readln(b);
writeln('Dati precizia: ');
write('Donez la precision: ');
readln(eps);
done:=false;
while not done do
begin
c:=(a+b)/2;
if abs(functie(c))<=eps then
begin
writeln('Radacina cautata este: ', c);
writeln('La racine cherche est: ', c);
done:=true;
end
else
if functie(a)*functie(c)<0 then b:=c
else

105
Methodes de calcul numerique en ingenierie electrique

if functie(c)*functie(b)<0 then a:=c;


end;
end.

#include <stdio.h>
#include <math.h>

float functie(float x)
{
return x*x*x-2;
}

void main(void)
{
float a,b,c,eps,f;
int done;

printf("Dati limita inferioara a intervalului in care calculam radacina: \n");


printf("Donez la limite inferieure de l'intervale dans lequel on cherche la racine: ");
scanf("%f",&a);
printf("Dati limita superioara a intervalului in care calculam radacina: \n");
printf("Donez la limite superieure de l'intervale dans lequel on cherche la racine: ");
scanf("%f",&b);
printf("Dati precizia: \n");
printf("Donez la precision: ");
scanf("%f",&eps);
done=0;
while(!done)
{
c=(a+b)/2;
if(fabs(functie(c))<=eps)
{
printf("Radacina cautata este: \n");
printf("La racine cherche est: %f", c);
done=1;
}
else
if((functie(a)*functie(c))<0) b=c;
else
if((functie(c)*functie(b))<0) a=c;
}

106
Metode numerice în ingineria electrică

1.2. Metoda coardei, sau a părţilor proporţionale

program coarda;

var a,b,c,d,eps:real;

function f(x:real):real;
begin
f:= x*x*x+6*x*x+11*x+6;
end;

begin
writeln('Dati limita inferioara a intervalului in care cautam radacina: ');
write('Donez la limite inferieure de lintervale dans lequel on cherche la racine: ');
readln(a);
writeln('Dati limita superioara a intervalului in care cautam radacina: ');
write('Donez la limite superieure de lintervale dans lequel on cherche la racine: ');
readln(b);
writeln('Dati precizia: ');
write('Donez la precision: ');
readln(eps);
c:=a;
repeat
d:=c;
c:=a-f(a)*(b-a)/(f(b)-f(a));
if f(a)*f(c)<0 then b:=c
else a:=c;
until abs(d-c)>eps;
writeln('Solutia este: ', c);
writeln('La solution est: ', c);
end.

#include <stdio.h>
#include <math.h>

double f(double x)
{
return x*x*x+6*x*x+11*x+6;
}
void main(void)
{
double a, b, c, d, eps;
printf("Dati limita inferioara a intervalului in care cautam radacina: \n");
printf("Donez la limite inferieure de l'intervale dans lequel on cherche: ");

107
Methodes de calcul numerique en ingenierie electrique

scanf("%lf",&a);
printf("Dati limita superioara a intervalului in care cautam radacina: \n");
printf("Donez la limite superieure de l'intervale dans lequel on cherche: ");
scanf("%lf",&b);
printf("Dati precizia: \n");
printf("Donez la precision: ");
scanf("%lf",&eps);
c=a;
do
{
d=c;
c=(a*f(b)-b*f(a))/(f(b)-f(a));
if(f(a)*f(c)<0) b=c;
else a=c;
}
while(fabs(d-c)>eps);
printf("Solutia este: \n");
printf("La solution est:%f\n ", c);
}

1.3. Metoda lui Newton

program newton;

function f(x:real):real;
begin
f:=x*x*x+6*x*x+11*x+6;
end;

function f_deriv(x:real):real;
begin
f_deriv:=3*x*x+12*x+11;
end;

var a,p,eps:real;
i:integer;

begin
writeln('Introduceti valoarea de plecare: ');
write('Introduisew la valeur de depart: ');
readln(p);
writeln('Introduceti precizia rezultatului: ');
write('Introduisez la precision du resultat: ');
readln(eps);
i:=0;
repeat

108
Metode numerice în ingineria electrică

p:=p-f(p)/f_deriv(p);
i:=i+1;
until abs(f(p))<eps;
writeln('Zeroul functiei este ', p, ' si eroarea este ', abs(f(p)));
write('Le zero de la fonction est ', p, ' et l erreur est ', abs(f(p)));
end.

#include <stdio.h>
#include <math.h>

double f(double x)
{
return x*x*x+6*x*x+11*x+6;
}
double f_deriv(double x)
{
return 3*x*x+12*x+11;
}

void main (void)


{
double a, p, eps;
int i;

printf ("Introdu valoarea de plecare: \n");


printf ("Introduisez la valeur de depart: ");
scanf ("%le", &p);

printf ("Introdu precizia valorii: \n");


printf ("Introduisez la precision de la valeur: ");
scanf ("%le", &eps);
i=0;

do
{
p-=f(p)/f_deriv(p);
i++;
}
while (fabs(f(p))>eps);

printf ("Zeroul functiei este %f si eroarea %f\n", p, fabs(f(p)));


printf ("Le zero de la fonction est %f et l'erreur %f\n", p, fabs(f(p)));
}

109
Methodes de calcul numerique en ingenierie electrique

1.4. Metoda şirului lui Rolle

program rolle;

function f(x: real):real;


begin
f:=x*x+5*x+4;
end;

var a,b: real;

begin
writeln('Dati limita inferioara a intervalului in care cautam radacina:');
write('Donnez la limite inferieure de l intervalle dans lequel on cherche la racine: ');
readln(a);
writeln('Dati limita superioara a intervalului in care cautam radacina: ');
write('Donnez la limite inferieure de l intervalle dans lequel on cherche la racine: ');
readln(b);
if f(a)=0 then
begin
writeln(a, ' este o radacina a ecuatiei f(x)=0');
writeln(a, 'est une racine de l equation f(x)=0');
end
else
if f(a)*f(b)<0 then
begin
writeln('In intervalul (',a,', ',b,') se gaseste o radacina a ecuatiei f(x)=0');
writeln('Dans l intervalle ]',a,', ',b, '[ il y a une racine de l equation f(x)=0');
end
else
if f(a)*f(b)>0 then
begin
writeln('In intervalul (',a,', ',b,') nu se gaseste o radacina a
ecuatiei f(x)=0');
writeln('Dans l intervalle ]',a,', ',b, '[ il n y a pas une racine de l equation f(x)=0');
end;
end.

#include <stdio.h>
#include <conio.h>
float f(float x)
{
return x*x+5*x+4;
}

110
Metode numerice în ingineria electrică

void main(void)
{
float a,b;
printf("Dati limita inferioara a intervalului in care cautam radacina: \n");
printf("Donnez la limite inferieure de l'intervalle dans lequel on cherche la racine: ");
scanf("%f",&a);
printf("Dati limita superioara a intervalului in care cautam radacina: \n");
printf("Donnez la limite superieure de l'intervalle dans lequel on cherche la racine: ");
scanf("%f",&b);
if(f(a)==0)
{
printf("%f este o radacina a ecuatiei f(x)=0.\n");
printf("%f est une racine de l'equation f(x)=0.\n");
}
else
if(f(a)*f(b)<0)
{
printf("In intervalul (%f,%f) se gaseste o radacina a ecuatiei f(x)=0.\n");
printf("Dans l'intervalle ]%f, %f[ il y a une racine de l'equation f(x)=0.\n");
}
else
if(f(a)*f(b)>0)
{
printf("In intervalul (%f,%f) nu se gaseste o radacina a ecuatiei f(x)=0.\n");
printf("Dans l'intervalle ]%f, %f[ il n'y a pas une racine de l'equation f(x)=0.\n");
}
getche();
}

1.5. Metoda şirului lui Şturm

program sturm;
type VReal=array [0..100] of real;

var i, gr1, gr2, gr3, nr_sch1, nr_sch2, nr_rad:integer;


v1, v2, v3: VReal;
x, y, v_x1, v_x2, v_x3, v_y1, v_y2, v_y3: real;

{procedura de derivare a polinomului}


{la procedure de derivation du polynome}
procedure derivare(var v1: VReal; var v2:VReal; gr:integer; var gr2:integer);
var i:integer;

111
Methodes de calcul numerique en ingenierie electrique

begin
for i:=1 to gr do
v2[i-1]:=v1[i]*i;
gr2:=gr-1;
end;

{procedura de impartire a doua polinoame}


{la procedure de division des deux polynomes}
procedure imparte(gr1:integer; v1:VReal; gr2:integer; v2:VReal; var gr5:integer; var
v5:VReal);
var v3, v4, v11:VReal;
grc, i, a, b, c:integer;
begin
for i:=0 to gr1 do
v11[i]:=v1[i];
grc:=gr1-gr2;
gr5:=gr2+1;
c:=gr1-gr2;
a:=gr1;
b:=gr2;
while gr5>=gr2 do
begin
v3[c]:=v11[a]/v2[b];
for i:=0 to c-1 do
v4[i]:=0;
for i:=c to a do
v4[i]:=-v3[c]*v2[i-c];
for i:=0 to gr1 do
v5[i]:=v11[i]+v4[i];
gr5:=a-1;
if v5[gr5]=0 then
gr5:=gr5-1;
for i:=0 to gr5 do
v11[i]:=v5[i];
a:=gr5;
c:=c-1;
end;
end;

{functia putere}
{fonction puissance}
function putere(x: real; i:integer):real;
var t: integer;
p:real;
begin
p:=x;
if i=1 then p:=x

112
Metode numerice în ingineria electrică

else
if i=0 then p:=1
else
for t:=2 to i do
p:=p*x;
putere:=p;
end;

{functia intoarce valoarea polinomului in punctul x}


{la fonction a comme resultat la valeur du polynome dans le point x}
function valoare_polinom(x:real; v:VReal; grad:integer):real;
var i:integer;
val:real;
begin
val:=0;
for i:=0 to grad do
val:=val+ v[i]*putere(x,i);
valoare_polinom:=val;
end;

{programul principal}
{le programme principal}
begin
writeln('Dati gradul polinomului: ');
write('Donnez le degre du polynome: ');
readln(gr1);
for i:=0 to gr1 do
begin
writeln('Dati coeficientul lui x la puterea ', i, ': ');
write('Donnez le coefficient de x a la puissance ', i, ': ');
readln(v1[i]);
end;
writeln('Dati limita inferioara a intervalului in care cautam radacina: ');
write('Donnez la limite inferieure de l intervalle dans lequel on cherche la racine:');
readln(x);
writeln('Dati limita superioara a intervalului in care cautam radacina: ');
write('Donnez la limite superieure de l intervalle dans lequel on cherche la racine:');
readln(y);
nr_sch1:=0;
nr_sch2:=0;
v_x1:=valoare_polinom(x,v1,gr1);
v_y1:=valoare_polinom(y,v1,gr1);
derivare(v1,v2,gr1,gr2);
v_x2:=valoare_polinom(x,v2,gr2);
v_y2:=valoare_polinom(y,v2,gr2);
if (v_x1=0) and (v_x2<0) then
nr_sch1:=nr_sch1+1;

113
Methodes de calcul numerique en ingenierie electrique

if (v_x1<0) and (v_x2=0) then


nr_sch1:=nr_sch1+1;
if (v_x1*v_x2)<0 then
nr_sch1:=nr_sch1+1;
if (v_y1=0) and (v_y2<0) then
nr_sch2:=nr_sch2+1;
if (v_y1<0) and (v_y2=0)then
nr_sch2:=nr_sch2+1;
if (v_y1*v_y2)<0 then
nr_sch2:=nr_sch2+1;
gr3:=2;
while gr3>=1 do
begin
imparte(gr1,v1, gr2, v2, gr3, v3);
for i:=0 to gr3 do
v3[i]:=-v3[i];
v_x3:=valoare_polinom(x,v3,gr3);
v_y3:=valoare_polinom(y,v3,gr3);
if (v_x2=0) and (v_x3<0) then
nr_sch1:=nr_sch1+1;
if (v_x2<0) and (v_x3=0) then
nr_sch1:=nr_sch1+1;
if (v_x2*v_x3)<0 then
nr_sch1:=nr_sch1+1;
if (v_y2=0) and (v_y3<0) then
nr_sch2:=nr_sch2+1;
if (v_y2<0) and (v_y3=0)then
nr_sch2:=nr_sch2+1;
if (v_y2*v_y3)<0 then
nr_sch2:=nr_sch2+1;
v_x2:=v_x3;
v_y2:=v_y3;
for i:=0 to gr2 do
v1[i]:=v2[i];
for i:=0 to gr3 do
v2[i]:=v3[i];
gr1:=gr2;
gr2:=gr3;
end;
nr_rad:=abs(nr_sch2-nr_sch1);
writeln('Numarul de radacini in intervalul (', x,', ' ,y,') este ', nr_rad);
writeln('Le nombre des racines reelles dans l intervale ]', x,',' , y,'[ est ', nr_rad);
end.

#include <stdio.h>
#include <math.h>
#include <conio.h>

114
Metode numerice în ingineria electrică

//functia de derivare a polinomului


//la fonction de derivation du polynome
void derivare(float v1[100], float v2[100], int gr, int& gr2)
{
int i;
for(i=1;i<=gr;i++)
v2[i-1]=v1[i]*i;
gr2=gr-1;
}

//functia de impartire a doua polinoame


//la fonction de division de deux polynomes
void imparte(int gr1, float v1[100], int gr2, float v2[100], int& gr5, float v5[100])
{
float v11[100];
float v3[100];
float v4[100];
int grc;
int i;
int a,b;
int c;

for(i=0; i<=gr1; i++)


v11[i]=v1[i];
grc=gr1-gr2;
gr5=gr2+1;
c=gr1-gr2;
a=gr1;
b=gr2;

while(gr5>=gr2)
{
v3[c]=v11[a]/v2[b];
for(i=0;i<c; i++)
v4[i]=0;
for(i=c; i<=a; i++)
v4[i]=-v3[c]*v2[i-c];
for(i=0; i<=gr1; i++)
v5[i]=v11[i]+v4[i];
gr5=a-1;
if(v5[gr5]==0)
gr5--;
for(i=0; i<=gr5; i++)
v11[i]=v5[i];
a=gr5;
c--;

115
Methodes de calcul numerique en ingenierie electrique

}
};

//functia intoarce valoarea polinomului in punctul x


//la fonction a comme resultat la valeur du polynome dans le point x
float valoare_polinom(float x, float v[100], int grad)
{
int i;
float val;
val=0;
for(i=0; i<=grad; i++)
val+=v[i]*pow(x,i);
return val;
};

//programul principal
//programme principall
void main(void)
{
int i;
int gr1, gr2, gr3;
float v1[100];
float v2[100];
float v3[100];
float x,y, v_x1, v_x2, v_x3, v_y1, v_y2, v_y3;
int nr_sch1, nr_sch2, nr_rad;
printf("Dati gradul polinomului: \n");
printf("Donnez le degre du polynome: ");
scanf("%d",&gr1);
for(i=0;i<gr1+1;i++)
{
printf("Dati coeficientul lui x la puterea %d: \n",i);
printf("Donez le coefficient de x a la puissance %d: ",i);
scanf("%f",&v1[i]);
}
printf("Dati limita inferioara a intervalului in care cautam radacina: \n");
printf("Donnez la limite inferieure de l'intervalle dans lequel on cherche la racine: ");
scanf("%f",&x);
printf("Dati limita superioara a intervalului in care cautam radacina: \n");
printf("Donnez la limite superieure de l'intervalle dans lequel on cherche la racine: ");
scanf("%f",&y);
nr_sch1=0;
nr_sch2=0;
v_x1=valoare_polinom(x,v1,gr1);
v_y1=valoare_polinom(y,v1,gr1);
derivare(v1,v2,gr1,gr2);
v_x2=valoare_polinom(x,v2,gr2);

116
Metode numerice în ingineria electrică

v_y2=valoare_polinom(y,v2,gr2);
if((v_x1==0)&&(v_x2<0))
nr_sch1++;
if((v_x1<0)&&(v_x2==0))
nr_sch1++;
if ((v_x1*v_x2)<0)
nr_sch1++;
if((v_y1==0)&&(v_y2<0))
nr_sch2++;
if((v_y1<0)&&(v_y2==0))
nr_sch2++;
if ((v_y1*v_y2)<0)
nr_sch2++;
gr3=2;
while(gr3>=1)
{
imparte(gr1, v1, gr2, v2, gr3, v3);
for(i=0; i<=gr3; i++)
v3[i]=-v3[i];
v_x3=valoare_polinom(x,v3,gr3);
v_y3=valoare_polinom(y,v3,gr3);
if((v_x2==0)&&(v_x3<0))
nr_sch1++;
if((v_x2<0)&&(v_x3==0))
nr_sch1++;
if ((v_x2*v_x3)<0)
nr_sch1++;
if((v_y2==0)&&(v_y3<0))
nr_sch2++;
if((v_y2<0)&&(v_y3==0))
nr_sch2++;
if ((v_y2*v_y3)<0)
nr_sch2++;
v_x2=v_x3;
v_y2=v_y3;
for(i=0; i<=gr2; i++)
v1[i]=v2[i];
for(i=0; i<=gr3; i++)
v2[i]=v3[i];
gr1=gr2;
gr2=gr3;
}
nr_rad=abs(nr_sch2-nr_sch1);
printf("Numarul de radacini reale in intervalul (%f , %f) este %d.\n", x, y, nr_rad);
printf("Le nombre des racines reelles dans l'intervale ]%f , %f[ est %d.\n", x, y, nr_rad);
getche();
}

117
Methodes de calcul numerique en ingenierie electrique

1.6. Metoda Lobacevski – Graeffe

program Graeffe;
type VReal=array[0..20] of real;

function pow(x:real; n:integer):real;


var i:integer;
rez:real;
begin
rez:=1;
for i:=1 to n do
rez:=rez*x;
pow:=rez;
end;

function root(x:real; n:integer):real;


var i:integer;
rez:real;
begin
rez:=x;
for i:=1 to n do
rez:=sqrt(rez);
root:=rez;
end;

var i, k, grad, etapa, minus_unu: integer;


coef, rad, b, rad_poz, rad_neg, a: VReal;
eroare, precizie, s: real;

begin
{lectura date de intrare si initializari}
{lecture des donnes d'entree et initialisations}
writeln('Dati gradul polinomului: ');
write('Donnez le degre du polynome: ');
readln(grad);
writeln('Dati coeficientii polinomului in ordinea descrescatoare a puterilor.');
writeln('Donnez les coefficients du polynome en ordre decroisante des puissances.');
for i:=0 to grad do
begin
write('coef[',i,']= ');
readln(coef[i]);
end;
writeln('Dati precizia: ');
write('Donnez la precision: ');
readln(precizie);

118
Metode numerice în ingineria electrică

for i:=0 to grad do


begin
rad[i]:=0;
a[i]:=coef[i];
end;
minus_unu:=-1;
{algoritmul Lobatcevski-Graeffe}
{l'algorithme de Lobatcevski-Graeffe}
repeat
{calculam coeficientii in etapa "etapa"}
{on calcule le coeficients dans l'etape "etapa"}
for i:=0 to grad do
begin
s:=0;
for k:=1 to i do
s:=s+pow(-1,k)*a[i-k]*a[i+k];
b[i]:=a[i]*a[i]+2*s;
end;
inc(etapa);
{calculam radacinile in etapa "etapa"}
{on calcule les racines dans l'etape "etapa"}
for i:=0 to grad-1 do
rad[i]:=root(b[i+1]/b[i],etapa);
{decidem semnul radacinii si eroarea prin introducere in ecuatia initiala}
{on decide le signe des racines et l'erreur par ramplacement dans l'ecuation initiale}
for i:=0 to grad-1 do
begin
rad_poz[i]:=0;
rad_neg[i]:=0;
for k:=0 to grad do
begin
rad_poz[i]:=rad_poz[i]+coef[k]*pow(rad[i],grad-k);
rad_neg[i]:=rad_neg[i]+coef[k]*pow(-rad[i],grad-k);
end;
if abs(rad_neg[i])<abs(rad_poz[i]) then
begin
rad[i]:=-rad[i];
rad_poz[i]:=rad_neg[i];
end;
end;
{cautam eroarea maxima din vectorul rad_poz}
{on cherche l'erreur maximale dans le vecteur rad_poz}
eroare:=abs(rad_poz[0]);
for i:=1 to grad-1 do
if abs(rad_poz[i])>eroare then
eroare:=abs(rad_poz[i]);
for i:=0 to grad do

119
Methodes de calcul numerique en ingenierie electrique

a[i]:=b[i];
until precizie>=eroare;
{afisam}
for i:=0 to grad-1 do
writeln('x[',i,']= ', rad[i]);
end.

#include <stdio.h>
#include <math.h>

void main(void)
{
int i, k, grad, etapa=0;
double precizie;
double coef[20];
double rad[20];
double eroare;
double putere, s, b[20], rad_poz[20], rad_neg[20], a[20];

//lectura date de intrare si initializari


//lecture des donnees d'entree et initialisations
printf("Dati gradul polinomului: \n");
printf("Donnez le degre du polynome: ");
scanf("%d", &grad);
printf("Dati coeficientii polinomului in ordinea descrescatoare a puterilor.\n");
printf("Donnez les coefficients dans l'ordre inverse des puissances.\n");
for(i=0; i<=grad; i++)
{
printf("coef[%d]=", i);
scanf("%lf", &coef[i]);
}
printf("Dati precizia: \n");
printf("Donnez la precision: ");
scanf("%lf", &precizie);
for(i=0; i<=grad; i++)
{
rad[i]=0;
a[i]=coef[i];
}
//algoritmul Lobatcevski - Graeffe
//l'algorithme de Lobatcevski - Graeffe
do
{
//calculam coeficinetii in etapa "etapa"
//on calcule les coefficients dans l'etape "etapa"
for(i=0;i<=grad; i++)

120
Metode numerice în ingineria electrică

{
s=0;
for(k=1;k<=i;k++)
s+=pow(-1,k)*a[i-k]*a[i+k];
b[i]=pow(a[i],2)+2*s;
}
etapa++;
//calculam radcinile in etapa "etapa"
//on calcule les racines dans l'etape "etapa"
putere =1.0/pow(2.0,etapa);
for(i=0; i<=grad-1; i++)
rad[i]= pow(b[i+1]/b[i], putere);
//decidem semnul radacinii si eroarea prin introducere in ecuatia initiala
//on decide le signe de la racine et l'erreur par ramplacement dans l'equation initiale
for(i=0; i<=grad-1; i++)
{
rad_poz[i]=0;
rad_neg[i]=0;
for(k=0;k<=grad; k++)
{
rad_poz[i]+=coef[k]*pow(rad[i], grad-k);
rad_neg[i]+=coef[k]*pow(-rad[i], grad-k);
}
if(fabs(rad_neg[i])<fabs(rad_poz[i]))
{
rad[i]=-rad[i];
rad_poz[i]=rad_neg[i];
}
}
//cautam eroarea maxima din vectorul rad_poz
//on cherche l'erreur maximalle dans le vecteur rad_poz
eroare=fabs(rad_poz[0]);
for(i=1; i<=grad-1; i++)
if(fabs(rad_poz[i])>eroare)
eroare=fabs(rad_poz[i]);
for(i=0; i<=grad; i++)
a[i]=b[i];
}
while(eroare>precizie);

//afisam
// on affiche
for(i=0; i<=grad-1; i++)
printf("x[%d]= %f \n", i+1, rad[i]);
}

121
Methodes de calcul numerique en ingenierie electrique

2. Metode numerice pentru rezolvarea


sistemelor liniare de ecuaţii

2.1. Metoda lui Gauss

program gauss;
type matrix=array[1..100,1..100] of real;
type vector=array[1..100] of real;
var A:matrix;
B,X:vector;
n:integer;
i,j,k,lp:integer;
i1,j1:integer;
m,temp,max:real;
option:integer;
strFichier:string;
f:text;
begin
i:=1;
repeat
writeln('Votre option pour introduire les valeurs:');
writeln('1. Fichier ');
writeln('2. Interactif');
readln(option);
until((option=1)or(option=2));
if (option=1) then
begin
write('Nom de fichier:');
readln(strFichier);
assign(f,strFichier);
reset(f);
readln(f,n);
for i:=1 to n do
begin
for j:=1 to n do
begin
read(f,A[i,j]);
write(A[i,j]:3:2,' ');
end;
readln(f,B[i]);
writeln(B[i]:3:2);
end;
end

122
Metode numerice în ingineria electrică

else
begin
write('n=');
readln(n);
for i:=1 to n do
for j:=1 to n do
begin
write('A[',i,',',j,']=');
read(A[i,j]);
end;
for i:=1 to n do
begin
write('B[',i,']=');
readln(B[i]);
end;
end;
j:=0;
for i:=1 to n do
begin
max:=abs(A[i,i]);
lp:=i;
for k:=i+1 to n do
if (max<abs(A[k,i])) then
begin
max:=A[k,i];
lp:=k;
end;
if(max=0) then
Exit;
if(lp<>i) then
begin
for j:=i to n do
begin
temp:=A[i,j];
A[i,j]:=A[lp,j];
A[lp,j]:=temp;
end;
temp:=B[i];
B[i]:=B[lp];
B[lp]:=temp;
end;

for k:=i+1 to n do
begin
m:=A[k,i]/A[i,i];
B[k]:=B[k]-m*B[i];
for j:=i to n do

123
Methodes de calcul numerique en ingenierie electrique

A[k,j]:=A[k,j]-m*A[i,j];
end;
end;

X[n]:=B[n]/A[n,n];

for i:=n-1 downto 1 do


begin
X[i]:=B[i];
for j:=n downto i+1 do
X[i]:=X[i]-(A[i,j]*X[j]);
X[i]:=X[i]/A[i,j-1];
end;
writeln('Les sollutions sont: ');

for i:=1 to n do
writeln('X[',i,']=',X[i]:3:2);
readln;
end.

#include "stdafx.h"
#include<iostream>
#include<fstream>
#include<math.h>
#include<conio.h>
using namespace std;

double A[100][100];
double B[100];
double X[100];
int n;

int _tmain(int argc, _TCHAR* argv[])


{
int i,j,k;
double m,temp,max;
int lp;
int option;
ifstream fin;
char chFichier[1024];
i=1;
cout.precision(3);
do
{
cout<<"Votre option pour introduire les valeurs:"<<endl;
cout<<"1. Fichier "<<endl<<"2. Interactif"<<endl;
cin>>option;

124
Metode numerice în ingineria electrică

}
while((option!=1)&&(option!=2));
if(option==1)
{
cout<<"Nom de fichier:";
cin>>chFichier;
fin.open(chFichier);
fin>>n;

for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
fin>>A[i][j];
fin.ignore();
cout<<A[i][j]<<" ";
}
fin>>B[i];
cout<<B[i]<<endl;
}
fin.close();
}
else
{
cout<<"n=";
cin>>n;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
cout<<"A["<<i+1<<","<<j+1<<"]=";
cin>>A[i][j];
}
for(i=0;i<n;i++)
{
cout<<"B["<<i+1<<"]=";
cin>>B[i];
}
}

i=0; j=0;
for(i=0;i<n;i++)
{
max=fabs(A[i][i]);
lp=i;
for(k=i+1;k<n;k++)
if(max<fabs(A[k][i]))
{

125
Methodes de calcul numerique en ingenierie electrique

max=A[k][i];
lp=k;
}
if(max==0)
return 0;
if(lp!=i)
{
for(j=i;j<n;j++)
{
temp=A[i][j];
A[i][j]=A[lp][j];
A[lp][j]=temp;
}

temp=B[i];
B[i]=B[lp];
B[lp]=temp;

k=i+1;

for(k=i+1;k<n;k++)
{
m=A[k][i]/A[i][i];
for(j=i;j<n;j++)
A[k][j]=A[k][j]-m*A[i][j];
B[k]=B[k]-m*B[i];
}
}

X[n-1]=B[n-1]/A[n-1][n-1];
for(i=n-2;i>-1;i--)
{
X[i]=B[i];
for(j=n-1;j>i;j--)
X[i]=X[i]-A[i][j]*X[j];
X[i]=X[i]/A[i][j];
}
cout<<"Les sollutions sont: "<<endl;
for(i=0;i<n;i++)
cout<<"X["<<i+1<<"]="<<X[i]<<endl;
_getch();

return 0;
}

126
Metode numerice în ingineria electrică

2.2. Metoda lui Gauss-Jordan

program Gauss_Jordan;
type matrix=array[1..100,1..100] of real;
type vector=array[1..100] of real;
var A:matrix;
B,X:vector;
n:integer;
i,j,k,lp:integer;
m,temp,max:real;
option:integer;
strFichier:string;
f:text;
begin
i:=1;
repeat
writeln('Votre option pour introduire les valeurs:');
writeln('1. Fichier ');
writeln('2. Interactif');
readln(option);
until((option=1)or(option=2));
if (option=1) then
begin
write('Nom de fichier:');
readln(strFichier);
assign(f,strFichier);
reset(f);
readln(f,n);
for i:=1 to n do
begin
for j:=1 to n do
begin
read(f,A[i,j]);
write(A[i,j]:3:2,' ');
end;
readln(f,B[i]);
writeln(B[i]:3:2);
end;
end
else
begin
write('n=');
readln(n);
for i:=1 to n do
for j:=1 to n do
begin

127
Methodes de calcul numerique en ingenierie electrique

write('A[',i,',',j,']=');
read(A[i,j]);
end;
for i:=1 to n do
begin
write('B[',i,']=');
readln(B[i]);
end;
end;
j:=0;
for i:=1 to n do
begin
max:=abs(A[i,i]);
lp:=i;
for k:=i+1 to n do
if (max<abs(A[k,i])) then
begin
max:=A[k,i];
lp:=k;
end;
if(max=0) then
Exit;
if(lp<>i) then
begin
for j:=i to n do
begin
temp:=A[i,j];
A[i,j]:=A[lp,j];
A[lp,j]:=temp;
end;
temp:=B[i];
B[i]:=B[lp];
B[lp]:=temp;
end;

for k:=1 to n do
if (k<>i) then
begin
m:=A[k,i]/A[i,i];
for j:=i to n do
A[k,j]:=A[k,j]-m*A[i,j];
B[k]:=B[k]-m*B[i];
end;
end;
for i:=1 to n do
X[i]:=B[i]/A[i,i];

128
Metode numerice în ingineria electrică

writeln('Les sollutions sont: ');


for i:=1 to n do
writeln('X[',i,']=',X[i]:3:2);
readln;
end.

#include "stdafx.h"
#include<iostream>
#include<fstream>
#include<math.h>
#include<conio.h>
using namespace std;

double A[100][100];
double B[100];
double X[100];
int n;

int _tmain(int argc, _TCHAR* argv[])


{
int i,j,k;
double m,temp,max;
int lin;
int option;

ifstream fin;
char chFichier[1024];
i=1;
cout.precision(3);
do
{
cout<<"Votre option pour introduire les valeurs:"<<endl;
cout<<"1. Fichier "<<endl<<"2. Interactif"<<endl;
cin>>option;
}
while((option!=1)&&(option!=2));
if(option==1)
{
cout<<"Nom de fichier:";
cin>>chFichier;
fin.open(chFichier);
fin>>n;

for(i=0;i<n;i++)
{
for(j=0;j<n;j++)

129
Methodes de calcul numerique en ingenierie electrique

{
fin>>A[i][j];
fin.ignore();
cout<<A[i][j]<<" ";
}
fin>>B[i];
cout<<B[i]<<endl;
}
fin.close();
}
else
{
cout<<"n=";
cin>>n;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
cout<<"A["<<i+1<<","<<j+1<<"]=";
cin>>A[i][j];
}
for(i=0;i<n;i++)
{
cout<<"B["<<i+1<<"]=";
cin>>B[i];
}
}

i=0; j=0;
for(i=0;i<n;i++)
{
max=fabs(A[i][i]);
lin=i;
for(k=i+1;k<n;k++)
if(max<fabs(A[k][i]))
{
max=A[k][i];
lin=k;
}
if(max==0)
return 0;

if(lin!=i)
{
for(j=i;j<n;j++)
{
temp=A[i][j];
A[i][j]=A[lin][j];

130
Metode numerice în ingineria electrică

A[lin][j]=temp;
}

temp=B[i];
B[i]=B[lin];
B[lin]=temp;

k=0;
for(k=0;k<n;k++)
if(k!=i)
{
m=A[k][i]/A[i][i];
for(j=i;j<n;j++)
A[k][j]=A[k][j]-m*A[i][j];
B[k]=B[k]-m*B[i];
}

for(i=0;i<n;i++)
X[i]=B[i]/A[i][i];

cout<<"Les sollutions sont "<<endl;


for(i=0;i<n;i++)
cout<<"X["<<i+1<<"]="<<X[i]<<endl;

getch();

return 0;
}

2.3. Metoda iterativă Jacobi

program Jacobi;
type matrice=array [1..10, 1..10] of real;
vect=array [1..10] of real;
var A:matrice;
B,X:vect;
i, j, n, it_nr, it: integer;
sum:real;
begin
write('Dati ordinul sistemului/ Donnez l''ordre du systeme: ');

131
Methodes de calcul numerique en ingenierie electrique

readln(n);
writeln('Dati matricea A/ Donnez la matrice A: ');
for i:=1 to n do
for j:=1 to n do
begin
write('A[',i,',',j,']= ');
readln(A[i,j]);
end;
writeln('Dati matricea B:/ Donnez la matrice B: ');
for i:=1 to n do
begin
write('B[',i,']= ');
readln(B[i]);
end;
write('Dati numarul de iteratii/ Donnez le nombre d''iterations: ');
readln(it);
for i:=1 to n do
X[i]:=1;
for it_nr:=1 to it do
begin
for i:=1 to n do
begin
sum:=0;
for j:=1 to n do
begin
if (i-j)<>0 then
sum:=sum+A[i,j]*X[j];
end;
X[i]:=(B[i]-sum)/A[i,i];
end;
end;
writeln('Rezultatul este/ Le resultat est: ');
for i:=1 to n do
begin
write(X[i]:6:2, ', ');
end;

end.

#include <stdio.h>

int main(void)
{
int i,j,n;
float A[10][10], B[10], X[10];
float sum;
int it, it_nr;

132
Metode numerice în ingineria electrică

printf("Dati ordinul sistemului/ Donnez l'ordre du systeme: ");


scanf("%d", &n);
printf("Dati matricea A/ Donnez la matrice A: \n");
for(i=0; i<n; i++)
for(j=0; j<n; j++)
{
printf("A[%d][%d]= ", i, j);
scanf("%f", &A[i][j]);
}
printf("Dati matricea B/ Donnez la matrice B: \n");
for(i=0; i<n; i++)
{
printf("B[%d]= ", i);
scanf("%f", &B[i]);
}
printf("Dati numarul de iteratii/ Donnez le nombre d'iterations: ");
scanf("%d", &it);
for(i=0; i<n; i++)
X[i]=1;
for(it_nr=0; it_nr<it; it_nr++)
{
for(i=0; i<n; i++)
{
sum=0;
for(j=0; j<n; j++)
{
if((i-j)!=0)
sum+=A[i][j]*X[j];
}
X[i]=(B[i]-sum)/A[i][i];
}
}
printf("Rezultatul este/ Le resultat est: \n");
for(i=0; i<n; i++)
printf("%f, ", X[i]);
return 0;
}

2.4. Metoda Gauss-Seidel

#include "stdafx.h"
#include<iostream>
#include<fstream>
#include<conio.h>
using namespace std;

133
Methodes de calcul numerique en ingenierie electrique

double A[100][100];
double B[100];
double X[100];
int n;
int _tmain(int argc, _TCHAR* argv[])
{
int i,j;
int option;
double d;
ifstream fin;
char chFichier[1024];
i=1;d=1;
cout.precision(3);
do
{
cout<<"Votre option pour introduire les valeurs:"<<endl;
cout<<"1. Fichier "<<endl<<"2. Interactif"<<endl;
cin>>option;
}
while((option!=1)&&(option!=2));

if(option==1)
{
cout<<"Nom de fichier:";
cin>>chFichier;
fin.open(chFichier);
fin>>n;

for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
fin>>A[i][j];
fin.ignore();
cout<<A[i][j]<<" ";
}
fin>>B[i];
cout<<B[i]<<endl;
}
fin.close();
}
else
{
cout<<"n=";
cin>>n;
for(i=0;i<n;i++)
for(j=0;j<n;j++)

134
Metode numerice în ingineria electrică

{
cout<<"A["<<i+1<<","<<j+1<<"]=";
cin>>A[i][j];
}
for(i=0;i<n;i++)
{
cout<<"B["<<i+1<<"]=";
cin>>B[i];
}
}
for(i=0;i<n;i++)
d=d*A[i][i];
if(d==0)
return 0;
for(i=0;i<n;i++)
{
X[i]=B[i];
for(j=0;j<i;j++)
X[i]=X[i]-A[i][j]*X[j];
X[j]=X[j]/A[i][i];
}
cout<<"Les sollutions sont:"<<endl;
for(i=0;i<n;i++)
cout<<"X["<<i+1<<"]="<<X[i]<<endl;
_getch();

return 0;
}

2.5. Metoda Choleski


Program triungiSup;
type vector=array[1..100] of real;
matrix=array[1..100,1..100] of real;
var A:matrix;
B,X:vector;
n:integer;
i,j,k,lp:integer;
i1,j1:integer;
m,d,temp,max:real;
option:integer;
strFichier:string;
f:text;
begin
i:=1;
d:=1;

135
Methodes de calcul numerique en ingenierie electrique

repeat
writeln('Votre option pour introduire les valeurs:');
writeln('1. Fichier ');
writeln('2. Interactif');
readln(option);
until((option=1)or(option=2));
if (option=1) then
begin
write('Nom de fichier:');
readln(strFichier);
assign(f,strFichier);
reset(f);
readln(f,n);
for i:=1 to n do
begin
for j:=1 to n do
begin
read(f,A[i,j]);
write(A[i,j]:3:2,' ');
end;
readln(f,B[i]);
writeln(B[i]:3:2);
end;
end
else
begin
write('n=');
readln(n);
for i:=1 to n do
for j:=1 to n do
begin
write('A[',i,',',j,']=');
read(A[i,j]);
end;
for i:=1 to n do
begin
write('B[',i,']=');
readln(B[i]);
end;
end;
for i:=1 to n do
d:=d*A[i,i];
if(d=0) then
Exit;
for i:=1 to n do
begin

136
Metode numerice în ingineria electrică

X[i]:=B[i];
for j:=1 to i-1 do
X[i]:=X[i]-A[i,j]*X[j];
X[j+1]:=X[j+1]/A[i,i];
end;
writeln('Les sollutions sont:');
for i:=1 to n do
writeln('X[',i,']=',X[i]:3:2);
readln;
end.
#include "stdafx.h"
#include<iostream>
#include<fstream>
#include<math.h>
#include<conio.h>
using namespace std;
void Descopune_Cholesky(double matA[200][200],double matL[200][200],double
matU[200][200],int n);
void tri_inf(double matA[200][200],double matTL[200],double matXX[200],int n);
void tri_sup(double matA[200][200],double matTL[200],double matXX[200],int n);

int _tmain(int argc, _TCHAR* argv[])


{
int i,j,n;
double A[200][200];
double B[200];
double X[200],Y[200];
double L[200][200],U[200][200];
ifstream fin;
int option;
bool ok;

char chFichier[1024];

cout.precision(3);
do
{
cout<<"Votre option pour introduire les valeurs:"<<endl;
cout<<"1. Fichier "<<endl<<"2. Interactif"<<endl;
cin>>option;
}
while((option!=1)&&(option!=2));

if(option==1)
{
cout<<"Nom de fichier:";
cin>>chFichier;

137
Methodes de calcul numerique en ingenierie electrique

fin.open(chFichier);
fin>>n;

for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
fin>>A[i][j];
fin.ignore();
cout<<A[i][j]<<" ";
}
fin>>B[i];
cout<<B[i]<<endl;
}
fin.close();
}
else
{
cout<<"n=";
cin>>n;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
cout<<"A["<<i+1<<","<<j+1<<"]=";
cin>>A[i][j];
}
for(i=0;i<n;i++)
{
cout<<"B["<<i+1<<"]=";
cin>>B[i];
}
}

ok=true;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(A[i][j]!=A[j][i])
ok=false;
if(!ok)
{
cout<<"Matrix n'est pas simetrique"<<endl;
exit(1);
}
Descopune_Cholesky(A,L,U,n);
tri_inf(L,B,Y,n);
tri_sup(U,Y,X,n);
cout<<"Les sollutions sont:"<<endl;

138
Metode numerice în ingineria electrică

for(i=0;i<n;i++)
cout<<"x["<<i+1<<"]="<<X[i]<<endl;
getch();

return 0;
}

void Descopune_Cholesky(double matA[200][200],double matL[200][200],double


matU[200][200],int n)
{
int i,j,k;
double suma;

for(i=0;i<n;i++)
{
for(j=0;j<i;j++)
{
suma=0;
for(k=0;k<j;k++)
suma+=matL[i][k]*matL[j][k];

if(matL[j][j]==0)
{
cout<<"matL[j][j]"<<endl;
exit(1);
}
else
matL[i][j]=(matA[i][j]-suma)/matL[j][j];
}

suma=0;
for(k=0;k<i;k++)
suma+=matL[i][k]*matL[i][k];

if((matA[i][i]-suma)<0)
{
cout<<"matA[i][i]";
exit(1);
}
else
matL[i][i]=sqrt(matA[i][i]-suma);

for(k=i+1;k<n;k++)
matL[i][k]=0;
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)

139
Methodes de calcul numerique en ingenierie electrique

matU[j][i]=matL[i][j];
}
void tri_inf(double matA[200][200],double matTL[200],double matXX[200],int n)
{
int i,j;
for(i=0;i<n;i++)
{
matXX[i]=matTL[i];
for(j=0;j<i;j++)
matXX[i]=matXX[i]-matA[i][j]*matXX[j];
matXX[i]=matXX[i]/matA[i][i];
}

}
void tri_sup(double matA[200][200],double matTL[200],double matXX[200],int n)
{

int i,j;
for(i=n-1;i>-1;i--)
{
matXX[i]=matTL[i];
for(j=n-1;j>i;j--)
matXX[i]=matXX[i]-matA[i][j]*matXX[j];
matXX[i]=matXX[i]/matA[i][i];
}
}

140
Metode numerice în ingineria electrică

Bibliografie

1. H.M. Antia, „Numerical Methods for Scientists and Engineers”, First Edition, Tata
McGrawHill India 1991.
2. C. Berbente, S. Mitran, S. Zancu, “Metode numerice”, Ed. Tehnica, Bucureşti, 1997.
3. E. J. Billo, „Excel for Scientists and Engineers: Numerical Methods”, Wiley-
Interscience, 2007.
4. R A Buckingham, „Numerical Methods”, Sir Isaac Pitman & Sons, 1962.
5 C.M. Bucur, C.A.Popeea, Gh. Simion, “Matematici speciale. Calcul numeric”, Ed.
Didactică şi Pedagogică, Bucureşti, 1983.
6. G. Dahlquist, A. Bjorck, “Numerical Methods”, Dover Publications, 2003.
7. V. Iorga, „Programare numerică”, Ed. Teora, Bucureşti, 1996.
8. D. Kahaner, C. Moler, S. Nash, „Numerical Methods”, Prentice Hall, 1988.
9. D. Kincaid, W. Cheney, „Numerical Analysis – Mathematics of Scientific Computing”,
Brooks – Cole Publishing Company, Pacific Grove, California, 1991.
10. R.L. Johnston, „Numerical Methods”, John Wiley & Sons Inc, 1982.
11. I. P. Mysovskih, „Lectures on Numerical Methods”, Wolters-Noordhoff Publishing, 1969.
12. Ad. Mateescu, „Prelucrarea numerică a semnalelor”, multiplicare UPB, 1996.
13. I. Olaru, „Metode numerice-note de curs”, Ed. Printech, Bucureşti, 2000
14. V. Pereyra, A. Reinoza, „NumericalMethods”, Springer-Verlag GmbH, 1983.
15. W.P. Press, S.A. Teukolski, W.T. Vetterling, B.P. Flannery, „Numerical Recipes in
FORTRAN – The Art of Scientific Computing, 2nd Edition, Cambridge University Press, 1995.
16. I. Rusu, „Metode numerice în electronică. Aplicaţii în limbaj C”, Ed. Tehnică, Bucureşti, 1997.
17. S. Salleh, A.Y. Zomaya, S.A. Bakar, „Computing for Numerical Methods Using Visual
C++”, Wiley-Interscience, 2007.
18. W.H.A. Schilders, E.J.W. Ter Maten, „Numerical Methods in Electromagnetics”, Volume
13: Special Volume Handbook of Numerical Analysis, North Holland, 2005.
19. S. Salon, M.V.K. Chari, „Numerical Methods in Electromagnetism”, Academic Press,
1999.
20. H.R. Schwartz, „Numerical Analysis of Symmetric Matrices”, Prentice Hall Inc., New
York, 1973.
21. I.Gh. Şabac, „Matematici speciale”, Ed. Didactică şi pedagogică, Bucureşti, 1983.
22. O. Stănăşilă, „Analiza mathematică”, Ed. Didactică şi pedagogică, Bucureşti, 1981.
23. S. Wolfram, „Mathematica – A System for Doing Mathematica by Computer”, 2nd
Edition, Addison-Wesley, 1991.
24. F. Zhang, „The Schur Complement and Its Applications. Numerical Methods and
Algorithms”, Springer, 2005.
25. *** Turbo Pascal 5.5 http://dn.codegear.com/article/20803
26. *** Visual C++ Express edition: http://msdn.microsoft.com/en-us/express/aa975050.aspx

141
Methodes de calcul numerique en ingenierie electrique

142
Metode numerice în ingineria electrică

143
Methodes de calcul numerique en ingenierie electrique

144
Metode numerice în ingineria electrică

145
Methodes de calcul numerique en ingenierie electrique

146
Metode numerice în ingineria electrică

147
Methodes de calcul numerique en ingenierie electrique

148