123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- function [x] = testgradientconj(n,tol,maxiter)
- % exemple pour illustrer un exemple de passage de paramètres
- % d'un script matlab lancer en mode batch sur calculco (tutoriaux)
- % résolution du système Ax =b par la méthode du gradient conjugué
- % En entrée les arguments (facultatifs!) sont:
- % -n : taille du système (100 par défaut)
- % -tol: la tolérance (1-e5 par défaut)
- % -maxiter: nombre max d'itérations (n, par défaut)
- % En sortie : x la solution ... qui est connue (!): ones(n,1)
- if nargin < 1
- n = 100;
- end
- if nargin < 2
- tol = 1e-5;
- end
- if nargin < 3
- maxiter = n;
- end
- Atmp=rand(n,n);
- A = Atmp + Atmp';
- sol=ones(n,1);
- b=A*sol;
- x0 = rand(n,1);
- iter =1;
- % Calcul du 1er résidu
- r = A*x0-b;
- % direction du gradient d = -r
- d = -r;
- % Calcul du pas
- a = norm(r)^2/dot(A*d,d);
- % 1ere itération x1
- x_ = x0 + d*a;
- % gradient en x1
- r_ = A*x_- b;
- p = norm(r_)^2/dot(r_-r,d);
- % direction
- d_ = -r_+ d*p;
- x = x_;
- r = r_;
- d = d_;
- while ((norm(r) > tol) && (iter < maxiter))
- a = norm(r)^2/dot(A*d,d);
- x_ = x + d*a;
- r_ = A*x_-b;
- p = norm(r_)^2/dot(d,r_-r);
- % direction suivante
- d_ = -r_+ d*p;
- x = x_;
- r = r_;
- d = d_;
- iter=iter+1;
- end
- %nombre d'iterations
- fprintf('Les 10 premiers elements de la solution sont : \n')
- x(1:10)
- fprintf('Le nombre d''iterations realisee est : %d \n', iter);
- end
|