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 :

déterminant et inverse de matrice en C++


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 117
    Par défaut déterminant et inverse de matrice en C++
    Bonsoir tout le monde
    comment faire pour le déterminant et l'inverse sachant que j'ai fait le produit et la puissance

    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
    # include <iostream>
    # include <cmath>
    using namespace std;
    /*lecture de deux matrices carrées*/
    void lecture (double X[][10],int a)
    {
         int I,J;   
    	    for (I=0;I<a;I++)
    		for (J=0;J<a;J++)
    	{
    	cout<<"donner votre element   "<<I<<" , "<<J<<endl;
    	cin>>X[I][J];
    	}
    }
    /* affichage de la matrice*/
    void affichage(double X[][10],int a)
    {
         int I,J;
    		cout<<"votre matrice est la suivante:"<<endl;
    		for (I=0;I<a;I++)
    {
    		for (J=0;J<a;J++)
    		cout<<X[I][J]<<"    ";
    		cout<<endl;
    		cout<< " FIN "<<endl;
    } 	
    }   
    void produit(double X[][10],double Y[][10],double Z[][10],int a)
    { 
     int I,J,K;      
     //initialisation de la matrice C
    		for (I=0;I<a;I++)
    		for (J=0;J<a;J++)
             Z[I][J]=0;   	
    // Calcul de la matrice C=A*B
    		for (I=0;I<a;I++)
    		for (J=0;J<a;J++)
    		for (K=0;K<a;K++)
             Z[I][J]=Z[I][J]+X[I][K]*Y[K][J];	
    }
    void puissance (double X[][10],double CB[][10],int a)
    {
         double Ck[10][10];
         int i,j,k,L;
         cout<<"donner la valeur de k pour caculer C^k"<<endl;
    	 cin>>k;
        for(i=0;i<a;i++)
        for(j=0;j<a;j++)
        	Ck[i][j]=X[i][j];
     
    	 for(L=1;L<k;L++)
          {produit(X,Ck,CB,a);
            for(i=0;i<a;i++)
            for(j=0;j<a;j++)
        	Ck[i][j]=CB[i][j];	
    }  
    }   
    int main()
    {
        int n;
        double A[10][10],B[10][10],C[10][10],CP[10][10];
        cout<<"donnez la taille des matrices"<<endl;
        cin>>n;
        cout<<"lecture de la matrice A"<<endl;
        lecture(A,n);
        cout<<"lecture de la matrice B"<<endl; 
        lecture(B,n);
        produit(A,B,C,n);  
        cout<<"affichage des elements de la matrice A "<<endl; 
    	 affichage( A,n);
    	 cout<<"affichage des elements de la matrice B "<<endl;
    	 affichage( B,n);
    	 cout<<"affichage des elements de la matrice C "<<endl;
         affichage(C,n);
    	 puissance (C,CP,n);
    	 cout<<"la matrice de puissance k "<<endl;
    	 affichage(CP,n);
    system("PAUSE");
    return 0;
    }
    merci

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    C'est une question algorithmique ca.

    sera ton meilleur ami.

    Pour le déterminant d'une matrice, c'est une fonction récursive qu'il va falloir faire (c'est le plus facile).

    Pour l'inverse, le pivot de gauss t'aidera.

    Jc

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 25
    Par défaut
    Va voir ici, j'ai poster une aide pour l'inverse.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 33
    Par défaut Calculer le déterminant d'une matrice (n,n)
    Bonjour,
    Je vous donne ici comment calculer le déterminant,parce que ce n'est pas trop compliqué.
    Le déterminant d'une matrice (d'ordre n) peut se développer,par exemple,selon la première colonne.Si la matrice se présente par exemple sous la forme
    a11 a12 .... a1n
    a21 a22 .... a2n
    a31 a32 .... a3n
    .
    .
    an1 an2 .... ann
    Si on développe selon la première colonne,on a
    det = somme ((-1)^(i+1)*ai1*min(i,1)) pour i allant de 1 à n où min(i,1) est le mineur de l'indice (i,1),c'est à dire le déterminant de la matrice obtenue en supprimant la ligne i et la colonne 1 de la matrice initiale.C'est un déterminant d'ordre n-1,donc le calcul peut se faire avec une fonction récursive.Quand on descend d'une profondeur dans la récursion,on diminue chaque fois l'ordre des déterminants de 1,jusqu'à ce qu'on tombe sur un déterminant d'ordre 1,qui est celui d'une matrice à un seul élément (a),et qui vaut det=a.
    Le problème est la gestion des indices de ligne non supprimés,sachant que les indices de colonne à garder sont j+1,j+2,...,n.On peut utiliser un petit tableau local short ind[n],où on stocke les indices de ligne à garder pour transmettre au niveau inférieur.
    De cette façon,on travaille toujours avec la matrice A[n][n].

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Surtout pas malheureux (sauf pour des matrices de taille 3 ou 4 au maximum) !

    En effet, cette méthode demande pour calculer un déterminant de matrice de taille n de calculer n déterminants de matrices de taille n-1, ce qui fait au total un algorithme en O(n!). Il existe pour le calcul de déterminant des algorithmes en O(n^3) (voir http://fr.wikipedia.org/wiki/Calcul_...3%A9terminants).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 33
    Par défaut
    Vous avez raison du point de vue de l'analyse numérique (au moins en théorie).
    Cependant,
    -on peut répondre à une question à plusieurs niveaux.Celui de l'expert qui donne une méthode optimale pour calculer un objet.Celui plus pédagogique,pour quelqu'un qui ne connait pas forcément bien l'objet :dans ce cas,il peut y avoir d'autres intérêts,ici celui de programmer et de mettre en oeuvre une fonction récursive
    -si on a une matrice creuse,ce qui très souvent le cas dans les applications pratiques,le fait d'ajouter un test de la forme (if A[l][c]#0. ou if |indice de ligne-indice de colonne|<L) peut diminuer beaucoup le temps de calcul par rapport à la valeur théorique (O(n!)) dans le cas d'une matrice pleine.Je ne prendrai pas alors le pari que la méthode optimisée soit supérieure à la méthode directe,dans le cas des matrices creuses.

Discussions similaires

  1. Inversion de matrice
    Par mhooreman dans le forum Mathématiques
    Réponses: 6
    Dernier message: 26/10/2006, 18h35
  2. Probleme d'inversion de matrice subtil
    Par babycrash dans le forum C
    Réponses: 2
    Dernier message: 02/08/2006, 17h41
  3. inversion de matrice?
    Par babycrash dans le forum C
    Réponses: 17
    Dernier message: 21/06/2006, 22h18
  4. Comment inverser une matrice H(2,2) ?
    Par fafa624 dans le forum Langage
    Réponses: 4
    Dernier message: 29/06/2005, 10h23
  5. Calculer un inverse de matrice avec boost?
    Par Clad3 dans le forum Bibliothèques
    Réponses: 6
    Dernier message: 02/06/2005, 18h38

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