L'algoritmo che chiedi è alquanto complesso....questo è un po semplificato...
Voglio combinare opportunamente i metodi di bisezione e secanti in modo da generare una successione di intervalli contenente la radice x*.
L'algoritmo usa ad ogni passo tre punti :
a= penultima approssimazione calcolata
b= ultima approssimazione
c=punto piu recente tale che x* cade nell intervallo (b,c)
Parto da due valori iniziali a e b tali che f(a)f(b) <0, pongo c=a e applico il metodo delle secanti, se il punto ottenuto da una approssimazione non buona si usa il metodo di bisezione.
Al passo successivo la nuova approssimazione è
bnew= ottenuto con metodo secanti applicato ad a eb se bnew appartiene all intervallo (b,c) e se f(b)!=f(a)
altrimenti
bnew= ottenuto con bisezione applicato ad (b,c)
Il nuovo intervallo sarà (b,bnew) o (bnew,c) a seconda di dove cade lo zero ; cosi il nuovo intervallo e il piu piccolo tra quelli calcolati contenente la radice.
codice:
fa=f(a);
fb=f(b);
nit=0;
if (fa*(fb/|fb|)) > 0 then stop
else
c=a
while (|b-c|) > TOL|b| and |fb|>TOLF and nit <NMAX
nit = nit+1
if (fb |= fa ) then
d=fb(b-a)/(fb-fa)
if(sign(d)|=sign(b-c) or |d|>|b-c) then //b-d non appartiene(b,c)
d=.5(b-c)
endif
else
d=.5(b-c)
endif
a=b;
fa=fb;
b=b-d;
fb=f(b);
if (fax(fb/|fb|))<0 then
c=a
endif
endif
endwhile
fa*fb < 0 va effettuato per evitare l underflow...se ad esempio fai che fa=10^-30 fb=-10^-30 si ha che fa*fb = underflow ed e posto a zero vanificando il test.
Il test (Sign(d)|=sign(b-c) or |d| > |b-c|) verifica che b-d non appartiene a(b,c), qualunque sia l ordine delgi estremi ;
infatti se b<c(b-c<0) si ha che b-d non appartiene all intervallo(b,c) se d>0 o se d<0 e|d|>c-b, se invece b>c(b-c>0) si ha che b-d non appartiene all intervallo (b,c) quando d<0 o quando d>0 e d> b-c, da cui il test.
In matlab ti ricordo la funziona fzero, che calcola lo zero di una funzione basata proprio sull algoritmo di dekker brent
Si usa cosi z=fzero('fun',x0,tol)