gradientconj.m 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. function [x] = testgradientconj(n,tol,maxiter)
  2. % exemple pour illustrer un exemple de passage de paramètres
  3. % d'un script matlab lancer en mode batch sur calculco (tutoriaux)
  4. % résolution du système Ax =b par la méthode du gradient conjugué
  5. % En entrée les arguments sont:
  6. % -n : taille du système
  7. % -tol: la tolérance
  8. % -maxiter: nombre max d'itérations
  9. % En sortie : x la solution ... qui est connue (!): ones(n,1)
  10. Atmp=rand(n,n);
  11. A = Atmp + Atmp';
  12. sol=ones(n,1);
  13. b=A*sol;
  14. x0 = rand(n,1);
  15. iter =1;
  16. % top départ;
  17. tic;
  18. % Calcul du 1er résidu
  19. r = A*x0-b;
  20. % direction du gradient d = -r
  21. d = -r;
  22. % Calcul du pas
  23. a = norm(r)^2/dot(A*d,d);
  24. % 1ere itération x1
  25. x_ = x0 + d*a;
  26. % gradient en x1
  27. r_ = A*x_- b;
  28. p = norm(r_)^2/dot(r_-r,d);
  29. % direction
  30. d_ = -r_+ d*p;
  31. x = x_;
  32. r = r_;
  33. d = d_;
  34. while ((norm(r) > tol) && (iter < maxiter))
  35. a = norm(r)^2/dot(A*d,d);
  36. x_ = x + d*a;
  37. r_ = A*x_-b;
  38. p = norm(r_)^2/dot(d,r_-r);
  39. % direction suivante
  40. d_ = -r_+ d*p;
  41. x = x_;
  42. r = r_;
  43. d = d_;
  44. iter=iter+1;
  45. end
  46. eltime=toc;
  47. %nombre d'iterations
  48. fprintf('Le nombre d''iterations realisee est : %d \n', iter);
  49. fprintf('elapsed time : %f \n', eltime);
  50. fprintf('csv: %d , %s, %d, %d, %f \n',n,tol,maxiter,iter,eltime);
  51. fprintf('Les 10 premiers elements de la solution sont : \n')
  52. x(1:10)
  53. end