Vous êtes sur la page 1sur 2

Master ISMA 2012-2013 Programmation orientee objets, langage Java

4. Le retour de la methode de Gauss


Le but de cet exercice est lecriture dune classe SystemeLineaire pour memoriser et resoudre des sys-
t`emes dequations lineaires
1
. Une instance de cette classe represente un tel syst`eme ; elle comporte les variables
(dinstance, privees) suivantes :
la dimension n du syst`eme,
la matrice `a n lignes et n + 1 colonnes formee des coecients et du second membre du syst`eme,
la precision (un pivot p veriant |p| < doit etre considere comme nul),
un entier etat qui indique letat de resolution du syst`eme ; les etats possibles sont expliques ci-dessous.
Ainsi, dans lexecution dun programme utilisant cette classe il peut y avoir plusieurs objets SystemeLi-
neaire, cest-`a-dire plusieurs syst`emes independants les uns des autres, chacun ayant sa propre dimension, sa
propre matrice et sa propre precision et se trouvant dans des etats de resolution dierents.
Les etats dans lesquels un syst`eme peut se trouver sont :
INITIAL : le syst`eme existe mais na pas encore ete traite . La matrice a ete allouee ; selon le construc-
teur de la classe SystemeLineaire utilise, elle est enti`erement garnie de zeros, ou bien elle contient les
coecients du syst`eme,
TRIANGULAIRE : le syst`eme a ete triangularise, cest-`a-dire que sa matrice a ete transformee sans changer
les solutions du syst`eme de telle mani`ere que pour tous 0 i, j < n on ait i > j a
i,j
= 0 et a
i,i
= 0,
RESOLU : le syst`eme a ete resolu : sa matrice est maintenant telle que pour tous 0 i, j < n on a
i = j a
i,j
= 0 et a
i,i
= 1,
SINGULIER : le syst`eme sest revele non inversible lors dune precedente tentative de triangularisation ;
tant quon ne lui aura pas change au moins un coecient (ce qui le remettra dans letat INITIAL), ce nest
pas la peine dy travailler dessus.
Les identicateurs INITIAL, TRIANGULAIRE, RESOLU, SINGULIER sont des noms de constantes de classe pu-
bliques enti`eres (cest-`a-dire des variables public static final int) de la classe SystemeLineaire.
Cette classe comportera en outre les methodes suivantes :
SystemeLineaire(int n) Construction dun objet representant un syst`eme lineaire `a n equations et n
inconnues, dont la matrice (`a n lignes et n + 1 colonnes) est enti`erement garnie de zeros.
SystemeLineaire(double[][] a, double[] b) Construction dun objet representant le syst`eme lineaire
dont les coecients sont donnes par la matrice a et le second membre par le tableau b. La dimension n
du syst`eme est determinee par le nombre de lignes de a.
Au choix, vous pouvez soit supposer que a et b sont coherents (cest-`a-dire a est carree n n et b a n
elements) soit le verier, auquel cas vous ferez en sorte que toute incoherence produise lachage dun
message et labandon du programme.
int n() Renvoie la dimension n du syst`eme (qui est memorisee dans une variable privee).
double epsilon() Renvoie la precision (qui est memorisee dans une variable privee).
int etat() Renvoie letat courant du syst`eme (qui est memorise dans une variable privee).
void defCoef(int i, int j, double aij) Denition (ou modication) de la valeur dun coecient : aij
est la nouvelle valeur du coecient qui se trouve sur la ligne i et la colonne j. Quel que soit son etat
courant, le syst`eme passe alors dans letat INITIAL.
void defEpsilon(double epsilon) Changement de la precision des calculs (par defaut, = 10
8
). Le
syst`eme passe alors dans letat INITIAL.
void impression(java.io.PrintStream sortie)

Ecriture du syst`eme sur le ux sortie (qui, en pratique,
sera tr`es souvent lusuel System.out).
1. Lobjet de cet exercice nest pas lalgorithme de la methode de Gauss lui-meme, mais son expression dans un langage oriente
objets. La plupart dentre vous ont dej`a programme cette methode en C ou dans un autre langage. Pour vous eviter de passer
beaucoup de temps sur des questions autres que la programmation en Java, vous trouverez une ecriture de cet algorithme (en java,
mais sans les objets ) ` a ladresse : http://henri.garreta.perso.luminy.univmed.fr/JavaMINT/TD/SurGauss.html
1
void triangularisation() Triangularisation du syst`eme, par la methode de Gauss. Cette methode ne
renvoie pas de resultat mais modie la matrice du syst`eme et la variable etat.
void resolution() Resolution du syst`eme. Si necessaire, cela commence par la triangularisation de ce
dernier. Cette methode ne renvoie pas de resultat mais modie la matrice du syst`eme et la variable etat.
double[] solution() Renvoie la solution du syst`eme (cela provoque la resolution du syst`eme, si celui-ci
nest pas dej`a resolu) ou null si la resolution est impossible.
On ecrira en outre une methode main pour tester toutes ces methodes. Le syst`eme `a resoudre pourra y etre
code en dur (cest-`a-dire par des variables initialisees lors de leur declaration) ou bien acquis au clavier (lisez
les indications donnees plus bas).

Rappel. La methode de Gauss est basee sur la triangularisation prealable du syst`eme :
Triangularisation :
pour k allant de 0 `a n-1
rechercher lindice i
p
tel que |a
i
p
,k
| = max{|a
k,k
|, |a
k+1,k
|, ...|a
n1,k
|}
si |a
i
p
,k
| < la matrice est singuli`ere, la resolution est impossible
sinon :
permuter les lignes dindices k et i
p
pour j allant de k + 1 `a n 1
ajouter `a la ligne dindice j la ligne dindice k multipliee par q =
a
j,k
a
k,k
Resolution :
pour i allant de n 1 `a 0
calculer x
i
=
b
i

n1

j=i+1
a
i,j
x
j
a
i,i
(notez que, une fois obtenu, x
i
peut etre range `a la place de
b
i
, qui nintervient plus dans la suite de la boucle sur i).
N.B. Une ecriture de cet algorithme en Java se trouve `a ladresse : http://henri.garreta.perso.luminy.
univmed.fr/JavaMINT/TD/SurGauss.html

2

Vous aimerez peut-être aussi