Beispiel #1
0
 private void AveriguarDatos(MetodoCerradoDelegate averiguarXr, double x1, double x2, double fXi, double fXd, string nombre, Function funcion)
 {
     Xr            = averiguarXr(x1, x2, fXd, fXi);
     contador     += 1;
     fXr           = EvaluarExpresion(nombre, funcion, new Argument("x", Xr));
     ErrorRelativo = Math.Abs((Xr - Xant) / Xr);
 }
        private ResultadoRegresion MetodosCerrados(ParametroCompuesto parametros, MetodoCerradoDelegate calcularXr)
        {
            ResultadoRegresion resultado = new ResultadoRegresion();
            var resultadoxi = Utilidad.EvaluarFuncion(parametros.Funcion, parametros.Xi);
            var resultadoxd = Utilidad.EvaluarFuncion(parametros.Funcion, parametros.Xd);

            if (resultadoxi.Equals(double.NaN) || resultadoxd.Equals(double.NaN))
            {
                throw new ArgumentException("Verificar Función", "parametros.Funcion");
            }

            if (resultadoxi * resultadoxd > 0)
            {
                throw new ArgumentException("Ingresar nuevamente los extremos", "parametros.Xi");
            }

            if (resultadoxi * resultadoxd == 0)
            {
                if (resultadoxi == 0)
                {
                    resultado.Raiz = parametros.Xi;
                }
                else
                {
                    resultado.Raiz = parametros.Xd;
                }
                resultado.Iteraciones   = 0;
                resultado.ErrorRelativo = 0;

                return(resultado);
            }

            return(this.BuscarRaicesCerrados(parametros, calcularXr));
        }
Beispiel #3
0
        private Resultado MetodoRaiz(ParametrosRaiz parametros, MetodoCerradoDelegate averiguarXr)
        {
            Function funcion = new Function(parametros.Funcion);
            var      Xi      = new Argument("x", parametros.ValorInicial);
            var      Xd      = new Argument("x", parametros.ValorFinal);
            double   x1      = parametros.ValorInicial;
            double   x2      = parametros.ValorFinal;

            Resultado res    = new Resultado();
            var       nombre = parametros.Funcion.Split('=')[0].Trim();
            var       fXi    = EvaluarExpresion(nombre, funcion, Xi);
            var       fXd    = EvaluarExpresion(nombre, funcion, Xd);

            this.Xr            = 0;
            this.contador      = 0;
            this.Xant          = 0;
            this.fXr           = 0;
            this.ErrorRelativo = 0;

            if (double.IsNaN(fXi) || double.IsNaN(fXd))
            {
                res.Raiz          = null;
                res.TipoResultado = TipoResultado.FuncionIncorrecta;
                return(res);
            }

            if (fXi * fXd == 0)
            {
                res.Iteraciones   = 1;
                res.Raiz          = x1;
                res.Error         = ErrorRelativo;
                res.TipoResultado = TipoResultado.Raiz;

                if (fXd == 0)
                {
                    res.Raiz = x2;
                }

                return(res);
            }

            if ((fXi * fXd) >= 0)
            {
                res.Raiz          = null;
                res.TipoResultado = TipoResultado.FueradeLimites;
                return(res);
            }

            this.AveriguarDatos(averiguarXr, x1, x2, fXi, fXd, nombre, funcion);

            if (fXr == 0)
            {
                res.Raiz          = Math.Round(Xr, 6);
                res.Iteraciones   = contador;
                res.TipoResultado = TipoResultado.Raiz;
                res.Error         = ErrorRelativo;
                return(res);
            }

            while (!(Math.Abs(fXr) < parametros.Tolerancia || ((Math.Abs(ErrorRelativo) < parametros.Tolerancia) && (Xr != 0)) || (contador >= parametros.Iteraciones)))
            {
                if ((fXi * fXr) > 0)
                {
                    x1 = Xr;
                }
                else
                {
                    x2 = Xr;
                }
                Xant = Xr;

                this.AveriguarDatos(averiguarXr, x1, x2, fXi, fXd, nombre, funcion);
            }
            res.Raiz          = Math.Round(Xr, 6);
            res.Iteraciones   = contador;
            res.TipoResultado = TipoResultado.Raiz;
            res.Error         = ErrorRelativo;
            return(res);
        }
        private ResultadoRegresion BuscarRaicesCerrados(ParametroCompuesto parametros, MetodoCerradoDelegate calcularXr)
        {
            ResultadoRegresion resultado = new ResultadoRegresion
            {
                ErrorRelativo = 0,
                Iteraciones   = 0
            };

            int    contador      = 0;
            double anterior      = 0;
            double errorRelativo = 0;
            var    XI            = parametros.Xi;
            var    XD            = parametros.Xd;
            double xr            = calcularXr(XI, XD, parametros.Funcion);

            if (xr != 0)
            {
                errorRelativo = (xr - anterior) / xr;
            }

            var resultadoXR = Utilidad.EvaluarFuncion(parametros.Funcion, xr);

            while ((Math.Abs(errorRelativo) > parametros.Tolerancia || xr == 0) && contador < parametros.Iteraciones && Math.Abs(resultadoXR) > parametros.Tolerancia)
            {
                if (Utilidad.EvaluarFuncion(parametros.Funcion, XI) * Utilidad.EvaluarFuncion(parametros.Funcion, xr) > 0)
                {
                    XI = xr;
                }
                else
                {
                    XD = xr;
                }

                anterior  = xr;
                xr        = calcularXr(XI, XD, parametros.Funcion);
                contador += 1;

                if (Math.Abs(xr) > ((parametros.Tolerancia) * 10))
                {
                    errorRelativo = (xr - anterior) / xr;
                }

                resultadoXR = Utilidad.EvaluarFuncion(parametros.Funcion, xr);
            }

            resultado.Iteraciones   = contador;
            resultado.ErrorRelativo = errorRelativo;
            resultado.Raiz          = xr;

            return(resultado);
        }