Metodo di bisezione in JAVA
Buona sera a tutti... ho un esercizio da svolgere ma ho un dubbio , se gentilmente qualcuno potrebbe darmi una mano !!
Allora : Scrivere un metodo che, dato un parametro reale d, calcoli con precisione d
uno zero di f(x) = 2$x^3$- 4x + 1 nell'intervallo [0; 1]. Io non capisco bene cosa sia il d (dovrebbe essere la distanza da uno zero ) ma la distanza da chi??
la soluzione è questa :

uno zero di f(x) = 2$x^3$- 4x + 1 nell'intervallo [0; 1]. Io non capisco bene cosa sia il d (dovrebbe essere la distanza da uno zero ) ma la distanza da chi??
la soluzione è questa :
public static float zero_f(float b,float t, float d ){ float m = (t+b)/2; if( ( Math.abs(f(t)))<=d) return t ; if ( (f(t)*f(m))<0) return zero_f(m,t,d); return zero_f(b,m,d); } //io non capisco quindi 1) cosa si intende con d , e poi perchè Math.abs(f(t)))<=d) Grazie a tutti!!!!!
Risposte
Nell'algoritmo di bisezione si prende un intervallo [a, b] all'interno del quale si assume l'esistenza di un unico zero e si ha quindi che \( f(a)f(b) < 0 \) (il segno della funzione ai due estremi è diverso). Si considera quindi il punto intermedio e si guarda il segno di questo valore. Siccome si suppone che la funzione abbia un solo zero nell'intervallo, tutti i valori \(a < x < b\) per cui \( f(x)f(b) > 0 \) sono a sinistra dello zero, mentre tutti i valori \( a < y < b \) per cui \( f(y)f(b) < 0 \) sono a destra dello zero. In questo modo si può ridurre l'intervallo da considerare sempre di più. Ma dimezzando un intervallo non si arriverà mai ad un singolo valore e serve allora un parametro \( d \) che definisca l'errore massimo nel valore restituito. Siccome nel tuo caso si restituisce uno dei due estremi si calcola il valore assoluto di questo valore e quando è abbastanza vicino allo zero, si restituisce.
Vediamo in pratica come funziona nel tuo caso. Hai \([a, b] = [0, 1]\) e \(f = 2\,x^3 - 4\,x + 1\). Supponiamo che sia \(d = 10^2 \). Per cui \(f(0) = 1 > 0\) e \(f(1) = -1 < 0\). Consideriamo allora il valore intermedio e calcoliamo \( f(1/2) = -3/4 < 0 \). Si prende allora l'intervallo \( [a, b] = [0, 1/2] \) e si ripete il procedimento ottenendo come valore intermedio \( f(1/4) = 1/32 \) che è questa volta positivo (ma l'errore è sempre troppo grande). Si prende allora l'intervallo \( [1/4, 1/2] \) e si divide nuovamente l'intervallo a metà a \( 3/8 \) ottenendo \( f(3/8) = -101/256 = -0.39453125 < 0 \). Si prende allora l'intervallo \( [1/4, 3/8] \) e lo si divide nuovamente a metà ottenendo:
\( [1/4, 3/8] \) -> \( f(5/16) = -387/2048 = -0.18896484375 < 0, \)
\( [1/4, 5/16] \) -> \( f(9/32) = -1319/16384 = -0.08050537109375 < 0, \)
\( [1/4, 9/32] \) -> \( f(17/64) = -3279/131072 = -0.02501678466796875 < 0, \)
\( [1/4, 17/64] \) -> \( f(33/128) = 3169/1048576 = 0.0030221939086914063 > 0, \)
Siccome la condizione viene verificata nel tuo codice nell'estremo superiore non ci fermiamo ancora anche se abbiamo ottenuto un valore abbastanza vicino allo zero.
\( [33/128, 17/64] \) -> \( f(67/256) = -92453/8388608 = -0.011021256446838379 < 0, \)
Continua ad essere maggiore dell'errore massimo, anche se di poco.
\( [33/128, 67/256] \) -> \( f(133/512) = -268803/67108864 = -0.0040054768323898315 < 0. \)
A questo punto la funzione esce e restituisce \( 133/512 \) come zero della funzione.
Vediamo in pratica come funziona nel tuo caso. Hai \([a, b] = [0, 1]\) e \(f = 2\,x^3 - 4\,x + 1\). Supponiamo che sia \(d = 10^2 \). Per cui \(f(0) = 1 > 0\) e \(f(1) = -1 < 0\). Consideriamo allora il valore intermedio e calcoliamo \( f(1/2) = -3/4 < 0 \). Si prende allora l'intervallo \( [a, b] = [0, 1/2] \) e si ripete il procedimento ottenendo come valore intermedio \( f(1/4) = 1/32 \) che è questa volta positivo (ma l'errore è sempre troppo grande). Si prende allora l'intervallo \( [1/4, 1/2] \) e si divide nuovamente l'intervallo a metà a \( 3/8 \) ottenendo \( f(3/8) = -101/256 = -0.39453125 < 0 \). Si prende allora l'intervallo \( [1/4, 3/8] \) e lo si divide nuovamente a metà ottenendo:
\( [1/4, 3/8] \) -> \( f(5/16) = -387/2048 = -0.18896484375 < 0, \)
\( [1/4, 5/16] \) -> \( f(9/32) = -1319/16384 = -0.08050537109375 < 0, \)
\( [1/4, 9/32] \) -> \( f(17/64) = -3279/131072 = -0.02501678466796875 < 0, \)
\( [1/4, 17/64] \) -> \( f(33/128) = 3169/1048576 = 0.0030221939086914063 > 0, \)
Siccome la condizione viene verificata nel tuo codice nell'estremo superiore non ci fermiamo ancora anche se abbiamo ottenuto un valore abbastanza vicino allo zero.
\( [33/128, 17/64] \) -> \( f(67/256) = -92453/8388608 = -0.011021256446838379 < 0, \)
Continua ad essere maggiore dell'errore massimo, anche se di poco.
\( [33/128, 67/256] \) -> \( f(133/512) = -268803/67108864 = -0.0040054768323898315 < 0. \)
A questo punto la funzione esce e restituisce \( 133/512 \) come zero della funzione.
adesso leggerò con calma il tutto vedro' di capire...!!!! COmunque grazie millee !!!!!
molto gentile!!!

quindi restituisce uno dei due estremi , però uno dei due diventa m giusto ? però perchè nell' ultima riga hai detto che si restitutisce $133/512$ e questo è m .
Quell'm diventa t nella successiva chiamata al metodo di bisezione. Fai infatti la verifica nel passo successivo.
giusto ! Yuhuuu
ho capitooo!! Grazie moltee!!


giusto !!!
grazieee
mooolte!



