package Lecture19; class FuncA implements MathFunction { public double f(double x) { return x*x - 2; } } public class RootFinder { // Versión de Java, basada en RF, p. 354 public static final int JMAX= 40; // Número máximo de bisecciones public static final double ERR_VAL= -10E10; public static double rtbis(MathFunction func, double x1, double x2, double xacc) { double dx, xmid, rtb; double f= func.f(x1); double fmid= func.f(x2); if (f*fmid >= 0.0) { System.out.println("La raíz debe estar acotada para la bisección"); return ERR_VAL; } // Búsqueda orientada para que f>0 quede en x + dx if (f < 0.0) { dx= x2 - x1; rtb= x1; } else { dx= x1 - x2; rtb= x2; } for (int j=0; j < JMAX; j++) { dx *= 0.5; xmid= rtb + dx; fmid= func.f(xmid); if (fmid <= 0.0) rtb= xmid; if (Math.abs(dx) < xacc || fmid == 0.0) return rtb; } System.out.println("Demasiadas bisecciones"); return ERR_VAL; } public static void main(String[] args) { double root= RootFinder.rtbis(new FuncA(), -1.0, 8.0, 0.0001); System.out.println("Raíz: " + root); System.exit(0); } }