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) {
double fa = evaluateFunction(function, a);
double fb = evaluateFunction(function, b);
if (fa * fb > 0) {
System.out.println("No hay raíces en el intervalo dado.");
return Double.NaN;
}
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;
}
// Método para evaluar la función en un punto dado
public static double evaluateFunction(String function, double x) {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
double result = Double.NaN;
try {
result = Double.parseDouble(engine.eval(function.replace("x", String.valueOf(x))).toString());
} catch (ScriptException e) {
System.out.println("Error al evaluar la función: " + e.getMessage());
}
return result;
}
// 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);
System.out.println("La raíz aproximada es: " + root);
scanner.close();
}
}
Comentarios
Publicar un comentario