Metode numerice în ingineria electrică

144
5 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

Transcript of Metode numerice în ingineria electrică

Metode numerice în ingineria electrică

5

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

Methodes de calcul numerique en ingenierie electrique

6

Metode numerice în ingineria electrică

7

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

Methodes de calcul numerique en ingenierie electrique

8

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

Metode numerice în ingineria electrică

9

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.

Methodes de calcul numerique en ingenierie electrique

10

1.1. Metode numerice de rezolvare

a ecuaţiilor neliniare cu o necunoscută

Se consideră ecuaţia neliniară sau transcendentă

( ) 0=xf (1.1)

în care [ ] ℜ→baf ,: este o funcţie continuă iar ( )baxr ,∈ 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

...,.......,, 10 kxxx convergent către soluţia exactă rx a ecuaţiei. Orice metodă iterativă pentru determinarea soluţiei rx constă în găsirea unei ecuaţii de forma

( )xFxr = (1.2)

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

( ) ( )xFxxf r =⇔= 0 (1.3)

astfel încât şirul de numere ( ) 0≥kkx să aibă limita rx adică

rkk

xx =∞→

lim , (1.4)

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

( )1−= kk xFx (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ă ε .

ε<− −1kk xx (1.6)

După modul în care este construită funcţia de iteraţie ( )xF 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 ( )xf de a avea semne diferite la capetele

Metode numerice în ingineria electrică

11

intervalului [ ]ba, , dacă soluţia unică rx a ecuaţiei ( ) 0=xf există în intervalul (a,b). Atunci:

( ) ( ) 0<⋅ bfaf (1.7)

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

200

baxxm+

=≡ (1.8)

jumătatea intervalului [ ]ba, . Dacă 0x 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

( ) ε<0xf (1.9)

atunci se evaluează dintre cele două subintervale ( )0, xa şi ( )bx ,0 pe acela care conţine soluţia. Evaluarea se face după semnul produsului valorilor funcţie la capetele subintervalelor, adică:

( ) ( ) 00 <⋅ xfaf (1.10)

şi

( ) ( ) 00 <⋅ bfxf (1.11) Dacă este satisfăcută inegalitatea (1.10) atunci soluţia se caută în intervalul

( )0, xa , algoritmul continuând cu înjumătăţirea acestuia

2

011

xaxxm

+=≡ , ş.a.m.d (1.12)

Dacă inegalitatea (1.10) nu este satisfăcută, atunci în mod obligatoriu este satisfăcută (1.11) şi soluţia se află în intervalul ( )bx ,0 , prin urmare algoritmul va continua cu înjumătăţirea acestuia:

2

011

bxxxm

+=≡ , ş.a.m.d.

Şirul valorilor succesive ale jumătăţilor de subintervale: ,.....,,210 mmm xxx

este convergent către soluţia exactă rx (figura1.1).

Methodes de calcul numerique en ingenierie electrique

12

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

ε<− nn ab (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ă rx a ecuaţiei ( ) 0=xf pe un interval (a,b), cu [ ] ℜ→baf .: continuă pe [ ]ba, şi ( ) ( ) 0<⋅ bfaf , împărţind intervalul [ ]ba, în două părţi proporţionale cu valorile ( )af şi )(bf .

Metode numerice în ingineria electrică

13

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( af şi ( )( )bfb, cu axa 0x:

( ) ( )( ) ( )afbf

afbbfax−

⋅−⋅=1 (1.14)

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ă

( ) ( ) 01 <⋅ xfaf (1.15) atunci se împarte în continuare subintervalul [ ]1, xa în părţi proporţionale iar soluţia aproximativă în următorul pas este:

( ) ( )( ) ( )afxf

afxxfax−

⋅−⋅=

1

112 (1.16)

În acest caz punctul de pornire al aproximaţiilor este punctul 0xa = , 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ă

( ) ( ) 01 <⋅ bfxf (1.17)

Methodes de calcul numerique en ingenierie electrique

14

atunci se împarte în continuare subintervalul [ ]bx ,1 în părţi proporţionale iar soluţia aproximativă în următorul pas este:

( ) ( )( ) ( )1

112 xfbf

xfbbfxx−

⋅−⋅= (1.18)

În acest caz punctul de pornire al aproximaţiilor este punctul 0xb = , punctul a rămâne fix iar deplasarea aproximaţiilor succesive se face de la dreapta la stânga.

În final, valoarea kx este soluţie a ecuaţiei date dacă ( ) εε ,<kxf fiind eroarea impusă. Convergenţa metodei depinde de alegerea optimă a punctului de pornire 0x . Condiţia de convergenţă (numită şi condiţia Fourier) este

( ) ( ) 00''

0 <⋅ xfxf (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), [ ] ,,: ℜ→baf continuă pe [ ]ba, şi cu derivata continuă pe [ ]ba, , în jurul punctului 0x , doar primii doi termeni. Astfel ecuaţia neliniară iniţială ( ) 0=xf se înlocuieşte cu ecuaţia liniară ( ) ( ) ( )0

'00 xfxxxf ⋅−= (1.20)

a cărei soluţie este:

( )( )0

'0

01 xfxf

xx −= (1.21)

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

( )( )k

kkk xf

xfxx '1 −=+ (1.22)

Metode numerice în ingineria electrică

15

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

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

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

( ) ( ) 00''

0 >⋅ xfxf (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ă:

( ) ℜ→ℜ≠=⋅= ∑=

− :;0 ,00

nnn

i

iinn PaxaxP (1.24)

În algebra clasică se arată că este posibil să rezolvăm cu mijloace elementare doar ecuaţiile cu grad 3≤n . 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

Methodes de calcul numerique en ingenierie electrique

16

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 [ ]ba, î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: ( ) 0≥kkx

( ) rkkkxx =≥∞→ 0lim (1.25)

şi care se numesc metodele numerice de determinare a rădăcinilor ecuaţiilor algebrice. Iteraţiile se opresc şi kx 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ă:

11 ε<− −kk xx (1.26)

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

( ) 2ε<kxP (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ă ( ) nnn PPxP ,:,0 ℜ→ℜ= continuă şi derivabilă pe

ℜ , între două rădăcini reale şi consecutive ale ecuaţiei ( ) 0'1 =− xPn 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

121'

1 ..... ,0 −− <<= nn xxxP şi, apoi, se calculează şirul lui Rolle (şirul valorilor funcţiei ( )xPn în punctele date de rădăcinile derivatei, la care se adaugă limitele la ∞± ): ( ) ( ) ( ) ( ) ( )∞∞− − PxPxPxPP n ,,.......,, 121 . În fiecare dintre intervalele

( ) ( ) ( ),,,.....,,, 1211 +∞∞− −nxxxx 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 ( ) 0'

1 =− xPn devine dificilă de rezolvat.

Metode numerice în ingineria electrică

17

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ă ( ) ,0=xPn cu .: ℜ→ℜnP Fie ℜ∈ba, continuă şi derivabilă pe ),( ba . Se formează şirul lui Sturm asociat

funcţiei ( )xPn , ca fiind polinoamele )(),....(),( 10 xpxpxp n continue pe (a,b) şi care satisfac urm[toarele patru condiţii:

)• ( ) ( )xPxp n=0

)•• ( ) ( )xPxp n'

11 −=

)••• nixpxqxpxp iiii ,2 ),()()()( 21 =−⋅= −− (adică, polinomul ( )xpi este restul cu semn schimbat al împărţirii polinomului ( )xpi 2− la ( )xpi 1− , ( )xqi fiind câtul acestei împărţiri)

)•••• ( ) ( ) [ ]baxxpn ,,0 ∈∀≠ . Metoda şirului lui Sturm este o consecinţă a următoarei teoreme: dacă funcţia

polinomială ( )xPn este derivabilă pe (a,b) şi cu derivata continuă, ( ) ( ) 0,0 ≠≠ bPaP nn şi admite un şir Sturm asociat: ),(),.......,(),( 10 xpxpxp n

atunci numărul rădăcinilor reale ale ecuaţiei ( ) 0=xPn în intervalul (a,b) este egal cu diferenţa dintre numerele schimbărilor de semn ale şirurilor de numere

( ) ( ) nibpsiap ii ,0, = . 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 ( ) 0=xPn . Polinomul ( )xPn se poate exprima cu două relaţii echivalente:

( ) ( ) niaaxxaxaxPn

i

n

jij

iinn ,0,,0,0

0 100 =ℜ∈∑ ∏ ≠=−==

= =− (1.28)

unde njx j ,1, = 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

0

121 .........

aa

xxx n −=+++ (1.29)

Methodes de calcul numerique en ingenierie electrique

18

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

njxx j ,2,1 =>> (1.30)

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

0

11 a

ax −≅ (1.31)

Î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 njxx j ,2,1 => .

Dacă vom ridica la o putere m suficient de mare această inegalitate, atunci rădăcina x1 va deveni preponderentă, adică

mj

m xx >>1 (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ă *,2 Npm p ∈= , 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 ( )xPn se schimbă necunoscuta x cu –x se obţine:

( ) ( ) ( )∏=

+⋅⋅−=−n

jj

nn xxaxP

101 (1.33)

Se efectuează produsul

( ) ( ) ( ) ( )∏=

−⋅=−⋅⋅−n

jjnn

n xxaxPxP1

22201 (1.34)

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

21 xx .

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

Metode numerice în ingineria electrică

19

( ) ( ) ( ) ( )∏ ∑= =

⋅−=−⋅=n

j

n

i

mi

pi

imj

mm xAxxaxQ1 0

20 1 (1.35)

unde ,....2,1=p Noii coeficienţi ( )piA obţinuţi în fiecare etapă de calcul p, rezultă

recursiv prin înmulţirea directă a polinoamelor ( )xPn şi ( )xPn − , adică în

funcţie de coeficienţii iniţiali ia . În prima etapă de calcul rezultă:

( ) ( ) ( )2

21

1120

21

11

20

10 2,....,2; −−− +−=−== nnn aaAaaaAaA (1.36)

Dacă se notează cu ( )1+piA 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ă

( ) ( )( ) ( ) ( ) niAAAA pki

pki

n

k

kpi

pi ,0,12 )(

0

21 =⋅⋅∑ −+= +−=

+ (1.37)

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

0<− ki să fie consideraţi nuli. Pentru cele trei cazuri posibile de existenţă a rădăcinilor polinomului iniţial ( )xPn , identificate cu ajutorul semnului şi valorilor noilor coeficienţi ( )p

iA î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 njx j ,1, = ale

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

nxxx >>> .......21 (1.38)

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

( )

( )p

pmn

mm

AA

xxx0

121 ............ =+++ (1.39)

( )

)(0

213121 .... p

pmn

mn

mmmm

AAxxxxxx =⋅++⋅+⋅ − (1.40)

M

Methodes de calcul numerique en ingenierie electrique

20

( )

( )p

pnm

nmm

AA

xxx0

21 ....................... =⋅⋅ (1.41)

în care termenii din dreapta sunt întotdeauna pozitiv, fiind pătrate perfecte.

Presupunând că în etapa p rădăcina pm xx 2

11 = a devenit preponderentă, atunci

termenii ,, 211mmm xxx ⋅ .........ş.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:

( )

( )p

pm

AA

x0

11 ≅ (1.42)

( )

( )p

pmm

AA

xx0

221 ≅⋅ (1.43)

( )

( )p

pnm

nmm

AA

xxx0

21 .... ≅⋅⋅

M

(1.44)

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

( )

( ) njA

Ax m p

j

pj

j ,1,1

=±=−

(1.45)

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ă ( ) 0=xPn , 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:

( )( )( )( ) 1,1,

21

−==−

njA

Ar p

j

pjp

j (1.46)

Metode numerice în ingineria electrică

21

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

122

−= pm, atunci conform relaţiei (1.42)

( )

( )10

112

112

1 −

−−≅= p

pmp

AA

xx (1.47)

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

( )

( )p

pmp

AA

xx0

11

21 ≅= (1.48)

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

calculează raportul

( ) 11 ≅pr (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 ( ) 1,1, −= njr p

j 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 ( )xPn are ordinul de multiplicitate M, atunci ordinea descrescătoare a rădăcinilor polinomului este:

nMM xxxxx >>>=== + ............... 121 (1.50) Prima relaţie a lui Vièta va avea un termen preponderent:

( )

( )p

pmm

nmM

mM

mm

AA

xMxxxxx0

11121 ......... ≅⋅≅++++++ + (1.51)

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

( )

( )

( )p

pMMmm

Mmm

mn

mMn

mM

mM

mmmM

mm

AA

xxxx

xxxxxxxxx

0121

112121

....

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

≅=⋅⋅⋅≅

≅⋅⋅++⋅⋅⋅+⋅⋅

−+−

(1.52)

Methodes de calcul numerique en ingenierie electrique

22

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:

( )

( )mMp

pM

AA

x0

1 ±= (1.53)

iar determinarea semnului se face prin verificarea ecuaţiei iniţiale ( ) 0=xPn . 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

( )

( )10

12

112

1 −

−−

⋅≅= p

pn

mp

AMA

xx (1.54)

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

( )

( )p

pmp

AMA

xx0

11

21

⋅≅= (1.55)

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

Mr p ≅1 (1.56)

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

jr 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 ( ) 0=xPn se constituie în:

nMkMkkk xxxxxxx >>>===>>> +−++ .............. 1121 (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:

( )

( )Mmp

k

pMk

k AA

x ⋅ +±= (1.58)

iar criteriul de separare se aplică asupra raportului

Metode numerice în ingineria electrică

23

( ) Mr pk ≅ (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 ( ) 0=xPn au şi cel mai mare modul adică:

nxxxx >>>= .......321 (1.60)

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

θ−θ ⋅ρ=⋅ρ= jj exex 21 , (1.61)

unde 21 xx ==ρ este modulul rădăcinilor iar 21 argarg xx −==θ este argumentul acestora. Prima relaţie a lui Vièta pentru pasul p al iteraţiilor devine

( )

( )po

pmn

m

AA

xxm 13 .....cos2 =+++⋅ θρ (1.62)

dar termenul θρ mm cos2 ⋅ nu poate fi considerat preponderent din cauza factorului θmcos cu semn oscilant. Cea de a doua relaţia a lui Vièta este

( )

( )p

pmm

nmn

mmmm

AA

xxxxxx0

2213121 ..... ≅≅⋅++⋅+⋅ − ρ (1.63)

ceea ce conduce la găsirea termenului preponderent m2ρ şi la determinarea modului rădăcinilor complexe şi conjugate în mod asemănător unei rădăcini reale 2- multiple în modul

( )

( )mp

p

AA

2

0

2=ρ (1.64)

semnul fiind evident.

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

Methodes de calcul numerique en ingenierie electrique

24

( )10

)1(22

12−

−−≅ρ=ρ p

pmp

AA

(1.65)

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

( )

( )pA

A pmp

0

22 ≅= ρρ (1.66)

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

( ) ,12 ≅pr (1.67)

iar raportul

( )( )( )( )p

pp

AA

r0

211

1

= (1.68)

are semn oscilant datorită schimbărilor de semn ale termenului θρ mm cos2 ⋅ . 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ă ( ) .0=xPn

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, )(xPn se poate aproxima în forma:

n

n

j

jjn

n

j

jjnn bxbxxaxP +−== ∑∑

=−−

=−

1

01

0)()( α (1.69)

unde noii coeficienţi bj, nj ,...,0= se determină recursiv prin identificarea termenilor cu aceeaşi putere a lui x.

nkbabab kkk ,...,1 , , 100 =+== −α (1.70)

Metode numerice în ingineria electrică

25

relaţii ce definesc schema Horner. Aceste relaţii permit determinarea valorii polinomului în α=x , adica )(αnP , prin ,,n’’ operaţii de înmulţire şi ,,n-1’’ operaţii de adunare, ceea ce rezultă chiar din (1.69) când pentru .)( , nn bPx == αα

Schema lui Horner poate fi adaptată şi pentru evaluarea derivatelor unui polinom. Folosind observaţia că nn bP =)(α , se poate considera pentru fiecare aproximaţie a rădăcinii α că )()( αα nn bP = , şi din relaţiile recursive (1.70), prin derivare rezultă:

nkd

dbbddb k

kk ,..,1 ,1

1 =+= −− α

αα

(1.71)

Se obţin pentru noii coeficienţi ai derivatei polinomului, notaţi cu

n1,...,k ,1 == −

αddbc k

k (1.72)

următoarele relaţii recursive

1-n1,...,k , , 100 =+== −kkk cbcbc α (1.73)

iar valoarea derivatei polinomului în α=x este

1)( −= nn cP α (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

)(

)(1

1mmn

mnm c

bαααα

−+ −= (1.75)

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ă

0)(' =αnP , 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

se aplică procedeul Newton-Raphson funcţiei Mn xPxf

1

)]([)( = , unde M este

Methodes de calcul numerique en ingenierie electrique

26

ordinul de multiplicitate al rădăcinii α . Deoarece MM

n xPM

xf−

=1

'' )]([1)( iteraţia

Newton-Raphson se exprimă

)()(

11

mn

mnmm c

bMαααα

−+ −= (1.76)

ceea ce este similar cu algoritmul (1.75). Determinarea lui M se face prin evaluarea derivatelor polinomului )(xPn , 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 )(xPn în α=x este echivalentă cu dezvoltarea în serie Taylor a polinomului )(xPn în jurul punctului α=x

nnn xCxCxCCxP )(...)()()( 2

210 ααα −++−+−+= (1.77)

unde s-a notat cu

!

)()(

kPC

kn

= (1.78)

Din relaţiile (1.69) şi (1.70) se obţin coeficienţii polinomului )(1 xPn−

onn CxPxxP +−= − )()()( 1α (1.79)

iar

)(0 αnPC = (1.80)

Prin urmare coeficienţii polinomului )(1 xPn− 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 )(1 xPn− şi se vor obţine coeficienţii lui )(2 xPn− din factorizarea:

121 )()()( CxPxxP nn +−= −− α (1.81)

Metode numerice în ingineria electrică

27

1.2.2.3. Metoda lui Bairstow permite determinarea rădăcinilor reale şi complex conjugate ale ecuaţiei ( ) ,0=xPn prin calculul iterativ al unui divizor de ordinul doi al polinomului considerat.

Polinomul ( )xPn se poate scrie

( ) ( )∑ ∑ ++⋅++===

=

n

oi

n

j

jj

iin SRxxbqpxxxaxP

2

2

2 (1.82)

unde qpxx ++2 este un trinom oarecare de ordinul doi iar Rx+S este restul

împărţirii lui ( )xPn la qpxx ++2 . Dacă extindem notaţiile şi pentru coeficienţii R şi S, adică notăm 1−= nbR şi 1−+= nn pbbS , atunci din identificarea termenilor cu acelaşi puteri ale lui x, va rezulta relaţia de recurenţă pentru noii coeficienţi

nkqbpbab kkkk ,0,21 =−−= −− (1.83)

unde vom considera 012 == −− bb . Evident că dacă qpxx ++2 divide pe ( )xPn trebuie ca restul să fie nul, adică

( )( ) 0,

0,==

qpSqpR

(1.84)

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

( )( ) 0,

0,

1 ==

− qpbqpb

n

n (1.85)

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

dezvolta în serie Taylor funcţiile ( )qpbn , şi ( )qpbn ,1− în jurul aproximaţiei

curente ( )mm qp , . Dacă se păstrează numai termenii liniari se obţine sistemul:

( ) ( ) ( ) ( ) 0,, =⎟⎟⎠

⎞⎜⎜⎝

⎛∂∂

−+⎟⎟⎠

⎞⎜⎜⎝

⎛∂∂

−+≅== mqq

nm

mpp

nmmmnn q

bqq

pb

ppqpbqpb

( ) ( ) ( ) ( ) 0,,1

11

1

111111 =⎟⎟

⎞⎜⎜⎝

⎛∂∂

−+⎟⎟⎠

⎞⎜⎜⎝

⎛∂∂

−+≅−=

−−

−=

−−−−−−

mqq

nm

mpp

nmmmnn q

bqq

pb

ppqpbqpb

(1.86)

Methodes de calcul numerique en ingenierie electrique

28

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

qb

qq

bpb

qb

pb

qp

bpb

pb

kkk

k

kkk

k

∂∂

−∂∂

−−=∂∂

∂∂

−∂∂

−−=∂∂

−−−

−−−

212

211

(1.87)

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

(1.83). Astfel dacă notăm cu pb

c kk ∂

∂= şi

qbd k

k ∂∂

= , rezultă că relaţiile

(1.87) se pot scrie în forma:

nkqdpdbd

qcpcbc

kkkk

kkkk

,0,212

211

=−−−=

−−−=

−−−

−−− (1.88)

unde se consideră 01212 ==== −−−− ddcc Sistemul liniarizat numai după prima relaţie (1.88) devine:

( ) ( )( ) ( ) 12111

111

−−+−+

−++

−=⋅−+⋅−−=⋅−+⋅−

nnmmnmm

nnmmnmm

bcqqcppbcqqcpp

(1.89)

În mod analog se obţine sistemul de liniarizat şi dacă se foloseşte cea de-a doua

relaţie (1.88).

Matricea sistemului ⎥⎦

⎤⎢⎣

⎡=

−−

21

1

nn

nn

cccc

J se numeşte şi matricea Jacobiană şi este

nesingulară dacă det 0≠J . În acest caz se calculează soluţia sistemului (1.89).

22

2111

nnn

nnnnmm ccc

cbcbppp

−⋅

⋅−⋅=−=δ

−−−+ (1.90)

22

111

nnn

nnnnmm ccc

cbcbqqq

−⋅⋅−⋅

=−=−

−−+δ (1.91)

unde .det22 Jccc nnn =−⋅ −

Întregul proces de calcul se poate relua pentru polinomul de gradul n-2

Metode numerice în ingineria electrică

29

( ) ∑=

− ⋅=n

j

jjn xbxP

22 (1.92)

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

242

2,1qpp

x−±−

= (1.93)

În ceea ce priveşte alegerea aproximaţiei iniţiale ( )00 , qp 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ă ( )xPn are o singură

rădăcină reală şi 0002 =++ qrpr , atunci metoda Bairstow nu converge pentru

valorile iniţiale ( )00 , qp .

Methodes de calcul numerique en ingenierie electrique

30

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 nf ℜ→ℜ2: şi ( ) 0=xf 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.

Metode numerice în ingineria electrică

31

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

nnnnnn

nn

nn

bxaxaxa

bxaxaxabxaxaxa

=++

=++=++

.......

.

.

.

.

.

.

.

.

........

2211

22222121

1̀1212111

(2.1)

sau în formă matriceală restrânsă

BAX = (2.2)

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

⎟⎟⎟⎟⎟⎟

⎜⎜⎜⎜⎜⎜

=

nnnn

n

aaa

aaa

A

......

.

.

.

.

.

.

21

11211

(2.3)

X este vectorul coloană 1xn al necunoscutelor

⎟⎟⎟⎟⎟⎟

⎜⎜⎜⎜⎜⎜

=

nx

x

X...1

(2.4)

şi B este vectorul coloană 1xn al termenilor liberi

⎟⎟⎟⎟⎟⎟

⎜⎜⎜⎜⎜⎜

=

nb

b

B...1

(2.5)

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

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

Methodes de calcul numerique en ingenierie electrique

32

sistemului (2.1), pe rând cu factorii 11

1

aai− , pentru ni ,2= şi apoi se adună la

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:

( )

( )

( )( )

( )11

1

22

)1(

21

2

1

222

11212111

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

.

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

..........

nnnnn

nn

nn

bxaxa

bxaxa

bxaxaxa

=

=

=

(2.6)

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

sistemului (2.6) cu 22

2

aai− , pentru ni ,3= şi apoi adunându-o la fiecare ecuaţie i a

sistemului se va elimina necunoscuta x2. Se obţine sistemul echivalent:

( ) ( ) ( )

( ) ( ) ( )

( ) ( ) ( )223

23

23

233

233

12

122

122

11212111

........

.....

..........

........

nnnnn

nn

nn

nn

bxaxa

bxaxa

bxaxa

bxaxaxa

=++

=++

=++

=+++

(2.7)

Procedeul de eliminare a necunoscutelor continuă până când se aduce sistemul la forma:

( ) ( ) ( )

( ) ( )111

12

122

122

11111

...........

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

−− =

=++

=++

nnn

nn

nn

nn

bxa

bxaxa

bxaxa

(2.8)

ceea ce este echivalent cu reducerea matricei A la o matrice superioar triunghiulară. În acest caz ecuaţia matriceală a sistemului devine

Metode numerice în ingineria electrică

33

( ) ( )

( ) ( )

( )

( )

( ) ⎟⎟⎟⎟⎟

⎜⎜⎜⎜⎜

=

⎟⎟⎟⎟⎟

⎜⎜⎜⎜⎜

⎟⎟⎟⎟⎟

⎜⎜⎜⎜⎜

−−

−−

1

12

11

1

1,

1,

12

122

111

...

....0.....0

...0

....

nnn

nnn

ini

iji

n

n

b

bb

x

x

aaaaaaa

(2.9)

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 nk ,1= 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

( )

( )

( )

( )

( ) ( )

( )11

2,11

111

1,

1

21,1

21

21

1

1

1

a

xabx

a

xabx

axab

x

ab

x

n

jjj

iii

n

ijj

iji

ii

i

nnn

nnn

nn

n

nnn

nn

n

∑∑=

−+=

−−

−−−

−−

−−

⋅−=

⋅−=

⋅⋅

⋅−=

=

(2.10)

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:

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

Methodes de calcul numerique en ingenierie electrique

34

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

( )( ) ( )3

1121

1

−=+−−∑

=

nnininn

i înmulţiri

( )( ) ( )3

11121

1

−=+−−∑

=

nninnn

i adunări

( ) ( )∑−

=

−=−

1

1 211

n

i

nnn împărţiri

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

( ) ( )∑−

=

−=−

1

1 21n

i

nnin înmulţiri

( ) ( )∑−

=

−=−

1

1 21n

i

nnin adunări

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

( )( )6

521 +− nnn înmulţiri,

( )( )6

521 +− nnn adunări şi

( )2

1+nn împărţiri.

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

( )6

262 2 −+≅

nnnGϑ (2.11)

Acest număr este foarte mic, începând cu 3≥n , faţă de numărul de operaţii

cerute de regula lui Cramer (cu determinanţii calculaţi după minori):

!nnC ⋅=θ (2.12)

Adică CG ϑϑ << (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: ( )22 +=++ nnnnn 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.

Metode numerice în ingineria electrică

35

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: ( )

ijij aa =1 (2.14)

iar în etapa k: ( ) ( )( )

( )( ) 1,11

111,1

11,1 −≥−≠⋅−= −

−−−−

−−− kjkia

aa

aa kkk

kk

kkik

ijk

ij (2.15)

( ) ( )

( ) ( ) 1

11

,

1,1,1

−<=

−≥=−

−−−

kjaa

kjaak

ijkji

kjk

kjk

Noii coeficienţi ai matricei B sunt:

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

iar în etapa k: ( ) ( )

( )

( )

( ) ( ) nkbb

kiaa

bb

kk

kk

kkk

kkik

ik

i

,2

1

111

11,1

11,1

==

−≠−=

−−−

−−−

−−−

(2.17)

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

kJG

nnnknnn1

23

23

2111ϑ (2.18)

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

Methodes de calcul numerique en ingenierie electrique

36

2.1.3. Metoda lui Jacobi Sistemul de ecuaţii:

nnnnnn

nn

nn

bxaxaxa

bxaxaxa

bxaxaxa

=+++

=+++

=+++

,22,11,

2,222,211,2

1,122,111,1

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

....

....

(2.19)

se rescrie în sensul exprimării fiecărei necunoscute x1,x2,…..xn în funcţie de toate celelalte şi se obţine:

0...

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

...........0

.........0

,

1,1

,

1,

,

2,2

,21

2,2

1,2

2,2

22

1,1

,12

1,1

2,1

1,1

11

−−−−−=

−−−−=

−−−−−=

−n

nn

nn

nn

n

nn

nn

nn

nn

xa

ax

aa

abx

xaa

xaa

abx

xaa

xaa

abx

(2.20)

Dacă se alege ca aproximare iniţială o soluţie ( ),....,, )0()0(2

)0(1 nxxx 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 ix în iteraţia k

)1()1(1

1,)1(1

1,)1(2

2)1(1

1)( ...... −−+

+−−

−−− −−−−−−= kn

ii

inki

ii

iiki

ii

iik

ii

ik

ii

i

ii

iki x

aax

aa

xa

ax

aax

aa

abx

(2.21) Dacă şirurile iteraţiilor succesive pentru determinarea necunoscutei ix

( ),....,, )()0()0( kiii xxx , unde ni ,1= , sunt convergente pentru k →∞ , atunci limitele

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

DCXX += )0()1( (2.22)

Metode numerice în ingineria electrică

37

unde

⎟⎟⎟⎟⎟

⎜⎜⎜⎜⎜

=

nx

xx

X...

2

1

,

⎟⎟⎟⎟⎟⎟⎟⎟

⎜⎜⎜⎜⎜⎜⎜⎜

−−

−−

=

0......................

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

............0

.......... 0

,

1,

2,2

,2

2,2

1,2

1,1

,1

1,1

2,1

nn

n

n

n

aa

aa

aa

aa

aa

C ,

⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟

⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜

=

nn

nab

ab

ab

D

,

2,2

2

1,1

1

...... (2.23)

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

DICCCXCX

CDXCDCXX

kkkk )...(

.....................................................21)0()(

)0(2)1()2(

+++++=

+=+=

−−

(2.24)

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

ICCCS kk ++++= −− ...21 (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

∑≠=

=⟨=

ijj

aa

iii

jiq1

n1,...,i ,1,

, (2.26)

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:

1)( −−= CIS (2.27)

ceea ce implică

∞→

+===k

DCXX ,C)-(IX ,0C lim -11-k D

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

Methodes de calcul numerique en ingenierie electrique

38

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:

∑∑+=

−−

=−−=

n

ij

kj

ii

jii

j

kj

ii

ji

ii

iki x

aa

xaa

abx

1

)1(

,

,1

1

)(

,

,

,

)( pentru n.1,..,k ,,...,1 == ni (2.28)

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

[ ] [ ]

11

11

1

x x x x xx x x x x

L Ux x x x xx x x x xx x x x x

⎛ ⎞ ⎛ ⎞⎜ ⎟ ⎜ ⎟⎜ ⎟ ⎜ ⎟⎜ ⎟ ⎜ ⎟= =⎜ ⎟ ⎜ ⎟⎜ ⎟ ⎜ ⎟⎜ ⎟ ⎜ ⎟⎝ ⎠ ⎝ ⎠

(2.31)

Metode numerice în ingineria electrică

39

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:

11 12 13 14 11 12 13 14

21 22 23 24 21 22 23 24

31 32 33 34 31 32 33 34

41 42 43 44 41 42 43 44

0 0 0 10 0 0 1

*0 0 0 1

0 0 0 1

A A A A L U U UA A A A L L U UA A A A L L L UA A A A L L L L

⎛ ⎞ ⎛ ⎞ ⎛ ⎞⎜ ⎟ ⎜ ⎟ ⎜ ⎟⎜ ⎟ ⎜ ⎟ ⎜ ⎟=⎜ ⎟ ⎜ ⎟ ⎜ ⎟⎜ ⎟ ⎜ ⎟ ⎜ ⎟⎜ ⎟⎜ ⎟ ⎜ ⎟ ⎝ ⎠⎝ ⎠ ⎝ ⎠

(2.36)

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

( )

11 11 12 11 13 11 14

21 21 12 22 21 13 22 23 21 14 22 24

31 31 12 32 31 13 32 23 33 31 14 32 24 33 34

41 41 12 42 41 13 42 23 43 41 14 42 24 43 34 44

L L U L U L UL L U L L U L U L U L U

AL L U L L U L U L L U L U L UL L U L L U L U L L U L U L U L

⎛ ⎞⎜ ⎟+ + +⎜ ⎟=⎜ ⎟+ + + + +⎜ ⎟⎜ ⎟+ + + + + +⎝ ⎠

(2.37)

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

Methodes de calcul numerique en ingenierie electrique

40

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:

1

1

1

1

;

( ) / ; 2,

k

im im ij jmj

k

mj mj mi ij mmi

L A L U

U A L U L m N

=

=

= −

= − =

∑ (2.38)

Putem ilustra aceasta prin figura următoare:

Fig. 2.1 Succesiunea operaţiilor în factorizarea Crout

1

3

m

2

4

Metode numerice în ingineria electrică

41

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

Fig. 2.2 Ilustrarea metodei de factorizare Crout

m

i

j

3

1

2

4

5

j

j

i

i

V

V

V

V

L(i

U(

Methodes de calcul numerique en ingenierie electrique

42

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

1

11

1

; 1,

( ) / ; 1,

j

mj mj mi iji

k

mj mj mi ij mmi

L A L U j m

U A L U L j m N

=

=

= − =

= − = +

∑ (2.39)

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

1

3

2

4

m

Metode numerice în ingineria electrică

43

//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”.

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

m

j

i

i

i

V

V V

L(m U(m jVj

1

2 3

Methodes de calcul numerique en ingenierie electrique

44

• 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):

( )1

N

iii

Det A L=

=∏ (2.40)

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

[ ] [ ] [ ] [ ]11 1 1

... ...

NN N N

L Z YL Z Y x x Z

x x L Z Y

⎛ ⎞⎛ ⎞ ⎛ ⎞⎜ ⎟⎜ ⎟ ⎜ ⎟= ⇒ = ↓ ⇒⎜ ⎟⎜ ⎟ ⎜ ⎟⎜ ⎟⎜ ⎟ ⎜ ⎟⎝ ⎠⎝ ⎠ ⎝ ⎠

(2.41)

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

Metode numerice în ingineria electrică

45

Parcursul direct poate fi executat în acelaşi timp ca şi factorizarea. • Parcursul invers. Să rezolvăm un alt sistem, auxiliar:

[ ] [ ] [ ] [ ]1 11

1 ... ...1 N N

x x X ZU X Z x X

X Z

⎛ ⎞⎛ ⎞ ⎛ ⎞⎜ ⎟⎜ ⎟ ⎜ ⎟= ⇒ = ↑ ⇒⎜ ⎟⎜ ⎟ ⎜ ⎟⎜ ⎟⎜ ⎟ ⎜ ⎟⎝ ⎠⎝ ⎠ ⎝ ⎠

(2.42)

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

Methodes de calcul numerique en ingenierie electrique

46

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

( , ) 0 ( , ) ( 1, )p pA m m pivot A i m i m 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ă:

( , ) 0 ( , ) ( 1, ), ( 1, )p p p pA m m pivot A i j i m N j m 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)

Metode numerice în ingineria electrică

47

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:

( ) ( )Tij jiA A A A= ⇒ = (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:

[ ] [ ] [ ]TA U U= (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:

11 12 13 14 11 11 12 13 14

12 22 23 24 12 22 22 23 24

13 23 33 34 13 23 33 33 34

14 24 34 44 14 24 34 44 44

0 0 00 0 0

*0 0 0

0 0 0

A A A A U U U U UA A A A U U U U UA A A A U U U U UA A A A U U U U U

⎛ ⎞ ⎛ ⎞ ⎛ ⎞⎜ ⎟ ⎜ ⎟ ⎜ ⎟⎜ ⎟ ⎜ ⎟ ⎜ ⎟=⎜ ⎟ ⎜ ⎟ ⎜ ⎟⎜ ⎟ ⎜ ⎟ ⎜ ⎟⎜ ⎟⎜ ⎟ ⎜ ⎟

⎝ ⎠⎝ ⎠ ⎝ ⎠

(2.55)

Methodes de calcul numerique en ingenierie electrique

48

Algoritmul este următorul: a) Determinăm mai întâi 11 11U A= , 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:

12

1 11

1

1 21

, ; 2,

( ) / ( , ) / ; 1,

m

mm mm im mmi

m

mj mj im ij mm mj mmi

U A U A v v m N

U U U U U U v v U j m N

=

=

= − = − < > =

= − = − < > = +

∑ (2.56)

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 v1

T care sunt echivalenţi).

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

m

i

V

V

U(m jj

2

3

i V

U(m

1

Metode numerice în ingineria electrică

49

//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(uim

2)] //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:

]][[][]][][[][ UDUUDLA T== , cu TUL ][][ = (2.57)

Methodes de calcul numerique en ingenierie electrique

50

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:

[ ] [ ]

11

22

11

11

1

±⎛ ⎞ ⎛ ⎞⎜ ⎟ ⎜ ⎟±⎜ ⎟ ⎜ ⎟⎜ ⎟ ⎜ ⎟= = ±⎜ ⎟ ⎜ ⎟

±⎜ ⎟ ⎜ ⎟⎜ ⎟⎜ ⎟ ±⎝ ⎠⎝ ⎠

mm

nn

NN

U x x x xU x x x

U U x x DU x

U

(2.58)

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

înmulţire a matricelor:

1 1 1 1

; 2,= = = =

= = =∑∑ ∑∑m m m m

mm mi ik km im km iki k i k

A L D U U U D m N (2.59)

Dar, din moment ce matricea D este diagonală, rămân doar termenii care au i=k, şi obţinem:

1

2 2 2

1 1; ( )

= =

= = + =∑ ∑m m

mm im ii im i mm m ii ii i

A U D U D U D D D (2.60)

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

12

1

12

1

sgn 1

; 2,

=

=

⎛ ⎞= − = ±⎜ ⎟⎝ ⎠

= − =

m

m mm im ii

m

mm mm im ii

D A U D

U A U D m N (2.61)

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

( )1 11

11 11

sgn 1= = ±

=

D A

U A (2.62)

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

Metode numerice în ingineria electrică

51

1 1 1 1

; 1,= = = =

= = = +∑∑ ∑∑m m m m

mj mi ik km im km iki k i k

A L D U U U D j m N (2.63)

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

obţinem:

1

1 1

= =

= = +∑ ∑m m

mj im ij i im ij i mm mj mi i

A U U D U U D U U D (2.64)

Astfel, putem determina:

( )1

1/ ; 1,

=

⎛ ⎞= − = +⎜ ⎟⎝ ⎠

∑m

mj mj im ij i mm mi

U A U U D U D j m N (2.65)

Pentru prima linie (m=1), sumele sunt nule, şi obţinem:

( ) ( )1 1 11 1/ ; 2,= =j jU A U D j 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

Methodes de calcul numerique en ingenierie electrique

52

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.

Metode numerice în ingineria electrică

53

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.

Methodes de calcul numerique en ingenierie electrique

54

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

( ) 0=xf (3.1)

où [ ] ℜ→baf ,: est une fonction continue et ( )baxr ,∈ 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

...,.......,, 10 kxxx 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

( )xFxr = (3.2)

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

( ) ( )xFxxf r =⇔= 0 (3.3)

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

rkx=

∞→lim , (3.4)

où les termes de la suite se déterminent par récurrence en fonction de le terme précèdent, avec la relation

( )1−= kk xFx (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ε .

ε<− −1kk xx (3.6)

D’après la construction de la fonction itérative ( )xF , 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 ( )xf d’avoir différentes signes aux extrémités de l’intervalle [a,b], si la solution unique x de l’équation ( ) 0=xf existe dans l’intervalle (a,b). Alors:

Metode numerice în ingineria electrică

55

( ) ( ) 0<⋅ bfaf (3.7) Dans une première itération on calcule:

200

baxxm+

=≡ (3.8)

le milieu de l’intervalle [a,b]. Si 0x n’est pas racine de l’équation, la vérification ne peut pas être faite par comparaison:

( ) ε<0xf (3.9)

alors on évalue parmi les deux mi-intervalles ( )0, xa et ( )bx ,0 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:

( ) ( ) 0<⋅ bfaf (3.10)

et

( ) ( ) 00 <⋅ bfxf (3.11) Si l’inégalité (3.9) est satisfaite alors on cherche la solution dans l’intervalle

( )0, xa , l’algorithme continuant par sa dichotomie:

2

011

xaxxm

+=≡ etc. (3.12)

Donc l’inégalité (10) n’ést pas satisfaite, alors, obligatoirement (10) est

satisfaite et la solution se trouve dans l’intervalle ( )bx ,0 . Par conséquent l’algorithme continue avec la dichotomie de cet intervalle:

2

011

bxxxm

+=≡ etc.

La suite des valeurs successives des moitiés des sous intervalles:

,.....,,210 mmm xxx est convergente vers la solution exacte rx (fig.3.1).

Methodes de calcul numerique en ingenierie electrique

56

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.

ε<− nn ab (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 ( ) 0=xf sur un intervalle (a,b), avec [ ] ℜ→baf .: continue sur [ ]ba, et ( ) ( ) 0<⋅ bfaf .

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

Metode numerice în ingineria electrică

57

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( af et ( )( )bfb, avec l’axe 0x:

( ) ( )( ) ( )afbf

afbbfax−

⋅−⋅=1 (3.14)

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:

( ) ( ) 0<⋅ bfaf (3.15)

alors on continue a diviser le sous intervalle [ ]1, xa en parties proportionnelles et la solution approximative dans le prochaine pas est:

( ) ( )( ) ( )afxf

afxxfax

−⋅−⋅

=1

112 (3.16)

Dans ce cas le point de départ des approximations est le point 0xa = , 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:

( ) ( ) 01 <⋅ bfxf (3.17)

alors on continue a diviser l’intervalle [ ]bx ,1 en parties proportionnelles et la solution approximative dans le prochaine pas est:

( ) ( )( ) ( )1

112 xfbf

xfbbfxx−

⋅−⋅= (3.18)

Dans ce cas le point de départ des approximations est le point 0xb = , le point a reste fixé et le déplacement des approximations successives se fait de droite à gauche. Enfin, la valeur kx est la solution de l’équation donnée, soit ( ) εε ,<kxf étant la valeur imposée.

La convergence de la méthode dépend de la choix optime du point de départ 0x . La condition de convergence (nommée la condition Fourier) est:

( ) ( ) 00''

0 <⋅ xfxf (3.19)

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

Methodes de calcul numerique en ingenierie electrique

58

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 0x , seulement les premiers deux termes, ou la fonction [ ] ℜ→baf ,: est continué et avec la première dérivée continue sur [ ]ba, Ainsi, l’équation non linéaire initiale ( ) 0=xf est remplacée par l’équation linéaire

( ) ( ) ( ) 00'

00 =⋅−≠ xfxxxf (3.20)

qui a comme solution

( )( )0

'0

01 xfxfxx −= (3.21)

De point de vue géométrique (fig. 3.3), dans la méthode de Newton 1x 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 ( )( )00 , xfx avec l’axe 0x. Il résulte la relation récursive pour l’approximation de la solution au pas k+1:

( )( )k

kkk xf

xfxx '1 −=+ (3.22)

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

Metode numerice în ingineria electrică

59

La convergence dépend du choix du point de départ 0x . Pour que l’algorithme de Newton soit convergent vers la solution rx il est nécessaire que le point de départ 0x vérifie la condition:

( ) ( ) 00''

0 >⋅ xfxf (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

i

iin xaxP

0

,0 avec ℜ←ℜ≠ :;0 nn Pa (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 3≤n . 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: ( ) 0≥kkx

( ) rkkkxx =≥∞→ 0lim (3.25)

Methodes de calcul numerique en ingenierie electrique

60

Les équations s’arrêt et kx 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é:

11 ε<− −kk xx (3.26)

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

( ) 2ε<kxP (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 ( ) nnn PPxP ,:,0 ℜ→ℜ= contient les dérivées sur ℜ , entre deux racines réelles et consécutives de l’équation

( ) 0'1 =− xPn il existe tout au plus une racine de l’équation considérée. On forme la suite croissante des racines de l’équation

121'

1 .....0 −− <<>= nn xxxP et on calcule la suite de Rolle (la suite des valeurs de la fonction ( )xPn dans les points données par les racines de la dérivée, à laquelle on ajoute les limites a ∞± ): ( ) ( ) ( ) ( ) ( )∞∞− − PxPxPxPP n ,,.......,, 121 . Dans chaque intervalle ( ) ( ) ( ),,,.....,,, 1211 +∞∞− −nxxxx 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

( ) 0'1 =− xPn 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 ( ) ℜ∈ℜ→ℜ= baFiePavecxP nn ,.:,0 . Soit ℜ∈ba, et ( )xPn ,

continue et dérivable sur ),( ba . On forme la suite du Sturm associée à la fonction ( )xPn , les polynômes nppp ,...., 10 continues sur ),( ba et lesquelles satisfait les conditions:

)• ( ) ( )xPxp n=0

)•• ( ) ( )xPxp n'

11 −=

Metode numerice în ingineria electrică

61

)••• nixpxqxpxp iiii ,2),()()()( 21 =−⋅= −− (c’ést-à-dire, le polynôme ( )xpi est le reste avec signe changé de la division du polynôme ( )xpi 2− à ( )xpi 1− , et ( )xqi est le quotient)

)•••• ( ) ( ) [ ]baxxpn ,,0 ∈∀≠ . La méthode de la suite du Sturm est une conséquence du théorème suivant: si

la fonction polynomiale ( )xPn est dérivable sur (a,b) avec la dérivée continue et ( ) ( ) 0,0 ≠≠ bPaP nn , de plus elle admet une suite Sturm associée:

,,.......,, 10 nppp alors le nombre des racines réelles de l’équation ( ) 0=xPn dans l’intervalle (a,b) est égal à la différence entre le nombre de changement de signe de la suite de numéros ( ) ( ) nibpsiap ii ,0, = .

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 ( ) 0=xPn . Le polynôme ( )xPn peut être exprime:

( ) ( ) niaayxaxaxPn

i

n

jiin ,0,,0,0

0 1001 =ℜ∈≠=−== ∑ ∏

= =

(3.28)

ou njx j ,1, = 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:

0

121 .........

aaxxx n −=+++ (3.29)

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

njxx j ,2,1 =>> (3.30)

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

Methodes de calcul numerique en ingenierie electrique

62

0

11 a

ax −≅ (3.31)

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 njxx j ,2,1 => . 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

mj

mn xx >> (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 ∈= pm p ,2 , des racines de l’équation donnée, ce qui conduit à la racine prépondérante.

Si dans l’expression (3.28) du polynôme ( )xPn on change l’inconnue x avec –x on obtient:

( ) ( ) ( )∏=

+⋅⋅−=−n

jj

nn xxaxP

101 (3.33)

En faisant le produit:

( ) ( ) ( ) ( )∏=

−⋅=−⋅⋅−n

jjnn

n xxaxPxP1

22201 (3.34)

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

,........, 22

21 xx . On répète ce procédé p fois et on obtient un nouveau polynôme de

degré pm 2= en variable x:

( ) ( ) ( ) ( )∏ ∑= =

⋅−=−⋅=n

j

n

i

mi

pi

imj

mm xAxxaxQ1 0

20 1 (3.35)

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

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

Metode numerice în ingineria electrică

63

polynômes ( ) ( )xPetxP nn − , c’est-à-dire la fonction des coefficients initiales

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

( ) ( ) ( )2

21

1120

21

11

20

10 2,....,2; −−− +−=−== nnn aaAaaaAaA (3.36)

Si on note avec ( )1+piA 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:

( ) ( )( ) ( ) ( ) niAAAA kipki

n

k

kpi

pi ,0,12

0

21 =⋅⋅−+= +−=

+ ∑ (3.37)

ou on convient que tous les termes d’indice inférieur 0<−>+ kietnki soit nuls.

Pour trois cas d’existence des racines du polynôme initial ( )xPn , identifies a

l’aide du signe et des valeurs des nouveaux coefficients ( )piA en diverses étapes de

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 njx j ,1, = du

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

nxxx >>> .......21 (3.38)

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

( )

( )p

pmn

mm

AA

xxx0

121 ............ =+++ (3.39)

( )

( )

( )p

pnm

nmm

p

pmn

mn

mmmm

AAxxx

AAxxxxxx

021

1)(

0

213121

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

....

=⋅⋅

=⋅++⋅+⋅ −

M (3.40)

dans lesquelles les termes de la partie droite sont toujours positifs, étant carrées parfaites. En supposant que dans l’étape p la racine pm xx 2

11 = est devenue

Methodes de calcul numerique en ingenierie electrique

64

prépondérante, alors les termes ,, 211mmm xxx ⋅ … deviendront prépondérants dans

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

( )

( )p

pm

AA

x0

11 ≅ (3.41)

( )

( )p

pmm

AA

xx0

221 ≅⋅ (3.42)

( )

( )p

pnm

nmm

AA

xxx0

21 .... ≅⋅⋅

M

(3.43)

desquelles on obtient, successivement – en commencent par x1 – les modules des racines:

( )

( ) njA

Ax m p

j

pj

j ,1,1

=±=−

(3.44)

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

dans l’équation initiale ( ) 0=xPn , 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:

( )( )( )( ) 1,1,

21

−==−

njA

Ar p

j

pjp

j (3.45)

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

c’est-à-dire 122

−= pm, alors en conformité avec la relation (3.42)

( )

( )10

112

121

1

≅=−

p

pm

AA

xxp

(3.46)

Metode numerice în ingineria electrică

65

et de plus dans l’étape suivante

( )

( )p

pmp

AA

xx0

11

21 ≅= (3.47)

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

(3.48), le rapport:

( ) 11 ≅pr (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 ( ) 1,1, −= njr p

j 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 ( )xPn aie l’ordre de multiplicité M, alors l’ordre décroissante des racines du polynôme est:

nMM XXXxx >>>=== + ............... 121 (3.49) La première relation Vieta aura un terme prépondérant:

( )

( )p

pmm

MmM

mm

AA

xMxxxx0

11121 ....... ≅⋅≅++++ + (3.50)

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

( )

( )

( )p

pMMmm

Mmm

mn

mMn

mM

mM

mmmM

mm

AA

xxxx

xxxxxxxxx

0121

112121

....

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

≅=⋅⋅⋅≅

≅⋅⋅++⋅⋅⋅+⋅⋅

−+−

(3.51)

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:

Methodes de calcul numerique en ingenierie electrique

66

( )

( )Mmp

pM

AAx ⋅±=

01 (3.52)

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

( ) 0=xPn . 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:

( )

( )10

12

121

1

⋅≅=

p

pn

m

AMA

xxp

(3.53)

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

( )

( )p

pmq

AMA

xxp

0

111 ⋅≅= (3.54)

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

Mr p ≅1 (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 ( ) 0=xPn est:

nMkMkkk XXXXXXX >>==>>> +−++ ........... 1121 (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:

( )

( )Mmp

k

pMk

k AA

x ⋅ +±= (3.57)

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

Metode numerice în ingineria electrică

67

( ) Mr pk → (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 ( ) 0=xPn ont le plus grand module:

nxxxx >>>= .......321 (3.59) Les racines x1 et x2 complexes et conjugues s’écrit:

θθ ρρ jj exsiex −⋅=⋅= 21 (3.60)

ou 21 xx ==ρ est le module des racines et 21 argarg xx −==θ est leur l’argument.

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

( )

( )po

pmn

m

AA

xxm 13 .....cos2 =+++⋅ θρ (3.61)

Mais le terme θρ mm cos2 ⋅ ne peut pas être considéré prépondérant à cause du facteur θmcos avec signe oscillant. La seconde relation Vieta est:

( )

( )p

pmm

nmn

mmmm

AA

xxxxxx0

2213121 ..... ≅≅⋅++⋅+⋅ − ρ (3.62)

ce qui conduit à la découverte du terme précèdent m2ρ et à la détermination du module des racines complexes conjuguées en mode similaire avec une racine réelle 2-multiple en module:

( )

( )mp

p

AA

2

0

2=ρ (3.63)

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:

Methodes de calcul numerique en ingenierie electrique

68

( )10

1222 1

≅=−

p

pm

AAp

ρρ (3.64)

davantage:

( )

( )pA

A pmp

0

22 ≅= ρρ (3.65)

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

( ) ,12 ≅pr (3.66) et le rapport:

( )( )( )( )p

pp

AA

r0

211

1

= (3.67)

a le signe oscillant dû à les changements du signe du terme θρ mm cos2 ⋅ . 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 ( ) .0=xPn

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, )(xPn peut être approximé sur la forme:

n

n

j

jjn

n

j

jjnn bxbxxaxP +−== ∑∑

=−−

=−

1

01

0)()( α (3.68)

ou, les nouveaux coefficients bj, nj ,...,0= sont déterminés récursivement par identification du termes avec la même puissance de x.

nkbabab kkk ,...,1 , , 100 =+== −α

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

Metode numerice în ingineria electrică

69

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

nkd

dbbddb k

kk ,..,1 ,1

1 =+= −− α

αα

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

n1,...,k ,1 == −αd

dbc kk

les suivantes relations de récursivité:

1-n1,...,k , , 100 =+== −kkk cbcbc α (3.70)

et la valeur du polynôme α=x est

1)( −= nn cP α (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:

)(

)(

11m

mn

mnm c

bαααα

−+ −= (3.72)

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 0)(' =αnP , 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

à la fonction Mn xPxf1

)]([)( = , ou M este l’ordre de multiplicité de la racine α . Parce

que MM

n xPM

xf−

=1

'' )]([1)( l’itération Newton-Raphson s’exprime par

)(

)(

11

mn

mnmm c

bMαααα

−+ −= (3.73)

Methodes de calcul numerique en ingenierie electrique

70

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 )(xPn , 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 )(xPn en α=x est équivalente avec le développement en série Taylor du polynôme )(xPn autur du α=x :

nnn xCxCxCCxP )(...)()()( 2

210 ααα −++−+−+= (3.74)

ou on a noté

!

)()(

kPC

kn

= (3.75)

Des itérations (3.69) et (3.70) on obtient les coefficients du polynôme )(1 xPn−

onn CxPxxP +−= − )()()( 1α (3.76)

et

)(0 αnPC = (3.77)

Par conséquent les coefficients du polynôme )(1 xPn− 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 )(1 xPn− et on obtient les coefficients de )(2 xPn− de la factorisation:

121 )()()( CxPxxP nn +−= −− α (3.78) L’application n fois du schéma du Horner va fournir tous le coefficients

1-n0,...,k , =kC , donc les valeurs des dérivés kk

n CkP !)()( =α . Aplicarea de n ori a schemei lui Horner va furniza toţi coeficienţii

1-n0,...,k , =kC , deci valorile tuturor derivatelor kk

n CkP !)()( =α . 3.2.2.3. La méthode de Bairstow permet a déterminer les racines réelles et

complexes conjuguées de l’équation ( ) ,0=xPn par calcul itératif d’un diviseur de second ordre du polynôme considéré.

Le polynôme ( )xPn peut être écrit:

Metode numerice în ingineria electrică

71

( ) ( )∑ ∑=

=

++⋅++==n

oi

n

j

jj

iin SRxxbqpxxxaxP

2

2

2 (3.79)

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

division de ( )xPn à qpxx ++2 . Si on élargit les notations pour les coefficients R

et S, c’est-à-dire on note 11 −− +== nnn pbbSetbR , alors par identification des termes avec les mêmes puissances de x, il résulte une relation récursif pour les nouveaux coefficients:

nkqbpbab kkkk ,0,21 =−−= −− (3.80)

ou on va considérer 012 == −− bb . Evidement pour que qpxx ++2 divise ( )xPn il faut que le reste soit nul:

( )( ) 0,

0,==

qpSqpR

(3.81)

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

( )( ) 0,

0,

1 ==

− qpbqpb

n

n (3.82)

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 ( ) ( )qpbetqpb nn ,, 1− autour de

l’approximation courante ( )mm qp , . Si on garde seulement les termes linéaires on obtient le système:

( ) ( ) ( ) ( ) 0,, =⎟⎟⎠

⎞⎜⎜⎝

⎛∂∂

−+⎟⎟⎠

⎞⎜⎜⎝

⎛∂∂

−+≅== mm qq

nm

pp

nmmmnn q

bqq

pb

ppqpbqpb (3.83)

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

récurrence (3.80):

Methodes de calcul numerique en ingenierie electrique

72

qb

qq

bpb

qb

pb

qp

bpb

pb

kkk

k

kkk

k

∂∂

−∂∂

−−=∂∂

∂∂

−∂∂

−−=∂∂

−−−

−−−

212

211

(3.84)

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

de type (3.80). Ainsi, si on note avecqb

dsipb

c kk

kk ∂

∂=

∂∂

= , il résulte que les

relations (3.74) peuvent s’écrire de la manière:

nkqdpdbd

cqcbc

kkkk

kkkk

,0,212

211

=−−−=

⋅−−=

−−−

−−− (3.85)

où on considère 01212 ==== −−−− ddcc . Le système linéarisé seulement après la première relation (3.85) devient:

( ) ( )( ) ( ) 12111

111

−−+−+

−++

−=⋅−+⋅−−=⋅−+⋅−

nnmmnmm

nnmmnmn

bcqqcppbcqqcpp

(3.86)

Par analogie on obtient le système a linéarité et ainsi on utilise la seconde

relation (3.85).

La matrice du système ⎥⎦

⎤⎢⎣

⎡=

−−

21

1

nn

nn

cccc

J est appelée la matrice Jacobienne et

elle est non singulière c’est-à-dire det ,0≠J pour les racines complexes et simples. Dans ce cas on calcule la solution du système (3.86):

22

2111

nnn

nnnnmmp ccc

cbcbpp

−⋅

⋅−⋅=−=

−−−+δ (3.87)

22

111

nnn

nnnnmm ccc

cbcbqqq

−⋅⋅−⋅

=−=−

−−+δ (3.88)

ou .det22 Jccc nnn =−⋅ −

L’entier procès peut être repris pour le polynôme de dégrée n-2

Metode numerice în ingineria electrică

73

( ) ∑=

− ⋅=n

j

jjn xbxP

22 (3.89)

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

( )xPn en produits des polynômes de degré tout au plus deux soit obtenue et on obtient de paires de solutions de la forme:

2

42

2,1qpp

x−±−

= (3.90)

En ce qui concerne la choix de l’approximation initiale ( )00 , qp 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 ( )xPn à une seule

racine réelle et 0002 =++ qrpr , alors la méthode de Bairstow ne converge pas

pour les valeurs initiales ( )00 , qp .

Methodes de calcul numerique en ingenierie electrique

74

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 nf ℜ→ℜ2: et ( ) 0=xf 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:

Metode numerice în ingineria electrică

75

nnnnnn

nn

nn

bxaxaxa

bxaxaxabxaxaxa

=++

=++=++

.......

.

.

.

.

.

.

.

.

........

2211

22222121

1̀1212111

(4.1)

ou sous forme matricielle restreinte:

BAx = (4.2)

où: A est la matrice du système (des coefficients) de dimension nxn

⎟⎟⎟⎟⎟⎟

⎜⎜⎜⎜⎜⎜

=

nnnn

n

aaa

aaa

A

......

.

.

.

.

.

.

21

11211

(4.3)

X est le vecteur colonne 1xn des inconnues:

⎟⎟⎟⎟⎟⎟

⎜⎜⎜⎜⎜⎜

=

nx

x

X...1

(4.4)

et B este le vecteur colonne 1xn des termes libres:

⎟⎟⎟⎟⎟⎟

⎜⎜⎜⎜⎜⎜

=

nb

b

B...1

(4.5)

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 ( )0det ≠A , par un algorithme d’élimination successive des inconnues. Ainsi, si on multiplie la première équation

du système (4.1), chacune à son tour avec 11

1

aai− pour ni ,2= et puis on l’ajoute a

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:

Methodes de calcul numerique en ingenierie electrique

76

( ) ( ) ( )

( ) ( ) ( )112

12

122

122

122

11212111

...........

........

.......

nnnnn

n

nn

bxaxa

bxaxa

bxaxaxa

=++

=++

=+++

(4.6)

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

multiplication de la seconde équation du système (4.6) par 22

2

aai− , pour ni ,3= et

puis en l’ajoutant a chaque équation i du système on va éliminer l’inconnue x2. On obtient le système équivalent:

( ) ( ) ( )

( ) ( ) ( )

( ) ( ) ( )223

23

23

233

233

12

122

122

11212111

........

.....

..........

........

nnnnn

nn

nn

nn

bxaxa

bxaxa

bxaxa

bxaxaxa

=++

=++

=++

=+++

(4.7)

Le procédé d’élimination des inconnues continue tant qu’on arrive à la forme du système:

( ) ( ) ( )

( ) ( )111

12

122

122

11111

.

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

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

−− =

=++

=++

nnn

nn

nn

nn

bxa

bxaxa

bxaxa

(4.8)

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:

( ) ( )

( ) ( )

( )

( )

( ) ⎟⎟⎟⎟⎟

⎜⎜⎜⎜⎜

=

⎟⎟⎟⎟⎟

⎜⎜⎜⎜⎜

⎟⎟⎟⎟⎟

⎜⎜⎜⎜⎜

−−

−−

1

12

11

1

1,

1,

12

122

111

...

....0.....0

...0

....

nnn

nnn

ini

iji

n

n

b

bb

x

x

aaaaaaa

(4.9)

Metode numerice în ingineria electrică

77

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 nk ,1= , 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:

( )

( )

( )

( )

( ) ( )

( )

11

211

1

11

11

21,1

21

21

1

1

1

.

a

xabx

a

xabx

axabx

abx

n

jjj

iii

n

ijj

iij

ii

i

nnn

nnn

nn

n

nnn

nn

n

=

−+=

−−

−−−

−−

−−

⋅−

=

⋅−

=

⋅−=

=

(4.10)

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: ( )( )1+−− knkn multiplications, ( )( )1+−− knkn additions, ( )kn − divisions

Par conséquent, à la fin des étapes de calcul on va effectuer:

( )( ) ( )3

1121

1

−=+−−∑

=

nnininn

i multiplications

Methodes de calcul numerique en ingenierie electrique

78

( )( ) ( )3

11121

1

−=+−−∑

=

nninnn

i additions

( ) ( )∑−

=

−=−

1

1 211

n

i

nnn divisions

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

( ) ( )∑−

=

−=−

1

1 21n

i

nnin multiplications, ( ) ( )∑−

=

−=−

1

1 21n

i

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

( )( )6

521 +− nnn multiplications,

( )( )6

521 +− nnn additions et

( )2

1+nn divisions.

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:

( )

6262 2 −+

≅nnn

Gϑ (4.11)

Ce nombre est très petit, a partir de 3≥n , comparé au nombre d’opérations

requises par la méthode de Cramer (avec les detérminnats calculés d’après les mineurs):

!nnC ⋅=θ (4.12)

c’est-à-dire CG ϑϑ << (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 ( )22 +=++ nnnnn 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.

Metode numerice în ingineria electrică

79

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: ( )ijij aa =1 (4.14)

dans l’étape k de calcul:

( ) ( )( )

( )( ) 1,11

111,1

11,1 −≥−≠⋅−= −

−−−−

−−− kjkia

aa

aa kkk

kk

kkik

ijk

ij (4.15)

( ) ( )

( ) ( ) 1

11

,

1,1,1

−<=

−≥=−

−−−

kjaa

kjaak

ijkji

kjk

kjk

Les nouveaux coefficients de la matrice B sont:

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

dans l’étape k de calcul: ( ) ( )

( )

( )

( ) ( ) nkbb

kiaa

bb

kk

kk

kkk

kkik

ik

i

,2

1

111

11,1

11,1

==

−≠−=

−−−

−−−

−−−

(4.17)

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

kJG

nnnknnn1

23

23

2111ϑ (4.18)

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

Methodes de calcul numerique en ingenierie electrique

80

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

nnnnnn

nn

nn

bxaxaxa

bxaxaxabxaxaxa

=+++

=+++=+++

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

........

2211

22222121

11212111

(4.19)

se transforme dans le sens de l’écriture de chaque inconnue x1,x2,…..xn en fonction de toutes autres et on obtient:

0...

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

...........0

.........0

1,1

1

22

21

22

21

22

22

11

12

11

12

11

11

−−−−−=

−−−−=

−−−−−=

−n

nn

nn

nn

n

nn

nn

nn

nn

xa

ax

aa

abx

xaax

aa

abx

xaax

aa

abx

(4.20)

Si on choit comme approximation initiale une solution ( ),....,, )0()0(2

)0(1 nxxx 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 ix dans l’itération k:

n1,..,i ,...0 )1()1(1

1,)1(1

1,)1(2

2)1(1

1)( =−−−−−−= −−+

+−−

−−− kn

ii

inki

ii

iiki

ii

iik

ii

ik

ii

i

ii

iki x

aax

aa

xa

ax

aax

aa

abx (4.21)

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

),....,,( )()0()0( kiii xxx sont convergentes pour k →∞ , alors les limites de la suite

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

DCXX += )0()1( (4.22)

ou:

Metode numerice în ingineria electrică

81

⎟⎟⎟⎟⎟

⎜⎜⎜⎜⎜

=

nx

xx

X...

2

1

,

⎟⎟⎟⎟⎟⎟⎟

⎜⎜⎜⎜⎜⎜⎜

−−

−−

=

0......................

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

............0

.......... 0

1

22

2

22

21

11

1

11

12

nn

n

n

n

aa

aa

aa

aa

aa

C ,

⎟⎟⎟⎟⎟⎟⎟⎟⎟

⎜⎜⎜⎜⎜⎜⎜⎜⎜

=

nn

n

ab

abab

D......

22

2

1,1

1

(4.23)

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

DICCCXCX

CDXCDCXX

kkkk )...(

.....................................................21)0()(

)0(2)1()2(

+++++=

+=+=

−−

(4.24)

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

ICCCS kk ++++= −− ...21 (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:

∑≠=

=⟨=

ijj

aa

i ii

ijq1

n1,...,i ,1 (4.26)

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:

1)( −−= CIS (4.27)

ce qui implique

∞→+===

k DCXX ,C)-(IX ,0C lim -11-k D

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

Methodes de calcul numerique en ingenierie electrique

82

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:

∑∑+=

−−

=

−−=n

ij

kj

ii

iji

j

kj

ii

ij

ii

iki x

aa

xaa

abx

1

)1(1

1

)()( que n.1,..,k ,,...,1 == ni (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.

[ ] [ ]

11

11

1

x x x x xx x x x x

L Ux x x x xx x x x xx x x x x

⎛ ⎞ ⎛ ⎞⎜ ⎟ ⎜ ⎟⎜ ⎟ ⎜ ⎟⎜ ⎟ ⎜ ⎟= =⎜ ⎟ ⎜ ⎟⎜ ⎟ ⎜ ⎟⎜ ⎟ ⎜ ⎟⎝ ⎠ ⎝ ⎠

(4.31)

Metode numerice în ingineria electrică

83

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:

11 12 13 14 11 12 13 14

21 22 23 24 21 22 23 24

31 32 33 34 31 32 33 34

41 42 43 44 41 42 43 44

0 0 0 10 0 0 1

*0 0 0 1

0 0 0 1

A A A A L U U UA A A A L L U UA A A A L L L UA A A A L L L L

⎛ ⎞ ⎛ ⎞ ⎛ ⎞⎜ ⎟ ⎜ ⎟ ⎜ ⎟⎜ ⎟ ⎜ ⎟ ⎜ ⎟=⎜ ⎟ ⎜ ⎟ ⎜ ⎟⎜ ⎟ ⎜ ⎟ ⎜ ⎟⎜ ⎟⎜ ⎟ ⎜ ⎟ ⎝ ⎠⎝ ⎠ ⎝ ⎠

(4.36)

Le produit des deux facteurs L et U donne:

( )

11 11 12 11 13 11 14

21 21 12 22 21 13 22 23 21 14 22 24

31 31 12 32 31 13 32 23 33 31 14 32 24 33 34

41 41 12 42 41 13 42 23 43 41 14 42 24 43 34 44

L L U L U L UL L U L L U L U L U L U

AL L U L L U L U L L U L U L UL L U L L U L U L L U L U L U L

⎛ ⎞⎜ ⎟+ + +⎜ ⎟=⎜ ⎟+ + + + +⎜ ⎟⎜ ⎟+ + + + + +⎝ ⎠

(4.37)

Par comparaison avec la matrice d’origine [A] on constate que:

Methodes de calcul numerique en ingenierie electrique

84

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:

1

1

1

1

;

( ) / ; 2,

k

im im ij jmj

k

mj mj mi ij mmi

L A L U

U A L U L m N

=

=

= −

= − =

∑ (4.38)

On peut illustrer ceci par la figure suivante:

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

1

3

m

2

4

Metode numerice în ingineria electrică

85

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.

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

m

i

j

3

1

2

4

5

j

j

i

i

V

V

V

V

L(i

U(

Methodes de calcul numerique en ingenierie electrique

86

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

1

11

1

; 1,

( ) / ; 1,

j

mj mj mi iji

k

mj mj mi ij mmi

L A L U j m

U A L U L j m N

=

=

= − =

= − = +

∑ (4.39)

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

1

3

2

4

m

Metode numerice în ingineria electrică

87

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

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

m

j

i

i

i

V

V V

L(m U(m jVj

1

2 3

Methodes de calcul numerique en ingenierie electrique

88

• 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):

( )1

N

iii

Det A L=

=∏ (4.40)

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

[ ] [ ] [ ] [ ]11 1 1

... ...

NN N N

L Z YL Z Y x x Z

x x L Z Y

⎛ ⎞⎛ ⎞ ⎛ ⎞⎜ ⎟⎜ ⎟ ⎜ ⎟= ⇒ = ↓ ⇒⎜ ⎟⎜ ⎟ ⎜ ⎟⎜ ⎟⎜ ⎟ ⎜ ⎟⎝ ⎠⎝ ⎠ ⎝ ⎠

(4.41)

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:

Metode numerice în ingineria electrică

89

//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 11

1 ... ...1 N N

x x X ZU X Z x X

X Z

⎛ ⎞⎛ ⎞ ⎛ ⎞⎜ ⎟⎜ ⎟ ⎜ ⎟= ⇒ = ↑ ⇒⎜ ⎟⎜ ⎟ ⎜ ⎟⎜ ⎟⎜ ⎟ ⎜ ⎟⎝ ⎠⎝ ⎠ ⎝ ⎠

(4.42)

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

Methodes de calcul numerique en ingenierie electrique

90

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:

( , ) 0 ( , ) ( 1, )p pA m m pivot A i m i m 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:

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

Metode numerice în ingineria electrică

91

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:

( ) ( )Tij jiA A A A= ⇒ = (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.

Methodes de calcul numerique en ingenierie electrique

92

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

[ ] [ ] [ ]TA U U= (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:

11 12 13 14 11 11 12 13 14

12 22 23 24 12 22 22 23 24

13 23 33 34 13 23 33 33 34

14 24 34 44 14 24 34 44 44

0 0 00 0 0

*0 0 0

0 0 0

A A A A U U U U UA A A A U U U U UA A A A U U U U UA A A A U U U U U

⎛ ⎞ ⎛ ⎞ ⎛ ⎞⎜ ⎟ ⎜ ⎟ ⎜ ⎟⎜ ⎟ ⎜ ⎟ ⎜ ⎟=⎜ ⎟ ⎜ ⎟ ⎜ ⎟⎜ ⎟ ⎜ ⎟ ⎜ ⎟⎜ ⎟⎜ ⎟ ⎜ ⎟

⎝ ⎠⎝ ⎠ ⎝ ⎠

(4.55)

L’algorithme est le suivant: a) On détérmine d’abord 11 11U A= , 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:

12

1 11

1

1 21

, ; 2,

( ) / ( , ) / ; 1,

m

mm mm im mmi

m

mj mj im ij mm mj mmi

U A U A v v m N

U U U U U U v v U j m N

=

=

= − = − < > =

= − = − < > = +

∑ (4.56)

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 v1

T qui sont équivalents).

Metode numerice în ingineria electrică

93

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(uim

2)] //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

m

i

V

V

U(m jj

2

3

i V

U(m

1

Methodes de calcul numerique en ingenierie electrique

94

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:

[ ] [ ] [ ][ ] [ ] [ ][ ] [ ] [ ],= = =T TA L D U U D U avec L U (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:

[ ] [ ]

11

22

11

11

1

±⎛ ⎞ ⎛ ⎞⎜ ⎟ ⎜ ⎟±⎜ ⎟ ⎜ ⎟⎜ ⎟ ⎜ ⎟= = ±⎜ ⎟ ⎜ ⎟

±⎜ ⎟ ⎜ ⎟⎜ ⎟⎜ ⎟ ±⎝ ⎠⎝ ⎠

mm

nn

NN

U x x x xU x x x

U U x x DU x

U

(4.58)

Un terme diagonal de la matrice des coefficients [A] est, selon les règles de multiplication des matrices:

1 1 1 1

; 2,= = = =

= = =∑∑ ∑∑m m m m

mm mi ik km im km iki k i k

A L D U U U D m N (4.59)

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

Metode numerice în ingineria electrică

95

1

2 2 2

1 1

; ( )−

= =

= = + =∑ ∑m m

mm im ii im i mm m ii ii i

A U D U D U D D D (4.60)

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

12

1

12

1

sgn 1

; 2,

=

=

⎛ ⎞= − = ±⎜ ⎟

⎝ ⎠

= − =

m

m mm im ii

m

mm mm im ii

D A U D

U A U D m N (4.61)

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

( )1 11

11 11

sgn 1= = ±

=

D A

U A (4.62)

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

1 1 1 1

; 1,= = = =

= = = +∑∑ ∑∑m m m m

mj mi ik km im km iki k i k

A L D U U U D j m N (4.63)

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

1

1 1

= =

= = +∑ ∑m m

mj im ij i im ij i mm mj mi i

A U U D U U D U U D (4.64)

Ainsi, on peut déterminer:

( )1

1/ ; 1,

=

⎛ ⎞= − = +⎜ ⎟⎝ ⎠

∑m

mj mj im ij i mm mi

U A U U D U D j m N (4.65)

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

( ) ( )1 1 11 1/ ; 2,= =j jU A U D j N (4.66)

Methodes de calcul numerique en ingenierie electrique

96

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.

Metode numerice în ingineria electrică

97

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.

Methodes de calcul numerique en ingenierie electrique

98

Anexa I

Exemple de calcul numeric

1. Metode numerice pentru rezolvarea ecuaţiilor

1.1. Metoda înjumătăţirii intervalului

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

Alegem intervalul (1,2) şi dăm valori 1)1( −=f

6)2( =f 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

5,12

21=

+

375,1)5,1( =f Dintre intervalele (1; 1,5) şi (1,5; 2), alegem intervalul (1; 1,5).

25,12

5,11=

+

04,0)25,1( −=f Dintre intervalele (1; 1,25) şi (1,25; 1,5), alegem intervalul (1,25; 1,5).

375,12

5,125,1=

+

59,0)375,1( =f Dintre intervalele (1,25; 1,375) et (1,375; 1,5), alegem intervalul (1,25; 1,375).

312,12

375,125,1=

+

026,0)312,1( =f Dintre intervalele (1,25; 1,312) şi (1,312; 1,375), alegem intervalul (1,25; 1,312).

281,12

312,125,1=

+

10,0)281,1( =f

Metode numerice în ingineria electrică

99

Dintre intervalele (1,25; 1,281) şi (1,281; 1,312), alegem intervalul (1,25; 1,281).

265,12

281,125,1=

+

02,0)265,1( =f 1.2. Metoda coardei, sau a părţilor proporţionale

Fie 33)( 23 −+= xxxf , ℜ→]1,0[:f 3)0( −=f

1)1( =f xxxf 63)(' 2 += ⇒ f crescătoare

66)(" += xxf ⇒ f concavă 00 == ax

1=b

)()()()(

1n

nnn xfbf

xbfbfxx−−

=+

75,01 =x 86,02 =x 87,03 =x

… 1.3. Metoda lui Newton

Fie funcţia x

xxf 1ln)( −= , ℜ→]2,1[:f

1)1( −=f 19,0)2( =f

011)(' 2 >+=xx

xf ⇒ f crescătoare

021)(" 32 >−−=xx

xf ⇒ f concave

Deducem formula de iteraţie:

Methodes de calcul numerique en ingenierie electrique

100

1)ln1(

1)1ln(

1

1ln

11

1ln 2

222

1 +−

=+−

−=+

−−=

+

−−=+

n

n

n

nnnn

nn

n

nn

nn

n

nn

nn

nn xxx

xxxxx

xxx

xxxx

x

xx

xx

xx

Alegem 10 =x 5,11 =⇒ x

73,12 =x 761,13 =x

… 1.4. Metoda şirului lui Rolle Se consideră funcţia polinomialaă de gradul 4, ℜ→ℜ:f , şi ecuţia ataşată

01246830( 234 =−+−−= xxxxxf

124683)( 234 −+−−= xxxxxf derivabilă pe ℜ

)1)(1)(2(1224122412)(' 33 +−−=+−−= xxxxxxxf cu rădăcinile 21 =x , 12 =x

∞=∞→

)(lim xfx

, 20)1( −=−f , 12)1( =f , 7)2( =f , ∞=−∞→

)(lim xfx

X ∞− -1 1 2 ∞ )(' xf 0 0 0 )(xf ∞ -20 12 7 ∞

Şirul lui Rolle + - + + +

Şirul lui Rolle are două schimbări de semn. Atunci ecuaţia are două rădăcini reale:

)1;(1 −−∞∈x şi )1;1(2 −∈x

1.5. Metoda şirului lui Şturm

a) Considerăm ecuaţia polinomială 0166)( 23 =−+= xxxP şi constituim şirul

lui Sturm ataşat acestui polinom

166 230 −+= xxp

xxp 123 21 +=

168)mod( 102 +=−= xppp

Metode numerice în ingineria electrică

101

12)mod( 213 =−= ppp )12;168;123;166();;;( 223

3210 ++−+== xxxxxppppS x=-7

)12;40;63;65( −−=⇒ S 31 =⇒ N (număr de schimbări de semn)

x=2 )12;32;36;16(=⇒ S

02 =⇒ N ⇒=− 321 NN P are cele trei rădăcini în intervalul ( )2;7−

b) Fie ecuaţia polinomială 0165 45 =+− xx . Şirul lui Sturm este prezentat în

tabelul următor x )(0 xp )(1 xp )(2 xp )(3 xp )(4 xp )(xN 165 45 +− xx 34 4xx − 43 −x 4+− x -1 ∞− - + - + - 3

-1 + + - + - 3 1 + - - + - 2 0 - - + + - 2 1 - 0 + 0 - 1 ∞ + + + - - 1

)1;(1 −−∞∈x )2;1(2 ∈x );4(3 ∞∈x

1.6. Metoda Lobacevski-Graeffe a) rădăcini reale Fie ecuaţia 0133 =+− xx . Calculul noilor coeficienţi, ai polinomului obţinut

prin ridicări succesive la pătrat este prezentat în tabelul următor 3x 2x 1x 0x

1 0 -3 1 1 0 9 1 0

jb 6 0 1 6 9 1 1 36 81 1 1

jb -18 -12

2jb 1 18 69 1

Methodes de calcul numerique en ingenierie electrique

102

3jb 1 21086,1 ⋅ 4725 1 4jb 1 4105,2 ⋅ 7102,2 ⋅ 1 5jb 1 8109,5 ⋅ 14109,4 ⋅ 1 6jb 1 171044,3 ⋅ 29105,2 ⋅ 1

88,11044,362 171 −=⋅−=x

535,11044,3

105,26212

29

2 =⋅⋅

=x

35,0105,21

62 292 =⋅

=x

b) rădăcini complexe Pentru ecuaţia cu rădăcini complexe 014 =−+ xx noii coeficienţi sunt

4x 3x 2x 1x 0x 1 0 0 1 -1 1 0 0 1 1 0 0 0

0jb

-2 1 0 -2 1 1 1 0 4 1 1 4 0 4

1jb

2 1 4 6 5 1 1 16 36 25 1 -12 -40 -12

2jb

2 1 4 -2 13 1 1 16 4 169 1 4 -104 4

3jb

2 4jb 1 20 -98 173 1

206,1206,120

1

21

4

−=

==

xx

Metode numerice în ingineria electrică

103

725,0

725,0173

1

4

24

4

=

==

x

x

144,120

1732405,002 42241 ==⇒=⇒=++ ruuxx

11,1)2405,0()144,1( 22 ±=−±=v ix 11,12405,03,2 ±=

2. Metode numerice pentru rezolvarea sistemelor liniare de ecuaţii

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

⎪⎪⎩

⎪⎪⎨

====

⎪⎪⎩

⎪⎪⎨

=+++=+++

=+++=+++

4321

1131514510914145

4655510

tzyx

zzyxtzyx

tzyxtzyx

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

⎪⎪⎩

⎪⎪⎨

====

⎪⎪⎩

⎪⎪⎨

=+++=+++

=+++=+++

4321

1131514510914145

4655510

tzyx

zzyxtzyx

tzyxtzyx

2.3.Metoda Gauss

14 12 5 4 24 24 3 15 3

x y z xx y z yx y z z

+ + = =⎧ ⎧⎪ ⎪+ + = ⇔ =⎨ ⎨⎪ ⎪+ + = =⎩ ⎩

Methodes de calcul numerique en ingenierie electrique

104

2.4. Metoda Gauss-Jordan

14 12 5 4 24 24 3 15 3

x y z xx y z yx y z z

+ + = =⎧ ⎧⎪ ⎪+ + = ⇔ =⎨ ⎨⎪ ⎪+ + = =⎩ ⎩

2.5. Factorizarea LU

1 12 3 8 2

2 3 14 3

x xx y y

x y z z

= =⎧ ⎧⎪ ⎪+ = ⇔ =⎨ ⎨⎪ ⎪+ + = =⎩ ⎩

Metode numerice în ingineria electrică

105

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

Methodes de calcul numerique en ingenierie electrique

106

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

Metode numerice în ingineria electrică

107

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

Methodes de calcul numerique en ingenierie electrique

108

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

Metode numerice în ingineria electrică

109

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

Methodes de calcul numerique en ingenierie electrique

110

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

Metode numerice în ingineria electrică

111

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;

Methodes de calcul numerique en ingenierie electrique

112

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

Metode numerice în ingineria electrică

113

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;

Methodes de calcul numerique en ingenierie electrique

114

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>

Metode numerice în ingineria electrică

115

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

Methodes de calcul numerique en ingenierie electrique

116

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

Metode numerice în ingineria electrică

117

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

Methodes de calcul numerique en ingenierie electrique

118

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

Metode numerice în ingineria electrică

119

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

Methodes de calcul numerique en ingenierie electrique

120

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

Metode numerice în ingineria electrică

121

{ 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]); }

Methodes de calcul numerique en ingenierie electrique

122

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

Metode numerice în ingineria electrică

123

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

Methodes de calcul numerique en ingenierie electrique

124

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;

Metode numerice în ingineria electrică

125

} 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])) {

Methodes de calcul numerique en ingenierie electrique

126

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

Metode numerice în ingineria electrică

127

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

Methodes de calcul numerique en ingenierie electrique

128

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

Metode numerice în ingineria electrică

129

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

Methodes de calcul numerique en ingenierie electrique

130

{ 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];

Metode numerice în ingineria electrică

131

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

Methodes de calcul numerique en ingenierie electrique

132

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;

Metode numerice în ingineria electrică

133

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;

Methodes de calcul numerique en ingenierie electrique

134

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

Metode numerice în ingineria electrică

135

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

Methodes de calcul numerique en ingenierie electrique

136

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

Metode numerice în ingineria electrică

137

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;

Methodes de calcul numerique en ingenierie electrique

138

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;

Metode numerice în ingineria electrică

139

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

Methodes de calcul numerique en ingenierie electrique

140

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]; } }

Metode numerice în ingineria electrică

141

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

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