Livre_silo 30 août 2013 16:32 Page 184
¨
©
¨
©
¨
©
¨
©
C o p y r i g h t E y r o l l e s
184
Informatique pour tous
# Phase de remontée
X = [0.] * n
for i in range(n-1, -1, -1):
X[i] = (Y[i][0]-sum(A[i][j]*X[j] for j in range(i+1,n))) / A[i][i]
return X
EN PRATIQUE Dans les versions Python 2.x
La conversion de a i,i en flottant est nécessaire si la matrice en entrée est constituée d’entiers, car en Python 2.x, la division est vue comme une division entière : c’est le quotient
dans la division euclidienne qui est renvoyé et non le quotient flottant.
Le choix qui a été fait dans Python 3.x est le suivant : l’opérateur / voit ses paramètres
comme des flottants et renvoie un flottant. Ce choix de conception est pragmatique dans ce
contexte, mais il fait perdre un peu en généricité. Par exemple, une résolution manipulant
des rationnels « exacts » devrait être écrite sans cette conversion.
Il est à noter enfin que la phase de remontée a été accélérée grâce à l’utilisation de la
fonction sum de Python. Le programme complet est donné programme 4 ci-après.
On peut vérifier que tout se passe bien, avec l’exemple 1 :
In [4]: resolution([[2,2,-3],[-2,-1,-3],[6,4,4]],[[2],[-5],[16]])
Out[4]: [-14.000000000000036, 21.000000000000046, 4.000000000000007]
Si on tente de résoudre les systèmes suivants, qui ne sont pas de Cramer, on a bien entendu
quelques ennuis :
x + 2y = 1
2x + 4y = 1
x + 2y = 1
2x + 4y = 2
In [5]: resolution([[1,2],[2,4]],[[1],[1]])
ZeroDivisionError: float division by zero
In [6]: resolution([[1,2],[2,4]],[[1],[2]])
ZeroDivisionError: float division by zero
POUR ALLER PLUS LOIN Une erreur peu parlante
Un logiciel de calcul formel traiterait ces deux situations de façon différente : dans le premier cas, l’ensemble vide serait renvoyé, alors que dans le second serait renvoyé un ensemble paramétré sous une forme ou une autre.
¨
©
¨
©
¨
©
¨
©
C o p y r i g h t E y r o l l e s
184
Informatique pour tous
# Phase de remontée
X = [0.] * n
for i in range(n-1, -1, -1):
X[i] = (Y[i][0]-sum(A[i][j]*X[j] for j in range(i+1,n))) / A[i][i]
return X
EN PRATIQUE Dans les versions Python 2.x
La conversion de a i,i en flottant est nécessaire si la matrice en entrée est constituée d’entiers, car en Python 2.x, la division est vue comme une division entière : c’est le quotient
dans la division euclidienne qui est renvoyé et non le quotient flottant.
Le choix qui a été fait dans Python 3.x est le suivant : l’opérateur / voit ses paramètres
comme des flottants et renvoie un flottant. Ce choix de conception est pragmatique dans ce
contexte, mais il fait perdre un peu en généricité. Par exemple, une résolution manipulant
des rationnels « exacts » devrait être écrite sans cette conversion.
Il est à noter enfin que la phase de remontée a été accélérée grâce à l’utilisation de la
fonction sum de Python. Le programme complet est donné programme 4 ci-après.
On peut vérifier que tout se passe bien, avec l’exemple 1 :
In [4]: resolution([[2,2,-3],[-2,-1,-3],[6,4,4]],[[2],[-5],[16]])
Out[4]: [-14.000000000000036, 21.000000000000046, 4.000000000000007]
Si on tente de résoudre les systèmes suivants, qui ne sont pas de Cramer, on a bien entendu
quelques ennuis :
x + 2y = 1
2x + 4y = 1
x + 2y = 1
2x + 4y = 2
In [5]: resolution([[1,2],[2,4]],[[1],[1]])
ZeroDivisionError: float division by zero
In [6]: resolution([[1,2],[2,4]],[[1],[2]])
ZeroDivisionError: float division by zero
POUR ALLER PLUS LOIN Une erreur peu parlante
Un logiciel de calcul formel traiterait ces deux situations de façon différente : dans le premier cas, l’ensemble vide serait renvoyé, alors que dans le second serait renvoyé un ensemble paramétré sous une forme ou une autre.
