IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

exercice m�thode de jacobi c++


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Femme Profil pro
    M1 MIAGE
    Inscrit en
    Janvier 2013
    Messages
    61
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    �ge : 33
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : M1 MIAGE

    Informations forums :
    Inscription : Janvier 2013
    Messages : 61
    Par d�faut exercice m�thode de jacobi c++
    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)
    J'ai fait:

    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);
    };
    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"; }
    }
    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?
    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

  2. #2
    R�dacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supa�ro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Ing Supa�ro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par d�faut
    Ce juste des maths : l�Id�e de la m�thode part de la recherche d'un point fixe d'une fonction vectorielle puis on decompose la matrice du syst�me pour ensuite cr�er une suite de vecteur convergent vers la solution.

    Tout est explique la : https://fr.wikipedia.org/wiki/M%C3%A9thode_de_Jacobi


    Edit : je laisse les autres faire les remarques sur le C++ en lui meme.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une tr�s bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Membre confirm�
    Femme Profil pro
    M1 MIAGE
    Inscrit en
    Janvier 2013
    Messages
    61
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    �ge : 33
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : M1 MIAGE

    Informations forums :
    Inscription : Janvier 2013
    Messages : 61
    Par d�faut
    Merci bien, mais j'ai d�j� visit� la page wikipedia, et plein d'autres expliquant le fonctionnement de la m�thode de jacobi, et j'ai m�me trouv� des codes en C++, mais avec plein de variables globales incompr�hensibles... Je ne poste pas sur un forum sans avoir fait des recherches pr�alablement.
    Je ne comprends pas comment je peux coder �a, c'est tout. est ce que je dois garder mon tableau � une dimension? passer � 2 dimensions? comment r�cup�rer les matrices diagonales sup�rieures et inf�rieures? faut-il r�cup�rer juste les valeurs ou il faut mettre des z�ros? ...

  4. #4
    R�dacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supa�ro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Ing Supa�ro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par d�faut
    Citation Envoy� par minimoack Voir le message
    Merci bien, mais j'ai d�j� visit� la page wikipedia, et plein d'autres expliquant le fonctionnement de la m�thode de jacobi, et j'ai m�me trouv� des codes en C++, mais avec plein de variables globales incompr�hensibles... Je ne poste pas sur un forum sans avoir fait des recherches pr�alablement.
    Je ne comprends pas comment je peux coder �a, c'est tout. est ce que je dois garder mon tableau � une dimension? passer � 2 dimensions? comment r�cup�rer les matrices diagonales sup�rieures et inf�rieures? faut-il r�cup�rer juste les valeurs ou il faut mettre des z�ros? ...
    La relation de reccurrence est la suivante :

    Avec Ta matrice = D -(E+F) et D diagonale.
    Il suffit de d�composer ta matrice en ta matrice D et E+F, calculer l'inverse de D (qui est une matrice diagonale, donc c'est trivial)
    Et ensuite de faire les produit et sommes comme dans la formule (au passage op�rations que tu dois impl�menter) et il te suffit de boucler jusqu'au crit�re de convergence voulu.

    Qu'est ce qui te bloque ? Car ce sont des maths de petit niveau bac+1.
    Je ne suis pas habitu� � manipuler des matrices protocolaires de NIVEAU 2!
    Ca donne quoi en francais ?

    J'aimerai donc �galement que vous nous postiez une solution rapide et plausible � rendre � notre cher et tendre professeur de Mathematique.
    Non. Enfin pas gratuitement. Si je dois faire vos devoirs, autant que ca me rapporte.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une tr�s bonne doc sur le C++ (en) Why linux is better (fr)

  5. #5
    Membre confirm�
    Femme Profil pro
    M1 MIAGE
    Inscrit en
    Janvier 2013
    Messages
    61
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    �ge : 33
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : M1 MIAGE

    Informations forums :
    Inscription : Janvier 2013
    Messages : 61
    Par d�faut
    Merci pour vos conseils, je vais essayer

  6. #6
    Invit� de passage
    Homme Profil pro
    D�veloppeur Web
    Inscrit en
    Mars 2014
    Messages
    1
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 32
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur Web

    Informations forums :
    Inscription : Mars 2014
    Messages : 1
    Par d�faut
    Citation Envoy� par Davidbrcz Voir le message
    Ce juste des maths : l�Id�e de la m�thode part de la recherche d'un point fixe d'une fonction vectorielle puis on la matrice du syst�me d�composition d'une matrice pour ensuite cr�er une suite de vecteur convergent vers la solution.

    Tout est explique la : https://fr.wikipedia.org/wiki/M%C3%A9thode_de_Jacobi


    Edit : je laisse les autres faire les remarques sur le C++ en lui meme.
    Bonjour Davidbrcz,
    Je ne suis pas habitu� � manipuler des matrices protocolaires de NIVEAU 2! Et mon niveau en math�matique approxime celui du niveau de la mer c'est � dire 0.
    J'aimerai donc �galement que vous nous postiez une solution rapide et plausible � rendre � notre cher et tendre professeur de Mathematique.
    Cordialement,
    Kalkalfoufounne.

  7. #7
    Expert �minent

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par d�faut
    Pour l'instant, je n'ai pas compris le calcul � appliquer, mais �a ressemble � une boucle de calcul.

    Par contre, j'ai un gros soucis avec ton code:

    Tout d'abord, un pragma once implique que le code que tu nous donne est un en-t�te.
    Le using namespace std; est alors une grave faute. En effet, tout fichier incluant ton en-t�te verra une pollution de son environnement.
    C'est � bannir absolument.
    Aucun using dans un en-t�te, sauf � l'int�rieur de la d�claration d'une classe.
    Ne pas s'y conformer n'est pas profond�ment dramatique en soi, mais finira par poser des probl�mes extr�mement difficile � r�soudre, surtout que celui qui les aura n'y pensera pas.

    Autre chose, tes constructeurs n'utilisent pas les initialiseurs, perdant en efficacit� et propret�. Dans d'autres cas, �a peut m�me poser des probl�mes.
    par exemple:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    //Constructeur par recopie
    Matrices::Matrices(const Matrices &other) : nbLignes(other.nbLignes), nbColonnes(other.nbColonnes), tab(new double[other.nbLignes * other.nbColonnes]) {
    	for (int i = 0; i < nbLignes*nbColonnes; i++) tab[i] = other.tab[i];
    }
    Enfin, ta classe devrait s'appeler Matrice (sans pluriel), car c'est ce nom qui servira � d�clarer les variables.
    Supposons double T[9] = {10,-1,0,-1,10,-2,0,1,-10};.
    On pr�f�rera certainement
    Matrice A(3,3,T);Matrices A(3,3,T);;

    Par ailleurs, on pr�f�rera Matrice A(3,3,T);Matrice A = Matrice(3,3,T);, mais c'est une question de style uniquement.

    Attention, Matrice A(3,3,T); d�clare une variable, tandis que Matrice * A = new Matrice(3,3,T); d�clare un pointeur, � d�truire manuellement (via un delete), et posant de ce fait de nombreux soucis de suivi.


    Pour la r�solution pratique, qu'as-tu d�j� essay�?
    Boileau disait "Ce qui se con�oit bien s'�nonce clairement.", il en va de m�me pour le code.
    Comment le ferais-tu sur papier? Pourquoi devrait-ce �tre diff�rent dans le code?

    Pour t'aider, consid�re le principe suivant:
    Si tu n'arrives pas � �crire la solution en code, �a ne peut venir que de trois choses:
    • la solution papier n'est pas ma�tris�e,
    • la repr�sentation des donn�es est inadapt�e,
    • le code fixe (comme les biblioth�ques) n'est pas suffisamment ma�tris�e.


    PS: je me penche moi-m�me sur la question.

  8. #8
    Membre Expert
    Homme Profil pro
    �tudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par d�faut
    Citation Envoy� par leternel Voir le message
    Attention, Matrice A(3,3,T); d�clare une variable, tandis que Matrice * A = new Matrice(3,3,T); d�clare un pointeur, � d�truire manuellement (via un delete), et posant de ce fait de nombreux soucis de suivi.
    �a va m�me plus loin que le "simple" suivi du pointeur. Une matrice � une s�mantique de valeur (et une petite taille en m�moire) -> il n'y aura (presque ?) jamais de "new Matrice".

    Un autre petit d�tail, en C++ "tableau" est presque synonyme de "std::vector".

    Pour le r�el probl�me du thread, j'ai pas le niveau en maths
    J'ai absolument aucune id�e comment de : Ax=b, on arrive � r^(k+1) = D^(-1) * ( b - (L+U) * r^(k)). Trop de lettres qui sortent de nulle part ^^".

Discussions similaires

  1. M�thode de Jacobi
    Par azerty65 dans le forum Scilab
    R�ponses: 0
    Dernier message: 27/11/2011, 19h59
  2. R�ponses: 9
    Dernier message: 28/12/2009, 16h48
  3. M�thode de Jacobi
    Par lila1 dans le forum Scilab
    R�ponses: 0
    Dernier message: 08/03/2009, 11h23
  4. R�ponses: 4
    Dernier message: 10/03/2007, 17h45
  5. [D�butante]Programmation de la m�thode de Jacobi
    Par asie86 dans le forum Langage
    R�ponses: 4
    Dernier message: 05/12/2006, 17h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo