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
| from scipy import linalg
from random import randint
from scipy import randn
from numpy import array, matrix
### Méthode des itérations successives de Gauss-Seidel
def DiagDom(n):
"""Genère une matrice aléatoire à diagonale dominante"""
M = randn(n,n) #matrice aléatoire
for i in range (0,n):
L1=[abs(M[i,j]) for j in range(0,n) if j !=i]
L2=[abs(M[j,i]) for j in range(0,n) if j !=i]
s= reduce(lambda x,y:x+y,L1+L2)
M[i,i]=s+randint(1,3)
return matrix(M)
def MatD(A):
"""Matrice D de A"""
D=A.copy()
n=len(D)
for i in range(0,n):
for j in range(0,i):
if j<i:
D[i,j]=0
return matrix(D)
def MatM(A):
"""Matrice extraite de A triangulaire inférieure"""
M=A.copy()
for i in range(0,len(A)):
for j in range(i,len(A)):
M[i,j]=0
return M
def Seidel(D,M,B,X):
"""itérateur de Gauss-Seidel"""
yield X
while True:
X=D*B-D*M*X
yield X
def main():
n=4
A=DiagDom(n) # matrice du système
B=matrix(randn(n,1)) # second membre
D=MatD(A)
D=linalg.inv(D)
M=MatM(A)
X=matrix( [[0] for i in range(0,n)])
Seid=Seidel(D,M,B,X)
for i in range(0,10):# 10 itérations par Gauss Seidel
S1=Seid.next()
S2=linalg.solve(A,B)# solution 'exacte'
print linalg.norm(S1-S2)
if __name__== "__main__":
main() |
Partager