testgradientconj.m 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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 (facultatifs!) sont:
  6. % -n : taille du système (100 par défaut)
  7. % -tol: la tolérance (1-e5 par défaut)
  8. % -maxiter: nombre max d'itérations (n, par défaut)
  9. % En sortie : x la solution ... qui est connue (!): ones(n,1)
  10. if nargin < 1
  11. n = 100;
  12. end
  13. if nargin < 2
  14. tol = 1e-5;
  15. end
  16. if nargin < 3
  17. maxiter = n;
  18. end
  19. Atmp=rand(n,n);
  20. A = Atmp + Atmp';
  21. sol=ones(n,1);
  22. b=A*sol;
  23. x0 = rand(n,1);
  24. iter =1;
  25. % Calcul du 1er résidu
  26. r = A*x0-b;
  27. % direction du gradient d = -r
  28. d = -r;
  29. % Calcul du pas
  30. a = norm(r)^2/dot(A*d,d);
  31. % 1ere itération x1
  32. x_ = x0 + d*a;
  33. % gradient en x1
  34. r_ = A*x_- b;
  35. p = norm(r_)^2/dot(r_-r,d);
  36. % direction
  37. d_ = -r_+ d*p;
  38. x = x_;
  39. r = r_;
  40. d = d_;
  41. while ((norm(r) > tol) && (iter < maxiter))
  42. a = norm(r)^2/dot(A*d,d);
  43. x_ = x + d*a;
  44. r_ = A*x_-b;
  45. p = norm(r_)^2/dot(d,r_-r);
  46. % direction suivante
  47. d_ = -r_+ d*p;
  48. x = x_;
  49. r = r_;
  50. d = d_;
  51. iter=iter+1;
  52. end
  53. %nombre d'iterations
  54. fprintf('Les 10 premiers elements de la solution sont : \n')
  55. x(1:10)
  56. fprintf('Le nombre d''iterations realisee est : %d \n', iter);
  57. end