Python : Algorithme de Gauss-Jordan

Répondre

Messages : 0

Enregistré le : 28 mai 2019 13:36

Classe : PSI

Python : Algorithme de Gauss-Jordan

Message par Porus » 13 août 2020 15:23

bonjour,

Je révise les cours d'IPT de sup, je bloque un peu pour comprendre la traduction en Python de l'algorithme de Gauss-Jordan que j'ai dans mon cours :?
Pour les fonctions auxiliaires suivantes, y a pas de soucis :

Code : Tout sélectionner

def Echangeligne(A,i,j): # pour échanger les lignes i et j
    X=numpy.copy(A[i])
    A[i]=A[j]
    A[j]=X
    return A
    
def Dilatation(A,a,i): #pour multiplier la ligne i par a
    A[i]=a*A[i]
    return A

def Transvection(A,i,j,a): #pour ajouter a fois la ligne j à la ligne i 
    A[i]=A[i]+a*A[j]
    return A
en revanche la fonction principale, j'ai bcp de mal, voici le programme :

Code : Tout sélectionner

def PivotInversible(Ap,Bp) : 
A=numpy.array(Ap,copy=True,dtype=float) #déjà pq faire des copies des 2 matrices en paramètres ?
B=numpy.array(Bp,copy=True,dtype=float)
n=A.shape[0]                                 #pour avoir le nombre de lignes dans la matrice A ??
for k in range(n) :                          #k va parcourir toutes les lignes je pense ?
    i=k                                               #on change le nom du compteur, pourquoi pas 
    while i<n and A[i,k]==0 :          #boucle qui va tourner jusqu'à la dernière ligne en 
                                                        #même temps que le coeff à la ligne i et à la colonne 
                                                        #k est nulle
        i+=1
        A=EchangeLigne(A,i,k)                #puis je sais même plus ce qu'on fait ...
        B=EchangeLigne(B,i,k)
        pivot=A[k,k]
        A=Dilatation(A,k,1/pivot)
        B=Dilatation(B,k,1/pivot)
        for j in range(n) :
            if j !=k :
            x=A[j,k]
            A=Transvection(A,j,k,-x)
            B=Transvection(B,j,k,-x)
return (A,B)
si vous pouvez lever le voile sur ce programme...
merci bcp

YS1

Messages : 10

Enregistré le : 06 févr. 2005 11:50

Classe : MPSI, PCSI, MP*, PC*

Re: Python : Algorithme de Gauss-Jordan

Message par YS1 » 17 août 2020 13:51

Effectivement, il y a plusieurs choix techniques qui me paraissent surprenants, avec des copies dans tous les sens (y compris dans la fonction d'échange) et d'autres choses (particulièrement des return qui me paraissent trahir une mauvaise compréhension de ce qui se passe quand on modifie une matrice en place)… La copie au début de la fonction principale en revanche a du sens : elle permet que les matrices initiales ne soient pas transformées par l'application de l'algorithme (c'est un choix).

Au surplus, la fonction principale est, comme vous le soulignez, difficile à comprendre car on n'a pas isolé dans une fonction auxiliaire la détermination de la ligne du pivot.

Si je demande d'écrire le pivot de Gauss et qu'on m'écrit ça, je ne mets pas tous les points…

Puisque vous avez l'air d'avoir un peu cerné les problèmes, plutôt que d'essayer de rétablir ce programme malhabile, je vous recommande d'écrire votre propre version depuis zéro. Pour ne pas être influencé par ce programme, vous pourriez faire une version qui manipule des matrices représentées par des listes de listes de flottants plutôt que par des tableaux numpy (qui sont certes optimisés mais ne sont pas au programme).

Répondre