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

Calcul scientifique Python Discussion :

Matrice et élimination de Gauss-Jordan


Sujet :

Calcul scientifique Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 8
    Par défaut Matrice et élimination de Gauss-Jordan
    Bonsoir,

    Je suis à l'université et nous avons actuellement un projet en cours, qui consiste à créer un programme en Python permettant de déterminer les coefficients stoechiométriques d'une équation chimique (en respectant bien évidemment les règles de conservation de la matière). On utilise pour cela la méthode de Gauss-Jordan. J'ai d'ailleurs bien vu le sujet de discussion précédent, traitant du même algorithme, mais je poste ici car le sujet a déjà été classé comme résolu.

    Les données nécessaires sont fournies via les arguments entrés en ligne de commande.

    Le programme se lance après avoir entré dans la console le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    python nom_fichier.py precision nbLignes nbColonnes liste_des_valeurs
    liste_des_valeurs correspondant à l'ensemble des coefficients de la matrice de départ, séparés par des espaces.

    Je commence donc par recueillir les différentes informations avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import sys
    precision = int(sys.argv[1])
    nb_lignes = int(sys.argv[2])
    nb_column = int(sys.argv[3])
    valeurs = map(float,sys.argv[4:])
    Jusque là, pas de problème
    Je définis ensuite une fonction qui me permet de générer la matrice de travail :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def create_matrix(valeurs, nb_column):
        """La fonction genere une matrice de travail dont les coefficients proviennent des valeurs entres en ligne de commande et etendue avec la matrice des zeros"""
        i = 0
        matrix = []
        while i in range(len(valeurs)):
            ligne = valeurs[i : i + nb_column]
            ligne.append(0.0)    # On ajoute un 0 en fin de chaque ligne, afin d'etendre la matrice de depart avec la matrice des zeros
            matrix.append(ligne)
            i += nb_column
        print matrix
     
    print create_matrix(valeurs, nb_column)
    C'est là que les problèmes arrivent puisque quand, pour vérifier ma fonction, je teste le programme, voici ce que la console (cmd.exe) m'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    C:\Users\***>C:\Python27\python.exe C:\Python27\projetinfo.py 1000 3 3 1 2 3
     4 5 6 7 8 9
    [[1.0, 2.0, 3.0, 0.0], [4.0, 5.0, 6.0, 0.0], [7.0, 8.0, 9.0, 0.0]]
    None
    Je ne comprends pas d'où vient ce "None", il est d'autant plus gênant qu'il m'empêche de continuer à coder. J'aimerais savoir comment m'en débarrasser.

    De plus, quand je teste la fonction dans la console IDLE de Python, la fonction ne me renvoie pas de none
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    >>> def create_matrix(valeurs, nb_column):
        """La fonction genere une matrice de travail dont les coefficients proviennent des valeurs entres en ligne de commande et etendue avec la matrice des zeros"""
        i = 0
        matrix = []
        while i in range(len(valeurs)):
            ligne = valeurs[i : i + nb_column]
            ligne.append(0.0)    # On ajoute un 0 en fin de chaque ligne, afin d'etendre la matrice de depart avec la matrice des zeros
            matrix.append(ligne)
            i += nb_column
        print matrix
     
     
    >>> create_matrix([1,2,3,4,5,6,7,8,9],3)
    [[1, 2, 3, 0.0], [4, 5, 6, 0.0], [7, 8, 9, 0.0]]
    Mon PC tourne sous Windows Vista SP1 et j'utilise Python 2.7

    J'espère que vous pourrez m'éclairer,

    Merci d'avance,
    Imazer

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Ta fonction doit retourner la matrice, c'est tout

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 8
    Par défaut
    Ah, c'est donc ça ^^
    Merci bien
    Je peux ne pas classer le sujet comme résolu pour le moment ? Le projet n'étant pas fini, je risque d'avoir encore pas mal de questions à poser ^^

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 8
    Par défaut
    Bonjour,

    Alors voilà pour la suite, je dois définir une fonction qui applique la méthode du pivot de Gauss sur une matrice. Vu les notions de python vues en cours, je suppose que ça paraîtra très "fait main".

    Le principe mathématique est expliqué plus avant ici

    Pour commencer, je dois donc définir une fonction qui "normalise" la ligne d'une matrice, afin que mon "pivot" soit un 1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def normalize(ligne,p):
    	i = 0
    	while i in range(len(ligne)):
    		ligne[i] = ligne[i]/ligne[p]
    		i += 1
    	return ligne
    La fonction devrait donc diviser chacun des éléments de la liste par l'élément situé à l'indice donné en argument (p)

    Or ce n'est pas le cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> normalize([0,2,4,8],1)
    [0, 1, 4, 8]
    Je ne comprends pas pourquoi les autres éléments de la liste ne sont pas divisés par 2

    Merci d'avance,
    Imazer

  5. #5
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    C'est assez facile à trouver:
    avec p=1, ligne[p] passe à 1 à partir de i=1.
    => Donc, avec i>1, tu divises ligne[i] par 1 et non 2.

    Tyrtamos

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 8
    Par défaut
    Merci bien, je vois que je bloque chaque fois sur des petits trucs idiots ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. matrice: éliminer les lignes non nulles
    Par ahcnas dans le forum MATLAB
    Réponses: 1
    Dernier message: 12/06/2011, 13h46
  2. Limite de Gauss pour de grosse matrice
    Par JonasB dans le forum MATLAB
    Réponses: 6
    Dernier message: 25/03/2009, 15h17
  3. Matrice Inverse avec l'Algorithme de Gauss
    Par 3logy dans le forum C#
    Réponses: 0
    Dernier message: 05/12/2008, 13h06
  4. Réponses: 1
    Dernier message: 21/05/2007, 10h33
  5. [LG]Matrice et pivot de Gauss
    Par Loopingus dans le forum Langage
    Réponses: 3
    Dernier message: 16/03/2005, 17h26

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