import java.util.Scanner;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class BisectionMethod {
// Método de bisección
public static double bisection(String function, double a, double b, double tol) {
try {
double fa = evaluateFunction(function, a);
double fb = evaluateFunction(function, b);
if (fa * fb > 0) {
throw new IllegalArgumentException("La función no cambia de signo en el intervalo dado.");
}
double c = 0;
while ((b - a) / 2.0 > tol) {
c = (a + b) / 2.0;
double fc = evaluateFunction(function, c);
if (fc == 0.0) {
break;
} else if (fa * fc < 0) {
b = c;
fb = fc;
} else {
a = c;
fa = fc;
}
}
return c;
} catch (ScriptException e) {
System.out.println("Error al evaluar la función: " + e.getMessage());
return Double.NaN;
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
return Double.NaN;
}
}
// Método para evaluar la función en un punto dado
public static double evaluateFunction(String function, double x) throws ScriptException {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
engine.put("x", x);
return ((Number) engine.eval(function)).doubleValue();
}
// Método principal para probar
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("Ingresa la función:");
String function = scanner.nextLine();
System.out.println("Ingresa el extremo izquierdo del intervalo:");
double a = scanner.nextDouble();
System.out.println("Ingresa el extremo derecho del intervalo:");
double b = scanner.nextDouble();
System.out.println("Ingresa la tolerancia para la precisión:");
double tol = scanner.nextDouble();
double root = bisection(function, a, b, tol);
if (!Double.isNaN(root)) {
System.out.println("La raíz aproximada es: " + root);
}
scanner.close();
}
}
Comentarios
Publicar un comentario