Upload
andre-galland
View
118
Download
2
Embed Size (px)
Citation preview
PROGRAMMATION SCIENTIFIQUE EN C
PRO-1027
Résolution de système d’équations linéaires
Élimination de Gauss Élimination de Gauss avec pivot Approche SVD (Singular Value Decomposition)
Élimination de Gauss
Exemple de système d’équations linéaires– Un alliage est composé de manganène, silice et de
cuivre
– Cet alliage est composé de 15 livres de Mn, 22 livres de Si et 39 livres de Cu par tonne d’alliage
– Les ingrédients de l’alliage (Mn, Si, Cu) sont extraits de minerai provenant de 3 fournisseurs différents
– De plus, la concentration des ingrédients est différente pour les 3 minerais
Élimination de Gauss
Fournisseur 1(lb/tonne de minerai)
Fournisseur 2(lb/tonne de minerai)
Fournisseur 3(lb/tonne de minerai)
Manganèse 1 3 2Silice 2 4 3Cuivre 3 4 7
Nous voulons alors déterminer quelle quantité de minerai nous devons acheter de chaque fournisseur pour éviter l’achat inutile d’ingrédient
Élimination de Gauss
Pour trouver une solution à ce problème nous devons définir les variables suivantes:
– Xj: la quantité de minerai achetée du fournisseur j (tonne de minerai)
– Ci: la quantité d’ingrédient i par tonne d’alliage (lb/ tonne d’alliage)
– aij: la quantité d’ingrédient i par tonne de minerai achetée du fournisseur j (lb/tonne de minerai)
Sol’n
Élimination de Gauss
Nous pouvons déduire une expression générale pour le calcul des Ci
mi
CXa ij
n
jij
,......,2,1
1
m représente le nombre d’ingrédients et n le nombre de fournisseurs
Élimination de Gauss
Le problème précédent peut être représenté par un système d’équations linéaires de la forme
39743
22342
1523
321
321
321
XXX
XXX
XXX
La solution de ce système correspond aux quantités de minerai à acheter de chaque fournisseur
Mn (lb/tonne d’alliage)
Si (lb/tonned’alliage)Cu (lb/tonned’alliage)
Élimination de Gauss
Détermination des courants dans un circuit électrique
4042
6502
0
321
321
321
III
III
III
Élimination de Gauss
Forme générale d’un système d’équations linéaires
nnnnnn
nn
nn
CXaXaXa
CXaXaXa
CXaXaXa
.....
.....
.....
2211
22222121
11212111
Élimination de Gauss
Solution de 2 équations (n=2)
2222121
1212111
CXaXa
CXaXa
Isolons X2 de la seconde équation
22
12122 a
XaCX
Substituons X2 de la première équation
122
121212111 C
a
XaCaXa
Élimination de Gauss
Nous pouvons alors isoler X1
12212211
2121221 aaaa
CaCaX
Nous pouvons alors déduire X2 par
12212211
1212112 aaaa
CaCaX
Élimination de Gauss
Classification des systèmes d’équations– Systèmes ayant des solutions
– Systèmes sans solution
– Systèmes avec une infinité de solutions
Élimination de Gauss
Élimination de Gauss
L’élimination de Gauss est similaire à la procé-dure de substitution utilisée précédemment pour déduire les valeurs de X1 et X2
L’élimination consiste à effectuer un ensemble d’opérations valides sur les équations pour arriver à obtenir une matrice dont la partie triangulaire inférieure (sous la diagonale) est nulle et une diagonale à 1 (Gauss-Jordan)
Nous pouvons alors isoler chacune de nos inconnues
Élimination de Gauss
Opérations valides sur les équations– Permuter deux équations
– Multiplier ou diviser une équation par une constante
– Additionner deux équations ensembles
Élimination de Gauss
Représentation matricielle d’un système d’équations linéaires
nnnnnn
n
n
C
C
C
X
X
X
aaa
aaa
aaa
2
1
2
1
21
22221
11211
Élimination de Gauss
Représentation sous forme de matrice augmen-tée
nnnnn
n
n
C
C
C
aaa
aaa
aaa
2
1
21
22221
11211
Élimination de Gauss
La procédure d’élimination de Gauss est subdi-visée en une phase d’élimination avant suivie d’une phase de substitution arrière. Avec l’élimination avant nous obtenons un système
n
n
n
e
e
e
d
dd
2
1
2
112
100
10
1
Élimination de Gauss
Si nous réinsérons les inconnues nous obtenons le système d’équations suivant
1,111,122,13132121 eXdXdXdXdXdX nnnnnn
2,211,222,23232 eXdXdXdXdX nnnnnn
3,311,322,33 eXdXdXdX nnnnnn
2,211,22 nnnnnnnn eXdXdX
1,11 nnnnn eXdX
nn eX
Élimination de Gauss
A partir du système précédent, nous pouvons déduire les inconnues Xi en commençant par l’inconnue Xn et par substitution arrière les autres inconnues X1 … Xn-1
nn eX
nnnnn XdeX ,111
Élimination de Gauss
L’élimination de Gauss appliquée à un circuit électrique (phase d’élimination avant)
4260
6720
0111
'2'
'2'
'
4042
6502
0111
133
122
11
RRR
RRR
RR
141900
32
710
0111
'6'2
'
'
4260
6720
0111
233
22
11
RRR
RR
RR
19
14100
32
710
0111
19'
'
'
141900
32
710
0111
33
22
11
RR
RR
RR
Élimination de Gauss
Algorithme d’élimination de Gauss (élimination avant)
Entrées: matrice A de nxn et un vecteur C de n éléments
Élimination avant
POUR j=1à n-1 FAIRE /* Pour chaque élément de la diagonale */
POUR i=j+1 à n FAIRE /* Pour chaque rangée sous la diagonale */
mij = aij/ajj
aij = 0; Ci = Ci - mij * Cj
POUR k = j+1 à n FAIRE /* Pour les éléments restant de la rangée i */
aik = aik - mij * ajk
Élimination de Gauss
Algorithme d’élimination de Gauss (substitution arrière)
Substitution arrière
POUR i= n à 1 FAIRE // pour chaque rangée à partir de la rangée n
xi=Ci
POUR j=i+1 à n FAIRE // pour les sol’n de la rangée i, Xi+1
xi = xi - aij * xj
xi = xi/aii
Sortie: vecteur x des solutions
Élimination de Gauss
Problèmes d’erreurs– Représentation des nombres
– Utilisation de pivot très petit (division par 0) Pour minimiser ces problèmes nous pouvons
utiliser l’élimination de Gauss avec pivot
Élimination de Gauss
Problèmes d’erreurs (exemple)
0.6
9.3
3.13
0303
10182
0637
3
2
1
x
x
x
En arithmétique exacte, la première étape de l’élimination donne
3.0030
1.01000
3.1306377
3,
7
23121 mm
Élimination de Gauss
Problèmes d’erreurs (exemple)– La dernière étape produit un élément diagonal
a22 nul
– L’élément pivot (diagonal) de la prochaine étape est donc nul
– Le rapport m23 = 3/0 ce qui cause erreur de division par 0
Élimination de Gauss
Nous pouvons corriger cette anomalie en permutant les rangées 2 et 3 permettant de déduire le vecteur solution exacte
01.0
1.0
1
x
Élimination de Gauss
Sur l’ordinateur, les rapports 2/7 et 3/7 ne sont pas représentés avec exactitude ce qui produit un élément diagonal a22 très petit. L’élimination avant peut quand même se poursuivre produi-sant des solutions erronnées
01000.0
10547.0
95078.0
10031.112031.100000.000000.0
01000.101000.111910.200000.0
01330.100000.001300.600000.7
x
EEEE
EEEE
EEEE
Élimination de Gauss avec pivot
Pour éviter les problèmes liés à l’utilisation de pivots petits nous devons avant chaque étape de l’élimination chercher la rangée dont la valeur pivot est maximale
Élimination avant
POUR j = 1à n-1 FAIRE /* Pour chaque élément de la diagonale */
trouver_pivot(n,j,A,kp)./*rangée où se trouve le pivot max */
Permuter les rangées j et kp
POUR i=j+1 à n FAIRE /* Pour chaque rangée sous la diagonale */
mij = aij/ajj
aij = 0; Ci = Ci - mij * Cj
POUR k = j+1 à n FAIRE /* Pour les éléments restant de la rangée i */
aik = aik - mij * ajk
Élimination de Gauss avec pivot
trouver_pivot(n,j,A,kp)
pivot = abs(A[j][j])
kp=j
POUR i=j+1à n FAIRE /* Pour chaque rangé sous la diagonale */
SI abs(A[i][j])>pivot ALORS
pivot = abs(A[i][j])
kp = i
FINSI
FIN POUR
Approche Singular Value Decomposition
Cette approche permet d’éliminer les faiblesses notées dans les approches de résolutions de Gauss.
L’approche SVD permet de résoudre divers types de problèmes: résolution de systèmes d’équations linéaires par moindres carrés (cas d’approximation de données), résolution de système mal conditionné.
Approche Singular Value Decomposition
Système à résoudre:
bU
w
w
w
Vx
bxA
T
n
/10000
00
000
00/10
000/1
2
1
Approche Singular Value Decomposition
Approche Singular Value Decomposition
• La fonction svdcmp() de Numerical Recipes in C permet de décomposer la matrice A en trois matrices U, W et VT
• La matrice A est fournie en argument de la fonction svdcmp()• La matrice U est retournée dans A, la diagonale de W est retournéedans le vecteur w, et VT dans la matrice v.
Approche Singular Value Decomposition
La fonction svdksb() permet de résoudre le système A.x = b sachant que A = U.W.VT
Cette fonction est aussi disponible dans Numerical Recipes in C.
Approche Singular Value Decomposition
Exemple d’utilisation#define N …
float wmax, wmin, **a,**u,*w,**v,*b,*x
int i,j;
….
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
u[i][j] = a[i][j];
svdcmp(u,N,N,w,v);
wmax = 0.0;
for(j=1;j<=N;j++) if(w[j] > wmax) wmax = w[j];
wmin = wmax*1.0e-6;
for(j=1;j<=N;j++) if(w[j] < wmin) w[j]=0.0;
svdksb(u,w,v,N,N,b,x);