import java.lang.Math; /** * Resuelve una ecuacion cuadratica. * * Encuentra las dos raices que resuelven la ecuacion cuadratica: * ax^2 + bx + c = 0. * * Utiliza la formula general (tambien conocida * coloquialmente como el "chicharronera 1 y 2") * y el metodo de Newton-Rapson. * * Parametros: * a -- coeficiente cuadratico (debe ser distinto de 0) * b -- coeficiente lineal * c -- termino independiente * * Error: * Si (a == 0) * */ public class cuadratica { // Coeficientes del polinomio private double A, B, C; /** * Constructor de la clase * * @param a Coeficiente cuadratico * @param b Coeficiente lineal * @param c Coeficiente independiente */ public cuadratica(double a, double b, double c) { if (a == 0) { System.out.println("No es una ecuacion cuadratica"); System.exit(1); } A = a; B = b; C = c; } /** * Evalua la funcion cuadratica * @param x Valor en que se evaluara la funcion * * @return Evaluacion de la funcion cuadratica en x */ private double f(double x) { return (x * x * A + x * B + C); } /** * Evalua el valor X en la funcion cuadratica * @param x Valor en que se evaluara la funcion * * @return Evaluacion de la funcion cuadratica en x */ private void evalua(double x) { System.out.println("Raiz (" + x + ") , evaluacion raiz: " + f(x)); } /** * Evalua la derivada de la funcion cuadratica * @param x Valor en que se evaluara la funcion * * @return Evaluacion de la funcion derivada en x */ private double df(double x) { return (2.0 * x * A + B); } /** * Metodo Newton-Raphson: x = x - f(x)/f'(x) * @param x Valor inicial para hacer la busqueda de la raiz * @param ni Numero de iteraciones * * @return La raiz buscada */ private double metodoNewtonRapson(double x, int ni) { for (int i = 0; i < ni; i++) { x = x - (f(x) / df(x)); } return x; } /** * Calculo de las raices del polinomio */ public void raices() { // Raices del polinomio double X1, X2, x; // Calculo del discriminante double d = B * B - 4.0 * A * C; // Raices reales if (d >= 0.0) { System.out.println(""); System.out.println("Raices Reales (" + A + ")X^2 + (" + B + ")X + (" + C + ") = 0"); System.out.println("Chicharronera 1"); X1 = (-B + Math.sqrt(d)) / (2.0 * A); X2 = (-B - Math.sqrt(d)) / (2.0 * A); evalua(X1); evalua(X2); System.out.println(""); System.out.println("Chicharronera 2"); X1 = (-2.0 * C) / (B + Math.sqrt(d)); X2 = (-2.0 * C) / (B - Math.sqrt(d));; evalua(X1); evalua(X2); System.out.println(""); // Metodo Newton-Raphson System.out.println("Newton-Rapson"); X1 = Math.round(X1); System.out.print("Valor inicial aproximado de X1 = " + X1); x = metodoNewtonRapson(X1, 8); evalua(x); X2 = Math.round(X2); System.out.print("Valor inicial aproximado de X2 = " + X2); x = metodoNewtonRapson(X2, 8); evalua(x); } else { // Raices complejas System.out.println("Raices Complejas ..."); } } /** * Funcion Principal .... */ public static void main(String[] args) { cuadratica cu1 = new cuadratica(1.0, 4.0, 1.0); cu1.raices(); } }