Vous êtes sur la page 1sur 15

Cours de Laboratoire de Calcul Numérique dispensé par Mme Buseyne durant l’année 2003-2004 à la Helho Laboratoire N°3 sur les résolutions de systèmes d’équations

Résolution de systèmes d’équations linéaires par la méthode de Jacobi et par la méthode de Gauss-Seidel

I.

Enoncé

1. Enoncé du problème

Soit à résoudre un système linéaire de n équations à n inconnues A x =b A=(a ij ), 1i, j n est une matrice n x n et x et b sont des vecteurs colonnes de dimension n. La résolution d’un système linéaire, si elle est possible, revient à l’inversion de la matrice A (det A 0) c’est-à-dire x=A -1 b.

2. Méthodes itératives

Une méthode itérative pour résoudre un système linéaire Ax=b consiste à utiliser une approximation x (0) pour construire une suite de vecteurs x (1) , x (2) , … qui converge vers la solution x. Dans la pratique, les méthodes itératives sont rarement utilisées pour résoudre les systèmes linéaires de petites dimensions car, dans ce cas, elles sont généralement plus coûteuses que les méthodes directes. Toutefois, ces méthodes s'avèrent efficaces (en termes de coût) dans les cas où le système linéaire Ax=b est de grande dimension et contient un grand nombre de coefficients nuls. (On dit alors que la matrice A est creuse ). 2.1. Méthode de Jacobi

Soit le système suivant de 3 équations à 3 inconnues :

Soit le système suivant de 3 équations à 3 inconnues : On résout le système de

On résout le système de la manière suivante :

inconnues : On résout le système de la manière suivante : , , . Si ces
,
,
,
,
: On résout le système de la manière suivante : , , . Si ces valeurs

. Si ces valeurs sont portées au second membre de la solution précédente, on obtient :

On donne aux inconnues les valeurs arbitraires initiales

Cours de Laboratoire de Calcul Numérique dispensé par Mme Buseyne durant l’année 2003-2004 à la Helho Laboratoire N°3 sur les résolutions de systèmes d’équations

N°3 sur les résolutions de systèmes d’équations Ce nouvel ensemble porté dans le second membre des

Ce nouvel ensemble porté dans le second membre des équations précédentes donne un autre

, On arrête les calculs lorsque les valeurs successives de x j sont suffisamment voisines.

Pour cela, on peut utiliser, le critère de Convergence absolue :

2.2. Méthode de Gauss-Seidel On reprend le calcul comme précédemment. Pour le système précédent par exemple, on choisit

un ensemble de valeurs

ensemble ,

par exemple, on choisit un ensemble de valeurs ensemble , , et ainsi de suite. ,
par exemple, on choisit un ensemble de valeurs ensemble , , et ainsi de suite. ,
par exemple, on choisit un ensemble de valeurs ensemble , , et ainsi de suite. ,

, et ainsi de suite.

un ensemble de valeurs ensemble , , et ainsi de suite. , , . On porte
, ,
,
,
.
.

On porte

etde valeurs ensemble , , et ainsi de suite. , , . On porte dans la

valeurs ensemble , , et ainsi de suite. , , . On porte et dans la

dans la 1 ère équation et on obtient :

On porte et dans la 1 è r e équation et on obtient : C’est cette

C’est cette nouvelle valeur de x 1 , et non pas donnant :

cette nouvelle valeur de x 1 , et non pas donnant : De même dans la

De même dans la 3 ème équation, on porte

: De même dans la 3 è m e équation, on porte , qui est portée
: De même dans la 3 è m e équation, on porte , qui est portée
: De même dans la 3 è m e équation, on porte , qui est portée

, qui est portée dans la 2 ème équation du système,

et

est portée dans la 2 è m e équation du système, et , et non et

, et non

dans la 2 è m e équation du système, et , et non et , et

et

, et on obtient :dans la 2 è m e équation du système, et , et non et Lorsqu’une inconnue

Lorsqu’une inconnue est utilisée, c’est automatiquement la plus récente valeur calculée. Ceci assure une convergence des calculs bien plus rapide que la méthode de JACOBI. On arrête les calculs lorsque les valeurs successives de x j sont suffisamment voisines.

Pour cela, on peut utiliser, le critère de Convergence absolue :

3. Méthodes directes

Ces méthodes donnent directement la solution exacte aux erreurs d’arrondi près, elles aboutissent à la solution en un nombre fini d’opérations. 3.1. Méthodes d’inversion par pivot de Gauss

3.1.1. Opérations élémentaires

par pivot de Gauss 3.1.1. Opérations élémentaires Les opérations élémentaires sur les matrices et les

Les opérations élémentaires sur les matrices et les déterminants sont les suivantes :

multiplication d'une ligne par un nombre non nul : l i s*l i où s est un scalaire

ajout d'une ligne à une autre : l i l i + s*l j

permutation de deux lignes : l i l j .

Cours de Laboratoire de Calcul Numérique dispensé par Mme Buseyne durant l’année 2003-2004 à la Helho Laboratoire N°3 sur les résolutions de systèmes d’équations

3.1.2. Méthode de la matrice inverse

Les matrices qui correspondent à des opérations élémentaires sont toutes inversibles. Cela permet de calculer l'inverse d'une matrice en ne faisant que les opérations élémentaires définies ci-dessus.

Pour résoudre un système linéaire Ax=y :

1. on applique n fois l’algorithme d’échange au système de n équations à n inconnues pour

trouver la matrice inverse.

Algorithme d’échange :

Il consiste à échanger les x i et les y i et donc faire passer les x i au second membre et les y j au premier membre du système.

a. Prendre un pivot (en général, le coefficient a ij le plus grand en valeur absolue. Cela pour réduire les erreurs d’arrondi).

b. Echanger le x i et le y j correspondant à la colonne et à la ligne du pivot. Pour cela :

le pivot est remplacé par son inverse

les autres éléments de la ligne du pivot sont changés de signe et divisés par le pivot

les autres éléments de la colonne du pivot sont divisés par le pivot

les autres éléments sont remplacés par (élément*pivot – produit des éléments croisés) / pivot.

2. On calcule les x i en utilisant l’équation suivante :

n

x i = c ik y k où c ik sont les coefficients de la matrice inverse remis dans le bon ordre.

k=1

Exemple : voir cours

3.1.3. Méthode de Gauss

Pour triangulariser (avoir tous des 0 en-dessous de la diagonale ou tous des 0 au-dessus de la diagonale) le système Ax = y, on utilise les opérations élémentaires. Si A est une matrice n*n, il y a n -1 étapes pour la triangularisation du système :

étape 1 :

considérer le terme a 11 de la première ligne (ce terme est appelé pivot, s'il est nul voir 1 ), la soustraire aux n -1 restantes autant de fois que nécessaire (c’est-à-dire en la multipliant par a i 1 / a 11 ) de façon que les a i 1 "disparaissent", et ce pour i de 2 à n . Le système obtenu est équivalent au précédent. étape 2 :

recommencer avec la sous-matrice (n-1)*(n-1) et le pivot a 22 étape k :

recommencer avec la sous-matrice (n-k+1)*(n-k+1) et le pivot a kk

jusqu'à n-1. Exemple : voir cours

3.2. Méthode de Jordan

1 Si à la suite de soustractions on obtient un zéro sur la diagonale (pivot nul), il faut échanger deux lignes (on choisira celle du pivot optimal c'est-à-dire le plus grand en valeur absolue). Si on ne trouve aucun élément non nul dans la colonne du pivot alors c'est que le système est singulier. Votre programme doit alors s'arrêter proprement.

Cours de Laboratoire de Calcul Numérique dispensé par Mme Buseyne durant l’année 2003-2004 à la Helho Laboratoire N°3 sur les résolutions de systèmes d’équations

Principe :

L’algorithme consiste à remplacer le système initial par un autre dont la matrice est diagonale et dont la solution est immédiate. Une matrice diagonale est une matrice dont tous les éléments autres que ceux de la diagonale sont nuls.

Le système initial:

a 11 x 1 + a 12 x 2 + … + a 1n x n = y 1 a 21 x 1 + a 22 x 2 + … + a 2n x n = y 2

a 1n x 1 + a 2n x 2 + … + a nn x n = y n

Est donc transformé en système suivant :

a 11 x 1 + a 12 x 2 + … + a 1n x n - y 1 x n+1 = 0

a 21 x 1 + a 22 x 2 + … + a 2n x n - y 2 x n+1 = 0

a 1n x 1 + a 2n x 2 + … + a nn x n - y n x n+1 = 0

x n+1 = 1

On utilise à nouveau l’algorithme d’échange sur le système transformé, mais on supprime les y j inutiles (seule la colonne y n+1 est utile, puisque les autres y j sont nuls après transformation du système initial).

Exercice :

Résoudre par jacobi et par Gauss-Seidel le système d’équations suivant avec une précision de

0,001:

5 x1+4 x2=−2

x15 x25 x3=0

x25

x3+2 x4=0

x35

x4=0

Cours de Laboratoire de Calcul Numérique dispensé par Mme Buseyne durant l’année 2003-2004 à la Helho Laboratoire N°3 sur les résolutions de systèmes d’équations

II. Résolution sur papier

A. Méthode de Jacobi

i

x1

x2

x3

x4

 

0

0

0

0

0

1

0,4

0

0

0

2

0,4

0,08

0

0

3

0,464

0,08

0,016

0

4

0,464

0,0896

0,016

0,0032

5

0,47168

0,0896

0,0192

0,0032

6

0,47168

0,090496

0,0192

0,00384

7

0,4723968

0,090496

0,0196352

0,00384

8

0,4723968

0,09055232

0,0196352

0,00392704

9

0,47244186

0,09055232

0,01968128

0,00392704

10

0,47244186

0,09055212

0,01968128

0,00393626

11

0,47244169

0,09055212

0,01968493

0,00393626

12

0,47244169

0,09055135

0,01968493

0,00393699

13

0,47244108

0,09055135

0,01968506

0,00393699

14

0,47244108

0,0905512

0,01968506

0,00393701

15

0,47244096

0,0905512

0,01968505

0,00393701

16

0,47244096

0,09055118

0,01968505

0,00393701

17

0,47244095

0,09055118

0,01968504

0,00393701

18

0,47244095

0,09055118

0,01968504

0,00393701

19

0,47244095

0,09055118

0,01968504

0,00393701

20

0,47244095

0,09055118

0,01968504

0,00393701

i

prec x1

prec x2

prec x3

prec x4

résultat

0

         

1

0,4

0

0

0

FAUX

2

0

0,08

0

0

FAUX

3

0,064

0

0,016

0

FAUX

4

0

0,0096

0

0,0032

FAUX

5

0,00768

0

0,0032

0

FAUX

6

0

0,000896

0

0,00064

VRAI

7

0,0007168

0

0,0004352

0

VRAI

8

0

5,632E-05

0

0,00008704

VRAI

9

4,5056E-05

0

4,608E-05

0

VRAI

10

0

2,048E-07

0

9,216E-06

VRAI

11

1,6384E-07

0

3,6454E-06

0

VRAI

12

0

7,6186E-07

0

7,2909E-07

VRAI

13

6,0948E-07

0

1,3926E-07

0

VRAI

14

0

1,4975E-07

0

2,7853E-08

VRAI

15

1,198E-07

0

1,8809E-08

0

VRAI

16

0

2,0198E-08

0

3,7618E-09

VRAI

17

1,6159E-08

0

5,5443E-09

0

VRAI

18

0

2,1228E-09

0

1,1089E-09

VRAI

19

1,6983E-09

0

8,6812E-10

0

VRAI

20

0

1,6603E-10

0

1,7362E-10

VRAI

Cours de Laboratoire de Calcul Numérique dispensé par Mme Buseyne durant l’année 2003-2004 à la Helho Laboratoire N°3 sur les résolutions de systèmes d’équations

B. Méthode de Gauss-Seidel

i

x1

x2

x3

x4

 

0

0

0

0

0

1

0,4

0,08

0,016

0,0032

2

0,464

0,0896

0,0192

0,00384

3

0,47168

0,090496

0,0196352

0,00392704

4

0,4723968

0,09055232

0,01968128

0,00393626

5

0,47244186

0,09055212

0,01968493

0,00393699

6

0,47244169

0,09055135

0,01968506

0,00393701

7

0,47244108

0,0905512

0,01968505

0,00393701

8

0,47244096

0,09055118

0,01968504

0,00393701

9

0,47244095

0,09055118

0,01968504

0,00393701

10

0,47244095

0,09055118

0,01968504

0,00393701

11

0,47244094

0,09055118

0,01968504

0,00393701

12

0,47244094

0,09055118

0,01968504

0,00393701

13

0,47244094

0,09055118

0,01968504

0,00393701

14

0,47244094

0,09055118

0,01968504

0,00393701

15

0,47244094

0,09055118

0,01968504

0,00393701

16

0,47244094

0,09055118

0,01968504

0,00393701

17

0,47244094

0,09055118

0,01968504

0,00393701

18

0,47244094

0,09055118

0,01968504

0,00393701

19

0,47244094

0,09055118

0,01968504

0,00393701

20

0,47244094

0,09055118

0,01968504

0,00393701

i

prec x1

prec x2

prec x3

prec x4

résultat

0

         

1

0,4

0,08

0,016

0,0032

FAUX

2

0,064

0,0096

0,0032

0,00064

FAUX

3

0,00768

0,000896

0,0004352

0,00008704

FAUX

4

0,0007168

5,632E-05

4,608E-05

9,216E-06

VRAI

5

4,5056E-05

2,048E-07

3,6454E-06

7,2909E-07

VRAI

6

1,6384E-07

7,6186E-07

1,3926E-07

2,7853E-08

VRAI

7

6,0948E-07

1,4975E-07

1,8809E-08

3,7618E-09

VRAI

8

1,198E-07

2,0198E-08

5,5443E-09

1,1089E-09

VRAI

9

1,6159E-08

2,1228E-09

8,6812E-10

1,7362E-10

VRAI

10

1,6983E-09

1,6603E-10

1,0266E-10

2,0531E-11

VRAI

11

1,3283E-10

6,0339E-12

9,4192E-12

1,8838E-12

VRAI

12

4,8271E-12

9,1842E-13

5,6985E-13

1,1397E-13

VRAI

13

7,3475E-13

2,6092E-13

6,5954E-15

1,3193E-15

VRAI

14

2,0872E-13

4,0426E-14

8,6146E-15

1,7226E-15

VRAI

15

3,2363E-14

4,7462E-15

1,6376E-15

3,2786E-16

VRAI

16

3,7748E-15

4,3021E-16

2,1511E-16

4,2501E-17

VRAI

17

3,3307E-16

2,7756E-17

2,4286E-17

5,2042E-18

VRAI

18

5,5511E-17

0

0

0

VRAI

19

0

0

0

0

VRAI

20

0

0

0

0

VRAI

Cours de Laboratoire de Calcul Numérique dispensé par Mme Buseyne durant l’année 2003-2004 à la Helho Laboratoire N°3 sur les résolutions de systèmes d’équations

III.

Organigramme

Tableau des entrées et sorties de la fonction principale :

Nom

Type

Description

NbrEqMax

define

Nombre d’équations maximal

i

int

Nombre pour l’incrémentation

j

int

Nombre pour l’incrémentation

k

int

Nombre pour l’incrémentation

NbrEq

int

Nombre d’équations entrées par l’utilisateur

choix

int

Nombre pour choisir une opération dans le menu

cpt

int

Compteur d’itérations

flag

int

Un drapeau de vérification de test

teq[NbrEqMax][ NbrEqMax]

float

Tableau d’équations

ti[NbrEqMax][ NbrEqMax]

float

Termes indépendants des équations

EqTransfo[NbrEqMax] [ NbrEqMax]

float

Tableau des équations transformées pour traitement

prec[NbrEqMax]

float

Tableau contenant la précision sur chaque mesure

jacobi[2][ NbrEqMax]

float

Tableau de calcul pour la méthode de Jacobi

gs[2][ NbrEqMax]

float

Tableau de calcul pour la méthode de Gauss-Seidel

precision

float

Précision à respecter pour le traitement

DEBUT i=0 i<nl i++ j=0 j<nl j++ EqTransfo[i][j]=0 teq[i][j]=0 EqTransfo[i][NbrEqMax]=0 ti[i]=0
DEBUT
i=0
i<nl
i++
j=0
j<nl
j++
EqTransfo[i][j]=0
teq[i][j]=0
EqTransfo[i][NbrEqMax]=0
ti[i]=0
precision=0 Lire choix oui choix!=0 non FIN
precision=0
Lire choix
oui
choix!=0
non
FIN

1

2

3

Selon choix :

4

5

0

default

1 Lire precision 3 4 5 Afficher fin du programme Afficher erreur
1
Lire precision
3
4
5
Afficher fin du programme
Afficher erreur

Cours de Laboratoire de Calcul Numérique dispensé par Mme Buseyne durant l’année 2003-2004 à la Helho Laboratoire N°3 sur les résolutions de systèmes d’équations

1 Lire NbrEq i=0 i<NbrEq i++ j=0 j<NbrEq j++ Lire teq[i][j] Lire ti[i]
1
Lire NbrEq
i=0
i<NbrEq
i++
j=0
j<NbrEq
j++
Lire teq[i][j]
Lire ti[i]
i++ j=0 j<NbrEq j++ Lire teq[i][j] Lire ti[i] j=0 j<NbrEq j++ non oui i != j
j=0 j<NbrEq j++ non oui i != j EqTransfo[i][j] = EqTransfo[i][j] - teq [i][j] /
j=0
j<NbrEq
j++
non
oui
i != j
EqTransfo[i][j] = EqTransfo[i][j] - teq [i][j] / teq[i][i]
EqTransfo[i][NbrEq] = EqTransfo[i][NbrEq] - ti [j] / teq[i][i]
i=0 i<NbrEq i++
i=0
i<NbrEq
i++
/1
/1
- ti [j] / teq[i][i] i=0 i<NbrEq i++ /1 5 void AfficheSystemeTransform (float
5
5
- ti [j] / teq[i][i] i=0 i<NbrEq i++ /1 5 void AfficheSystemeTransform (float

void AfficheSystemeTransform (float EqTransfo[NbrEqMax][NbrEqMax], int nl);

(float EqTransfo[NbrEqMax][NbrEqMax], int nl); void AfficheSysteme (float teq[NbrEqMax][NbrEqMax], float ti
(float EqTransfo[NbrEqMax][NbrEqMax], int nl); void AfficheSysteme (float teq[NbrEqMax][NbrEqMax], float ti
(float EqTransfo[NbrEqMax][NbrEqMax], int nl); void AfficheSysteme (float teq[NbrEqMax][NbrEqMax], float ti
(float EqTransfo[NbrEqMax][NbrEqMax], int nl); void AfficheSysteme (float teq[NbrEqMax][NbrEqMax], float ti
(float EqTransfo[NbrEqMax][NbrEqMax], int nl); void AfficheSysteme (float teq[NbrEqMax][NbrEqMax], float ti
(float EqTransfo[NbrEqMax][NbrEqMax], int nl); void AfficheSysteme (float teq[NbrEqMax][NbrEqMax], float ti
(float EqTransfo[NbrEqMax][NbrEqMax], int nl); void AfficheSysteme (float teq[NbrEqMax][NbrEqMax], float ti

void AfficheSysteme (float teq[NbrEqMax][NbrEqMax], float ti [NbrEqMax], int nl);

AfficheSysteme (float teq[NbrEqMax][NbrEqMax], float ti [NbrEqMax], int nl); /5 Pierre Liétar Page 8/15 13/12/2003
AfficheSysteme (float teq[NbrEqMax][NbrEqMax], float ti [NbrEqMax], int nl); /5 Pierre Liétar Page 8/15 13/12/2003
AfficheSysteme (float teq[NbrEqMax][NbrEqMax], float ti [NbrEqMax], int nl); /5 Pierre Liétar Page 8/15 13/12/2003
AfficheSysteme (float teq[NbrEqMax][NbrEqMax], float ti [NbrEqMax], int nl); /5 Pierre Liétar Page 8/15 13/12/2003
/5
/5

Cours de Laboratoire de Calcul Numérique dispensé par Mme Buseyne durant l’année 2003-2004 à la Helho Laboratoire N°3 sur les résolutions de systèmes d’équations

3 i=0 i<2 i++ j=0 j<NbrEq j++ jacobi [i][j] = 0 flag = 0 cpt
3
i=0
i<2
i++
j=0
j<NbrEq
j++
jacobi [i][j] = 0
flag = 0
cpt = 0
flag==0
i=0
i<NbrEq
i++
j=0
j<NbrEq
j++
jacobi [1][i] = jacobi [1][i] + EqTransfo[i][j] * jacobi[0][j]
jacobi[1][i] = jacobi[1][i] + EqTransfo[i][NbrEq]
prec [i] = | jacobi [1][i] - jacobi [0][i] |
prec[0] < precision
et prec[1] < precision
et prec[2] < precision
et prec[3] < precision
flag = 1
i=0
i<2
i++
jacobi [0][i] = jacobi [1][i]
jacobi [1][i] = 0
i++ jacobi [0][i] = jacobi [1][i] jacobi [1][i] = 0 void AfficheSystemeTransform (EqTransfo, nl) i=0
i++ jacobi [0][i] = jacobi [1][i] jacobi [1][i] = 0 void AfficheSystemeTransform (EqTransfo, nl) i=0
i++ jacobi [0][i] = jacobi [1][i] jacobi [1][i] = 0 void AfficheSystemeTransform (EqTransfo, nl) i=0

void AfficheSystemeTransform (EqTransfo, nl)

i=0 i<NbrEq i++ Afficher i , jacobi [0][i] Afficher cpt / 3
i=0
i<NbrEq
i++
Afficher i , jacobi [0][i]
Afficher cpt
/ 3

Cours de Laboratoire de Calcul Numérique dispensé par Mme Buseyne durant l’année 2003-2004 à la Helho Laboratoire N°3 sur les résolutions de systèmes d’équations

4 i=0 i<2 i++ j=0 j<NbrEq j++ gs [i][j] = 0 flag = 0 cpt
4
i=0
i<2
i++
j=0
j<NbrEq
j++
gs [i][j] = 0
flag = 0
cpt = 0
flag==0
i=0
i<NbrEq
i++
j=0
j<NbrEq
j++
gs [1][i] = gs [1][i] + EqTransfo[i][j] * gs[0][j]
gs [1][i] = gs [1][i] + EqTransfo[i][NbrEq]
prec [i] = | gs [1][i] - gs [0][i] |
gs [0][i] = gs [1][i]
prec[0] < precision
et prec[1] < precision
et prec[2] < precision
et prec[3] < precision
flag = 1
i=0
i<2
i++
jacobi [1][i] = 0
precision flag = 1 i=0 i<2 i++ jacobi [1][i] = 0 void AfficheSystemeTransform (EqTransfo, nl) i=0
precision flag = 1 i=0 i<2 i++ jacobi [1][i] = 0 void AfficheSystemeTransform (EqTransfo, nl) i=0
precision flag = 1 i=0 i<2 i++ jacobi [1][i] = 0 void AfficheSystemeTransform (EqTransfo, nl) i=0

void AfficheSystemeTransform (EqTransfo, nl)

i=0 i<NbrEq i++ Afficher i , gs [0][i] Afficher cpt / 4
i=0
i<NbrEq
i++
Afficher i , gs [0][i]
Afficher cpt
/ 4

Cours de Laboratoire de Calcul Numérique dispensé par Mme Buseyne durant l’année 2003-2004 à la Helho Laboratoire N°3 sur les résolutions de systèmes d’équations

N°3 sur les résolutions de systèmes d’équations void AfficheSystemeTransform (float
N°3 sur les résolutions de systèmes d’équations void AfficheSystemeTransform (float

void AfficheSystemeTransform (float EqTransfo[NbrEqMax][NbrEqMax], int nl)

(float EqTransfo[NbrEqMax][NbrEqMax], int nl) int i, j; i=0 i<nl i++ Afficher X i+1 j=0 j<nl
(float EqTransfo[NbrEqMax][NbrEqMax], int nl) int i, j; i=0 i<nl i++ Afficher X i+1 j=0 j<nl
(float EqTransfo[NbrEqMax][NbrEqMax], int nl) int i, j; i=0 i<nl i++ Afficher X i+1 j=0 j<nl
(float EqTransfo[NbrEqMax][NbrEqMax], int nl) int i, j; i=0 i<nl i++ Afficher X i+1 j=0 j<nl
int i, j; i=0 i<nl i++ Afficher X i+1 j=0 j<nl j++ Afficher EqTransfo [i][j]
int i, j;
i=0
i<nl
i++
Afficher X i+1
j=0
j<nl
j++
Afficher EqTransfo [i][j] j+1
X i+1 j=0 j<nl j++ Afficher EqTransfo [i][j] j+1 / void AfficheSystemeTransform (float
X i+1 j=0 j<nl j++ Afficher EqTransfo [i][j] j+1 / void AfficheSystemeTransform (float
X i+1 j=0 j<nl j++ Afficher EqTransfo [i][j] j+1 / void AfficheSystemeTransform (float

/ void AfficheSystemeTransform (float EqTransfo[NbrEqMax][NbrEqMax], int nl)

(float EqTransfo[NbrEqMax][NbrEqMax], int nl) void AfficheSysteme (float teq[NbrEqMax][NbrEqMax], float ti
(float EqTransfo[NbrEqMax][NbrEqMax], int nl) void AfficheSysteme (float teq[NbrEqMax][NbrEqMax], float ti

void AfficheSysteme (float teq[NbrEqMax][NbrEqMax], float ti [NbrEqMax], int nl)

(float teq[NbrEqMax][NbrEqMax], float ti [NbrEqMax], int nl) int i, j; Afficher \n i=0 i<nl i++ Afficher
(float teq[NbrEqMax][NbrEqMax], float ti [NbrEqMax], int nl) int i, j; Afficher \n i=0 i<nl i++ Afficher
int i, j; Afficher \n i=0 i<nl i++ Afficher X i+1 Afficher ti \n i=0
int i, j;
Afficher \n
i=0
i<nl
i++
Afficher X i+1
Afficher ti \n
i=0
i<nl
i++
j=0
j<nl
j++
Afficher teq[i][j]
Afficher |
non
oui
i==0
Afficher | ti [i] |
Afficher = | ti [i] |
non oui i==0 Afficher | ti [i] | Afficher = | ti [i] | / void
non oui i==0 Afficher | ti [i] | Afficher = | ti [i] | / void
non oui i==0 Afficher | ti [i] | Afficher = | ti [i] | / void

/ void AfficheSysteme (float teq[NbrEqMax][NbrEqMax], float ti [NbrEqMax], int nl)

Cours de Laboratoire de Calcul Numérique dispensé par Mme Buseyne durant l’année 2003-2004 à la Helho Laboratoire N°3 sur les résolutions de systèmes d’équations

IV. Code source

// laboratoire de calcul numérique 3.

// Editeur : TextPad // Pierre Liétar

Compilateur : DJGPP

#include <stdio.h>

#include <conio.h>

#include <math.h>

#define NbrEqMax 10

/**************************************************************

***

**************************************************************/

D‚finition des prototypes.

***

void AfficheSystemeTransform ( float EqTransfo[NbrEqMax][NbrEqMax+1], int nl); void AfficheSysteme ( float teq[NbrEqMax][NbrEqMax], float ti[NbrEqMax], int nl);

/**************************************************************

***

**************************************************************/

Fonction principale

***

void main()

{

// Déclaration des variables. int i, j, k, NbrEq, choix, cpt, flag; float teq[NbrEqMax][NbrEqMax], EqTransfo[NbrEqMax][NbrEqMax+1], ti[NbrEqMax], prec[NbrEqMax], jacobi[2][NbrEqMax], gs[2][NbrEqMax], precision;

// Initialisation du tableau des ‚quations … 0 et de la matrice des termes ind‚pendants … 0 // Et initialisation de la matrice de transformation … 0 for (i=0;i<NbrEqMax;i++)

{

 

for (j=0;j<NbrEqMax;j++)

{

EqTransfo[i][j]=0;

teq[i][j]=0;

}

EqTransfo[i][NbrEqMax]=0;

ti[i]=0;

}

// Initialisation de la pr‚cision

precision=0.01;

// Menu du programme do{

clrscr(); printf("\n\n\n1. Entrer la matrice."); printf("\n2. Entrer la pr‚cision"); printf("\n3. Executer Jacobi"); printf("\n4. Executer Gauss-Seidel"); printf("\n5. Afficher de la pr‚cision des m‚thodes, des ‚quations et de la matrice"); printf("\n\n0. Quitter"); printf("\n\nVotre choix : ");

scanf ("%d", & choix);

switch (choix)

{

case 1 :

//Demande du nbre d'‚quations. printf("\nDe combien d'‚quations sera constitue le systŠme d'‚quations? "); scanf("%d", &NbrEq);

Cours de Laboratoire de Calcul Numérique dispensé par Mme Buseyne durant l’année 2003-2004 à la Helho Laboratoire N°3 sur les résolutions de systèmes d’équations

terme indep‚ndant i

i");

// entr‚e des n ‚quations pour i allant de 1 a n de la forme a*x1 + b*x2 +

+ o*xn =

printf("\nChaque ‚quation est de la forme : a*x1 + b*x2 +

+ o*xn = terme ind‚pendant

for (i=0;i<NbrEq;i++)

{

printf("\nEntrez l'‚quation %d : ", i+1); for (j=0;j<NbrEq;j++)

{

printf("\nEntrez l'‚l‚ment en X%d de l'‚quation %d : ", j+1, i+1); scanf("%f",&teq[i][j]);

}

printf("\nEntrez le terme ind‚pendant de l'‚quation %d : ", i+1); scanf("%f",&ti[i]);

}

// transformation de l'‚quation pour les diff‚rentes m‚thodes sous la forme x1 = a*x2 +

+ o*xn + terme ind‚pendant

for (i=0;i<NbrEq;i++)

{

for (j=0;j<NbrEq;j++)

if (i!=j)

EqTransfo[i][j]=-teq[i][j]/teq[i][i];

EqTransfo[i][NbrEq]=ti[i]/teq[i][i];

}

break; case 2 : // Entr‚e de la pr‚cision printf("\n\nEntrez la pr‚cision avec laquelle vous voulez op‚rer : "); scanf ("%f",&precision); break; case 3 : // Jacobi // Initialisation du tableau de calcul … 0.

for(i=0;i<2;i++)

flag=cpt=0;

for(j=0;j<NbrEq;j++)

jacobi[i][j]=0;

// Traitement

while (flag==0)

{

for(i=0;i<NbrEq;i++)

{

for(j=0;j<NbrEq;j++)

jacobi[1][i]+=EqTransfo[i][j]*jacobi[0][j];

jacobi[1][i]+=EqTransfo[i][NbrEq];

prec[i]=fabs(jacobi[1][i]-jacobi[0][i]);

}

cpt++;

if (prec[0]<precision&&prec[1]<precision&&prec[2]<precision&&prec[3]<precision)

flag=1;

for(i=0;i<NbrEq;i++)

{

jacobi[0][i]=jacobi[1][i];

jacobi[1][i]=0;

}

}

// Affichage du résultat pour Jacobi clrscr(); printf("Pour une pr‚cision de %f, la valeur des diff‚rents X pour les \n‚quations suivantes : \n\n", precision); AfficheSystemeTransform (EqTransfo, NbrEq); printf("\n\n\test : \n");

for(i=0;i<NbrEq;i++)

printf("X%d = %f\n", i, jacobi[0][i]); printf("\n\nen %d tours", cpt);

getch();

break;

case 4 : //Gauss-Seidel

// Initialisation du tableau de calcul … 0.

for(i=0;i<2;i++)

for(j=0;j<NbrEq;j++)

gs[i][j]=0;

Cours de Laboratoire de Calcul Numérique dispensé par Mme Buseyne durant l’année 2003-2004 à la Helho Laboratoire N°3 sur les résolutions de systèmes d’équations

flag=cpt=0;

while (flag==0)

{

for(i=0;i<NbrEq;i++)

{

for(j=0;j<NbrEq;j++)

gs[1][i]+=EqTransfo[i][j]*gs[0][j];

gs[1][i]+=EqTransfo[i][NbrEq];

prec[i]=fabs(gs[1][i]-gs[0][i]);

gs[0][i]=gs[1][i];

}

cpt++;

if (prec[0]<precision&&prec[1]<precision&&prec[2]<precision&&prec[3]<precision)

flag=1;

for(i=0;i<NbrEq;i++)

gs[1][i]=0;

}

// Affichage du résultat pour Gauss-Seidel clrscr(); printf("Pour une pr‚cision de %f, la valeur des diff‚rents X pour les \n‚quations suivantes : \n\n", precision); AfficheSystemeTransform (EqTransfo, NbrEq); printf("\n\n\test : \n");

for(i=0;i<NbrEq;i++)

printf("X%d = %f\n", i, gs[0][i]); printf("\n\nen %d tours", cpt);

getch();

break;

case 5 : // Affichage de la matrice et de la pr‚cision. printf("\n\nLa pr‚cision demand‚e pour les m‚thodes est de : %f\n\nLes ‚quations sont :

\n", precision);

AfficheSystemeTransform (EqTransfo, NbrEq); printf("\net sont tir‚es du systŠme donn‚ par les matrices suivantes : \n"); AfficheSysteme( teq, ti, NbrEq); getch(); break;

case 0 : // Fin du programme printf ("\nfin du programme"); getch(); break;

default : // Mauvais choix printf("\n\n Mauvaise entr‚e, ce choix n'existe pas! Veuillez recommencer.");

}

}while (choix!=0);

}

/**************************************************************

***

**************************************************************/

Fonctions secondaires.

***

// fonction d'affichage de la matrice transform‚e.

void AfficheSystemeTransform ( float EqTransfo[NbrEqMax][NbrEqMax+1], int nl)

{

 

int i, j;

for(i=0;i<nl;i++)

{

printf("\nX%d = ", i+1);

for(j=0;j<nl;j++)

printf ("%2.3f X%d + ", EqTransfo[i][j], j+1); printf("%2.3f", EqTransfo[i][nl]);

}

getch();

}

// fonction d'affichage de la matrice de d‚part (telle quelle apres introdution). void AfficheSysteme ( float teq[NbrEqMax][NbrEqMax], float ti[NbrEqMax], int nl)

Cours de Laboratoire de Calcul Numérique dispensé par Mme Buseyne durant l’année 2003-2004 à la Helho Laboratoire N°3 sur les résolutions de systèmes d’équations

{

 

int i, j; printf("\n

");

for (i=0;i<nl;i++)

 
 

printf("X%d

", i+1);

 

printf(" TI\n");

for(i=0;i<nl;i++)

{

 

printf("\nX%2d

| ", i+1);

for(j=0;j<nl;j++)

printf ("%2.4f ", teq[i][j]); printf(" | ");

if (i==0)

{

printf(" = "); printf(" | %2.4f |", ti[i]);

}

else printf("

| %2.4f |", ti[i]);

 

}

getch();

}