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
Partager