cours4

publicité
PROGRAMMATION
SCIENTIFIQUE EN C
PRO-1027
Résolution de système d’équations
linéaires (méthodes itératives)
 Introduction
 Méthode
de Jacobi
 Méthode de Gauss-Seidel
 Considérations sur la convergence
 Travail pratique 1 c
– Utilisez le fichier de données tp1c_data au lieu du
fichier tp1b_data
 Examen
1 (11 février 1999)
Introduction
 Les
méthodes d’élimination sont des méthodes de
résolution directes puisque le nombre d’opérations
est connu
 Nous pouvons cependant résoudre un système
d’équations linéaires par une procédure d’essai et
erreur
 Cette procédure suppose une solution de départ qui
représente une estimation des valeurs des inconnus
Introduction
 De
façon itérative, les estimées de la solution sont
rafinées jusqu’à ce qu’un critère d’arrêt soit atteint
 Les avantages des méthodes itératives sont d’être
plus rapides que les méthodes directes et qu’elles
peuvent être utilisées pour résoudre des systèmes
non-linéaires
La méthode de Jacobi
 Par
la méthode de Jacobi nous pouvons isoler
chaque inconnu Xi de la façon suivante
X 1k 1
C1  (a12 X 2k  a13 X 3k    a1n X nk )

a11
X 2k 1
C2  (a21 X 1k  a23 X 3k    a2 n X nk )

a22

X nk 1
Cn  (an1 X 1k  an 2 X 2k    ann1 X nk1 )

ann
La méthode de Jacobi
 Algorithme
de Jacobi (une itération)
Jacobi(int dim,float **a, float *c, float *x, float *y)
/* x contient l’estimation actuelle de la solution
y contient la nouvelle estimation de la solution */
POUR i allant de 1 à dim FAIRE
y[i] = c[i]
POUR j allant de 1 à dim FAIRE
SI j != i ALORS
y[i] = y[i]- a[i,j] * x[j]
FIN SI
FIN POUR
y[i] = y[i]/ a[i,i]
FIN POUR
La méthode de Jacobi

Algorithme de Jacobi (général)
JacobiG(int dim, float **a, flaot *c)
assignation du vecteur x initial et y aux mêmes valeurs
erreur = MAXFLOAT
TANT QUE erreur > eps FAIRE
POUR i allant de 1 à dim FAIRE x[i]=y[i] FINTANTQUE
Jacobi(dim, a,c,x,y) /* Gauss-Seidel() */
erreurmax = 0
POUR i allant de 1 à dim FAIRE /* Calcul de l ’erreur */
erreur = | y[i]- x[i] |
SI erreur > erreurmax ALORS
erreurmax = erreur
FINSI
FIN POUR
erreur = erreurmax
FINTANTQUE
imprimer le vecteur y
La méthode de Gauss-Seidel
 Pour
accélérer le taux de convergence pourquoi ne
pas insérer les nouvelles estimations dans les équations suivantes pour donner
X 1k 1
C1  (a12 X 2k  a13 X 3k    a1n X nk )

a11
X 2k 1
C2  (a21 X 1k 1  a23 X 3k    a2 n X nk )

a22

X nk 1
Cn  (an1 X 1k 1  an 2 X 2k 1    ann1 X nk11 )

ann
La méthode de Gauss-Seidel
 Algorithme
de Gauss-Seidel (une itération)
GaussSeidel(int dim,float **a, float *c, float *x, float *y)
/* x contient l’estimation actuelle de la solution
y contient la nouvelle estimation de la solution */
POUR i allant de 1 à dim FAIRE
y[i] = c[i]
POUR j allant de 1 à i-1 FAIRE
y[i] = y[i]- a[i,j] * y[j]
FIN POUR
POUR j allant de i+1 à dim FAIRE
y[i] = y[i]- a[i,j] * x[j]
FIN POUR
y[i] = y[i]/ a[i,i]
FIN POUR
Considérations sur la convergence
 Pour
que les méthodes de Jacobi et Gauss-Seidel
convergent il faut que la condition suivante soit
respectée
N
aii   aij
j 1
j i
i  1,2,  , N
Considérations sur la convergence
 Quand
cette condition est vraie, les algorithmes
itératifs convergent vers la solution indépendamment du choix du vecteur solution x1 initial
 Une matrice des coefficients qui possède cette
propriété est appelée matrice à diagonale dominante
 Lorsque la matrice a ne respecte pas cette condition nous pouvons permuter des rangées de façon à
respecter cette condition
Considérations sur la convergence
 Si
nous avons un système de 2 inconnus de la
forme
a11 X 1  a12 X 2  C1
a21 X 1  a22 X 2  C2
 Nous pouvons isoler les inconnus
X 1k 1
X
k 1
2
C1  a12 X 2k

a11
C2  a21 X 1k 1

a22
Considérations sur la convergence
 Exemple
graphique (Cas convergent)
Considérations sur la convergence
 Exemple
graphique (Cas divergent)
Travail pratique 1 c
 Le
système d’équations contenu dans le fichier
tp1b_data ne possède pas une matrice des coefficients à diagonale dominante
 Même après permutation de rangées le système ne
converge toujours pas
 Utilisez alors le système d’équations qui est dans le
fichier tp1c_data
 Ce système possède une matrice a à diagonale
dominante
Examen 1
 Les
erreurs sur les calculs par ordinateur
– Comprendre le concept du epsilon de la machine
– Comprendre les sources d’erreurs (représentation,
propagation des erreurs)
 Résolution
de système d’équations linéaires
– Comprendre l’algorithme d’élimination de Gauss
– Voir comment pourrait être améliorer l’efficacité de
l’algorithme dans le cas où nous savons que la
matrice des coefficients a est symétrique
Examen 1
 Résolution
de système d’équations linéaires
– Système avec une matrice a symétrique
 a11
a
 21
 

 an1
a12
a22

an 2
aij  a ji




a1n C1 
a2 n C2 
  

ann Cn 
Examen 1
 Résolution
de système d’équations linéaires
(méthodes itératives)
– Comprendre le fonctionnement de l’algorithme de
Gauss-Seidel
– Voir comment l’efficacité de cet algorithme pourrait être améliorée sachant que la matrice des coefficients a est tridiagonale
Examen 1
 Résolution
de système d’équations linéaires
(méthodes itératives)
– Système d’équations avec une matrice a
0
0
0
tridiagonale  a11 a12
a
 21
 0

 0

 0
a22
a23
0
0
a32
0
a33
a43
a34
a44
0
a45
0
0
a54
a55
aij  0
i  1,2,...., n 
j  i  1, i, i  1
1 j  n
C1 
C2 

C3 

C4 
C5 

Un peu de C
 Lecture
de données à partir du clavier
float valeur;
printf(`` \n Introduisez un nombre en simple precision:``);
scanf(``%f``,&valeur);
 Mise
à la puissance d’un nombre
float res;
int i;
i=10;
res = (float)(pow(2.0,(double)(i)));
Téléchargement