/* Risolve numericamente una equazione * applicando il metodo di bisezione. * Partendo da qualsiasi intervallo che contiene uno zero, * dimezza ripetutamente la dimensione dell'intervallo finche' l'ampiezza relativa * dell'intervallo risulta minore di 1.0E-7 * * Il metodo e' applicato all'equazione * x - 5 sin(x) = 0 * partendo dall'intervallo [1.5, 3.2], che sicuramente contiene uno zero. */ import javax.swing.JOptionPane; public class BisezioneSempliceMetodo { /* Questo metodo implementa l'equazione da risolvere */ public static double f(double x) { return x - 5*Math.sin(x); } /* Questo metodo realizza l'algoritmo di bisezione per la ricerca di uno zero * di una funzione continua. * L'algoritmo si arresta quando l'ampiezza relativa dell'intervallo * contenente la soluzione diventa * minore di 1.0E-7 */ public static double appr(double x1, double x2) { double xm, fx1, fx2, fxm; //calcolo la f(x1) fx1 = f(x1); //calcolo la f(x2) fx2 = f(x2); while(Math.abs((x2-x1)/x2) > 1.0E-7) { // visualizzo l'intervallo corrente System.out.println(x1+" \t"+x2+"\tampiezza "+(x2-x1)); xm = (x2+x1)/2; // calcolo la f(middle) fxm = f(xm); if (fxm * fx1 >= 0) { // f(xm) ha lo stesso segno di f(x1): sposto x1 x1 = xm; fx1 = fxm; } else { // f(xm) ha lo stesso segno di f(x2): sposto x2 x2 = xm; fx2 = fxm; } } return x1; } public static void main(String[] args) { double sol; sol = appr(1.5, 3.2); System.out.println("La soluzione approssimata e' " + sol); } }