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 :

résoudre Ax=b avec A matrice triangulaire inférieure


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Novembre 2010
    Messages : 4
    Par défaut résoudre Ax=b avec A matrice triangulaire inférieure
    Bonjour,
    je suis actuellement en L3 maths appliquées, je débute en C++ et j'ai un projet à faire dont la première question est de résoudre le système Ax=b avec A matrice triangulaire inférieure. j'ai fait le programme suivant mais il ne veut pas marcher, je ne comprend pas pourquoi, est ce que quelqu'un pourrait m'aider? merci.

    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
    #include <cstdlib>
    #include <iostream>
     
    using namespace std;
     
    void AfficherMatrice(float **M, int n){ //affiche une matrice de taille n*n
         for (int i=0; i<n; i++){
             for (int j=0; j<n; j++){
                 cout<< M[i][j] << "\t" ;
                 }
                 cout<< endl;
                 }
                 }
     
    void AfficherVecteur (float *y, int n){ //affiche un vecteur de taille n
         for (int i=0; i<n; i++){
             cout<< y[i] << "\t";
             }
             cout<<endl;
             }
     
    void MTI(float **M, int n){ // matrice triangulaire inférieure
                    for(int i=0; i<n; i++){ 
                 for (int j=0; j<=i; j++){
                     cout<<M[i][j]<< "\t";
                     }
                     cout<<endl;
                     }
                     }
     
    float Somme(float **M, float *x, int i, int j){ // M.x
         float S=0;
         for (i=1; i<j;i++){
             S+=M[j][i]*x[i];
             }
             }
     
    void SystMatTI (float **M, float *b, float *x, int n){ //trouver x tel que Mx=b avec M tiangulaire inférieure
         x[1]=b[1]/M[1][1];
         for (int j=2; j<=n; j++){
                 x[j]=(b[j]- Somme(M,x,1,j-1))/M[j][j];
                 }
                 }
     
     
     
    int main(int argc, char *argv[])
    {
        int n;
        cout << "entrer la valeur de n" <<endl;
        cin>>n;
        float **A=NULL;
        A= new float*[n];
        for (int i=0; i<n; i++){
            A[i]= new float[i+1];
            }
            for (int i=0; i<n; i++){
                for (int j=0; j<n; j++){
       cout<< "Entrer A" <<i+1<<","<<j+1<<endl;
       cin>> A[i][j];
    }
    }
       AfficherMatrice(A,n);
       cout<<endl;
       MTI(A,n);
       float *x;
       x=new float [n];
       float *b=NULL;
       b= new float [n];
           for (int i=0; i<n; i++){
               cout<< "Entrer b" <<i+1<< endl;
               cin>>b[i];
               }
               AfficherVecteur(b,n);
               cout<<endl;
               SystMatTI(A,b,x,n);
               cout<<endl;
     
       for (int i=0; i<n; i++){
           delete []A[i];
           }
           delete []A;
           delete []b;
           delete []x;
           x=NULL;
     
        system("PAUSE");
        return EXIT_SUCCESS;
    }

  2. #2
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Oulà, c'est loin les calculs sur les matrices…
    Je ne vais probablement pas pouvoir t'aider beaucoup sur le fond, juste sur le code.
    Par contre, ce serait sympa de faire attention à l'indentation ; bien réalisée elle facilite (de beaucoup) la lecture et la compréhension du code.

    Pour commencer, j'aimerais pointer un gros problème.
    Tu construis ta matrice A comme une matrice triangulaire inférieure.
    Jusque là, pas de souci.
    Mais après, tu veux l'afficher avec ta fonction « AfficherMatrice() », qui s'attend à recevoir une matrice complète.
    Et donc, à chaque fois que tu tentes d'accéder à M[i][j] alors que j > i, tu vas dans une zone mémoire qui n'a pas été réservée pour la ligne en cours.
    Ça peut être n'importe quoi : une zone non initialisée, une case d'une autre ligne de ta matrice, une zone réservée pour une autre variable, une zone à laquelle tu n'es pas censée avoir accès…

    Bon, ce n'est pas dramatique puisque tu ne fais qu'accéder à cette zone, tu n'essaies pas d'en modifier le contenu.
    Au pire, ça affichera n'importe quoi.
    Mais il faut bien que tu te rendes comptes que tu tentes d'accéder à une case qui finalement se trouve hors de ta matrice.
    Cela peut être critique si tu essaies d'en modifier le contenu…

    Ensuite, ta fonction « Somme() » est censée retourner un « float », mais ne retourne rien.
    Je suppose que c'est un juste oubli de ta part, et que normalement tu retournes « S ».
    Ceci dit, dans la boucle, la première valeur de «i » devrait être «0 », non ?

    Voilà, après je n'ai pas vu d'autres choses importantes.
    Bonne continuation !

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Novembre 2010
    Messages : 4
    Par défaut
    ok merci j'ai fait quelques modifs mais en fait ce que je veux c'est qu'après exécution il me donne le vecteur x et ça marche pas (j'ai remplacé void par float dans ma fonction SystMTI), il affiche bien la matrice triangulaire inférieure et le vecteur b mais après il me met "a cessé de fonctionner" donc je pense que c'est ma fonction qui est fausse seulement je ne vois pas pourquoi.
    désolée d'être aussi nulle

  4. #4
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Évite un maximum les pointeurs. Ta matrice n'est pas obligé d'être une allocation dynamique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    float **A=NULL;
    A= new float*[n];
    //peut être remplacer par
    float A[n];
     
    //Ainsi que 
    float *x;
    x=new float [n];
    //peut être remplacer par
    float x[n];
    Il n'est pas plus efficace de passer une type de base (int, float, etc...) par pointeur que par valeur. Si tu dois la modifier, passe le par référence au pire.
    Déjà ça éclaircira ton code.
    A quel ligne plante-t-il exactement?

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France, Doubs (Franche Comté)

    Informations forums :
    Inscription : Novembre 2010
    Messages : 4
    Par défaut
    Le soucis c'est qu'on me demande d'utiliser les pointeurs justement!
    à la compilation il ne me met aucun problème mais après il plante pour m'afficher le vecteur x.

  6. #6
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut http://solutions-entreprise.developpez.com/
    1/ on alloue les tableaux 2D proprement:
    http://codepad.org/K2WAwRBP

    2/ tes boucles ont des bornes bizarres ...

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/01/2007, 17h53
  2. Calculer une moyenne avec une matrice
    Par progfou dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 05/06/2006, 16h47
  3. [numarray] Image convolué avec une matrice.
    Par parp1 dans le forum Calcul scientifique
    Réponses: 1
    Dernier message: 20/04/2006, 17h35
  4. [SWING] remplir une jtable avec une matrice de double
    Par Psykorel dans le forum Composants
    Réponses: 3
    Dernier message: 04/01/2006, 14h14
  5. [JTable] remplir avec une matrice
    Par ybdz dans le forum Composants
    Réponses: 3
    Dernier message: 08/12/2004, 21h03

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