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

Entradas populares