Ejemplo n.º 1
0
 public void DeberiaCalcularLabiseccion( )
 {
     var parametros = new ParametrosRaices {
         Iteraciones = 100, Tolerancia = 1, Ok = true, ValorFinal = -1, ValorInicial = 10, Funcion = "f(x)=x-7"
     };
     var resul = new ResultadoRaices();
 }
        public ResultadoRaices MetodoBiseccionReglaFalsa(ParametrosRaices parametros)
        {
            var funcion    = new Function(parametros.Funcion);
            var argumento1 = new Argument("x", parametros.ValorInicial);
            var argumento2 = new Argument("x", parametros.ValorFinal);

            var nombre = parametros.Funcion.Split('=')[0].Trim();

            var expresion1 = new Expression(nombre, funcion, argumento1);
            var expresion2 = new Expression(nombre, funcion, argumento2);

            bool termino = false;

            ResultadoRaices resultado = new ResultadoRaices();

            resultado.Texto = "";

            if (expresion1.calculate() * expresion2.calculate() > 0)
            {
                resultado.Texto = "Ingrese otra vez los valores";
                termino         = true;
            }
            else if (expresion1.calculate() * expresion2.calculate() == 0)
            {
                if (expresion1.calculate() == 0)
                {
                    resultado.Raiz = parametros.ValorInicial;
                }
                else
                {
                    resultado.Raiz = parametros.ValorFinal;
                }
            }
            else
            {
                int    cInteraciones = 0;
                double antXr         = 0;
                double Erel          = 0;
                double Xr            = 0;

                while (!termino)
                {
                    if (parametros.Ok)
                    {
                        Xr = CalcularXrBiseccion(parametros.ValorInicial, parametros.ValorFinal);
                    }
                    else
                    {
                        Xr = CalcularXrReglaFalsa(parametros.ValorInicial, parametros.ValorFinal, parametros.Funcion);
                    }
                    cInteraciones++;

                    Erel = (Xr - antXr) / Xr; //Ver el caso que divide por 0

                    //var argumentoXr = new Argument("x", Xr);
                    //var expresionXr = new Expression(nombre, funcion, argumentoXr);

                    if ((Math.Abs(RetornarImagen(parametros.Funcion, Xr)) < parametros.Tolerancia) || (cInteraciones > parametros.Iteraciones) || (Math.Abs(Erel) < parametros.Tolerancia))
                    {
                        resultado.Raiz = Xr;
                        termino        = true;
                    }
                    else
                    {
                        //var imagenvalorinicial = expresion1.calculate();
                        //var imagenvalorxr = RetornarImagen(parametros.Funcion, Xr);
                        if ((expresion1.calculate()) * RetornarImagen(parametros.Funcion, Xr) > 0)
                        {
                            parametros.ValorInicial = Xr;
                        }
                        else
                        {
                            parametros.ValorFinal = Xr;
                        }
                        antXr = Xr;
                    }
                }
                resultado.Iteraciones = cInteraciones;
                resultado.Error       = Math.Abs(Erel);
            }
            return(resultado);
        }
        public ResultadoRaices MetodoSecante(ParametrosRaices parametros)
        {
            var funcion    = new Function(parametros.Funcion);
            var argumento1 = new Argument("x", parametros.ValorInicial);
            var argumento2 = new Argument("x", parametros.ValorFinal);

            var nombre = parametros.Funcion.Split('=')[0].Trim();

            var expresion1 = new Expression(nombre, funcion, argumento1);
            var expresion2 = new Expression(nombre, funcion, argumento2);

            bool termino = false;

            ResultadoRaices resultado = new ResultadoRaices();

            resultado.Texto = "";

            double Xini0 = parametros.ValorInicial;
            double Xini1 = parametros.ValorFinal;
            double Xini2 = 0;

            double Xant = 0;

            var imagen1  = RetornarImagen(parametros.Funcion, Xini1);
            var imagen11 = RetornarImagen(parametros.Funcion, Xini0);

            Xini2 = ((RetornarImagen(parametros.Funcion, Xini1) * Xini0) - (RetornarImagen(parametros.Funcion, Xini0) * Xini1) / (RetornarImagen(parametros.Funcion, Xini1) - RetornarImagen(parametros.Funcion, Xini0)));

            if ((RetornarImagen(parametros.Funcion, Xini0) * RetornarImagen(parametros.Funcion, Xini1)) == 0)
            {
                // x1 es raiz
                resultado.Raiz = Xini0;
            }
            else
            {
                int    cInteraciones = 0;
                double Erel          = 0;

                while (!termino)
                {
                    cInteraciones++;
                    Xant = Xini2;

                    Xini0 = Xini1;
                    Xini1 = Xini2;

                    Xini2 = ((RetornarImagen(parametros.Funcion, Xini1) * Xini0) - RetornarImagen(parametros.Funcion, Xini0) * Xini1) / (RetornarImagen(parametros.Funcion, Xini1) - RetornarImagen(parametros.Funcion, Xini0));

                    Erel = (Xini2 - Xant) / Xini2;

                    if ((Math.Abs(RetornarImagen(parametros.Funcion, Xini2)) < parametros.Tolerancia) || (Math.Abs(Erel) < parametros.Tolerancia) || (cInteraciones > parametros.Iteraciones))
                    {
                        resultado.Raiz  = Xini2;
                        resultado.Error = Erel;
                        termino         = true;
                        break;
                    }
                }
                resultado.Iteraciones = cInteraciones;
                resultado.Error       = Erel;
            }
            return(resultado);
        }
        public ResultadoRaices MetodoTangente(ParametrosRaices parametros)
        {
            var funcion    = new Function(parametros.Funcion);
            var argumento1 = new Argument("x", parametros.ValorInicial);

            var nombre = parametros.Funcion.Split('=')[0].Trim();

            var expresion1 = new Expression(nombre, funcion, argumento1);

            bool termino = false;

            ResultadoRaices resultado = new ResultadoRaices();

            resultado.Texto = "";

            double Xini = parametros.ValorInicial;

            if (RetornarImagen(parametros.Funcion, Xini) == 0) // si el F(x1) es 0
            {
                // x1 es raiz
                resultado.Raiz = Xini;
            }
            else
            {
                int    cInteraciones = 0;
                double antXr         = 0;
                double Erel          = 0;
                double Xr            = 0;
                double dFx           = 0;

                while (!termino)
                {
                    double aproximacion = Xini + parametros.Tolerancia;

                    var imagenaproximaxion = RetornarImagen(parametros.Funcion, aproximacion);
                    var imagenxini         = RetornarImagen(parametros.Funcion, Xini);

                    dFx = (RetornarImagen(parametros.Funcion, aproximacion) - RetornarImagen(parametros.Funcion, Xini)) / parametros.Tolerancia;

                    Xr = parametros.ValorInicial - (RetornarImagen(parametros.Funcion, parametros.ValorInicial) / dFx);

                    cInteraciones++;

                    Erel = Math.Abs(Xr - antXr) / Xr;

                    if ((Math.Abs(RetornarImagen(parametros.Funcion, Xr)) < parametros.Tolerancia) || (Math.Abs(Erel) < parametros.Tolerancia) || (cInteraciones > parametros.Iteraciones))
                    {
                        resultado.Raiz = Xr;
                        termino        = true;
                        break;
                    }
                    else
                    {
                        antXr = Xini;

                        Xini = Xr;
                    }
                }
                resultado.Iteraciones = cInteraciones;
                resultado.Error       = Math.Abs(Erel);
            }
            return(resultado);
        }
        public ResultadoRaices MetodoTangente(ParametrosRaices parametros)
        {
            bool ban = false;

            var Resultado = new ResultadoRaices
            {
                Iteraciones = 0
            };

            var nombre     = parametros.Funcion.Split('=')[0].Trim();
            var funcion    = new Function(parametros.Funcion);
            var argumento1 = new Argument("x", parametros.Xi);
            var expresion1 = new Expression(nombre, funcion, argumento1);

            double Fxi = expresion1.calculate();

            double xant = 0;

            double derFx = 0;

            bool bandera = false;

            while (bandera == false)
            {
                if (Math.Abs(Fxi) == 0)
                {
                    Resultado.Raiz = parametros.Xi;
                    bandera        = true;
                }
                else
                {
                    Fxi = CalculoFuncion(parametros.Funcion, parametros.Xi);

                    var xi      = parametros.Xi + parametros.Tolerancia;
                    var Fxitole = CalculoFuncion(parametros.Funcion, xi);

                    derFx = (Fxitole - Fxi) / parametros.Tolerancia;

                    if (derFx < 0.001 && derFx > -0.001)
                    {
                        bandera           = true;
                        Resultado.Mensaje = "Pendiente cero.";
                        break;
                    }

                    double xr = parametros.Xi - (Fxi / derFx);

                    //ESTAN COLOCADOS CON 4 DECIMALES PORQUE NO SABIA CUANTOS DEBERIA PONER PARA
                    //QUE LA IGUALDAD SEA LA CORRECTA ("N4"). SUPONGO QUE TODOS PERO ES DIFICIL ENCONTRAR JUSTO LA QUE DE.
                    if (xr.ToString("N4") == xant.ToString("N4"))
                    {
                        ban = true;
                    }

                    Resultado.Iteraciones++;

                    Resultado.Error = Math.Abs((xr - xant) / xr);

                    var Fxr = CalculoFuncion(parametros.Funcion, xr);

                    if (Math.Abs(Fxr) < parametros.Tolerancia || Resultado.Iteraciones > parametros.Iteraciones || Resultado.Error < parametros.Tolerancia)
                    {
                        Resultado.Raiz = xr;
                        bandera        = true;
                        if (Resultado.Iteraciones > parametros.Iteraciones)
                        {
                            if (ban)
                            {
                                Resultado.Mensaje = "Supero la cantidad máxima de iteraciones. Cicla entre dos valores.";
                            }
                            else
                            {
                                Resultado.Mensaje = "Supero la cantidad máxima de iteraciones. Posible punto de inflexion.";
                            }
                        }
                    }
                    else
                    {
                        xant          = parametros.Xi;
                        parametros.Xi = xr;
                    }
                }
            }
            return(Resultado);
        }
        public ResultadoRaices MetodoSecante(ParametrosRaices parametros)
        {
            var nombre  = parametros.Funcion.Split('=')[0].Trim();
            var funcion = new Function(parametros.Funcion);

            var argumento1 = new Argument("x", parametros.Xi);
            var argumento2 = new Argument("x", parametros.Xd);

            var expresion1 = new Expression(nombre, funcion, argumento1);
            var expresion2 = new Expression(nombre, funcion, argumento2);

            double Fxi = expresion1.calculate();
            double Fxd = expresion2.calculate();

            var    Resultado = new ResultadoRaices();
            double xant      = parametros.Xi; //de otro modo en la primera iteracion el error siempre seria 1
            double xr        = 0;

            double CalcularSec(double x0, double x1)
            {
                var Fx0 = CalculoFuncion(parametros.Funcion, x0);
                var Fx1 = CalculoFuncion(parametros.Funcion, x1);

                return((Fx1 * x0 - Fx0 * x1) / (Fx1 - Fx0));
            }

            bool bandera = false;

            while (bandera == false)
            {
                if (Fxi * Fxd == 0)
                {
                    if (Fxi == 0)
                    {
                        Resultado.Raiz = parametros.Xi;
                        bandera        = true;
                    }
                    else
                    {
                        Resultado.Raiz = parametros.Xd;
                        bandera        = true;
                    }
                }
                else
                {
                    if (Fxd - Fxi == 0)
                    {
                        Resultado.Mensaje = "La recta secante nunca corta al eje x.";
                        bandera           = true;
                    }

                    Resultado.Iteraciones++;
                    xr = CalcularSec(parametros.Xi, parametros.Xd);

                    var    calculo  = Math.Abs(CalculoFuncion(parametros.Funcion, xr));
                    string calculo2 = calculo.ToString();

                    if (calculo2 == "NaN")
                    {
                        Resultado.Mensaje = "f(x) es de la familia del logaritmo. La función evaluada en x2 no existe";
                        bandera           = true;
                    }

                    Resultado.Error = Math.Abs((xr - xant) / xr);

                    if (Math.Abs(Fxd) < parametros.Tolerancia || Resultado.Iteraciones >= parametros.Iteraciones || Resultado.Error < parametros.Tolerancia)
                    {
                        Resultado.Raiz = xr;
                        bandera        = true;
                    }
                    else
                    {
                        parametros.Xi = parametros.Xd;
                        parametros.Xd = xr;
                        xant          = parametros.Xd;

                        Fxi = CalculoFuncion(parametros.Funcion, parametros.Xi);
                        Fxd = CalculoFuncion(parametros.Funcion, parametros.Xd);
                    }
                }
            }
            return(Resultado);
        }
        public ResultadoRaices MetodosCerrados(ParametrosRaices parametros)
        {
            double xr = 0;

            var Resultado = new ResultadoRaices
            {
                Iteraciones = 0
            };

            var nombre     = parametros.Funcion.Split('=')[0].Trim();
            var funcion    = new Function(parametros.Funcion);
            var argumento1 = new Argument("x", parametros.Xi);
            var argumento2 = new Argument("x", parametros.Xd);
            var expresion1 = new Expression(nombre, funcion, argumento1);
            var expresion2 = new Expression(nombre, funcion, argumento2);

            double Fxi = expresion1.calculate();
            double Fxd = expresion2.calculate();

            double R = Fxi * Fxd;

            double xant = 0;

            bool bandera = false;

            while (bandera == false)
            {
                if (R > 0)
                {
                    Resultado.Raiz = 00;
                    bandera        = true;
                }
                else if (R < 0)
                {
                    Fxi = expresion1.calculate();
                    Fxd = expresion2.calculate();

                    if (parametros.Tipo)
                    {
                        xr = (parametros.Xi + parametros.Xd) / 2;
                    }
                    else
                    {
                        xr = (Fxd * parametros.Xi - Fxi * parametros.Xd) / (Fxd - Fxi);
                    }

                    var Fxr = CalculoFuncion(parametros.Funcion, xr);

                    Resultado.Iteraciones++;

                    Resultado.Error = Math.Abs((xr - xant) / xr);

                    if (Math.Abs(Fxr) < parametros.Tolerancia || Resultado.Error < parametros.Tolerancia || Resultado.Iteraciones >= parametros.Iteraciones)
                    {
                        Resultado.Raiz = xr;
                        bandera        = true;
                    }
                    else if (Fxi * Fxr > 0)
                    {
                        parametros.Xi = xr;
                        xant          = xr;
                    }
                    else
                    {
                        parametros.Xd = xr;
                        xant          = xr;
                    }
                }
                else
                {
                    if (Fxi == 0)
                    {
                        Resultado.Raiz = parametros.Xi;
                        bandera        = true;
                    }
                    else
                    {
                        Resultado.Raiz = parametros.Xd;
                        bandera        = true;
                    }
                }
            }
            return(Resultado);
        }