48
2 Equations non linéaires
Programme 2.1. bisection : méthode de dichotomie
function [ zero , res , niter ]= b i s e ctio n( fun ,a ,b , tol ,...
nmax , varargin )
% B I S E CTION Cherche les zéros d ’ une fonction .
%
ZERO = B I S E CTION( FUN ,A ,B , TOL , NMAX ) tente de trouver
%
un zéro ZERO d ’ une fonction continue FUN sur
%
l ’ i n t e rvalle [A , B] u t i li sant la méthode de
%
d i c ho tomie ( ou b i s ect ion).
%
FUN prend des réels en entrée et retourne un
%
scalaire réel . Si la r e c he rche échoue , un message
%
d ’ erreur est affiché . FUN peut aussi être
%
un objet inline , une fonction anonyme ou
%
bien être définie par un M - files .
%
ZERO = B I S E CTION( FUN ,A ,B , TOL , NMAX ,P1 , P2 ,...) passe
%
les p a r a mèt res P1 , P2 ,... à la fonction
%
FUN (X ,P1 , P2 ,...).
%
[ ZERO , RES , NITER ]= B I S E CTION( FUN ,...) retourne la
%
valeur a p p r oché e du zéro , la valeur du résidu en
%
ZERO et le numéro de l ’ i t é ra tion à laquelle ZERO a
%
été calculé .
x = [a , ( a+ b )*0.5 , b ]; fx = feval (fun ,x , varargin {:});
if fx (1)* fx (3) >0
error ([ ’ Les signes de la fonction aux e x t r émi tés’ ,...
’ de l ’’ i n t erv alle doivent être d i f f ére nts\ n ’ ]);
elseif fx (1) == 0
zero = a; res = 0; niter = 0; return
elseif fx (3) == 0
zero = b; res = 0; niter = 0; return
end
niter = 0;
I = ( b - a )*0.5;
while I >= tol & niter < nmax
niter = niter + 1;
if fx (1)* fx (2) < 0
x (3) = x (2);
x (2) = x (1)+( x (3) -x ( 1 ) )* 0.5;
fx = feval (fun ,x , varargin {:});
I = ( x (3) -x ( 1 ) )*0. 5;
elseif fx (2)* fx (3) < 0
x (1) = x (2);
x (2) = x (1)+( x (3) -x ( 1 ) )* 0.5;
fx = feval (fun ,x , varargin {:});
I = ( x (3) -x ( 1 ) )*0. 5;
else
x (2) = x ( find ( fx ==0)); I = 0;
end
end
if ( niter == nmax & I > tol )
fprintf ([ ’ La d i c h otom ie s ’’ est arrêtée sans \ n ’ ,...
’ c o n ver ger avec la t o l é rance s o u hait ée car \ n ’ ,...
’ le nombre maximal d ’’ i t é r ations a été atteint \ n ’ ]);
end
zero = x (2); x = x (2); res = feval ( fun ,x , varargin {:});
return
2 Equations non linéaires
Programme 2.1. bisection : méthode de dichotomie
function [ zero , res , niter ]= b i s e ctio n( fun ,a ,b , tol ,...
nmax , varargin )
% B I S E CTION Cherche les zéros d ’ une fonction .
%
ZERO = B I S E CTION( FUN ,A ,B , TOL , NMAX ) tente de trouver
%
un zéro ZERO d ’ une fonction continue FUN sur
%
l ’ i n t e rvalle [A , B] u t i li sant la méthode de
%
d i c ho tomie ( ou b i s ect ion).
%
FUN prend des réels en entrée et retourne un
%
scalaire réel . Si la r e c he rche échoue , un message
%
d ’ erreur est affiché . FUN peut aussi être
%
un objet inline , une fonction anonyme ou
%
bien être définie par un M - files .
%
ZERO = B I S E CTION( FUN ,A ,B , TOL , NMAX ,P1 , P2 ,...) passe
%
les p a r a mèt res P1 , P2 ,... à la fonction
%
FUN (X ,P1 , P2 ,...).
%
[ ZERO , RES , NITER ]= B I S E CTION( FUN ,...) retourne la
%
valeur a p p r oché e du zéro , la valeur du résidu en
%
ZERO et le numéro de l ’ i t é ra tion à laquelle ZERO a
%
été calculé .
x = [a , ( a+ b )*0.5 , b ]; fx = feval (fun ,x , varargin {:});
if fx (1)* fx (3) >0
error ([ ’ Les signes de la fonction aux e x t r émi tés’ ,...
’ de l ’’ i n t erv alle doivent être d i f f ére nts\ n ’ ]);
elseif fx (1) == 0
zero = a; res = 0; niter = 0; return
elseif fx (3) == 0
zero = b; res = 0; niter = 0; return
end
niter = 0;
I = ( b - a )*0.5;
while I >= tol & niter < nmax
niter = niter + 1;
if fx (1)* fx (2) < 0
x (3) = x (2);
x (2) = x (1)+( x (3) -x ( 1 ) )* 0.5;
fx = feval (fun ,x , varargin {:});
I = ( x (3) -x ( 1 ) )*0. 5;
elseif fx (2)* fx (3) < 0
x (1) = x (2);
x (2) = x (1)+( x (3) -x ( 1 ) )* 0.5;
fx = feval (fun ,x , varargin {:});
I = ( x (3) -x ( 1 ) )*0. 5;
else
x (2) = x ( find ( fx ==0)); I = 0;
end
end
if ( niter == nmax & I > tol )
fprintf ([ ’ La d i c h otom ie s ’’ est arrêtée sans \ n ’ ,...
’ c o n ver ger avec la t o l é rance s o u hait ée car \ n ’ ,...
’ le nombre maximal d ’’ i t é r ations a été atteint \ n ’ ]);
end
zero = x (2); x = x (2); res = feval ( fun ,x , varargin {:});
return
