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 :

Aide de programmation - matrice


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2011
    Messages : 7
    Par défaut Aide de programmation - matrice
    Bonjour à tous ! Je débute une programmation en C# depuis ce début d'année, et je me suis lancé dans un programme permettant le traitement de matrices saisies par l'utilisateur.
    J'ai cependant un soucis pour deux fonctions : le pivot de gauss, et le calcul de déterminant.
    Je voudrais donc savoir si quelques uns d'entre vous pouvez m'aider/me donner quelques piste de réflexions parce que je bloque un peu ces derniers temps.
    Je vous met ci-dessous un extrait de mon programmes :

    Le programme principal :

    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
     
    class Program
        {
            static void Main(string[] args)
            {
                  int choix = ChoixOp();
                  switch (choix){
                        case 6:
                        Matrice mat7 = new Matrice();
                        Console.Out.WriteLine("Entrez le nombre de lignes de la première matrice");
                        mat7.setLigne(int.Parse(Console.In.ReadLine()));
                        Console.Out.WriteLine("Entrez le nombre de colonnes de la première matrice");
                        mat7.setColonne(int.Parse(Console.In.ReadLine()));
     
                        mat7.RemplirMatrice();
                        int dim = 3;
                        Matrice M_inv = new Matrice() ;
                        M_inv.setLigne(dim) ;
                        M_inv.setColonne(dim);
                        //3Matrice.Gauss(mat7, M_inv, dim) ;
                        M_inv.AfficheMat() ;
                        break;
                   }
            }
     
     
            public static int ChoixOp(){
                int choix;
                Console.Out.WriteLine("Que voulez-vous faire ?");
                Console.Out.WriteLine("1. Additionner \n2. Soustraire \n3. Multiplier \n4. Calculer le déterminant \n5. Faire le transpose \n6. Pivot de Gauss \n7. (provisoire) Identité");
                choix = int.Parse(Console.In.ReadLine());
                return choix;
            }
    Et dans ma classe matrice :

    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
     
    namespace Matrice
    {
        public class Matrice
        {
                protected int nbrLigne ;
                protected int nbrColonne ;
                protected double[,] composant ;
                protected double determinant ;
     
    public static void Gauss(Matrice mat1, Matrice mat2, int dim){
                    Matrice temp = new Matrice();
                    CopieMatrice(mat1, temp, dim);
                    double a, b;
                    a = 0;
                    b = 0;
                    int c = 0;
                    Identite(mat2, dim);
                    for (int k = 0; k < dim; k++){
                        a = temp.composant[k, k * dim];
                        // Vérifie la condition a != 0
                        c = 0;
                        while( a != 0){
                            c++;
                            for (int q = 0; q < dim; q++){
                                temp.composant[k, q * dim] = temp.composant[k, q * dim] + temp.composant[k + c, q * dim];
                                mat2.composant[k, q * dim] = mat2.composant[k, q * dim] + mat2.composant[k + c, q * dim];
                            }
                            a = temp.composant[k, k * dim];
                        }
     
                        //normalisation de la ligne k 
                        for (int l = 0; l < dim; l++) {
                            temp.composant[k, l * dim] = temp.composant[k, l * dim] / a;
                            mat2.composant[k, l * dim] = mat2.composant[k, l * dim] / a;
                        }
     
                        //Réduction e gauss-jordan
                        for (int i = 0; i < dim; i++) {
                            b = temp.composant[i, k * dim];
                            if (i != k) {
                                for (int j = 0; j < dim; j++) {
                                    temp.composant[i, j * dim] = temp.composant[i, j * dim] - b * temp.composant[k, j * dim];
                                    mat2.composant[i, j * dim] = mat2.composant[i, j * dim] - b * mat2.composant[k, j * dim];
                                }
                            }
                        }
                    }
                }
     
    public static void CopieMatrice(Matrice mat1, Matrice mat2, int dim){
                    for (int i = 0; i < dim; i++){
                        for (int j = 0; j < dim; j++){
                            mat2.composant[i,j*dim] = mat1.composant[i,j*dim] ;
                        }
                    }
                } 
     
    public static void Identite(Matrice mat1, int dim){
                    for (int i = 0; i < dim; i++){
                        for (int j = 0; j < dim; j++){
                            if (i == j){
                                mat1.composant[i, j] = 1;
                            }
                            else{
                                mat1.composant[i, j] = 0;
                            }
                        }
                    }
                }
    En fait ma fonction du pivot de gauss me renvoi une matrice vide, enfin avec que des 0 à la place des valeurs... Et je bloque complètement dessus.

    Pour calculer le déterminant, j'avais vaguement commencé une fonction en récursif qui réduisait l'ordre au fur et à mesure mais je n'ai jamais réussi à la terminer, je me suis emmêlé quelque part et je n'ai pas réussi à retrouver le bout du fil.

    J'espère que le code n'est pas trop long et un futur merci à ceux qui se pencheront sur mon problème !

  2. #2
    Membre Expert Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Par défaut
    Ce qui serait bien pour qu'on puisse t'aider, c'est que tu définisses un les règles métiers : comment fait-on un pivot de Gauss.
    Sans ça, ça risque de limiter le nombre de personnes susceptibles de t'aider.

    Par ailleurs, ton code pourrait sans doute être optimisé, mais on y reviendra quand le problème sera résolu.

    Sinon, tu peux déjà commencer par débugger le programme pour voir à quel niveau ça coince non ? Le problème vient de la normalisation de la matrice ou de sa réduction ?

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Er3van Voir le message
    Ce qui serait bien pour qu'on puisse t'aider, c'est que tu définisses un les règles métiers : comment fait-on un pivot de Gauss.
    bah alors, t'as oublié tes cours de terminale ? (moi j'ai oublié en tous cas )
    http://fr.wikipedia.org/wiki/%C3%89l...e_Gauss-Jordan

  4. #4
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Par défaut
    Citation Envoyé par tomlev Voir le message
    bah alors, t'as oublié tes cours de terminale ? (moi j'ai oublié en tous cas )
    Les matrices, ce n'était pas au programme de la T.D... à ma lointaine époque

    je flood... ok, je sors.

  5. #5
    Membre Expert Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Par défaut
    Citation Envoyé par tomlev Voir le message
    bah alors, t'as oublié tes cours de terminale ? (moi j'ai oublié en tous cas )
    http://fr.wikipedia.org/wiki/%C3%89l...e_Gauss-Jordan
    Le pire c'est que je viens de finir mon cursus d'ingé, j'en ai bouffé... mais bizarrement c'est du "fire and forget" : exam validé, cours oublié !

    Sinon pour la version facile de la résolution de ton problème : Gauss Jordan en C#

Discussions similaires

  1. Liens : Aide à la programmation avec DirectX
    Par djbed dans le forum DirectX
    Réponses: 11
    Dernier message: 22/03/2007, 23h30
  2. besoin d'aide sur programme en sql 3
    Par abdel54 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/12/2005, 09h19
  3. aide petit programme pour débutant
    Par kartp0rqx dans le forum C
    Réponses: 16
    Dernier message: 14/10/2005, 19h31
  4. aide en programmation opengl:maillage 3d de visage
    Par lisser dans le forum OpenGL
    Réponses: 4
    Dernier message: 14/05/2004, 23h25

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