Exercice C++ méthode de jacobi - C++ - Programmation
Marsh Posté le 18-03-2014 à 14:44:05
Je comprends pas pourquoi ta fonction setTableau prend en 1er paramètre une variable membre de la classe
Marsh Posté le 18-03-2014 à 14:46:48
ah oui effectivement, c'est plutôt :
void setTableau(int i, double n)
{
tab[i] = n;
}
non?
Marsh Posté le 18-03-2014 à 15:18:46
oui, c'est ce que j'aurais fait, avec une vérification tout de même sur la valeur de n : >=0 et < à la taille allouée de la matrice.
Si n est < 0, tu lèves une erreur, mais si > à la taille de la matrice, tu pourrais proposer de faire une réalloc automatique afin d'agrandir la matrice...
Edit : au passage, pour une question de lisibilité du programme, même si la matrice est stockée sous forme d'un tableau à une dimension, j'aurais plutôt fait des méthodes set() et get() prenant en paramètres "ligne" et "colonne" plutôt qu'un simple entier.
set(int Lig, int Col, double val)
get(int Lig, int Col)
Le calcul matriciel reposant beaucoup sur les indices de lignes et colonnes je pense que ça sera plus facile de travailler avec des méthodes, elles aussi à base de Lig et Col plutôt qu'un simple entier
Marsh Posté le 18-03-2014 à 15:23:59
ok merci, et est-ce que tu aurais une idée sur l'histoire de jacobi? il me semble juste qu'il faut récupérer la matrice diagonale, la matrice inférieure à la diagonale ainsi que la matrice supérieure à la diagonale, mais c'est tout, et je ne vois pas vraiment comment les récupérer vu comment j'ai fais mon tableau/matrice... je suis un peu perdue ^^
Code :
|
Marsh Posté le 18-03-2014 à 15:26:22
Mais c'est un tableau à une dimension... donc du coup je le modifie en 2 dimensions?
Marsh Posté le 18-03-2014 à 16:01:29
Code :
|
Mon set et get, c'est pour récupérer un seul élément de la matrice, pas pour toute une ligne ou colonne
Et non, tu peux rester en 1 dimension pour le stockage mais avoir 2 paramètres pour l'accès.
Position d'un élément = ((NumLig - 1) * nbcolonnes) + (NumCol - 1)
Avec NumLig appartient à [1..nblignes] et NumCol à [1..nbcolonnes].
Marsh Posté le 18-03-2014 à 16:14:50
ah ok c'est pas les mêmes get et set que les miens ! ok je vais essayer merci, je post dès que je l'ai fait
Marsh Posté le 18-03-2014 à 16:25:07
Code :
|
Marsh Posté le 18-03-2014 à 16:27:27
Code :
|
Marsh Posté le 22-03-2014 à 15:16:05
salut déjà la matrice est carrée donc pas la peine d'utiliser lignes et colonnes, juste une matrice carré de taille n
Code :
|
stocker une matrice comme un vecteur est une bonne chose pour la rapidité d'execution il me semble
à ta place j'utiliserai la classe standard vector
Code :
|
définies de la façon suivante:
Code :
|
Marsh Posté le 11-05-2014 à 22:36:33
if dans un for et modulo/division sont des drames de performances, mieux faut faire une chtite boucle sur i/j et linearisez l'index d'access.
Marsh Posté le 18-03-2014 à 14:23:42
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?
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)
Voilà ce que j'ai fait pour l'instant :
Message édité par minimoack le 18-03-2014 à 19:56:02