Bonjour,
Je suis débutante en Python et je dois faire un code qui programme les différentes méthodes de relaxation (Jacobi, Gauss-Seidel et SOR) pour calculer Ax=b.
Pour la méthode de Jacobi, on décompose A=M-N avec M=diagonale(A) et N=A-M. Partant d'un x0 donné, on écrit Mx^(k+1) = Nx^(k) + b.
On cherche à écrire une fonction qui prend en entrée une matrice A, un vecteur colonne b, un nombre d'itérations maximal Imax, une tolérance eps (pour epsilon). On utilisera un test d'arrêt [k <= Imax ou ||r^k|| < eps, où r^k = Ax^k - b est le "résidu" à l'étape k.
Voici mon code :
Puis j'ai fait un test avec une matrice A de taille 3x3 pour voir si mon code est correct.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 def jacobi(A,b,Imax,eps,x0): D=np.diag(np.diag(A)) N=D-A r=np.dot(A,x0)-b x=x0 i=0 err=1+eps res=[] while ((i<Imax) and ((la.norm(r))>=eps)): x=np.dot(np.dot((la.inv(D)),N),x)+np.dot((la.inv(D)),b) r=np.dot(A,x)-b err = la.norm(r,2) res.append(err) i=i+1 return (x,i,res)
ça me semble pas trop mal, mais j'ai quelques questions.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 A=np.array([[2,0,0],[4,5,0],[7,8,9]]) x0=np.array([[1],[1],[1]]) b=np.array([[20],[8],[7]]) print(jacobi(A,b,1000,10**(-3),x0))
Pensez-vous qu'il y ait des erreurs dans mon code ?
L'énoncé me demande de tester le code avec une matrice 20x20. Je me demande comment tester avec une telle matrice sans entrer les coefficients un par un (ce qui me semble long et fastidieux). Avez-vous une idée?
Merci d'avance, je suis débutante en Python, j'espère que mon sujet est bien placé...
Partager