Francesca Mazzia
Dipartimento Interuniversitario di Matematica Universit` a di Bari
MATLAB:Metodi Numerici per zeri di funzioni.
Metodo delle successive bisezioni
Sappiamo che la procedura definita dal metodo delle bisezioni determina una sequenza di intervalli ciascuno dei quali ` e contenuto nel precedente
[a
n, b
n] ⊆ [a
n−1, b
n−1] ⊆ . . . ⊆ [a
1, b
1] ⊆ [a
0, b
0];
il generico intervallo ha ampiezza pari alla met` a di quella dell’intervallo pre- cedentemente determinato e contiene lo zero α di f (x).
Generalizzando, la procedura costruisce la successione dei punti medi c
n= a
n−1+ b
n−12 n ≥ 1
e se f (c
n) 6= 0, definisce i nuovi intervalli nel modo seguente
[a
n, b
n] =
(
[c
n, b
n−1] se f (c
n) f (b
n−1) < 0 [a
n−1, c
n] se f (a
n−1) f (c
n) < 0.
Vediamo come costruire una funzione Matlab che ci permette di risolvere il problema della ricerca degli zeri di una funzione mediante il metodo delle bisezioni:
Innanzitutto definiamo una funzione in un file Matlab che chiamiamo f1.m:
function y=f1(x) y=exp(x)-(2*x).^2;
Ora costruiamo la funzione bisezioni.m in cui viene implementato il metodo delle successive bisezioni:
% METODO DELLE SUCCESSIVE BISEZIONI
% PER LA SOLUZIONE DI EQUAZIONI NON LINEARI
%
% function [root,nit] = bisezioni(funz,a,b,tol,nmax)
%
% DATI DI INPUT:
% funz = stringa contenente il nome della funzione
% a,b = estremi dell’intervallo in cui si cerca la radice di funz
% tol = tolleranza
% nmax = numero massimo di iterate
%
% DATI DI OUTPUT:
% root = soluzione
% nit = numero di iterate
%
function [root,nit,errv] = bisezioni(funz,a,b,tol,nmax)
% L’istruzione feval ci permette di calcolare il valore della funzione
% in un punto.
fa = feval(funz,a);
fb = feval(funz,b);
if fa*fb > 0
error(’ERRORE: la funzione non cambia di segno agli estremi’) end
err = 1/eps;
nit = 0
while (err > tol) & (nit <= nmax) c = (a+b)*0.5;
fc = feval(funz,c);
if (fc*fa < 0) b = c;
fb = fc;
else a = c;
fa = fc;
end
nit = nit+1;
err = abs(b-a)/max(1,min([abs(a),abs(b)]));
errv(nit) = err;
end
root = c;
Eseguiamo la funzione:
>> a=-1;
>> b=0;
>> tol=1e-10;
>> nmax=100;
>> [root,nit]=bisezioni(’f1’,a,b,tol,nmax) root =
-4.0778e-01
nit = 36
Possiamo fare altri esempi:
>>
>> a=0;
>> b=1;
>> [root,nit]=bisezioni(’f1’,a,b,tol,nmax) root =
7.1481e-01
nit = 34
>> a=4;
>> b=4.5;
>> [root,nit]=bisezioni(’f1’,a,b,tol,nmax) root =
4.3066e+00
nit = 37
Ordine di convergenza
Il metodo delle bisezioni converge linearmente ad α ed ha costante asin- totica pari ad
12, risultando con ci` o molto lento.
Teorema. Se le successioni convergono con la stessa velocit` a, ovvero 0 < lim
n→∞
a
n− α b
n− α
< ∞, (1)
allora
n→∞
lim
b
n+1− α b
n− α