Implémentation de l'algorithme du pivot de Gauss — Les-mathematiques.net The most powerful custom community solution in the world

Implémentation de l'algorithme du pivot de Gauss

Bonjour,
Je voudrais implémenter l'algorithme du pivot de Gauss sous Python dans le but de résoudre un système de la forme AX=B.
Pour l'instant, j'ai réfléchi à un programme qui mettrait la matrice A sous forme triangulaire :
Le script fonctionne, sauf pour la dernière étape (pour j=n-2).
Quelqu'un saurait-il quel est le problème ?
Merci d'avance

Réponses

  • Bonjour,

    Tu devrais poster dans le sous forum "logiciels pour les mathématiques".
    D'autre part, tu devrais donner ton code sous forme texte (voir la balise "Code") et non une image pour qu'on ne soit pas pas obligé de le recopier pour le tester.
    Enfin, un exemple d'appel de ta fonction ne serait pas inutile.

    Cordialement,
    Rescassol

  • Modifié (May 2023)
    Bonjour,
    Je voudrais implémenter l'algorithme du pivot de Gauss sous Python dans le but de résoudre un système de la forme AX=B.
    Pour l'instant, j'ai réfléchi à un programme qui mettrait la matrice A sous forme triangulaire et qui modifierait B de la même façon :
    def MiseSousFormeTriang(A,B):
        n=A.shape[0]
        for j in range(0,n-1):
            for i in range(j+1,n):
                B[i]=B[i]-A[i,j]/A[j,j]*B[j]
                A[i,:]=A[i,:]-A[i,j]/A[j,j]*A[j,:]
        return(A,B) 
    Le script fonctionne, sauf pour la dernière étape (pour j=n-2). Par exemple pour :
    C=np.array([[1,-2,1,-1],[2,-3,-2,1],[3,1,-3,2],[-1,0,5,-3]])
    D=np.array([-9,-4,7,-11])
    
    On obtient :


    Quelqu'un saurait-il quel est le problème ?
    Merci d'avance
  • Merci pour votre conseil. Je fais ça de suite.
  • Ton code fonctionne , où est le probleme
    def MiseSousFormeTriang(A, B):
        n = A.shape[0]
        for j in range(0, n - 1):
            for i in range(j + 1, n):
                B[i] = B[i] - A[i, j] / A[j, j] * B[j]
                A[i, :] = A[i, :] - A[i, j] / A[j, j] * A[j, :]
        return A, B
    
    import numpy as np
    
    C = np.array([[1, -2, 1, -1], [2, -3, -2, 1], [3, 1, -3, 2], [-1, 0, 5, -3]])
    D = np.array([-9, -4, 7, -11])
    
    result_A, result_B = MiseSousFormeTriang(C, D)
    print("Matrice A après transformation en forme triangulaire :")
    print(result_A)
    print("Matrice B mise à jour :")
    print(result_B)
    

    Le 😄 Farceur


  • Bonsoir,

    Il se trouve que ta matrice $C$ est singulière.

    Cordialement,
    Rescassol

  • Bonjour, 
    Merci pour vos réponses.

     La matrice C est bien inversible :

    Et c'est vraiment à la dernière étape de mon algorithme que ça déraille : lorsque je le fait tourner le programme pour j in range (0,n-2) (c'est à dire que je ne fais pas la dernière étape d'élimination), j'obtiens :

    Et c'est correct (j'ai vérifié à la main) !!!
    Pourquoi du coup le programme ne fait-il plus ce qu'il faut pour j=n-2 ? 
  • MrJMrJ
    Modifié (May 2023)
    Ton code marche : il faut juste entrer des matrices avec des coefficients flottants (Actuellement, l'ordinateur converti le dernier coefficients $0.5$ que l'on trouve avec le pivot en entier pour respecter le type de la matrice entrée).
  • La méthode est bien expliquée dans le document joint . Il vaut mieux trouver l'erreur par toi même.
    Le 😄 Farceur


  • Merci pour la réponse. 
    Pourquoi ? Et comment faire pour transformer tous les coefficients des matrices en flottants ?
  • MrJMrJ
    Modifié (May 2023)
    Voici deux solutions :

    1) On ajoute des points pour préciser qu'il s'agit de flottants.
    C=np.array([[1.,-2.,1.,-1.],[2.,-3.,-2.,1.],[3.,1.,-3.,2.],[-1.,0.,5.,-3.]])
    2) On précise le type des données dans la définition.
    C=np.array([[1,-2,1,-1],[2,-3,-2,1],[3,1,-3,2],[-1,0,5,-3]], dtype=float)

    Tu peux aussi convertir le tableau au début de ta fonction sinon (je ne connais plus la syntaxe par cœur).
  • Merci,
    je n'aurais jamais pensé à ce problème !! Je croyais devenir fou !!
Connectez-vous ou Inscrivez-vous pour répondre.
Success message!