Documente Academic
Documente Profesional
Documente Cultură
Cuvânt-înainte
Autorii
5
Methodes de calcul numerique en ingenierie electrique
6
Metode numerice în ingineria electrică
Cuprins
Capitolul 1
Metode numerice de rezolvare a ecuaţiilor / 9
1.1. Metode numerice de rezolvare a ecuaţiilor neliniare cu o necunoscută / 10
1.1.1. Metoda bisecţiei sau a înjumătăţirii intervalului / 11
1.1.2. Metoda coardei sau metoda părţilor proporţionale / 13
1.1.3. Metoda lui Newton / 14
1.2. Metode numerice de rezolvare a ecuaţiilor algebrice / 16
1.2.1 Metode de separare a rădăcinilor ecuaţiilor algebrice / 17
1.2.1.2. Metoda şirului lui Rolle / 17
1.2.1.2. Metoda şirului lui Sturm / 18
1.2.2. Metode de determinare a rădăcinilor ecuaţiilor algebrice / 18
1.2.2.1. Metoda Lobacevski – Graeffe / 18
1.2.2.2. Schema lui Horner / 27
1.2.2.3. Metoda lui Bairstow / 30
Capitolul 2
Metode numerice de rezolvare a sistemelor de ecuaţii liniare / 33
2.1. Metode de eliminare utilizate în rezolvarea
numerică a sistemelor liniare de ecuaţii / 33
2.1.1. Metoda lui Gauss / 35
2.1.2. Metoda Gauss-Jordan sau metoda matricială formală / 38
2.1.3. Metoda lui Jacobi / 40
2.1.4 Metoda Gauss-Seidel / 42
2.2. Metode de rezolvare numerică a sistemelor
de ecuaţii prin factorizare / 42
2.3. Metode de rezolvare numerică a sistemelor de ecuaţii simetrice / 54
2.3.1. Factorizarea prin metoda rădăcinii pătrate (metoda lui Cholesky) / 54
2.3.2. Factorizarea matricelor simetrice, nepozitive definite / 57
2.4. Tehnici de adaptare la matricele rare / 59
Chapitre 3
Méthodes numériques de résolution des équations / 61
3.1. Méthodes numériques de résolution des équations non linéaires
avec une seule inconnue / 62
3.1.1. La méthode de la dichotomie / 63
7
Methodes de calcul numerique en ingenierie electrique
Chapitre 4.
Méthodes numériques pour la résolution
des systemes lineaires d’équations / 85
4.1. Méthodes directes de résolution des systèmes linéaires d’équations / 85
4.1.1. La méthode de Gauss / 87
4.1.2. La méthode de Gauss-Jordan / 91
4.1.3. La méthode de Jacobi / 92
4.1.4. La méthode de Gauss-Seidel / 94
4.2. Méthodes de résolution des systèmes d’équations par factorisation / 95
4.3. Méthodes de résolution des systèmes d’équations symétriques / 106
4.3.1. Factorisation par la méthode
de la racine carrée (méthode de Cholesky) / 107
4.3.2. Factorisation des matrices symétriques, non positives définies / 110
4.4. Techniques adaptées aux matrices creuses / 112
Anexa 1
Exemple de calcul numeric / 114
Anexa 2
Algoritmi în C++ şi Turbo Pascal / 142
Bibliografie / 164
8
Metode numerice în ingineria electrică
Capitolul 1
Metode numerice
de rezolvare a ecuaţiilor
9
Methodes de calcul numerique en ingenierie electrique
f (x ) = 0 (1.1)
în care f : [a, b] → ℜ este o funcţie continuă iar x r ∈ (a, b ) este soluţia exactă a
ecuaţiei. Pentru determinarea numerică a acestei soluţii se utilizează metode
iterative care constau în construirea unui şir de numere reale
x0 , x1 ,......., x k ... convergent către soluţia exactă x r a ecuaţiei. Orice metodă
iterativă pentru determinarea soluţiei x r constă în găsirea unei ecuaţii de forma
xr = F (x ) (1.2)
f (x ) = 0 ⇔ xr = F (x ) (1.3)
lim xk = xr , (1.4)
k →∞
x k = F ( x k −1 ) (1.5)
Iteraţiile se opresc atunci când distanţa dintre doi termeni consecutiv ai şirului
este mai mică decât o valoare impusă ε .
x k − x k −1 < ε (1.6)
10
Metode numerice în ingineria electrică
f (a ) ⋅ f (b ) < 0 (1.7)
a+b
x m0 ≡ x0 = (1.8)
2
jumătatea intervalului [a, b ] . Dacă x 0 nu este rădăcină a ecuaţiei, adică dacă
valoarea funcţiei în acest punct nu este mai mică decât eroarea impusă ε pentru
determinarea rădăcinii
şi
f ( x0 ) ⋅ f (b ) < 0 (1.11)
x0 + b
x m1 ≡ x1 = , ş.a.m.d.
2
Şirul valorilor succesive ale jumătăţilor de subintervale: x m0 , x m1 , x m2 ,.....
este convergent către soluţia exactă x r (figura1.1).
11
Methodes de calcul numerique en ingenierie electrique
bn − a n < ε (1.13)
12
Metode numerice în ingineria electrică
f (a ) ⋅ f ( x1 ) < 0 (1.15)
atunci se împarte în continuare subintervalul [a, x1 ] în părţi proporţionale iar
soluţia aproximativă în următorul pas este:
a ⋅ f (x1 ) − x1 ⋅ f (a )
x2 = (1.16)
f ( x1 ) − f (a )
13
Methodes de calcul numerique en ingenierie electrique
f ( x0 )
x1 = x0 − (1.21)
f ' (x0 )
Din punct de vedere geometric (figura 1.3) în metoda lui Newton x1 reprezintă
abscisa punctului de intersecţie a tangentei dusă la graficul funcţiei f(x) în punctul
de coordonate ( x0 , f ( x0 )) cu axa 0x. Rezultă relaţia recursivă pentru aproximaţia
soluţiei la pasul k+1:
f (xk )
x k +1 = x k − (1.22)
f ' (xk )
14
Metode numerice în ingineria electrică
15
Methodes de calcul numerique en ingenierie electrique
lim ( x k )k ≥0 = x r (1.25)
k →∞
x k − x k −1 < ε 1 (1.26)
sau dacă valoarea polinomului în punctul respectiv este mai mică decât o altă
valoare impusă:
16
Metode numerice în ingineria electrică
1.2.1.2. Metoda şirului lui Sturm determină numărul de rădăcini reale dintr-un
interval şi separarea acestora pentru ecuaţia algebrică Pn(x) =0, cu Pn : ℜ → ℜ. Fie
a, b ∈ ℜ continuă şi derivabilă pe (a, b) . Se formează şirul lui Sturm asociat
funcţiei Pn ( x ) , ca fiind polinoamele p0 ( x), p1 ( x),.... pn ( x) continue pe (a,b) şi
care satisfac urm[toarele patru condiţii:
•) p 0 (x ) = Pn ( x )
• •) p1 ( x ) = Pn' −1 ( x )
• ••) pi ( x) = pi −1 ( x) ⋅ qi ( x) − pi − 2 ( x), i = 2, n (adică, polinomul pi (x ) este
restul cu semn schimbat al împărţirii polinomului pi − 2 ( x ) la pi −1 ( x ) ,
qi ( x ) fiind câtul acestei împărţiri)
• • • •) p n ( x ) ≠ 0, (∀)x ∈ [a, b] .
Metoda şirului lui Sturm este o consecinţă a următoarei teoreme: dacă funcţia
polinomială Pn ( x ) este derivabilă pe (a,b) şi cu derivata continuă,
Pn (a ) ≠ 0, Pn (b ) ≠ 0 şi admite un şir Sturm asociat: p0 ( x), p1 ( x),......., pn ( x),
atunci numărul rădăcinilor reale ale ecuaţiei Pn ( x ) = 0 în intervalul (a,b) este egal
cu diferenţa dintre numerele schimbărilor de semn ale şirurilor de numere
pi (a ) si pi (b ), i = 0, n .
Prin urmare teorema permite atât determinarea numărului rădăcinilor reale într-
un interval dar şi separarea acestora prin micşorarea lungimii subintervalelor
conţinute în intervalul dat.
( )
n n
Pn (x ) = ∑ a n−i x i = a 0 ∏ x − x j = 0, a 0 ≠ 0, ai ∈ ℜ, i = 0, n (1.28)
i =0 j =1
a1
x1 + x 2 + ......... + x n = − (1.29)
a0
17
Methodes de calcul numerique en ingenierie electrique
Dacă una dintre rădăcini, să presupunem x1, este mult mai mare în modul decât
toate celelalte
x1 >> x j , j = 2, n (1.30)
a1
x1 ≅ − (1.31)
a0
Se efectuează produsul
(− 1)n ⋅ Pn (x ) ⋅ Pn (− x ) = a02 ⋅ ∏ (x 2 − x 2j )
n
(1.34)
j =1
18
Metode numerice în ingineria electrică
( )
n n
Q( x ) = a 0m ⋅ ∏ x m − x mj = ∑ (− 1) Ai( p ) ⋅ xi2 m
i
(1.35)
j =1 i =0
unde p = 1,2,.... Noii coeficienţi Ai( p ) obţinuţi în fiecare etapă de calcul p, rezultă
recursiv prin înmulţirea directă a polinoamelor Pn ( x ) şi Pn (− x ) , adică în
funcţie de coeficienţii iniţiali ai . În prima etapă de calcul rezultă:
Dacă se notează cu Ai( p +1) valorile acestor coeficienţi obţinuţi în etapa p+1,
atunci prin procedeul de identificare a coeficienţilor prezentat anterior se obţine
relaţia recursivă
( )
Ai( p +1) = Ai( p )
2 n
+ 2 ∑ (− 1) ⋅ Ai(−pk) ⋅ Ai(+pk) , i = 0, n
k =0
k
(1.37)
A1( p )
x1m + x 2m + ............ + x nm = (1.39)
A0( p )
A2( p )
x1m ⋅ x2m + x1m ⋅ x3m + .... + xnm−1 ⋅ xnm = (1.40)
A0( p )
M
19
Methodes de calcul numerique en ingenierie electrique
An( p )
x1m ⋅ x 2m ....................... ⋅ x nm = (1.41)
A0( p )
în care termenii din dreapta sunt întotdeauna pozitiv, fiind pătrate perfecte.
p
Presupunând că în etapa p rădăcina x1m = x12 a devenit preponderentă, atunci
termenii x1m , x1m
⋅ x 2m , .........ş.a.m.d.
vor deveni preponderenţi în relaţiile
(1.39), (1.40),....... Prin urmare, se pot utiliza cu suficient de bună
aproximaţie relaţiile:
A1( p )
x1m ≅ (1.42)
A0( p )
A2( p )
x1m ⋅ x 2m ≅ (1.43)
A0( p )
M
An( p ) (1.44)
x1m ⋅ x 2m .... ⋅ x nm ≅
A0( p )
A (j p )
x j = ±m , j = 1, n (1.45)
A (j −p1)
rj ( p)
=
( A( ) )
j
p −1 2
, j = 1, n − 1 (1.46)
A (j p )
20
Metode numerice în ingineria electrică
A1( p −1)
m
p −1
x12 = x12 ≅ (1.47)
A0( p −1)
p A1( p )
x12 = x1m ≅ (1.48)
A0( p )
r1( p ) ≅ 1 (1.49)
A1( p )
x1m + x 2m + ....... + x M
m m
+ xM m m
+1 + .. + x n ≅ M ⋅ x1 ≅ (1.51)
A0( p )
x1m ⋅ x 2m ...... ⋅ x M
m
+ x1m ⋅ x 2m ..... ⋅ x M
m m m m
−1 ⋅ x M +1 + ...... + x n − M ⋅ .... ⋅ x n ≅
AM( p ) (1.52)
≅ x1m ⋅ x 2m ⋅ .... ⋅ x M
m
= ( x1 )m⋅M ≅ ( p)
A0
21
Methodes de calcul numerique en ingenierie electrique
Calculul rădăcinii M-multiple în modul se face utilizând relaţia (1.52) prin care
se obţine o aproximaţie de calcul mai bună având în vedere exponentul mai mare:
AM( p )
x1 = ± mM (1.53)
A0( p )
An( p −1)
m
p −1
x12 = x12 ≅ (1.54)
M ⋅ A0( p −1)
p A1( p )
x12 = x1m ≅ (1.55)
M ⋅ A0( p )
Din relaţiile (1.37), (1.54) şi (1.55) rezultă că raportul r1( p ) tinde către M
r1p ≅ M (1.56)
Ak( +p )M
x k = ± m⋅M (1.58)
Ak( p )
22
Metode numerice în ingineria electrică
rk( p ) ≅ M (1.59)
care dacă tinde către numărul întreg M arată că s-a separat rădăcina M- multiplă.
c) Cazul rădăcinilor complexe. Se presupunem că rădăcinile complexe şi
conjugate x1 şi x2 ale ecuaţiei Pn ( x ) = 0 au şi cel mai mare modul adică:
x1 = ρ ⋅ e jθ , x 2 = ρ ⋅ e − jθ (1.61)
A1( p )
2 ρ m ⋅ cos mθ + x3 + ..... + x nm = (1.62)
Ao( p )
A2( p )
x1m ⋅ x 2m + x1m ⋅ x3m + ..... + x nm−1 ⋅ x nm ≅ ρ 2 m ≅ (1.63)
A0( p )
A( p )
ρ = 2 m 2( p ) (1.64)
A 0
23
Methodes de calcul numerique en ingenierie electrique
m
2 p −1 A2( p −1)
ρ = ρ2 ≅ (1.65)
A0( p −1)
A2( p )
ρ 2p = ρ m ≅ ( p) (1.66)
A0
r2( p ) ≅ 1, (1.67)
iar raportul
( p)
r1 =
(A( ) )1
p −1 2
(1.68)
A0( p )
n n −1
Pn ( x) = ∑ an − j x j = ( x − α ) ∑ bn −1− j x j + bn (1.69)
j =0 j =0
24
Metode numerice în ingineria electrică
dbk db
= bk −1 + α k −1 , k = 1,.., n (1.71)
dα dα
Se obţin pentru noii coeficienţi ai derivatei polinomului, notaţi cu
dbk −1
ck = , k = 1,..., n (1.72)
dα
următoarele relaţii recursive
Pn (α ) = cn −1 (1.74)
bn (α m )
α m +1 = α m − (1.75)
cn −1 (α m )
unde bn, cn-1 sunt calculaţi folosind (1.71) şi (1.73). Algoritmul se încheie dacă
valoarea polinomului este mai mică decât o eroare impusă ε .
Dacă α este o rădăcină multiplă, atunci derivata polinomului în α va fi nulă
Pn' (α ) = 0 , iar bn şi cn-1 vor tinde spre 0 simultan. În acest caz convergenţa
procedeului Newton-Raphson dat de relaţia (1.74) se înrăutăţeşte.
Pentru îmbunătăţirea convergenţei se utilizează o modificare simplă, şi anume
1
se aplică procedeul Newton-Raphson funcţiei f ( x ) = [ Pn ( x)] M , unde M este
25
Methodes de calcul numerique en ingenierie electrique
1− M
1 '
ordinul de multiplicitate al rădăcinii α . Deoarece f ( x) = '
[ Pn ( x)] M iteraţia
M
Newton-Raphson se exprimă
bn (α m )
α m +1 = α m − M (1.76)
cn −1 (α m )
ceea ce este similar cu algoritmul (1.75). Determinarea lui M se face prin evaluarea
derivatelor polinomului Pn (x) , iar prima derivată ce este nenulă va furniza
multiplicitatea rădăcinii.
Pentru evaluarea derivatelor se foloseşte schema lui Horner completă, adică
determinarea tuturor derivatelor lui Pn (x) în x = α este echivalentă cu
dezvoltarea în serie Taylor a polinomului Pn (x) în jurul punctului x = α
Pn ( x) = C0 + C1 ( x − α ) + C2 ( x − α ) 2 + ... + Cn ( x − α ) n (1.77)
Pn( k ) (α )
Ck = (1.78)
k!
Din relaţiile (1.69) şi (1.70) se obţin coeficienţii polinomului Pn−1 ( x)
Pn ( x) = ( x − α ) Pn −1 ( x) + Co (1.79)
iar
C0 = Pn (α ) (1.80)
Pn −1 ( x) = ( x − α ) Pn − 2 ( x) + C1 (1.81)
26
Metode numerice în ingineria electrică
n
( )n−2
Pn (x ) = ∑ ai x i = x 2 + px + q ∑ b j ⋅ x j + Rx + S
i =o j =2
(1.82)
unde x 2 + px + q este un trinom oarecare de ordinul doi iar Rx+S este restul
împărţirii lui Pn ( x ) la x 2 + px + q . Dacă extindem notaţiile şi pentru coeficienţii R
şi S, adică notăm R = bn−1 şi S = bn + pbn −1 , atunci din identificarea termenilor
cu acelaşi puteri ale lui x, va rezulta relaţia de recurenţă pentru noii coeficienţi
R ( p, q ) = 0
(1.84)
S ( p, q ) = 0
bn ( p, q ) = 0
(1.85)
bn−1 ( p, q ) = 0
⎛ ∂b ⎞ ⎛ ∂b ⎞
bn ( p, q ) ≅ bn ( p m , q m ) + ( p − p m )⎜⎜ n ⎟⎟ + (q − q m )⎜⎜ n ⎟⎟ =0
⎝ ∂p ⎠ p = pm ⎝ ∂q ⎠ q = qm
⎛ ∂b ⎞ ⎛ ∂b ⎞
bn −1 ( p, q ) ≅ bn −1 ( p m −1 , q m −1 ) + ( p − p m −1 )⎜⎜ n−1 ⎟⎟ + (q − q m −1 )⎜⎜ n −1 ⎟⎟ =0
⎝ ∂p ⎠ p = pm −1 ⎝ ∂q ⎠ q = qm −1
(1.86)
27
Methodes de calcul numerique en ingenierie electrique
∂bk ∂b ∂b
= −bk −1 − p k −1 − q k −2
∂p ∂p ∂p
(1.87)
∂bk ∂b ∂b
= −bk −2 − p k −1 − q k − 2
∂q ∂q ∂q
c k = −bk −1 − pc k −1 − qc k −2
(1.88)
d k = −bk −2 − pd k −1 − qd k − 2 , k = 0, n
unde se consideră c − 2 = c −1 = d − 2 = d −1 = 0
Sistemul liniarizat numai după prima relaţie (1.88) devine:
( pm +1 − pm ) ⋅ cn + (qm+1 − qm ) ⋅ cn −1 = −bn
(1.89)
( pm +1 − pm ) ⋅ cn −1 + (qm +1 − qm ) ⋅ cn − 2 = −bn −1
În mod analog se obţine sistemul de liniarizat şi dacă se foloseşte cea de-a doua
relaţie (1.88).
⎡ cn c n−1 ⎤
Matricea sistemului J = ⎢ se numeşte şi matricea Jacobiană şi este
⎣c n−1 c n −2 ⎥⎦
nesingulară dacă det J ≠ 0 . În acest caz se calculează soluţia sistemului (1.89).
bn−1 ⋅ c n −1 − bn ⋅ c n− 2
δp = p m+1 − p m = (1.90)
c n ⋅ c n− 2 − c n2
bn ⋅ c n−1 − bn −1 ⋅ c n
δq = q m+1 − q m = (1.91)
c n ⋅ c n −2 − c n2
unde c n ⋅ c n − 2 − c n2 = det J .
Întregul proces de calcul se poate relua pentru polinomul de gradul n-2
28
Metode numerice în ingineria electrică
n
Pn− 2 (x ) = ∑ b j ⋅ x j (1.92)
j =2
unde coeficienţii acestui polinom sunt tocmai ultimele valori calculate cu ajutorul
relaţiei (1.83). Algoritmul continuă până la factorizarea polinomului Pn ( x ) în
produse de polinoame de grad cel mult doi şi se obţin perechi de soluţii de forma:
− p± p 2 − 4q
x1, 2 = (1.93)
2
În ceea ce priveşte alegerea aproximaţiei iniţiale ( p 0 , q0 ) aceasta se poate
obţine printr-un procedeu de localizare a rădăcinilor, cum ar fi de exemplu metoda
Lobacevski-Graeffe. Asupra convergenţei metodei Bairstow, din punct de vedere
practic se poate prezenta un caz de neconvergenţă: dacă Pn ( x ) are o singură
rădăcină reală şi r 2 + rp 0 + q 0 = 0 , atunci metoda Bairstow nu converge pentru
valorile iniţiale ( p 0 , q0 ) .
29
Methodes de calcul numerique en ingenierie electrique
Capitolul 2
30
Metode numerice în ingineria electrică
AX = B (2.2)
unde A este matricea pătrată a sistemului (a coeficienţilor) de dimensiuni nxn
⎛ b1 ⎞
⎜ . ⎟
⎜ ⎟
şi B este vectorul coloană 1xn al termenilor liberi B = ⎜ . ⎟ (2.5)
⎜ ⎟
⎜⎜ . ⎟⎟
⎝ bn ⎠
31
Methodes de calcul numerique en ingenierie electrique
ai1
sistemului (2.1), pe rând cu factorii − , pentru i = 2, n şi apoi se adună la
a11
ecuaţia cu numărul i, se va elimina necunoscuta x1 din fiecare ecuaţie, evident cu
excepţia primei ecuaţii. Se obţine sistemul echivalent:
unde s-au notat noii coeficienţi obţinuţi în această primă etapă de calcul cu indice
superior(1). De asemenea este evident că în prima ecuaţie a sistemului coeficienţii
nu se modifică. Algoritmul se continuă prin înmulţirea celei de-a doua ecuaţii a
ai 2
sistemului (2.6) cu − , pentru i = 3, n şi apoi adunându-o la fiecare ecuaţie i a
a 22
sistemului se va elimina necunoscuta x2. Se obţine sistemul echivalent:
32
Metode numerice în ingineria electrică
⎛ a11 .. . . a1n ⎞ ⎛ x1 ⎞ ⎛ b1 ⎞
⎜ (1) ⎟ ⎜ ⎟ ⎜ ⎟
⎜ 0.. a 22 . a 2(1n) ⎟ ⎜ . ⎟ ⎜ b2(1) ⎟
⎜ 0.. ⋅ = (2.9)
. ai(,i −j 1) .. ai(,in−1) ⎟ ⎜ . ⎟ ⎜ . ⎟
⎜ ⎟ ⎜ ⎟ ⎜ ⎟
⎜ 0.. . . ( n −1) ⎟ ⎜
a nn x ⎟ ⎜ b (n −1) ⎟
⎝ ⎠ ⎝ n⎠ ⎝ n ⎠
unde indicii superiori indică etapa în care a fost obţinut respectivul element.
Această etapă de aducere a matricii A la forma triunghiulară se numeşte
eliminare sau triangularizare iar fiecare din elementele akk, cu k = 1, n aflate pe
diagonala principală se numeşte pivot. Este evident că în cursul algoritmului pentru
a putea opera, trebuie ca toţi pivoţii să fie nenuli. Mai mult, pentru reducerea
erorilor de rotunjire se recomandă ca valoarea pivotului, în modul să fie cât mai
mare posibilă. Pentru rezolvarea acestor două cerinţe se utilizează procedura de
pivotare, adică de permutare (schimbare) a liniilor (sau a liniilor şi coloanelor).
Pivotarea, efectuată într-o anumită etapă de calcul nu modifică zerourile deja
obţinute în matricea A. Mai multe explicaţii în ceea ce priveşte procedurile de
pivotare şi de alegere a pivotului se dau la capitolul 2.2, paragraful iii.
Necunoscutele se determină după n-1 etape de eliminare şi din (2.8) rezultă, pe
rând, începând cu ultima
bn(n −1)
xn = ( n −1)
a nn
bn(n−1− 2 ) − a nn−−12 ⋅ x n
x n −1 =
a n(n−−1,2n)−1
⋅ (2.10)
⋅
n n
bi(i −1) − ∑ ai(,i −j 1) ⋅ x j
j =i +1
b1 − ∑ a1, j ⋅ x j
j =2
xi = x1 =
aii(i −1) a11
33
Methodes de calcul numerique en ingenierie electrique
(n − i ) = n(n − 1) adunări
n −1
∑
i =1 2
Adunând tipurile de operaţii efectuate în total în cele două etape se obţine
pentru metoda Gauss un total de:
n(2n 2 + 6n − 2)
ϑG ≅ (2.11)
6
Acest număr este foarte mic, începând cu n ≥ 3 , faţă de numărul de operaţii
cerute de regula lui Cramer (cu determinanţii calculaţi după minori):
θ C = n ⋅ n! (2.12)
34
Metode numerice în ingineria electrică
ai(,kk−−11)
iar în etapa k: aij(k ) = aij(k −1) − (k −1) ⋅ a k(k−−11) i ≠ k − 1, j ≥ k − 1 (2.15)
a k −1, k −1
a k(k−)1, j = a k(k−−11,j) j ≥ k −1
ai(,kj) = aij(k −1) j < k −1
ai(,kk−−11)
bi(k ) = bi(k −1) − i ≠ k −1
iar în etapa k: a k(k−−11,k)−1 (2.17)
(k ) ( k −1)
bk −1 = bk −1 k = 2, n
35
Methodes de calcul numerique en ingenierie electrique
b1 a a
x1 = − − 0 − 1, 2 x2 − ......... − 1, n xn
a1,1 a1,1 a1,1
b2 a a
x2 = − − 2,1 x1 − 0........... − 2, n xn
a2, 2 a2, 2 a2, 2 (2.20)
................................................................
b a a
xn = − n − n,1 x1 − ... − n, n −1 xn − 0
an, n an, n an, n
Dacă se alege ca aproximare iniţială o soluţie ( x1(0) , x2(0) ,...., xn(0) ) a sistemului,
atunci soluţiile (2.20) vor reprezenta formulele de recurenţă pentru calculul iterativ
al tuturor soluţiilor sistemului. Compact aceste relaţii se pot pune pentru
exprimarea necunoscutei xi în iteraţia k
36
Metode numerice în ingineria electrică
unde
⎛ b1 ⎞
⎛ 0 − a1, 2 .......... − a1,n ⎞ ⎜ ⎟
⎜ a1,1 a1,1 ⎟ ⎜ a1,1 ⎟
⎛ x1 ⎞ ⎜ ⎟ ⎜ b ⎟
⎜ ⎟ ⎜ a 2,1 a 2,n ⎟
⎜ x2 ⎟ − 0 .......... .. − ⎜ 2 ⎟
X = ⎜ ⎟ , C = ⎜ a 2, 2 a 2 , 2 ⎟ , D = ⎜ a 2, 2 ⎟ (2.23)
... ⎜ ⎟ ⎜ ⎟
⎜ ⎟ ⎜ ................................. ⎟
⎜x ⎟ ⎜ ...... ⎟
⎝ n⎠ ⎜ a n ,1 ⎟ ⎜ b ⎟
⎜ − a ......................0 ⎟ ⎜⎜ n ⎟⎟
⎝ n ,n ⎠
⎝ an, n ⎠
X ( 2) = CX (1) + D = C 2 X (0) + CD
..................................................... (2.24)
(k ) k ( 0) k −1 k −2
X =C X + (C +C + ... + C + I ) D
S = C k −1 + C k − 2 + ... + C + I (2.25)
este convergentă atunci când norma sau toate valorile proprii ale matricei C sunt
subunitare. Condiţia ca toate valorile proprii ale matricei sa fie subunitare este ca
ai , j
qi = ∑ ai ,i
〈1, i = 1,..., n (2.26)
j =1
j ≠i
iar relaţia (2.26) este necesar a fi îndeplinită pentru ca metoda Jacobi să fie
aplicată.
În condiţia (2.26) suma seriei este:
S = ( I − C ) −1 (2.27)
ceea ce implică
lim C k -1 = 0, X = (I - C) -1 D, X = CX + D
k→∞
37
Methodes de calcul numerique en ingenierie electrique
bi i −1 a n a
i, j (k ) i , j ( k −1)
xi( k ) = −∑ xj − ∑ xj pentru i = 1,..., n, k = 1,.., n. (2.28)
ai ,i j =1 ai ,i j = i +1 ai ,i
Fie sistemul
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)
⎛x ⎞ ⎛1 x x x x⎞
⎜ ⎟ ⎜ ⎟
⎜x x ⎟ ⎜ 1 x x x⎟
[ L] = ⎜ x x x ⎟ [U ] = ⎜ 1 x x⎟ (2.31)
⎜ ⎟ ⎜ ⎟
⎜x x x x ⎟ ⎜ 1 x⎟
⎜x x x x x ⎟⎠ ⎜ 1 ⎟⎠
⎝ ⎝
38
Metode numerice în ingineria electrică
[L][U][X]=[Y] (2.32)
[U][X]=[Z] (2.33)
[L][Z]=[Y] (2.34)
[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.
39
Methodes de calcul numerique en ingenierie electrique
k −1
Lim = Aim − ∑ LijU jm ;
j =1
(2.38)
k −1
U mj = ( Amj − ∑ LmiU ij ) / Lmm ; m = 2, N
i =1
40
Metode numerice în ingineria electrică
V 5
i U(
4
1
V
i L(i
j
41
Methodes de calcul numerique en ingenierie electrique
1 2
3 4
42
Metode numerice în ingineria electrică
Este un avantaj dacă matricele sunt păstrate în memorie pe linii. Acest fapt
poate fi util atunci când folosim tehnici adaptate „matricelor creuses”.
V i i V
2 3
V
m
V L(m U(m j
i j j
43
Methodes de calcul numerique en ingenierie electrique
⎛ L11 ⎞ ⎛ Z1 ⎞ ⎛ Y1 ⎞
⎜ ⎟⎜ ⎟ ⎜ ⎟
[ L][ Z ] = [Y ] ⇒ ⎜ x x ⎟ ⎜ ... ⎟ = ⎜ ... ⎟ ↓ ⇒ [ Z ] (2.41)
⎜ x x LNN ⎟⎠ ⎜⎝ Z N ⎟⎠ ⎜⎝ YN ⎟⎠
⎝
Elementele vectorului [Z] sunt calculate succesiv în sensul indicat de săgeată.
Această etapă cere O(N2/2) operaţii.
44
Metode numerice în ingineria electrică
⎛ 1 x x ⎞ ⎛ X 1 ⎞ ⎛ Z1 ⎞
⎜ ⎟⎜ ⎟ ⎜ ⎟
[U ][ X ] = [ Z ] ⇒ ⎜ 1 x ⎟ ⎜ ... ⎟ = ⎜ ... ⎟ ↑ ⇒ [ X ] (2.42)
⎜ 1 ⎟⎠ ⎜⎝ X N ⎟⎠ ⎜⎝ Z N ⎟⎠
⎝
//Elementele următoare
Pentru m=N-1 la 1 cu pasul -1 {
X(m)=Z(m)- Σj=m+1 à N[U(j,m)X(j)]
}
Observaţii:
• Constatăm că partea cea mai „costisitoare” în termeni de timp de calcul este
cea a factorizării, cu un număr de calcule semnificative de ordinul O(N3/3). Dublul
parcurs care urmează cere, în total, în jur de O(N2) calcule.
• Metoda de factorizare devine şi mai performantă când un sistem trebuie să fie
rezolvat pentru mai mulţi termeni liberi. Într-adevăr, într-o astfel de situaţie, este
suficientă o singură factorizare a matricei de coeficineţi.
iii) Probleme numerice
După cum putem constata, când factorizăm, prin oricare dintre metode, există o
operaţie de diviziune a elementelor unei linii prin elementele diagonalei de la
matricea L, situată pe linia în curs de prelucrare. Numim acest termen „pivot”.
Problema survine atunci când întâlnim un pivot nul (Lkk = 0 pentru o anumită
valoare a lui k).
Soluţia constă în adoptarea unui pivot convenabil, obligatoriu non nul. În plus,
argumente numerice arată că este avantajos să se aleagă un pivot cât mai mare cu
putinţă, caz în care erorile sunt mai mici.
Pivotul poate fi ales dintre termenii matricei care încă nu au fost prelucraţi în
timpul factorizării, deci dintre cei situaţi „deasupra” şi la „dreapta” termenului în
cauză.
45
Methodes de calcul numerique en ingenierie electrique
Î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:
46
Metode numerice în ingineria electrică
( A) = ( A)
T
Aij = Aji ⇒ (2.53)
[ A] = [U ] [U ]
T
(2.54)
47
Methodes de calcul numerique en ingenierie electrique
m −1
U mm = Amm − ∑ U im2 = Amm − < v1 , v1 > ; m = 2, N
i =1
(2.56)
m −1
U mj = (U mj − ∑ U imU ij ) / U mm = (U mj − < v1 , v2 >) / U mm ; j = m + 1, N
i =1
Ca şi mai sus, <vm,vn> este produsul scalar a doi vectori figuraţi pe diagrama
următoare. Trebuie totuşi să ţinem cont de simetria matricei (de exemplu, vectorii
v1 et v1T care sunt echivalenţi).
1
V V
i i
3
V
m
U(m j
U(m j
48
Metode numerice în ingineria electrică
49
Methodes de calcul numerique en ingenierie electrique
unde [D] este o matrice diagonală, ai cărei termeni sunt Dm=±1, şi [U] este o
matrice triunghiulară superioară, cu termeni diagonalei diferiţi de 1:
⎛ U11 x x x x ⎞ ⎛ ±1 ⎞
⎜ ⎟ ⎜ ⎟
⎜ U22 x x x ⎟ ⎜ ±1 ⎟
[U ] = ⎜ Umm x x ⎟ [ D] = ⎜ ±1 ⎟ (2.58)
⎜ ⎟ ⎜ ⎟
⎜ Unn x ⎟ ⎜ ±1 ⎟
⎜ U NN ⎠⎟ ⎜ ±1⎟
⎝ ⎝ ⎠
Dar, din moment ce matricea D este diagonală, rămân doar termenii care au
i=k, şi obţinem:
m m −1
Amm = ∑ U im2 Dii = ∑ U im2 Di + U mm
2
Dm ; ( Dii = Di ) (2.60)
i =1 i =1
⎛ m −1
⎞
Dm = sgn ⎜ Amm − ∑ U im2 Di ⎟ = ±1
⎝ i =1 ⎠
(2.61)
m −1
U mm = Amm − ∑ U Di 2
im ; m = 2, N
i =1
D1 = sgn ( A11 ) = ±1
(2.62)
U11 = A11
Termenii non diagonali pe linia (m) a matricei coeficienţilor sunt, la rândul lor:
50
Metode numerice în ingineria electrică
m m m m
Amj = ∑∑ L mi DikU km = ∑∑ U imU km Dik ; j = m + 1, N (2.63)
i =1 k =1 i =1 k =1
Ca şi înainte, matricea [D] este diagonală, deci rămân doar termenii cu i=k, şi
obţinem:
m m −1
Amj = ∑ U imU ij Di = ∑ U imU ij Di + U mmU mj Dm (2.64)
i =1 i =1
⎛ m −1
⎞
U mj = ⎜ Amj − ∑ U imU ij Di ⎟ / (U mm Dm ) ; j = m + 1, N (2.65)
⎝ i =1 ⎠
Pentru prima linie (m=1), sumele sunt nule, şi obţinem:
U1 j = ( A1 j ) / (U11 D1 ) ; j = 2, N (2.66)
51
Methodes de calcul numerique en ingenierie electrique
52
Metode numerice în ingineria electrică
Chapitre 3
Méthodes numériques
de résolution des équations
53
Methodes de calcul numerique en ingenierie electrique
f (x ) = 0 (3.1)
xr = F (x ) (3.2)
f (x ) = 0 ⇔ xr = F (x ) (3.3)
lim = x r , (3.4)
k →∞
x k − x k −1 < ε (3.6)
54
Metode numerice în ingineria electrică
f (a ) ⋅ f (b ) < 0 (3.7)
a+b
xm0 ≡ x0 = (3.8)
2
le milieu de l’intervalle [a,b]. Si x0 n’est pas racine de l’équation, la vérification
ne peut pas être faite par comparaison:
f ( x0 ) < ε (3.9)
alors on évalue parmi les deux mi-intervalles (a, x0 ) et ( x0 , b ) l’un qui contient la
solution. L’évaluation se fait d’après le signe du produit des valeurs de la fonction
à les extrémités de mi-intervalles, c’est-à-dire:
f (a ) ⋅ f (b ) < 0 (3.10)
et
f ( x0 ) ⋅ f (b ) < 0 (3.11)
Donc l’inégalité (10) n’ést pas satisfaite, alors, obligatoirement (10) est
satisfaite et la solution se trouve dans l’intervalle ( x0 , b ) . Par conséquent
l’algorithme continue avec la dichotomie de cet intervalle:
x0 + b
x m1 ≡ x1 = etc.
2
La suite des valeurs successives des moitiés des sous intervalles:
x m0 , x m1 , x m2 ,..... est convergente vers la solution exacte x r (fig.3.1).
55
Methodes de calcul numerique en ingenierie electrique
bn − a n < ε (3.13)
56
Metode numerice în ingineria electrică
a ⋅ f (b ) − b ⋅ f (a )
x1 = (3.14)
f (b ) − f (a )
L’inverse itératif de division proportionnelle de l’intervalle continue en
fonction de la position de la corde vers le graphique.
Si la corde se trouve a la gauche du graphique (fig. 3.2), c’est-à-dire:
f (a ) ⋅ f (b ) < 0 (3.15)
57
Methodes de calcul numerique en ingenierie electrique
f ( x0 ) ≠ (x − x0 ) ⋅ f ' ( x0 ) = 0 (3.20)
f ( x0 )
x1 = x0 − (3.21)
f ' ( x0 )
f (xk )
xk +1 = xk − (3.22)
f ' (xk )
58
Metode numerice în ingineria electrică
lim ( x k )k ≥0 = x r (3.25)
k →∞
59
Methodes de calcul numerique en ingenierie electrique
x k − x k −1 < ε 1 (3.26)
ou si la valeur du polynôme dans le point respectif est plus petite que une valeur
imposée:
•) p 0 (x ) = Pn ( x )
• •) p1 ( x ) = Pn' −1 ( x )
60
Metode numerice în ingineria electrică
a1
x1 + x 2 + ......... + x n = − (3.29)
a0
Si une des racines, par exemple x1, est plus grande en module que toutes les autres
x1 >> x j , j = 2, n (3.30)
61
Methodes de calcul numerique en ingenierie electrique
a1
x1 ≅ − (3.31)
a0
Dans ce cas on dit que la racine x1 est prépondérante. Il est évident qu’en
réalité on ne purait pas jamais accepter la supposition que un polynôme a une
racine prépondérante. Par contre, on peut toujours affirmer que un polynôme a une
racine, soit x1, plus grande en module que toutes les autres x1 > x j , j = 2, n . Si
on va mètre a une puissance pas trop grande cette inégalité, alors la racine x1
deviendra prépondérante, c’est-à-dire
x nm >> x mj (3.32)
En faisant le produit:
(− 1)n ⋅ Pn (x ) ⋅ Pn (− x ) = a02 ⋅ ∏ (x 2 − x 2j )
n
(3.34)
j =1
( )
n n
Q( x ) = a 0m ⋅ ∏ x m − x mj = ∑ (− 1) Ai( p ) ⋅ xi2 m
i
(3.35)
j =1 i =0
62
Metode numerice în ingineria electrică
Si on note avec Ai( p +1) les valeurs de ces fonctions, les coefficients obtenues
dans l’étape p+1, alors par le procédé d’identification des coefficients présenté
antérieur on obtient la relation récursive:
( )
n
Ai( p +1) = Ai( p ) + 2 ∑ (− 1)k ⋅ Ai(−pk) ⋅ Ai + k , i = 0, n
2
(3.37)
k =0
ou on convient que tous les termes d’indice inférieur i + k > n et i − k < 0
soit nuls.
Pour trois cas d’existence des racines du polynôme initial Pn ( x ) , identifies a
l’aide du signe et des valeurs des nouveaux coefficients A ( p ) en diverses étapes de
i
mis successive au carrée, on va présenter la méthode de Lobacevski-Graeffe.
Les relations Vieta pour le polynôme Q( x ) obtenu dans l’étape p de calcul sont:
A1( p )
x1m + x 2m + ............ + x nm = (3.39)
A0( p )
A2( p )
x1m ⋅ x2m + x1m ⋅ x3m + .... + xnm−1 ⋅ xnm =
A0( p ) 1
M (3.40)
( p)
An
x1m ⋅ x2m ....................... ⋅ xnm =
A0( p )
dans lesquelles les termes de la partie droite sont toujours positifs, étant carrées
parfaites. En supposant que dans l’étape p la racine x1m = x12 p est devenue
63
Methodes de calcul numerique en ingenierie electrique
A1( p )
x1m ≅ (3.41)
A0( p )
A2( p )
x1m ⋅ x 2m ≅ (3.42)
A0( p )
M
An( p ) (3.43)
x1m ⋅ x 2m .... ⋅ x nm ≅ ( p)
A0
desquelles on obtient, successivement – en commencent par x1 – les modules des
racines:
A (j p )
x j = ±m , j = 1, n (3.44)
A (j −p1)
rj ( p)
=
(A ( ) )
j
p −1 2
, j = 1, n − 1 (3.45)
A (j p )
A1( p −1)
m
p −1
x12 = x12 ≅ (3.46)
A0( p −1)
64
Metode numerice în ingineria electrică
A1( p )
x12 p = x1m ≅ (3.47)
A0( p )
r1( p ) ≅ 1 (3.48)
A1( p )
x1m + x 2m + ....... + x M
m m
+ xM m
+1 ≅ M ⋅ x1 ≅ (3.50)
A0( p )
x1m ⋅ x 2m ...... ⋅ x M
m
+ x1m ⋅ x 2m ..... ⋅ x M
m m m m
−1 ⋅ x M +1 + ...... + x n − M ⋅ .... ⋅ x n ≅
AM( p ) (3.51)
≅ x1m ⋅ x 2m ⋅ .... ⋅ x M
m
= ( x1 )m⋅M ≅ ( p)
A0
65
Methodes de calcul numerique en ingenierie electrique
AM( p )
x1 = ± m⋅M (3.52)
A0( p )
An( p −1)
m
p −1
x12 = x12 ≅ (3.53)
M ⋅ A0( p −1)
p A1( p )
x1q = x1m ≅ (3.54)
M ⋅ A0( p )
De la relation (3.37), (3.54), (3.55) il résulte que le rapport r1( p ) tend vers M
r1p ≅ M (3.55)
alors dans les relations (3.53) ÷ (3.56) on applique un déplacement vers droit avec k
des racines inférieures. Ainsi, le calcul des racines M-multiples en module se fait
avec la relation:
Ak( +p M
)
x k = ± m⋅M (3.57)
Ak( p )
66
Metode numerice în ingineria electrică
rk( p ) → M (3.58)
qui s’il tend vers le nombre entier M il montre que la séparation de la racine M-
multiple s’est produite.
c) Le cas des racines complexes. On suppose que les racines complexes et
conjugues x1 et x2 d’équation Pn ( x ) = 0 ont le plus grand module:
x1 = ρ ⋅ e jθ si x 2 = ρ ⋅ e − jθ (3.60)
A1( p )
2 ρ m ⋅ cos mθ + x3 + ..... + x nm = (3.61)
Ao( p )
A2( p )
x1m ⋅ x 2m + x1m ⋅ x3m + ..... + x nm−1 ⋅ x nm ≅ ρ 2 m ≅ (3.62)
A0( p )
A2( p )
ρ= 2m (3.63)
A0( p )
67
Methodes de calcul numerique en ingenierie electrique
m
2 p −1 A2p −1
ρ =ρ 2 ≅ (3.64)
A0( p −1)
davantage:
A2( p )
ρ 2p = ρ m ≅ ( p) (3.65)
A0
r2( p ) ≅ 1, (3.66)
et le rapport:
( p)
r1 =
(A( ) )
1
p −1 2
(3.67)
A0( p )
n n −1
Pn ( x) = ∑ an − j x j = ( x − α ) ∑ bn −1− j x j + bn (3.68)
j =0 j =0
ou, les nouveaux coefficients bj, j = 0,..., n sont déterminés récursivement par
identification du termes avec la même puissance de x.
b0 = a0 , bk = ak + αbk −1 , k = 1,..., n
relations qui define le schéma de Horner. Cette relations permet de déterminer les valeurs
du polynôme en x = α , c'est-à-dire Pn (α ) , par « n » opérations de multiplication et
« n-1 » opérations d’adition, ce qui résulte de (3.69) quand x = α , Pn (α ) = bn .
68
Metode numerice în ingineria electrică
Le schéma de Horner peut être adapté pour l’évaluation des dérivâtes d’un
polynôme. En utilisant l’observation que Pn (α ) = bn , on peut considérer pour chaque
approximation de la racine α des relations récursives (3.70), par dérivation il résulte:
dbk db
= bk −1 + α k −1 , k = 1,.., n (3.69)
dα dα
dbk −1
ck = , k = 1,..., n
dα
Pn (α ) = cn −1 (3.71)
bn (α m )
α m +1 = α m − (3.72)
cn −1 (α m )
bn (α m )
α m +1 = α m − M (3.73)
cn −1 (α m )
69
Methodes de calcul numerique en ingenierie electrique
Pn ( x) = C0 + C1 ( x − α ) + C2 ( x − α ) 2 + ... + Cn ( x − α ) n (3.74)
ou on a noté
Pn( k ) (α )
Ck = (3.75)
k!
Des itérations (3.69) et (3.70) on obtient les coefficients du polynôme Pn−1 ( x)
Pn ( x) = ( x − α ) Pn −1 ( x) + Co (3.76)
et
C0 = Pn (α ) (3.77)
Pn −1 ( x) = ( x − α ) Pn − 2 ( x) + C1 (3.78)
70
Metode numerice în ingineria electrică
( )∑ b
n n−2
Pn (x ) = ∑ ai x i = x 2 + px + q j ⋅ x j + Rx + S (3.79)
i =o j =2
R ( p, q ) = 0
(3.81)
S ( p, q ) = 0
bn ( p, q ) = 0
(3.82)
bn−1 ( p, q ) = 0
⎛ ∂b ⎞ ⎛ ∂b ⎞
bn ( p, q ) ≅ bn ( p m , q m ) + ( p − p m )⎜⎜ n ⎟⎟ + (q − q m )⎜⎜ n ⎟⎟ = 0 (3.83)
⎝ ∂p ⎠ p = pm ⎝ ∂q ⎠ q = qm
71
Methodes de calcul numerique en ingenierie electrique
∂bk ∂b ∂b
= −bk −1 − p k −1 − q k −2
∂p ∂p ∂p
(3.84)
∂bk ∂b ∂b
= −bk −2 − p k −1 − q k − 2
∂q ∂q ∂q
L’idée ingénieuse de la méthode consiste dans le fait que les dérivées partielles
nécessaires a l’itération prochaine peut se calculer a l’aide des formules récursives
∂bk ∂bk
de type (3.80). Ainsi, si on note avec c k = si d k = , il résulte que les
∂p ∂q
relations (3.74) peuvent s’écrire de la manière:
c k = −bk −1c k −1 − q ⋅ c k − 2
(3.85)
d k = −bk −2 − pd k −1 − qd k − 2 , k = 0, n
où on considère c − 2 = c −1 = d − 2 = d −1 = 0 .
Le système linéarisé seulement après la première relation (3.85) devient:
( pn +1 − pm ) ⋅ cn + (qm +1 − qm ) ⋅ cn −1 = −bn
(3.86)
( pm +1 − pm ) ⋅ cn −1 + (qm +1 − qm ) ⋅ cn − 2 = −bn −1
Par analogie on obtient le système a linéarité et ainsi on utilise la seconde
relation (3.85).
⎡ cn
c n−1 ⎤
La matrice du système J = ⎢ est appelée la matrice Jacobienne et
c n −2 ⎥⎦
⎣c n−1
elle est non singulière c’est-à-dire det J ≠ 0, pour les racines complexes et
simples. Dans ce cas on calcule la solution du système (3.86):
bn−1 ⋅ c n −1 − bn ⋅ c n− 2
δ p = p m+1 − p m = (3.87)
c n ⋅ c n− 2 − c n2
bn ⋅ c n−1 − bn −1 ⋅ c n
δq = q m+1 − q m = (3.88)
c n ⋅ c n −2 − c n2
ou c n ⋅ c n − 2 − c n2 = det J .
L’entier procès peut être repris pour le polynôme de dégrée n-2
72
Metode numerice în ingineria electrică
n
Pn− 2 (x ) = ∑ b j ⋅ x j (3.89)
j =2
où les coefficients du cet polynôme sont justement les dernières valeurs calculées à
l’aide de la relation (3.80). L’algorithme continue tant que la factorisation de
Pn ( x ) en produits des polynômes de degré tout au plus deux soit obtenue et on
obtient de paires de solutions de la forme:
− p± p 2 − 4q
x1, 2 = (3.90)
2
En ce qui concerne la choix de l’approximation initiale ( p 0 , q0 ) cella peut être
obtenue par un procédé de localisation des racines, comme par exemple la méthode
de Lobacevski-Graeffe. Sur la convergence de la méthode de Bairstow, du point de
vu pratique on peut présenter un cas de non convergence: si Pn ( x ) à une seule
racine réelle et r 2 + rp 0 + q 0 = 0 , alors la méthode de Bairstow ne converge pas
pour les valeurs initiales ( p 0 , q0 ) .
73
Methodes de calcul numerique en ingenierie electrique
Chapitre 4
74
Metode numerice în ingineria electrică
⎛ x1 ⎞
⎜ . ⎟
⎜ ⎟
X est le vecteur colonne 1xn des inconnues: X = ⎜ . ⎟ (4.4)
⎜ ⎟
⎜⎜ . ⎟⎟
⎝ xn ⎠
⎛ b1 ⎞
⎜ . ⎟
⎜ ⎟
et B este le vecteur colonne 1xn des termes libres: B = ⎜ . ⎟ (4.5)
⎜ ⎟
⎜⎜ . ⎟⎟
⎝ bn ⎠
4.1.1. La méthode de Gauss résout les systèmes des équations linéaires qui
ont la matrice du système carrée et non singulière (det A ≠ 0 ) , par un algorithme
d’élimination successive des inconnues. Ainsi, si on multiplie la première équation
ai1
du système (4.1), chacune à son tour avec − pour i = 2, n et puis on l’ajoute a
a11
l’équation numéro i, on va éliminer l’inconnue x1 de chaque équation, évidemment
avec l’exception de la première équation. On obtient le système équivalent:
75
Methodes de calcul numerique en ingenierie electrique
b (n −1)
xn = n(n −1)
ann
bn(n−−1 2 ) − ann−−12 ⋅ xn
xn −1 =
an(n−−1,2n)−1
⋅
n (4.10)
bi(i −1) − ∑ a(
j = i +1
ij
i −1)
⋅ xj
xi =
aii(i −1)
.
n
b1 − ∑a
j =2
1j ⋅ xj
x1 =
a11
77
Methodes de calcul numerique en ingenierie electrique
n −1
n(n 2
) additions
−1
∑ (n − 1)(n − i + 1) =
i =1 3
n −1
n(n − 1)
∑ (n − 1)
i =1
=
2
divisions
n −1
n(n − 1) n −1
n(n − 1)
∑ (n − i ) =
i =1
multiplications, ∑ (n − i ) =
2 i =1 2
additions.
En ajoutant les types d’opérations n divisions effectuées en total dans les deux
étapes on obtient pour la méthode de Gauss un total de:
ϑG ≅
(
n 2n 2 + 6n − 2 ) (4.11)
6
Ce nombre est très petit, a partir de n ≥ 3 , comparé au nombre d’opérations
requises par la méthode de Cramer (avec les detérminnats calculés d’après les
mineurs):
θ C = n ⋅ n! (4.12)
78
Metode numerice în ingineria electrică
ai(,kk−−11)
bi(k ) = bi(k −1) − i ≠ k −1
dans l’étape k de calcul: a k(k−−11,k) −1 (4.17)
(k ) ( k −1)
bk −1 = bk −1 k = 2, n
79
Methodes de calcul numerique en ingenierie electrique
b1 a a
x1 = − − 0 − 12 x2 − ......... − 1n xn
a11 a11 a11
b2 a21 a
x2 = − − x1 − 0........... − 2 n xn
a22 a22 a22 (4.20)
................................................................
b a a
xn = − n − n1 x1 − ... − n, n −1 xn − 0
ann ann ann
Si on choit comme approximation initiale une solution ( x1(0) , x2(0) ,...., xn(0) ) du
système, alors les solutions (4.20) seront les formules de récurrence pour le calcul
itératif des solutions du système. Toutes ensemble, ces relations peut être pose pour
exprimer l’inconue xi dans l’itération k:
ou:
80
Metode numerice în ingineria electrică
⎛ b1 ⎞
⎜ ⎟
⎛ 0 − .......... − a12
⎞ ⎜ a1,1 ⎟
a1n
⎛ x1 ⎞ ⎜ a11⎟ ⎜b ⎟
a11
⎜ ⎟ ⎜ a 21 a ⎟
⎜ 2 ⎟
⎜ x2 ⎟ ⎜ − a 0............ − a2 n ⎟
X = ⎜ ⎟, C =
⎜
22 22
⎟ , D = ⎜ a22 ⎟ (4.23)
... ................................. ⎟ ⎜ ⎟
⎜ ⎟ ⎜ ...... ⎟
⎜x ⎟ ⎜
⎝ n⎠ ⎜⎜ − n1 ......................0 ⎟⎟
a
⎜ bn ⎟
⎝ a nn ⎠ ⎜ ⎟
⎝ ann ⎠
X ( 2) = CX (1) + D = C 2 X (0) + CD
..................................................... (4.24)
(k ) k ( 0) k −1 k −2
X =C X + (C +C + ... + C + I ) D
S = C k −1 + C k − 2 + ... + C + I (4.25)
est convergente quand la norme ou toutes les valeurs propres de la matrice C sont
sous unitaires. La condition que toutes les valeurs propres de la matrice soient sous
unitaires est:
∑
aij
qi = aii
〈1, i = 1,..., n (4.26)
j =1
j ≠i
S = ( I − C ) −1 (4.27)
ce qui implique
lim C k -1 = 0, X = (I - C) -1 D, X = CX + D
k→∞
81
Methodes de calcul numerique en ingenierie electrique
où [X] est le vecteur des N inconnues, [Y] est le vecteur des termes libres, et [A]
est la matrice carrée (de taille N*N) des coefficients.
La factorisation consiste dans la représentation de la matrice des coefficients
[A] par le produit de deux matrices:
[ A] = [ L ][U ] (4.30)
où:
[L] est une matrice inférieure - gauche (« Lower », en anglais), dont les
termes non nuls se trouvent seulement en dessous de la diagonale
principale, et sur celle-ci.
[U] est une matrice supérieure - droite (« Upper », en anglais), dont les termes
non nuls se trouvent seulement en dessus de la diagonale principale. Les
termes diagonaux de [U] sont tous 1.
⎛x ⎞ ⎛1 x x x x⎞
⎜ ⎟ ⎜ ⎟
⎜x x ⎟ ⎜ 1 x x x⎟
[ L] = ⎜ x x x ⎟ [U ] = ⎜ 1 x x⎟ (4.31)
⎜ ⎟ ⎜ ⎟
⎜x x x x ⎟ ⎜ 1 x⎟
⎜x x x x x ⎟⎠ ⎜ 1 ⎟⎠
⎝ ⎝
82
Metode numerice în ingineria electrică
[U][X]=[Z] (4.33)
83
Methodes de calcul numerique en ingenierie electrique
84
Metode numerice în ingineria electrică
Pour m=2 à N {
//Colonne m de L (étape 4):
Pour i=m à N {
//L(i,m)=A(i,m)-<v1,v2>
L(i,m)=A(i,m)-Σj=1à m-1[L(i,j)U(j,m)]
}//i
Si j=N, alors FIN
//Ligne m de U (étape 5):
Pour j=m+1 à N {
//U(m,j)=[A(m,j)-<v3,v4>]/L(m,m)
U(m,j)=(A(m,j)-Σi=1 à m-1[L(m,i)U(i,j)])/L(m,m)
}//j
}//m
où <vm, vn> est le « produit scalaire » entre les « vecteurs » vm et vn.
m j
2
V j V i
3
V 5
i U(
4
1
V
i L(i
j
85
Methodes de calcul numerique en ingenierie electrique
• Factorisation de Doolittle
Cette variante présente quelques avantages par rapport avec la méthode de
Crout, ce qui la rend mieux adaptée dans le cas des « matrices creuses », dont on va
parler plus loin.
Prenons, pour l’instant, l’exemple précédent (relations 4.27 et 4.28), mais en
suivant une procédure différente.
On détérmine d’abord L11=A11, puis la première ligne de U:
U1j = A 1j/L11, pour j=2 à N.
On continue par la deuxième ligne de L et de U. Ainsi:
L21=A21 ; L22 = A22 – L21U12.
U2j = (A2j –L21U1j)/ L22 pour j=3 à N.
L’algorithme continue de la même manière, en traitant succéssivement les lignes des
deux matrices, d’abord de L, puis de U. Ainsi, à l’étape (m, pour m=2 à N), on obtient:
j −1
Lmj = Amj − ∑ LmiU ij ; j = 1, m
i =1
(4.39)
k −1
U mj = ( Amj − ∑ LmiU ij ) / Lmm ; j = m + 1, N
i =1
1 2
3 4
86
Metode numerice în ingineria electrică
V i i V
2 3
V
m
V L(m U(m j
i j j
87
Methodes de calcul numerique en ingenierie electrique
⎛ L11 ⎞ ⎛ Z1 ⎞ ⎛ Y1 ⎞
⎜ ⎟⎜ ⎟ ⎜ ⎟
[ L][ Z ] = [Y ] ⇒ ⎜ x x ⎟ ⎜ ... ⎟ = ⎜ ... ⎟ ↓ ⇒ [ Z ] (4.41)
⎜ x x LNN ⎟⎠ ⎜⎝ Z N ⎟⎠ ⎜⎝ YN ⎟⎠
⎝
88
Metode numerice în ingineria electrică
⎛ 1 x x ⎞ ⎛ X 1 ⎞ ⎛ Z1 ⎞
⎜ ⎟⎜ ⎟ ⎜ ⎟
[U ][ X ] = [ Z ] ⇒ ⎜ 1 x ⎟ ⎜ ... ⎟ = ⎜ ... ⎟ ↑ ⇒ [ X ] (4.42)
⎜ 1 ⎟⎠ ⎜⎝ X N ⎟⎠ ⎜⎝ Z N ⎟⎠
⎝
Les éléments du vecteur des inconnues [X] sont calculés successivement dans
le sens indiqué par la flèche. Cette étape exige aussi environ O(N2/2) calculs.
En principe, l’algorithme est le suivant:
//PROGRAMME Parcours inverse
//Dernier élément de X:
X(N)=Z(N)
//Eléments suivants:
Pour m=N-1 à 1 avec pas -1 {
X(m)=Z(m)- Σj=m+1 à N[U(j,m)X(j)]
}
Remarques:
• On constate que la partie la plus « coûteuse » en terme de temps de calcul est
celle de la factorisation, avec un nombre de calculs significatifs de l’ordre O(N3/3).
Le double parcours qui s’ensuit demande, en total, environ O(N2) calculs.
• La méthode de la factorisation devient encore plus performante lorsque un
système doit être résolu pour plusieurs termes libres. En effet, dans une telle
situation, il suffit une seule factorisation de la matrice des coefficients.
iii) Problèmes numériques
Comme on peut constater, lors de la factorisation, par n’importe quelle
méthode, il existe un opération de division des éléments d’une ligne par le terme
diagonal de la matrice L, situé sur la ligne en cours de traitement. On appelle ce
terme « pivot ».
89
Methodes de calcul numerique en ingenierie electrique
Le problème arrive lorsque on tombe sur un pivot nul (Lkk = 0 pour une
certaine valeur de k).
La solution consiste dans l’adoption d’un pivot convenable, obligatoirement
non nul. En plus, des raisons numériques montrent qu’il est avantageux de choisir
un pivot le plus grand possible, dans quel cas les erreurs sont moindres.
Le pivot peut être choisi parmi les termes de la matrice pas encore traités
pendant la factorisation, donc parmi ceux situés « en dessous » et « à droite » du
terme concerné.
Ceci équivaut à une permutation des équations (donc des lignes), ou à une
permutation des colonnes (donc une renumérotation des inconnues).
En pratique, la permutation (des lignes ou des colonnes) est seulement
«virtuelle ». En effet, les éléments gardent leurs places, mais ils sont accédés par
voie indirecte, par l’intermédiaire de « vecteurs de permutation ».
• Dans le cas du « pivotage partiel », seulement les lignes sont permutées.
Le pivot qui doit remplacer un élément A(m,m) nul est choisi parmi les
candidats situés sur la même colonne, et sur une des lignes qui suivent:
• Dans le cas du « pivotage total », à la fois les lignes et les colonnes sont
permutées.
Le pivot qui doit remplacer un élément L(k,k) nul est choisi parmi les
candidats situés sur une des lignes et colonnes qui suivent:
A(m, m) = 0 ⇒ pivot = A(i p , j p ) i p ∈ (m + 1, N ), j p ∈ (m + 1, N ) (4.47)
90
Metode numerice în ingineria electrică
( A) = ( A)
T
Aij = Aji ⇒ (4.53)
Des telles matrices figurent, par exemple, dans les systèmes d’équations
fournis par les méthodes numériques de modélisation des champs. La symétrie de
la matrice pourrait être exploitée, afin de simplifier les traitements, et les rendre
plus performants.
91
Methodes de calcul numerique en ingenierie electrique
[ A] = [U ] [U ]
T
(4.54)
où [U] est une matrice supérieure - droite (« Upper », en anglais), dont les termes
non nuls se trouvent seulement en dessus de la diagonale principale. Les termes
diagonaux de [U] ne sont plus 1.
Par exemple, soit le cas d’une matrice symétrique d’ordre 4:
m −1
U mm = Amm − ∑ U im2 = Amm − < v1 , v1 > ; m = 2, N
i =1
(4.56)
m −1
U mj = (U mj − ∑ U imU ij ) / U mm = (U mj − < v1 , v2 >) / U mm ; j = m + 1, N
i =1
Comme plus haut, <vm,vn> est le produit scalaire des deux vecteurs figurés sur
le diagramme suivant. Il faut cependant tenir compte de la symétrie de la matrice
(voir, par exemple, les vecteurs v1 et v1T qui sont équivalents).
92
Metode numerice în ingineria electrică
1
V V
i i
3
V
m
U(m j
U(m j
93
Methodes de calcul numerique en ingenierie electrique
situations, il faut choisir l’algorithme sui sera présenté plus loin, qui est utilisable
aussi pour les matrices symétriques, mais non positives définies.
Il est, par contre, évident que le « pivotage » risque de détruire la symétrie de
la matrice. Par conséquent, il est à éviter.
Cependant, on peut démontrer que si la matrice A est symétrique et positive
définie, tous les « pivots » seront positifs (de sorte que l’algorithme puisse être mis
en œuvre) , donc le pivotage n’est pas nécessaire de ce point de vue. Il reste,
néanmoins, le problème de savoir si les pivots sont suffisamment grands, de sorte
que les erreurs d’arrondi ne soient pas trop grandes. La réponse est, de nouveau,
favorable à cette méthode. Par conséquent, on peut considérer que les permutations
ne sont pas nécessaires dans la méthode de Choleski, bien que les erreurs d’arrondi
ne soient pas totalement exclues.
où [D] est une matrice diagonale, dont les termes sont Dm=±1, et [U] est une
matrice triangulaire supérieure, avec des termes diagonaux différents de 1:
⎛ U11 x x x x ⎞ ⎛ ±1 ⎞
⎜ ⎟ ⎜ ⎟
⎜ U22 x x x ⎟ ⎜ ±1 ⎟
[U ] = ⎜ Umm x x ⎟ [ D] = ⎜ ±1 ⎟ (4.58)
⎜ ⎟ ⎜ ⎟
⎜ Unn x ⎟ ⎜ ±1 ⎟
⎜ UNN ⎠⎟ ⎜ ±1⎠⎟
⎝ ⎝
Un terme diagonal de la matrice des coefficients [A] est, selon les règles de
multiplication des matrices:
m m m m
Amm = ∑∑ L mi DikU km = ∑∑ U imU km Dik ; m = 2, N (4.59)
i =1 k =1 i =1 k =1
Mais, comme la matrice D est diagonale, seulement les termes avec i=k
demeurent, et on obtient:
94
Metode numerice în ingineria electrică
m m −1
Amm = ∑ U im2 Dii = ∑ U im2 Di + U mm
2
Dm ; ( Dii = Di ) (4.60)
i =1 i =1
Dans le cas particulier du premier terme (m=1), les sommes sont nulles. Par
conséquent:
D1 = sgn ( A11 ) = ±1
(4.62)
U11 = A11
Les termes non diagonaux sur la ligne (m) de la matrice des coefficients sont, à
leur tour:
m m m m
Amj = ∑∑ L mi DikU km = ∑∑ U imU km Dik ; j = m + 1, N (4.63)
i =1 k =1 i =1 k =1
Comme avant, la matrice [D] est diagonale, donc seulement les termes avec
i=k demeurent, et on obtient:
m m −1
Amj = ∑ U imU ij Di = ∑ U imU ij Di + U mmU mj Dm (4.64)
i =1 i =1
⎛ m −1
⎞
U mj = ⎜ Amj − ∑ U imU ij Di ⎟ / (U mm Dm ) ; j = m + 1, N (4.65)
⎝ i =1 ⎠
U1 j = ( A1 j ) / (U11 D1 ) ; j = 2, N (4.66)
95
Methodes de calcul numerique en ingenierie electrique
Une matrice « creuse » contient peu de termes non nuls. On peut la caractériser
par un « taux de remplissage », défini comme le rapport entre le nombre de termes
non nuls et le nombre total des termes (donc N², pour une matrice carrée avec N
lignes et colonnes). Souvent, surtout pour les matrices de grande taille, ce taux peut
être de quelques pourcents.
De telles matrices peuvent apparaître dans des problèmes de modélisation
numérique des champs (par les méthodes des différences finies ou éléments finis),
ainsi que lors de la simulation numérique des réseaux électriques de grande taille.
Dans le cas le plus favorable, les matrices sont symétriques et positives-définies.
Cependant, des situations où on sort de ce cadre sont rencontrées dans des
problèmes courants.
Il est clair que:
• Les techniques courantes de stockage des matrices (tableaux) sont peu
adaptées, car on « gaspille » la mémoire.
• Les méthodes courantes de factorisation et de résolution des systèmes
d’équations sont peu adaptées, car elle impliquent un grand nombre de
calculs inutiles.
96
Metode numerice în ingineria electrică
On peut estimer que dans le cas des systèmes d’équations de grande taille et
dont la matrice des coefficients est creuse, l’utilisation des techniques adaptées aux
matrices creuses est presque incontournable.
Le nombre d’opérations et le temps de calcul pourront être réduits d’une
manière drastique. En pratique, pour des systèmes de grande taille, l’utilisation des
techniques de matrices creuses peut conduire à un nombre d’opérations presque
proportionnel à N (~O(N)) plutôt qu’au N3.
Bien sûr, le prix à payer consiste dans une mise en œuvre plus complexe, mais
il existe déjà de outils informatiques adéquats.
Un problème qui se pose est celui de « remplissages ». En effet, lors de la
factorisation, des éléments nouveaux peuvent apparaître. Les technique de
stockage utilisées doivent permettre l’insertion facile des nouveaux termes aux
bons endroits.
Par conséquent, le taux de remplissage de la matrice en cours de factorisation
augmente. Des techniques spéciales ont été développées, afin de réduire le nombre
de remplissages.
97
Methodes de calcul numerique en ingenierie electrique
Anexa I
98
Metode numerice în ingineria electrică
Dintre intervalele (1,25; 1,281) şi (1,281; 1,312), alegem intervalul (1,25; 1,281).
1,25 + 1,281
= 1,265
2
f (1,265) = 0,02
Fie f ( x) = x 3 + 3 x 2 − 3 , f : [0,1] → ℜ
f (0) = −3
f (1) = 1
f ' ( x) = 3 x 2 + 6 x ⇒ f crescătoare
f " ( x) = 6 x + 6 ⇒ f concavă
x0 = a = 0
b =1
x f (b) − bf ( xn )
xn+1 = n
f (b) − f ( xn )
x1 = 0,75
x2 = 0,86
x3 = 0,87
…
1
Fie funcţia f ( x) = ln x − , f : [1,2] → ℜ
x
f (1) = −1
f (2) = 0,19
1 1
f ' ( x) = + 2 > 0 ⇒ f crescătoare
x x
1 2
f " ( x) = − 2 − 3 > 0 ⇒ f concave
x x
Deducem formula de iteraţie:
99
Methodes de calcul numerique en ingenierie electrique
1 xn ln xn 1
ln xn − − 2
xn xn xn ( x ln xn − 1) xn xn (1 − ln x)
xn+1 = xn − = xn − = xn − n =
1 1 xn 1 xn + 1 xn + 1
+ 2 2
+ 2
xn xn xn xn
Alegem x0 = 1
⇒ x1 = 1,5
x2 = 1,73
x3 = 1,761
…
Şirul lui Rolle are două schimbări de semn. Atunci ecuaţia are două rădăcini reale:
x1 ∈ (−∞;−1) şi x2 ∈ (−1;1)
100
Metode numerice în ingineria electrică
p3 = −( p1 mod p2 ) = 12
S = ( p0 ; p1; p2 ; p3 ) = ( x 3 + 6 x 2 − 16;3 x 2 + 12 x;8 x + 16;12)
x=-7
⇒ S = (−65;63;−40;12)
⇒ N1 = 3 (număr de schimbări de semn)
x=2
⇒ S = (16;36;32;12)
⇒ N2 = 0
N1 − N 2 = 3 ⇒ P are cele trei rădăcini în intervalul (− 7;2 )
101
Methodes de calcul numerique en ingenierie electrique
b 3j 1 1,86 ⋅ 10 2 4725 1
4
b j 1 2,5 ⋅ 10 4
2,2 ⋅ 10 7
1
b 5j 1 5,9 ⋅ 108 4,9 ⋅ 1014 1
b 6j 1 3,44 ⋅ 1017 2,5 ⋅ 10 29 1
2,5 ⋅ 10 29
x2 = 26 = 1,535
3,44 ⋅ 1012
1
x2 = 26 = 0,35
2,5 ⋅ 10 29
b) rădăcini complexe
Pentru ecuaţia cu rădăcini complexe x 4 + x − 1 = 0 noii coeficienţi sunt
x4 x3 x2 x1 x0
1 0 0 1 -1
b 0 1 0 0 1 1
j
0 0 0
-2
1 0 -2 1 1
b 1 1 0 4 1 1
j
4 0 4
2
1 4 6 5 1
b 2 1 16 36 25 1
j
-12 -40 -12
2
1 4 -2 13 1
b 3 1 16 4 169 1
j
4 -104 4
2
b 4j 1 20 -98 173 1
4
x1 = 2 20 = 1,206
x1 = −1,206
102
Metode numerice în ingineria electrică
1
x4 = 24 = 0,725
173
x4 = 0,725
173
x1 + x4 + 2u = 0 ⇒ u = 0,2405 ⇒ r 2 = 24 = 1,144
20
v = ± (1,144) 2 − (0,2405) 2 = ±1,11
x2,3 = 0,2405 ± 1,11i
⎧ x + y + z + t = 10 ⎧x = 1
⎪ x + 5 y + 5 z + 5t = 46 ⎪y = 2
⎪ ⎪
⎨ ⇔ ⎨
⎪ x + 5 y + 14 z + 14t = 109 ⎪z = 3
⎪⎩ x + 5 y + 14 z + 15 z = 113 ⎪⎩t = 4
⎧ x + y + z + t = 10 ⎧x = 1
⎪ x + 5 y + 5 z + 5t = 46 ⎪y = 2
⎪ ⎪
⎨ ⇔⎨
⎪ x + 5 y + 14 z + 14t = 109 ⎪z = 3
⎪⎩ x + 5 y + 14 z + 15 z = 113 ⎪⎩t = 4
2.3.Metoda Gauss
⎧ x + y + z = 14 ⎧x = 1
⎪ ⎪
⎨ 2 x + 5 y + 4 z = 24 ⇔ ⎨ y = 2
⎪ 4 x + y + 3 z = 15 ⎪z = 3
⎩ ⎩
103
Methodes de calcul numerique en ingenierie electrique
⎧ x + y + z = 14 ⎧x = 1
⎪ ⎪
⎨ 2 x + 5 y + 4 z = 24 ⇔ ⎨ y = 2
⎪ 4 x + y + 3 z = 15 ⎪z = 3
⎩ ⎩
2.5. Factorizarea LU
⎧x = 1 ⎧x = 1
⎪ ⎪
⎨2 x + 3 y = 8 ⇔ ⎨y = 2
⎪ x + 2 y + 3z = 14 ⎪z = 3
⎩ ⎩
104
Metode numerice în ingineria electrică
Anexa II
function functie(x:real):real;
begin
functie:=x*x*x-2;
end;
begin
writeln('Dati limita inferioara a intervalului in care calculam radacina: ');
write('Donez la limite inferieure de l intervale dans lequel on cherche la racine: ');
readln(a);
writeln('Dati limita superioara a intervalului in care calculam radacina: ');
write('Donez la limite superieure de l intervale dans lequel on cherche la racine: ');
readln(b);
writeln('Dati precizia: ');
write('Donez la precision: ');
readln(eps);
done:=false;
while not done do
begin
c:=(a+b)/2;
if abs(functie(c))<=eps then
begin
writeln('Radacina cautata este: ', c);
writeln('La racine cherche est: ', c);
done:=true;
end
else
if functie(a)*functie(c)<0 then b:=c
else
105
Methodes de calcul numerique en ingenierie electrique
#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;
106
Metode numerice în ingineria electrică
program coarda;
var a,b,c,d,eps:real;
function f(x:real):real;
begin
f:= x*x*x+6*x*x+11*x+6;
end;
begin
writeln('Dati limita inferioara a intervalului in care cautam radacina: ');
write('Donez la limite inferieure de lintervale dans lequel on cherche la racine: ');
readln(a);
writeln('Dati limita superioara a intervalului in care cautam radacina: ');
write('Donez la limite superieure de lintervale dans lequel on cherche la racine: ');
readln(b);
writeln('Dati precizia: ');
write('Donez la precision: ');
readln(eps);
c:=a;
repeat
d:=c;
c:=a-f(a)*(b-a)/(f(b)-f(a));
if f(a)*f(c)<0 then b:=c
else a:=c;
until abs(d-c)>eps;
writeln('Solutia este: ', c);
writeln('La solution est: ', c);
end.
#include <stdio.h>
#include <math.h>
double f(double x)
{
return x*x*x+6*x*x+11*x+6;
}
void main(void)
{
double a, b, c, d, eps;
printf("Dati limita inferioara a intervalului in care cautam radacina: \n");
printf("Donez la limite inferieure de l'intervale dans lequel on cherche: ");
107
Methodes de calcul numerique en ingenierie electrique
scanf("%lf",&a);
printf("Dati limita superioara a intervalului in care cautam radacina: \n");
printf("Donez la limite superieure de l'intervale dans lequel on cherche: ");
scanf("%lf",&b);
printf("Dati precizia: \n");
printf("Donez la precision: ");
scanf("%lf",&eps);
c=a;
do
{
d=c;
c=(a*f(b)-b*f(a))/(f(b)-f(a));
if(f(a)*f(c)<0) b=c;
else a=c;
}
while(fabs(d-c)>eps);
printf("Solutia este: \n");
printf("La solution est:%f\n ", c);
}
program newton;
function f(x:real):real;
begin
f:=x*x*x+6*x*x+11*x+6;
end;
function f_deriv(x:real):real;
begin
f_deriv:=3*x*x+12*x+11;
end;
var a,p,eps:real;
i:integer;
begin
writeln('Introduceti valoarea de plecare: ');
write('Introduisew la valeur de depart: ');
readln(p);
writeln('Introduceti precizia rezultatului: ');
write('Introduisez la precision du resultat: ');
readln(eps);
i:=0;
repeat
108
Metode numerice în ingineria electrică
p:=p-f(p)/f_deriv(p);
i:=i+1;
until abs(f(p))<eps;
writeln('Zeroul functiei este ', p, ' si eroarea este ', abs(f(p)));
write('Le zero de la fonction est ', p, ' et l erreur est ', abs(f(p)));
end.
#include <stdio.h>
#include <math.h>
double f(double x)
{
return x*x*x+6*x*x+11*x+6;
}
double f_deriv(double x)
{
return 3*x*x+12*x+11;
}
do
{
p-=f(p)/f_deriv(p);
i++;
}
while (fabs(f(p))>eps);
109
Methodes de calcul numerique en ingenierie electrique
program rolle;
begin
writeln('Dati limita inferioara a intervalului in care cautam radacina:');
write('Donnez la limite inferieure de l intervalle dans lequel on cherche la racine: ');
readln(a);
writeln('Dati limita superioara a intervalului in care cautam radacina: ');
write('Donnez la limite inferieure de l intervalle dans lequel on cherche la racine: ');
readln(b);
if f(a)=0 then
begin
writeln(a, ' este o radacina a ecuatiei f(x)=0');
writeln(a, 'est une racine de l equation f(x)=0');
end
else
if f(a)*f(b)<0 then
begin
writeln('In intervalul (',a,', ',b,') se gaseste o radacina a ecuatiei f(x)=0');
writeln('Dans l intervalle ]',a,', ',b, '[ il y a une racine de l equation f(x)=0');
end
else
if f(a)*f(b)>0 then
begin
writeln('In intervalul (',a,', ',b,') nu se gaseste o radacina a
ecuatiei f(x)=0');
writeln('Dans l intervalle ]',a,', ',b, '[ il n y a pas une racine de l equation f(x)=0');
end;
end.
#include <stdio.h>
#include <conio.h>
float f(float x)
{
return x*x+5*x+4;
}
110
Metode numerice în ingineria electrică
void main(void)
{
float a,b;
printf("Dati limita inferioara a intervalului in care cautam radacina: \n");
printf("Donnez la limite inferieure de l'intervalle dans lequel on cherche la racine: ");
scanf("%f",&a);
printf("Dati limita superioara a intervalului in care cautam radacina: \n");
printf("Donnez la limite superieure de l'intervalle dans lequel on cherche la racine: ");
scanf("%f",&b);
if(f(a)==0)
{
printf("%f este o radacina a ecuatiei f(x)=0.\n");
printf("%f est une racine de l'equation f(x)=0.\n");
}
else
if(f(a)*f(b)<0)
{
printf("In intervalul (%f,%f) se gaseste o radacina a ecuatiei f(x)=0.\n");
printf("Dans l'intervalle ]%f, %f[ il y a une racine de l'equation f(x)=0.\n");
}
else
if(f(a)*f(b)>0)
{
printf("In intervalul (%f,%f) nu se gaseste o radacina a ecuatiei f(x)=0.\n");
printf("Dans l'intervalle ]%f, %f[ il n'y a pas une racine de l'equation f(x)=0.\n");
}
getche();
}
program sturm;
type VReal=array [0..100] of real;
111
Methodes de calcul numerique en ingenierie electrique
begin
for i:=1 to gr do
v2[i-1]:=v1[i]*i;
gr2:=gr-1;
end;
{functia putere}
{fonction puissance}
function putere(x: real; i:integer):real;
var t: integer;
p:real;
begin
p:=x;
if i=1 then p:=x
112
Metode numerice în ingineria electrică
else
if i=0 then p:=1
else
for t:=2 to i do
p:=p*x;
putere:=p;
end;
{programul principal}
{le programme principal}
begin
writeln('Dati gradul polinomului: ');
write('Donnez le degre du polynome: ');
readln(gr1);
for i:=0 to gr1 do
begin
writeln('Dati coeficientul lui x la puterea ', i, ': ');
write('Donnez le coefficient de x a la puissance ', i, ': ');
readln(v1[i]);
end;
writeln('Dati limita inferioara a intervalului in care cautam radacina: ');
write('Donnez la limite inferieure de l intervalle dans lequel on cherche la racine:');
readln(x);
writeln('Dati limita superioara a intervalului in care cautam radacina: ');
write('Donnez la limite superieure de l intervalle dans lequel on cherche la racine:');
readln(y);
nr_sch1:=0;
nr_sch2:=0;
v_x1:=valoare_polinom(x,v1,gr1);
v_y1:=valoare_polinom(y,v1,gr1);
derivare(v1,v2,gr1,gr2);
v_x2:=valoare_polinom(x,v2,gr2);
v_y2:=valoare_polinom(y,v2,gr2);
if (v_x1=0) and (v_x2<0) then
nr_sch1:=nr_sch1+1;
113
Methodes de calcul numerique en ingenierie electrique
#include <stdio.h>
#include <math.h>
#include <conio.h>
114
Metode numerice în ingineria electrică
while(gr5>=gr2)
{
v3[c]=v11[a]/v2[b];
for(i=0;i<c; i++)
v4[i]=0;
for(i=c; i<=a; i++)
v4[i]=-v3[c]*v2[i-c];
for(i=0; i<=gr1; i++)
v5[i]=v11[i]+v4[i];
gr5=a-1;
if(v5[gr5]==0)
gr5--;
for(i=0; i<=gr5; i++)
v11[i]=v5[i];
a=gr5;
c--;
115
Methodes de calcul numerique en ingenierie electrique
}
};
//programul principal
//programme principall
void main(void)
{
int i;
int gr1, gr2, gr3;
float v1[100];
float v2[100];
float v3[100];
float x,y, v_x1, v_x2, v_x3, v_y1, v_y2, v_y3;
int nr_sch1, nr_sch2, nr_rad;
printf("Dati gradul polinomului: \n");
printf("Donnez le degre du polynome: ");
scanf("%d",&gr1);
for(i=0;i<gr1+1;i++)
{
printf("Dati coeficientul lui x la puterea %d: \n",i);
printf("Donez le coefficient de x a la puissance %d: ",i);
scanf("%f",&v1[i]);
}
printf("Dati limita inferioara a intervalului in care cautam radacina: \n");
printf("Donnez la limite inferieure de l'intervalle dans lequel on cherche la racine: ");
scanf("%f",&x);
printf("Dati limita superioara a intervalului in care cautam radacina: \n");
printf("Donnez la limite superieure de l'intervalle dans lequel on cherche la racine: ");
scanf("%f",&y);
nr_sch1=0;
nr_sch2=0;
v_x1=valoare_polinom(x,v1,gr1);
v_y1=valoare_polinom(y,v1,gr1);
derivare(v1,v2,gr1,gr2);
v_x2=valoare_polinom(x,v2,gr2);
116
Metode numerice în ingineria electrică
v_y2=valoare_polinom(y,v2,gr2);
if((v_x1==0)&&(v_x2<0))
nr_sch1++;
if((v_x1<0)&&(v_x2==0))
nr_sch1++;
if ((v_x1*v_x2)<0)
nr_sch1++;
if((v_y1==0)&&(v_y2<0))
nr_sch2++;
if((v_y1<0)&&(v_y2==0))
nr_sch2++;
if ((v_y1*v_y2)<0)
nr_sch2++;
gr3=2;
while(gr3>=1)
{
imparte(gr1, v1, gr2, v2, gr3, v3);
for(i=0; i<=gr3; i++)
v3[i]=-v3[i];
v_x3=valoare_polinom(x,v3,gr3);
v_y3=valoare_polinom(y,v3,gr3);
if((v_x2==0)&&(v_x3<0))
nr_sch1++;
if((v_x2<0)&&(v_x3==0))
nr_sch1++;
if ((v_x2*v_x3)<0)
nr_sch1++;
if((v_y2==0)&&(v_y3<0))
nr_sch2++;
if((v_y2<0)&&(v_y3==0))
nr_sch2++;
if ((v_y2*v_y3)<0)
nr_sch2++;
v_x2=v_x3;
v_y2=v_y3;
for(i=0; i<=gr2; i++)
v1[i]=v2[i];
for(i=0; i<=gr3; i++)
v2[i]=v3[i];
gr1=gr2;
gr2=gr3;
}
nr_rad=abs(nr_sch2-nr_sch1);
printf("Numarul de radacini reale in intervalul (%f , %f) este %d.\n", x, y, nr_rad);
printf("Le nombre des racines reelles dans l'intervale ]%f , %f[ est %d.\n", x, y, nr_rad);
getche();
}
117
Methodes de calcul numerique en ingenierie electrique
program Graeffe;
type VReal=array[0..20] of real;
begin
{lectura date de intrare si initializari}
{lecture des donnes d'entree et initialisations}
writeln('Dati gradul polinomului: ');
write('Donnez le degre du polynome: ');
readln(grad);
writeln('Dati coeficientii polinomului in ordinea descrescatoare a puterilor.');
writeln('Donnez les coefficients du polynome en ordre decroisante des puissances.');
for i:=0 to grad do
begin
write('coef[',i,']= ');
readln(coef[i]);
end;
writeln('Dati precizia: ');
write('Donnez la precision: ');
readln(precizie);
118
Metode numerice în ingineria electrică
119
Methodes de calcul numerique en ingenierie electrique
a[i]:=b[i];
until precizie>=eroare;
{afisam}
for i:=0 to grad-1 do
writeln('x[',i,']= ', rad[i]);
end.
#include <stdio.h>
#include <math.h>
void main(void)
{
int i, k, grad, etapa=0;
double precizie;
double coef[20];
double rad[20];
double eroare;
double putere, s, b[20], rad_poz[20], rad_neg[20], a[20];
120
Metode numerice în ingineria electrică
{
s=0;
for(k=1;k<=i;k++)
s+=pow(-1,k)*a[i-k]*a[i+k];
b[i]=pow(a[i],2)+2*s;
}
etapa++;
//calculam radcinile in etapa "etapa"
//on calcule les racines dans l'etape "etapa"
putere =1.0/pow(2.0,etapa);
for(i=0; i<=grad-1; i++)
rad[i]= pow(b[i+1]/b[i], putere);
//decidem semnul radacinii si eroarea prin introducere in ecuatia initiala
//on decide le signe de la racine et l'erreur par ramplacement dans l'equation initiale
for(i=0; i<=grad-1; i++)
{
rad_poz[i]=0;
rad_neg[i]=0;
for(k=0;k<=grad; k++)
{
rad_poz[i]+=coef[k]*pow(rad[i], grad-k);
rad_neg[i]+=coef[k]*pow(-rad[i], grad-k);
}
if(fabs(rad_neg[i])<fabs(rad_poz[i]))
{
rad[i]=-rad[i];
rad_poz[i]=rad_neg[i];
}
}
//cautam eroarea maxima din vectorul rad_poz
//on cherche l'erreur maximalle dans le vecteur rad_poz
eroare=fabs(rad_poz[0]);
for(i=1; i<=grad-1; i++)
if(fabs(rad_poz[i])>eroare)
eroare=fabs(rad_poz[i]);
for(i=0; i<=grad; i++)
a[i]=b[i];
}
while(eroare>precizie);
//afisam
// on affiche
for(i=0; i<=grad-1; i++)
printf("x[%d]= %f \n", i+1, rad[i]);
}
121
Methodes de calcul numerique en ingenierie electrique
program gauss;
type matrix=array[1..100,1..100] of real;
type vector=array[1..100] of real;
var A:matrix;
B,X:vector;
n:integer;
i,j,k,lp:integer;
i1,j1:integer;
m,temp,max:real;
option:integer;
strFichier:string;
f:text;
begin
i:=1;
repeat
writeln('Votre option pour introduire les valeurs:');
writeln('1. Fichier ');
writeln('2. Interactif');
readln(option);
until((option=1)or(option=2));
if (option=1) then
begin
write('Nom de fichier:');
readln(strFichier);
assign(f,strFichier);
reset(f);
readln(f,n);
for i:=1 to n do
begin
for j:=1 to n do
begin
read(f,A[i,j]);
write(A[i,j]:3:2,' ');
end;
readln(f,B[i]);
writeln(B[i]:3:2);
end;
end
122
Metode numerice în ingineria electrică
else
begin
write('n=');
readln(n);
for i:=1 to n do
for j:=1 to n do
begin
write('A[',i,',',j,']=');
read(A[i,j]);
end;
for i:=1 to n do
begin
write('B[',i,']=');
readln(B[i]);
end;
end;
j:=0;
for i:=1 to n do
begin
max:=abs(A[i,i]);
lp:=i;
for k:=i+1 to n do
if (max<abs(A[k,i])) then
begin
max:=A[k,i];
lp:=k;
end;
if(max=0) then
Exit;
if(lp<>i) then
begin
for j:=i to n do
begin
temp:=A[i,j];
A[i,j]:=A[lp,j];
A[lp,j]:=temp;
end;
temp:=B[i];
B[i]:=B[lp];
B[lp]:=temp;
end;
for k:=i+1 to n do
begin
m:=A[k,i]/A[i,i];
B[k]:=B[k]-m*B[i];
for j:=i to n do
123
Methodes de calcul numerique en ingenierie electrique
A[k,j]:=A[k,j]-m*A[i,j];
end;
end;
X[n]:=B[n]/A[n,n];
for i:=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;
124
Metode numerice în ingineria electrică
}
while((option!=1)&&(option!=2));
if(option==1)
{
cout<<"Nom de fichier:";
cin>>chFichier;
fin.open(chFichier);
fin>>n;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
fin>>A[i][j];
fin.ignore();
cout<<A[i][j]<<" ";
}
fin>>B[i];
cout<<B[i]<<endl;
}
fin.close();
}
else
{
cout<<"n=";
cin>>n;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
cout<<"A["<<i+1<<","<<j+1<<"]=";
cin>>A[i][j];
}
for(i=0;i<n;i++)
{
cout<<"B["<<i+1<<"]=";
cin>>B[i];
}
}
i=0; j=0;
for(i=0;i<n;i++)
{
max=fabs(A[i][i]);
lp=i;
for(k=i+1;k<n;k++)
if(max<fabs(A[k][i]))
{
125
Methodes de calcul numerique en ingenierie electrique
max=A[k][i];
lp=k;
}
if(max==0)
return 0;
if(lp!=i)
{
for(j=i;j<n;j++)
{
temp=A[i][j];
A[i][j]=A[lp][j];
A[lp][j]=temp;
}
temp=B[i];
B[i]=B[lp];
B[lp]=temp;
k=i+1;
for(k=i+1;k<n;k++)
{
m=A[k][i]/A[i][i];
for(j=i;j<n;j++)
A[k][j]=A[k][j]-m*A[i][j];
B[k]=B[k]-m*B[i];
}
}
X[n-1]=B[n-1]/A[n-1][n-1];
for(i=n-2;i>-1;i--)
{
X[i]=B[i];
for(j=n-1;j>i;j--)
X[i]=X[i]-A[i][j]*X[j];
X[i]=X[i]/A[i][j];
}
cout<<"Les sollutions sont: "<<endl;
for(i=0;i<n;i++)
cout<<"X["<<i+1<<"]="<<X[i]<<endl;
_getch();
return 0;
}
126
Metode numerice în ingineria electrică
program Gauss_Jordan;
type matrix=array[1..100,1..100] of real;
type vector=array[1..100] of real;
var A:matrix;
B,X:vector;
n:integer;
i,j,k,lp:integer;
m,temp,max:real;
option:integer;
strFichier:string;
f:text;
begin
i:=1;
repeat
writeln('Votre option pour introduire les valeurs:');
writeln('1. Fichier ');
writeln('2. Interactif');
readln(option);
until((option=1)or(option=2));
if (option=1) then
begin
write('Nom de fichier:');
readln(strFichier);
assign(f,strFichier);
reset(f);
readln(f,n);
for i:=1 to n do
begin
for j:=1 to n do
begin
read(f,A[i,j]);
write(A[i,j]:3:2,' ');
end;
readln(f,B[i]);
writeln(B[i]:3:2);
end;
end
else
begin
write('n=');
readln(n);
for i:=1 to n do
for j:=1 to n do
begin
127
Methodes de calcul numerique en ingenierie electrique
write('A[',i,',',j,']=');
read(A[i,j]);
end;
for i:=1 to n do
begin
write('B[',i,']=');
readln(B[i]);
end;
end;
j:=0;
for i:=1 to n do
begin
max:=abs(A[i,i]);
lp:=i;
for k:=i+1 to n do
if (max<abs(A[k,i])) then
begin
max:=A[k,i];
lp:=k;
end;
if(max=0) then
Exit;
if(lp<>i) then
begin
for j:=i to n do
begin
temp:=A[i,j];
A[i,j]:=A[lp,j];
A[lp,j]:=temp;
end;
temp:=B[i];
B[i]:=B[lp];
B[lp]:=temp;
end;
for k:=1 to n do
if (k<>i) then
begin
m:=A[k,i]/A[i,i];
for j:=i to n do
A[k,j]:=A[k,j]-m*A[i,j];
B[k]:=B[k]-m*B[i];
end;
end;
for i:=1 to n do
X[i]:=B[i]/A[i,i];
128
Metode numerice în ingineria electrică
#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;
ifstream fin;
char chFichier[1024];
i=1;
cout.precision(3);
do
{
cout<<"Votre option pour introduire les valeurs:"<<endl;
cout<<"1. Fichier "<<endl<<"2. Interactif"<<endl;
cin>>option;
}
while((option!=1)&&(option!=2));
if(option==1)
{
cout<<"Nom de fichier:";
cin>>chFichier;
fin.open(chFichier);
fin>>n;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
129
Methodes de calcul numerique en ingenierie electrique
{
fin>>A[i][j];
fin.ignore();
cout<<A[i][j]<<" ";
}
fin>>B[i];
cout<<B[i]<<endl;
}
fin.close();
}
else
{
cout<<"n=";
cin>>n;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
cout<<"A["<<i+1<<","<<j+1<<"]=";
cin>>A[i][j];
}
for(i=0;i<n;i++)
{
cout<<"B["<<i+1<<"]=";
cin>>B[i];
}
}
i=0; j=0;
for(i=0;i<n;i++)
{
max=fabs(A[i][i]);
lin=i;
for(k=i+1;k<n;k++)
if(max<fabs(A[k][i]))
{
max=A[k][i];
lin=k;
}
if(max==0)
return 0;
if(lin!=i)
{
for(j=i;j<n;j++)
{
temp=A[i][j];
A[i][j]=A[lin][j];
130
Metode numerice în ingineria electrică
A[lin][j]=temp;
}
temp=B[i];
B[i]=B[lin];
B[lin]=temp;
k=0;
for(k=0;k<n;k++)
if(k!=i)
{
m=A[k][i]/A[i][i];
for(j=i;j<n;j++)
A[k][j]=A[k][j]-m*A[i][j];
B[k]=B[k]-m*B[i];
}
for(i=0;i<n;i++)
X[i]=B[i]/A[i][i];
getch();
return 0;
}
program Jacobi;
type matrice=array [1..10, 1..10] of real;
vect=array [1..10] of real;
var A:matrice;
B,X:vect;
i, j, n, it_nr, it: integer;
sum:real;
begin
write('Dati ordinul sistemului/ Donnez l''ordre du systeme: ');
131
Methodes de calcul numerique en ingenierie electrique
readln(n);
writeln('Dati matricea A/ Donnez la matrice A: ');
for i:=1 to n do
for j:=1 to n do
begin
write('A[',i,',',j,']= ');
readln(A[i,j]);
end;
writeln('Dati matricea B:/ Donnez la matrice B: ');
for i:=1 to n do
begin
write('B[',i,']= ');
readln(B[i]);
end;
write('Dati numarul de iteratii/ Donnez le nombre d''iterations: ');
readln(it);
for i:=1 to n do
X[i]:=1;
for it_nr:=1 to it do
begin
for i:=1 to n do
begin
sum:=0;
for j:=1 to n do
begin
if (i-j)<>0 then
sum:=sum+A[i,j]*X[j];
end;
X[i]:=(B[i]-sum)/A[i,i];
end;
end;
writeln('Rezultatul este/ Le resultat est: ');
for i:=1 to n do
begin
write(X[i]:6:2, ', ');
end;
end.
#include <stdio.h>
int main(void)
{
int i,j,n;
float A[10][10], B[10], X[10];
float sum;
int it, it_nr;
132
Metode numerice în ingineria electrică
#include "stdafx.h"
#include<iostream>
#include<fstream>
#include<conio.h>
using namespace std;
133
Methodes de calcul numerique en ingenierie electrique
double A[100][100];
double B[100];
double X[100];
int n;
int _tmain(int argc, _TCHAR* argv[])
{
int i,j;
int option;
double d;
ifstream fin;
char chFichier[1024];
i=1;d=1;
cout.precision(3);
do
{
cout<<"Votre option pour introduire les valeurs:"<<endl;
cout<<"1. Fichier "<<endl<<"2. Interactif"<<endl;
cin>>option;
}
while((option!=1)&&(option!=2));
if(option==1)
{
cout<<"Nom de fichier:";
cin>>chFichier;
fin.open(chFichier);
fin>>n;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
fin>>A[i][j];
fin.ignore();
cout<<A[i][j]<<" ";
}
fin>>B[i];
cout<<B[i]<<endl;
}
fin.close();
}
else
{
cout<<"n=";
cin>>n;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
134
Metode numerice în ingineria electrică
{
cout<<"A["<<i+1<<","<<j+1<<"]=";
cin>>A[i][j];
}
for(i=0;i<n;i++)
{
cout<<"B["<<i+1<<"]=";
cin>>B[i];
}
}
for(i=0;i<n;i++)
d=d*A[i][i];
if(d==0)
return 0;
for(i=0;i<n;i++)
{
X[i]=B[i];
for(j=0;j<i;j++)
X[i]=X[i]-A[i][j]*X[j];
X[j]=X[j]/A[i][i];
}
cout<<"Les sollutions sont:"<<endl;
for(i=0;i<n;i++)
cout<<"X["<<i+1<<"]="<<X[i]<<endl;
_getch();
return 0;
}
135
Methodes de calcul numerique en ingenierie electrique
repeat
writeln('Votre option pour introduire les valeurs:');
writeln('1. Fichier ');
writeln('2. Interactif');
readln(option);
until((option=1)or(option=2));
if (option=1) then
begin
write('Nom de fichier:');
readln(strFichier);
assign(f,strFichier);
reset(f);
readln(f,n);
for i:=1 to n do
begin
for j:=1 to n do
begin
read(f,A[i,j]);
write(A[i,j]:3:2,' ');
end;
readln(f,B[i]);
writeln(B[i]:3:2);
end;
end
else
begin
write('n=');
readln(n);
for i:=1 to n do
for j:=1 to n do
begin
write('A[',i,',',j,']=');
read(A[i,j]);
end;
for i:=1 to n do
begin
write('B[',i,']=');
readln(B[i]);
end;
end;
for i:=1 to n do
d:=d*A[i,i];
if(d=0) then
Exit;
for i:=1 to n do
begin
136
Metode numerice în ingineria electrică
X[i]:=B[i];
for j:=1 to i-1 do
X[i]:=X[i]-A[i,j]*X[j];
X[j+1]:=X[j+1]/A[i,i];
end;
writeln('Les sollutions sont:');
for i:=1 to n do
writeln('X[',i,']=',X[i]:3:2);
readln;
end.
#include "stdafx.h"
#include<iostream>
#include<fstream>
#include<math.h>
#include<conio.h>
using namespace std;
void Descopune_Cholesky(double matA[200][200],double matL[200][200],double
matU[200][200],int n);
void tri_inf(double matA[200][200],double matTL[200],double matXX[200],int n);
void tri_sup(double matA[200][200],double matTL[200],double matXX[200],int n);
char chFichier[1024];
cout.precision(3);
do
{
cout<<"Votre option pour introduire les valeurs:"<<endl;
cout<<"1. Fichier "<<endl<<"2. Interactif"<<endl;
cin>>option;
}
while((option!=1)&&(option!=2));
if(option==1)
{
cout<<"Nom de fichier:";
cin>>chFichier;
137
Methodes de calcul numerique en ingenierie electrique
fin.open(chFichier);
fin>>n;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
fin>>A[i][j];
fin.ignore();
cout<<A[i][j]<<" ";
}
fin>>B[i];
cout<<B[i]<<endl;
}
fin.close();
}
else
{
cout<<"n=";
cin>>n;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
cout<<"A["<<i+1<<","<<j+1<<"]=";
cin>>A[i][j];
}
for(i=0;i<n;i++)
{
cout<<"B["<<i+1<<"]=";
cin>>B[i];
}
}
ok=true;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(A[i][j]!=A[j][i])
ok=false;
if(!ok)
{
cout<<"Matrix n'est pas simetrique"<<endl;
exit(1);
}
Descopune_Cholesky(A,L,U,n);
tri_inf(L,B,Y,n);
tri_sup(U,Y,X,n);
cout<<"Les sollutions sont:"<<endl;
138
Metode numerice în ingineria electrică
for(i=0;i<n;i++)
cout<<"x["<<i+1<<"]="<<X[i]<<endl;
getch();
return 0;
}
for(i=0;i<n;i++)
{
for(j=0;j<i;j++)
{
suma=0;
for(k=0;k<j;k++)
suma+=matL[i][k]*matL[j][k];
if(matL[j][j]==0)
{
cout<<"matL[j][j]"<<endl;
exit(1);
}
else
matL[i][j]=(matA[i][j]-suma)/matL[j][j];
}
suma=0;
for(k=0;k<i;k++)
suma+=matL[i][k]*matL[i][k];
if((matA[i][i]-suma)<0)
{
cout<<"matA[i][i]";
exit(1);
}
else
matL[i][i]=sqrt(matA[i][i]-suma);
for(k=i+1;k<n;k++)
matL[i][k]=0;
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
139
Methodes de calcul numerique en ingenierie electrique
matU[j][i]=matL[i][j];
}
void tri_inf(double matA[200][200],double matTL[200],double matXX[200],int n)
{
int i,j;
for(i=0;i<n;i++)
{
matXX[i]=matTL[i];
for(j=0;j<i;j++)
matXX[i]=matXX[i]-matA[i][j]*matXX[j];
matXX[i]=matXX[i]/matA[i][i];
}
}
void tri_sup(double matA[200][200],double matTL[200],double matXX[200],int n)
{
int i,j;
for(i=n-1;i>-1;i--)
{
matXX[i]=matTL[i];
for(j=n-1;j>i;j--)
matXX[i]=matXX[i]-matA[i][j]*matXX[j];
matXX[i]=matXX[i]/matA[i][i];
}
}
140
Metode numerice în ingineria electrică
Bibliografie
1. H.M. Antia, „Numerical Methods for Scientists and Engineers”, First Edition, Tata
McGrawHill India 1991.
2. C. Berbente, S. Mitran, S. Zancu, “Metode numerice”, Ed. Tehnica, Bucureşti, 1997.
3. E. J. Billo, „Excel for Scientists and Engineers: Numerical Methods”, Wiley-
Interscience, 2007.
4. R A Buckingham, „Numerical Methods”, Sir Isaac Pitman & Sons, 1962.
5 C.M. Bucur, C.A.Popeea, Gh. Simion, “Matematici speciale. Calcul numeric”, Ed.
Didactică şi Pedagogică, Bucureşti, 1983.
6. G. Dahlquist, A. Bjorck, “Numerical Methods”, Dover Publications, 2003.
7. V. Iorga, „Programare numerică”, Ed. Teora, Bucureşti, 1996.
8. D. Kahaner, C. Moler, S. Nash, „Numerical Methods”, Prentice Hall, 1988.
9. D. Kincaid, W. Cheney, „Numerical Analysis – Mathematics of Scientific Computing”,
Brooks – Cole Publishing Company, Pacific Grove, California, 1991.
10. R.L. Johnston, „Numerical Methods”, John Wiley & Sons Inc, 1982.
11. I. P. Mysovskih, „Lectures on Numerical Methods”, Wolters-Noordhoff Publishing, 1969.
12. Ad. Mateescu, „Prelucrarea numerică a semnalelor”, multiplicare UPB, 1996.
13. I. Olaru, „Metode numerice-note de curs”, Ed. Printech, Bucureşti, 2000
14. V. Pereyra, A. Reinoza, „NumericalMethods”, Springer-Verlag GmbH, 1983.
15. W.P. Press, S.A. Teukolski, W.T. Vetterling, B.P. Flannery, „Numerical Recipes in
FORTRAN – The Art of Scientific Computing, 2nd Edition, Cambridge University Press, 1995.
16. I. Rusu, „Metode numerice în electronică. Aplicaţii în limbaj C”, Ed. Tehnică, Bucureşti, 1997.
17. S. Salleh, A.Y. Zomaya, S.A. Bakar, „Computing for Numerical Methods Using Visual
C++”, Wiley-Interscience, 2007.
18. W.H.A. Schilders, E.J.W. Ter Maten, „Numerical Methods in Electromagnetics”, Volume
13: Special Volume Handbook of Numerical Analysis, North Holland, 2005.
19. S. Salon, M.V.K. Chari, „Numerical Methods in Electromagnetism”, Academic Press,
1999.
20. H.R. Schwartz, „Numerical Analysis of Symmetric Matrices”, Prentice Hall Inc., New
York, 1973.
21. I.Gh. Şabac, „Matematici speciale”, Ed. Didactică şi pedagogică, Bucureşti, 1983.
22. O. Stănăşilă, „Analiza mathematică”, Ed. Didactică şi pedagogică, Bucureşti, 1981.
23. S. Wolfram, „Mathematica – A System for Doing Mathematica by Computer”, 2nd
Edition, Addison-Wesley, 1991.
24. F. Zhang, „The Schur Complement and Its Applications. Numerical Methods and
Algorithms”, Springer, 2005.
25. *** Turbo Pascal 5.5 http://dn.codegear.com/article/20803
26. *** Visual C++ Express edition: http://msdn.microsoft.com/en-us/express/aa975050.aspx
141
Methodes de calcul numerique en ingenierie electrique
142
Metode numerice în ingineria electrică
143
Methodes de calcul numerique en ingenierie electrique
144
Metode numerice în ingineria electrică
145
Methodes de calcul numerique en ingenierie electrique
146
Metode numerice în ingineria electrică
147
Methodes de calcul numerique en ingenierie electrique
148