Informatica 5 Liceo Scientifico Scienze Applicate/Metodo di Bisezione

Wikibooks, manuali e libri di testo liberi.
Indice del libro

Calcolare la radice di una Funzione, Metodo di Bisezione[modifica]

Il metodo della bisezione consente di trovare la radice di una funzione se conosciamo:

  • l'intervallo ]a,b[ che la contiene (non ci sono altre radici nell'intervallo)
  • e che f(a) ha segno opposto a f(b) (quindi f(a)*f(b)<0) in modo da segnalare l'attraversamento della funzione per l'asse delle ascisse, questo comporta che la funzione sia sempre positiva prima di x e sempre negativa dopo o viceversa.

Bisection anime

Nella spiegazione il punto c dell'animazione è diventato x.
Per avvicinarsi alla radice possiamo prendere un punto arbitrario x contenuto nell'intervallo ]a,b[

  • se siamo fortunati f(x)=0 cioè abbiamo trovato la radice della funzione z=x,
  • altrimenti riduciamo l'intervallo di ricerca a ]x,b[ se f(x) ha lo stesso segno di f(a)

o a ]a,x[ se f(x) ha lo stesso segno di f(b),

Naturalmente se viene scelto x=(a+b)/2 il nuovo intervallo ridotto si è dimezzato rispetto a quello di partenza. Il metodo si ripete iterativamente dimezzando ad ogni iterazione l'intervallo di ricerca fino a trovare la soluzione. Ora i punti in un intervallo anche se ridotto sono infiniti è quindi non è detto che troviamo la soluzione ma sicuramente ci avviciniamo, la funzione f viene analizzata però in termini numerici ( per i numeri di tipo float, double,etc si usa una codifica con un numero finito di bit e questo comporta che i valori che i numeri possono assumere costituiscano un insieme finito di elementi) e questo comporta una discretizzazione dei punti dell'intervallo, ha senso quindi fermarsi quando l'intervallo ]a,b[ si ridotto al di sotto di un certo valore, oppure per l'analoga discretizzazione numerica sui valori assunti dalla funzione ci possiamo fermare quando il modulo di f(x) diventa molto piccolo.

Quindi il criterio per terminare la ricerca della radice tramite un metodo iterativo è quello di b-a < quantitàpiccola1 oppure |f(x)|< quantitàpiccola2 dove quanto piccolo lo decidiamo noi.

Dal punto di vista pratico determinare il punto di una trave di cemento armato in cui le forze di taglio passano da positive a negative con una precisione di 1cm o di 10 cm è perfettamente accettabile come quella di considerare nulle le forze di taglio di entità modesta. Per determinare la radice possiamo anche discretizzare l'asse delle x ( un punto ogni cm) e assumere come radice z il valore x per cui la |f(x)| sia il più piccolo fra i valori assunti nell'intervallo ]a,b[

In octave il programma diventa:

a=1;
b=2;
intervallomin=0.001;
zeromax=0.01;
f = inline('x^3-x-2');

do 
x=(b+a)/2;

if( abs(feval(f,x)) < zeromax) 
  break;
 endif

if( sign(feval(f,x)) == sign(feval(f,a)))
  a=x;
else
  b=x;
endif;

until( (b-a) < intervallomin )

x