Ralis par: -GASMI MOSTAPHA EL HADI Pr :k.rachedi -KADRI AHCENE -Groupe : MMTR 13
TP mthode numrique Rsoudre une quation linaire AX=B par la mthode de Jacobi partir de programmation fortran 2013/2014
Plan de travail : Partie thorique : Explication la mthode de Jacobi Partie pratique : Programme de Jacobi sur Fortran Solution
Partie thorique : La mthode de Jacobi, due au mathmaticien allemand Karl Jacobi, est une mthode itrative de rsolution d'un systme matriciel de la forme Ax=b. Pour cela, on utilise une suite x (k) qui converge vers un point fixe x, solution du systme d'quations linaires. Principe de construction : On cherche construire l'algorithme pour x (0) donn, la suite x (k + 1) = F(x (k) ) avec .
A = M N o M est une matrice inversible.
O F est une fonction affine. Algorithme :
Si x est solution de Ax = b alors x = M 1 Nx + M 1 b . Vecteur erreur : Soit e (k) le vecteur erreur e (k + 1) = x (k + 1) x (k) = M 1 N(x (k) x (k 1) ) = M 1 Ne (k)
On pose B = M 1 N, ce qui donne e (k + 1) = Be (k) = B (k + 1) e (0) . Convergence : L'algorithme converge si (matrice nulle).
Thorme : Une condition ncessaire et suffisante pour que est que le rayon spectral (plus grande valeur propre en module) de B soit strictement infrieur 1.
Thorme : La mthode converge quel que soit x (0) pour les systmes linaires dont la matrice est diagonale strictement dominante.
Mthode de Jacobi : On dcompose la matrice A de la faon suivante : A = D-E-F avec D la diagonale, -E la partie en dessous de la diagonale et -F la partie au-dessus. Dans la mthode de Jacobi, on choisit M = D et N = E+F (dans la mthode de Gauss-Seidel, M = D-E et N = F). x (k + 1) = D 1 (E + F)x (k) + D 1 b avec pour la ligne i de D 1 (E + F) :
Vecteur rsidu : Soit r (k) = De (k) le vecteur rsidu. On peut crire avec que l'on calcule de la manire suivante :.
Test d'arrt : Pour le test d'arrt, on utilise le vecteur rsidu, ce qui donne, pour une prcision donne :
Conclusion Cette mthode a un cot de l'ordre de 3n+2n par itration, elle est trs facilement paralllisa- bl contrairement la mthode de Gauss-Seidel, mais qui converge plus vite.
Partie pratique : Le programme de Jacobi : program ljacobi parameter(mmax=50,nmax=50,mx=mmax+1,ny=nmax+1) parameter(tol=.005) dimension u(0:mx,0:ny) dimension v(0:mx,0:ny) dimension e(0:mx,0:ny) dimension a(nmax), b(nmax), c(nmax), d(nmax) dx = 1./mx do 2 m = 1,mmax x = m*dx v(m,0) = x*x v(m,ny) = x*x - 1. 2 continue dy = 1./ny do 3 n = 1,nmax y = n*dy v(0,n) = -y*y v(mx,n) = 1. - y*y 3 continue do 99 j = 1,nmax do 99 i = 1,mmax x = i*dx y = j*dy e(i,j) = x*x - y*y v(i,j) = 0.0 99 continue do 77 k = 1,100 do 6 m = 1,mmax do 55 n = 1,nmax a(n) = -1. b(n) = 4. c(n) = -1. d(n) = v(m-1,n) + v(m+1,n) 55 continue d(1) = d(1) + v(m,0) d(nmax) = d(nmax) + v(m,ny) do 10 i = 2,nmax ratio = a(i)/b(i-1) b(i) = b(i) - ratio*c(i-1) d(i) = d(i) - ratio*d(i-1) 10 continue d(nmax) = d(nmax)/b(nmax) u(m,nmax) = d(nmax) do 20 i = nmax-1,1,-1 d(i) = (d(i) - c(i)*d(i+1))/b(i) u(m,i) = d(i) 20 continue 6 continue do 7 n = 1,nmax do 7 m = 1,mmax v(m,n) = u(m,n) 7 continue residual = 0.0 emax = 0.0 do 88 n = 1,mmax do 88 m = 1,mmax res = 4.*v(m,n) - (v(m-1,n)+v(m,n-1)+v(m+1,n)+v(m,n+1)) residual = amax1(abs(res),residual) error = v(m,n) - e(m,n) emax = amax1(abs(error),emax) 88 continue write(6,200) k,residual,emax if(emax.lt.tol) goto 999 77 continue 999 write(6,300) 200 format('at iteration ',i5' residual = ',e10.2' error = ',e10.2) 300 format('done') end
Simply FORTRAN:
La solution: Lexcution :
t iteration 1 residual = .88E+00 error = .91E+00 t iteration 2 residual = .44E+00 error = .87E+00 t iteration 3 residual = .29E+00 error = .83E+00 t iteration 4 residual = .23E+00 error = .79E+00 t iteration 5 residual = .17E+00 error = .77E+00 t iteration 6 residual = .16E+00 error = .76E+00 t iteration 7 residual = .13E+00 error = .73E+00 t iteration 8 residual = .12E+00 error = .71E+00 t iteration 9 residual = .11E+00 error = .71E+00 t iteration 10 residual = .95E-01 error = .69E+00 t iteration 11 residual = .90E-01 error = .68E+00 t iteration 12 residual = .78E-01 error = .67E+00 t iteration 13 residual = .76E-01 error = .65E+00 t iteration 14 residual = .69E-01 error = .64E+00 t iteration 15 residual = .66E-01 error = .63E+00 t iteration 16 residual = .61E-01 error = .62E+00 Press any key to continue