public Salida ObtenerRaizMetodoSecante(int maxiteraciones, double tolerancia, double xi, double x2) { Salida nuevaSalida = new Salida(); if (Math.Abs(EvaluarFuncion(xi)) < tolerancia) { nuevaSalida.RaizEncontrada = xi; } else { int iteraciones = 0; double anterior = 0; iteraciones++; double denominador = EvaluarFuncion(x2) - EvaluarFuncion(xi); if (denominador != 0) { double raiz = 0; raiz = ObtenerRaizMetodoSecante(xi, denominador, x2); double error = Math.Abs((raiz - anterior) / raiz); while (!(Math.Abs(EvaluarFuncion(raiz)) < tolerancia || error < tolerancia || iteraciones >= maxiteraciones)) { xi = x2; x2 = raiz; anterior = raiz; iteraciones++; denominador = EvaluarFuncion(x2) - EvaluarFuncion(xi); if (denominador != 0) { raiz = 0; raiz = ObtenerRaizMetodoSecante(xi, denominador, x2); error = Math.Abs((raiz - anterior) / raiz); } else { nuevaSalida.IteracionesRealizadas = iteraciones; nuevaSalida.Mensaje = "División por cero"; return(nuevaSalida); } } nuevaSalida.RaizEncontrada = raiz; nuevaSalida.IteracionesRealizadas = iteraciones; nuevaSalida.ErrorRelativo = error; } else { nuevaSalida.IteracionesRealizadas = iteraciones; nuevaSalida.Mensaje = "División por cero"; return(nuevaSalida); } } return(nuevaSalida); }
//Metodos abiertos public Salida ObtenerRaizMetodoNewtonRaphson(int maxiteraciones, double tolerancia, double xi) { Salida nuevaSalida = new Salida(); if (Math.Abs(EvaluarFuncion(xi)) < tolerancia) { nuevaSalida.RaizEncontrada = xi; } else { int iteraciones = 0; double anterior1 = 0; double anterior2 = 0; double anterior3 = 0; iteraciones++; double suma = xi + tolerancia; double derivada = (EvaluarFuncion(suma) - EvaluarFuncion(xi)) / tolerancia; if (derivada != 0) { double raiz = ObtenerRaizMetodoNewtonRaphson(xi, tolerancia, derivada); double error = Math.Abs((raiz - anterior3) / raiz); while (!(Math.Abs(EvaluarFuncion(raiz)) < tolerancia || error < tolerancia || iteraciones >= maxiteraciones)) { xi = raiz; anterior1 = anterior2; anterior2 = anterior3; anterior3 = raiz; iteraciones++; derivada = 0; suma = xi + tolerancia; derivada = (EvaluarFuncion(suma) - EvaluarFuncion(xi)) / tolerancia; if (derivada != 0) { raiz = ObtenerRaizMetodoNewtonRaphson(xi, tolerancia, derivada); error = Math.Abs((raiz - anterior3) / raiz); } else { nuevaSalida.IteracionesRealizadas = iteraciones; nuevaSalida.Mensaje = "División por cero"; return(nuevaSalida); } } nuevaSalida.RaizEncontrada = raiz; nuevaSalida.IteracionesRealizadas = iteraciones; nuevaSalida.ErrorRelativo = error; if (anterior1 == anterior3 && anterior2 == raiz) { nuevaSalida.Mensaje = "Bucle por mínimo, máximo o punto de inflexión"; } else if (iteraciones >= maxiteraciones) { nuevaSalida.Mensaje = "Superó el máximo de iteraciones"; } } else { nuevaSalida.IteracionesRealizadas = iteraciones; nuevaSalida.Mensaje = "División por cero"; return(nuevaSalida); } } return(nuevaSalida); }
//Metodos cerrados public Salida ObtenerRaizMetodosCerrados(string metodo, int maxiteraciones, double tolerancia, double limiteizquierdo, double limitederecho) { Salida nuevaSalida = new Salida(); if ((EvaluarFuncion(limiteizquierdo) * EvaluarFuncion(limitederecho)) > 0) { return(null); } else if ((EvaluarFuncion(limiteizquierdo) * EvaluarFuncion(limitederecho)) == 0) { if (EvaluarFuncion(limitederecho) == 0) { nuevaSalida.RaizEncontrada = limitederecho; } else { nuevaSalida.RaizEncontrada = limiteizquierdo; } } else { double anterior = 0; int iteraciones = 0; iteraciones++; double raiz = 0; switch (metodo) { case "Biseccion": raiz = ObtenerRaizMetodoBiseccion(limitederecho, limiteizquierdo); break; case "Regla Falsa": raiz = ObtenerRaizMetodoReglaFalsa(limitederecho, limiteizquierdo); break; } double error = Math.Abs((raiz - anterior) / raiz); while (!(Math.Abs(EvaluarFuncion(raiz)) < tolerancia || error < tolerancia || iteraciones >= maxiteraciones)) { if (EvaluarFuncion(limiteizquierdo) * EvaluarFuncion(raiz) > 0) { limiteizquierdo = raiz; } else { limitederecho = raiz; } anterior = raiz; iteraciones++; raiz = 0; switch (metodo) { case "Biseccion": raiz = ObtenerRaizMetodoBiseccion(limitederecho, limiteizquierdo); break; case "Regla Falsa": raiz = ObtenerRaizMetodoReglaFalsa(limitederecho, limiteizquierdo); break; } error = Math.Abs((raiz - anterior) / raiz); } nuevaSalida.RaizEncontrada = raiz; nuevaSalida.IteracionesRealizadas = iteraciones; nuevaSalida.ErrorRelativo = error; } return(nuevaSalida); }