Bonjour,
j'ai un exercice � faire en C++. j'ai commenc�, mais je suis bloqu�e avec la m�thode de jacobi. je ne comprends pas trop, est-ce que quelqu'un pourrait m'expliquer svp?
J'ai fait:L'objectif de cette s�ance est d'impl�menter en C++ le d�but d'une classe � matrice � : les champs qui d�finissent chaque matrice, deux constructeurs, une m�thode d'affichage, ainsi qu'une m�thode permettant de r�soudre, avec la m�thode de Jacobi, un syst�me d'�quations lin�aires.
Les champs de la classe � matrice �
Chaque matrice est d�finie par : ses dimensions et un tableau contenant les �l�ments de la matrice.
Constructeurs
Pour pouvoir facilement tester vos programmes sur des petites matrices, il vous faut au moins un constructeur prenant en param�tre un tableau contenant tous les �l�ments de la matrice. Ainsi, pour tester vos programmes sur la matrice ci-contre, vous devriez pouvoir �crire des lignes de code qui ressemblent � :
double T[9] = {10,-1,0,-1,10,-2,0,1,-10} ;
matrice * A = new matrice(3,3,T) ;
M�thodes de base
Il est pratique d'avoir des m�thodes pour lire un �l�ment de la matrice et modifier un �l�ment de la matrice, appel�es par exemple get et set. Il est aussi recommand� d'avoir une m�thode permettant un affichage simple, ligne par ligne, d'une matrice de petite taille.
M�thode de Jacobi
Pour r�soudre un syst�me d'�quations lin�aires de la forme Ax=b, o� A est une matrice carr�e de dimension n, b un vecteur de taille n, on calcule une suite r�currente d�finie par :
r^(k+1) = D^(-1) * ( b - (L+U) * r^(k))
�crivez une m�thode, prenant en param�tre le vecteur b (un vecteur est une matrice n � 1), permettant de calculer simplement cette suite : il suffit d'exprimer le terme r(k+1)j en fonction des r(k)ij, des Aij et des bj.
Comme pour la m�thode de la s�cante vue en TDs, il faut deux variables, contenant la valeur courante du vecteur r et la valeur suivante, soit par exemple rcour et rsuiv ; alors la i-�me composante de r est mise � jours comme suit :
rsuiv(i) = (b(i) - sum{0 <= m < n} � {m <> i} (A(im) * rcour(m))) / A(ii)
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 Matrices.h #pragma once #include <iostream> using namespace std; class Matrices { private : // Dimensions de la matrice int nbLignes, nbColonnes; //Tableau de valeurs double * tab; public : //Destructeur ~Matrices(void); //Constructeur Matrices(int=0, int=0, double * =NULL); //Constructeur par recopie Matrices(const Matrices &); void Afficher(); int getLigne(); int getColonne(); double getTableau(); void setTableau(int, double); double getValeur(int, int); void setValeur(int, int, double); };Donc voil�, je bugg totalement sur la m�thode de jacobi... je ne comprends pas du tout ce que je dois faire... il me semble que je dois r�cup�rer la matrice diagonale, sup�rieure � la diagonale, et inf�rieure � la diagonale... mais je ne sais pas comment faire... tableau ? matrice? et puis que va renvoyer la fonction ? un vecteur ou un tableau?
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96 Matrices.cpp #include "StdAfx.h" #include "Matrices.h" #include <iostream> #include <math.h> using namespace std; Matrices::~Matrices() { delete[] tab; } Matrices::Matrices(int l, int c, double t[]) { nbLignes = l; nbColonnes = c; tab = newdouble[nbLignes*nbColonnes]; for (int i = 0; i < nbLignes*nbColonnes; i++) { tab[i] = t[i]; } } //Constructeur par recopie Matrices::Matrices(const Matrices &m) { nbLignes = m.nbLignes; nbColonnes = m.nbColonnes; tab = newdouble [nbLignes*nbColonnes]; for (int i = 0; i < nbLignes*nbColonnes; i++) { tab[i] = m.tab[i]; } } void Matrices :: Afficher() { int compteur = 1; cout<<"Voici la matrice : "<<endl; for (int i = 0; i < nbColonnes*nbLignes; i++) { if (compteur == nbColonnes+1) { cout<<"\n"; cout<<tab[i]<<" "; compteur = 2; } else { cout<<tab[i]<<" "; compteur++; } } cout<<"\n"; } int Matrices :: getLigne() { return nbLignes; } int Matrices :: getColonne() { return nbColonnes; } double Matrices :: getTableau() { return *tab; } void setTableau(int i, double n) { if ((i >= 0) && (i < nbLignes)) { tab[i] = n; } else { cout<<"erreur sur l'indice" ; } } double getValeur(int ligne, int colonne) { if ((ligne >= 0) && (ligne < nbLignes) && (colonne >= 0) && (colonne < nbColonnes)) { return tab[((ligne - 1) * nbColonnes) + (colonne - 1)]; } else { cout<<"erreur"; } } void setValeur(int ligne, int colonne, double valeur) { if ((ligne >= 0) && (ligne < nbLignes) && (colonne >= 0) && (colonne < nbColonnes)) { tab[((ligne - 1) * nbColonnes) + (colonne - 1)] = valeur; } else { cout<<"erreur"; } }
Je suis perdue...
Merciiiii ...
EDIT : en fait, c'est un exercice en deux parties, la premi�re �tant le d�but de l'impl�mentation de Matrices, c'est-�-dire le code que j'ai mis, et que j'ai d�j� rendu � mon prof... La deuxi�me partie est la cr�ation de la m�thode de jacobi, pour laquelle je gal�re







R�pondre avec citation











Partager