1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| function [x, err] = steffenson(g, x0, nmax, epsilon, resul)
%
% Méthode d'accélération de Steffenson pour les points fixes en une variable
% pour résoudre x = g(x)
% Programmeur: A. Fortin (2008)
% Référence: Analyse numérique pour ingénieurs, A. Fortin,
% Presses internationales Polytechnique, 2008
% Section 2.3.3
%
%
% Exemples d'appel:
% [x, err] = steffenson('g', 2.0, 10, 1.0e-6)
% [x, err] = steffenson('g', 2.0, 10, 1.0e-6, 'resul.dat')
%
% Si vous avec une fonction anonyme (@) (on ne met pas les apostrophes)
% [x, err] = steffenson(g_anonyme, 2.0, 10, 1.0e-6)
% [x, err] = steffenson(g_anonyme, 2.0, 10, 1.0e-6, 'resul.dat')
%
% Arguments
%
% Entrée:
% 1) g: Le nom entre apostrophes (' ') du fichier .m contenant la fonction g(x).
% comme par exemple 'g' (correspondant a un fichier g.m)
% ou encore le nom de la fonction anonyme comme par exemple
% g_anonyme = @(x) exp(-x);
% 2) x0: Vous devez fournir un estimé initial.
% 3) nmax: Vous devez fournir le nombre maximal d'itérations.
% 4) epsilon: Vous devez fournir le critère d'arrêt.
% 5) resul: Si vous voulez les résultats dans un fichier, vous devez
% fournir le nom entre apostrophes (' ') de ce fichier.
% Exemple: 'resul.dat' qui créera un fichier nommé resul.dat.
% Retour:
% 1) x est un vecteur contenant les différentes itérations.
% 2) S'il y a convergence, err est le vecteur dont les composantes sont |x_n - r|,
% r étant le point fixe trouve. Sinon, err est une matrice vide.
%
f = g;
g=fcnchk(g);
infini = 0;
x=zeros(1); gx=zeros(1); errel=zeros(1);
x(1) = x0;
gx0 = g(x0);
if (~isfinite(gx0)),
error('g(x0) n''est pas un nombre fini.');
end
gx(1) = gx0;
compteur = 0;
for n=1:nmax,
x1 = g(x0);
x2 = g(x1);
xe = x0 - (x1-x0)^2/(x2-2*x1+x0);
ind = n-1;
x0 = xe;
if (~isfinite(gx0)),
if (n == 1),
fprintf('\r\n Il n''y a pas convergence.\r\n\r\n');
else
fprintf('\r\n Il n''y a pas convergence après %1.0f itérations.\r\n\r\n', ind);
end
infini = 1;
break;
end
x(n+1) = x0;
gx0 = g(x0);
gx(n+1) = gx0;
tol = abs(x0 - x(n));
tolrel = tol/(abs(x0)+eps);
errel(n) = tolrel;
if (tolrel < epsilon),
break;
end
end
if (tolrel < epsilon),
err = abs(x - x0);
converg = 1;
else
err = [];
converg = 0;
if (infini == 0),
fprintf('\r\n Il n''y a pas de convergence apres %1.0f iterations.\r\n\r\n', nmax);
end
end
if (nargin > 4),
steffenson_out(f, resul, x, gx, errel, nmax, epsilon, converg);
end
plot(x,x,'g*');
end |
Partager