private void btnCalcular_Click(object sender, EventArgs e)
        {
            ParametrosRaiz parametros = new ParametrosRaiz();

            if (txtboxFuncion.Text != "" && txtboxIteraciones.Text != "" && txtboxLimiteMinimo.Text != "" && txtboxTolerancia.Text != "")
            {
                if (comboMetodo.Text == "SECANTE" && txtboxLimiteMaximo.Text != "")
                {
                    parametros.ValorFinal = Convert.ToDouble(txtboxLimiteMaximo.Text);
                }
                parametros.Funcion      = txtboxFuncion.Text;
                parametros.Iteraciones  = Convert.ToInt32(txtboxIteraciones.Text);
                parametros.Tolerancia   = Convert.ToDouble(txtboxTolerancia.Text);
                parametros.ValorInicial = Convert.ToDouble(txtboxLimiteMinimo.Text);
            }
            else
            {
                MessageBox.Show("No se colocaron correctamente los parametros", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }

            Resultado resultado = new Resultado();

            if (comboMetodo.Text == "SECANTE")
            {
                parametros.TipoMetodo = TipoMetodo.Secante;
                resultado             = this.metodosRaices.MetodoSecante(parametros);
            }
            else
            {
                parametros.TipoMetodo = TipoMetodo.Tangente;
                resultado             = this.metodosRaices.MetodoTangente(parametros);
            }

            switch (resultado.TipoResultado)
            {
            case TipoResultado.Raiz:
                resultado.Mensaje = "SE ENCONTRO LA RAIZ.";
                break;

            case TipoResultado.Constante:
                if (parametros.TipoMetodo == TipoMetodo.Tangente)
                {
                    resultado.Mensaje = "EL VALOR INGRESADO " + parametros.ValorInicial + " ES INCORRECTO. LA RECTA TANGENTE TRAZADA EN ESE PUNTO ES CONSTANTE O NO SE PUEDE EVALUAR LA FUNCION EN DICHO PUNTO.";
                }
                else
                {
                    resultado.Mensaje = "LOS VALORES INGRESADOS SON INCORRECTOS. NO SE PUEDE EVALUAR LA FUNCION EN DICHOS PUNTOS O LA RECTA SECANTE TRAZADA ES CONTASTANTE O CORTA EL EJE X FUERA DEL DOMINIO DE LA FUNCION.";
                }
                break;

            case TipoResultado.FueradeLimites:
                resultado.Mensaje = "ENTRE EL VALOR INICIAL Y FINAL NO EXISTE LA RAIZ";
                break;

            case TipoResultado.FuncionIncorrecta:
                if (parametros.TipoMetodo == TipoMetodo.Tangente)
                {
                    resultado.Mensaje = "EL VALOR INGRESADO " + parametros.ValorInicial + " ES INCORRECTO. LA RECTA TANGENTE TRAZADA EN ESE PUNTO ES CONSTANTE O NO SE PUEDE EVALUAR LA FUNCION EN DICHO PUNTO.";
                }
                else
                {
                    resultado.Mensaje = "LA FUNCIÓN INGRESADA ES INCORRECTA";
                }
                break;

            default:
                break;
            }

            if (resultado.TipoResultado == TipoResultado.Raiz)
            {
                labelResultado.Height             = 40;
                labelResultado.Text               = resultado.Mensaje;
                labelResultado.Visible            = true;
                labelDetalles.Visible             = true;
                labelRaiz.Visible                 = true;
                txtRaiz.Visible                   = true;
                labelIteraciones.Visible          = true;
                labelIteracionesResultado.Visible = true;
                labelError.Visible                = true;
                labelErrorResultado.Visible       = true;

                labelResultado.Text            = resultado.Mensaje;
                labelErrorResultado.Text       = Convert.ToString(resultado.Error);
                labelIteracionesResultado.Text = Convert.ToString(resultado.Iteraciones);
                txtRaiz.Text = Convert.ToString(resultado.Raiz);
            }

            if (resultado.TipoResultado == TipoResultado.FueradeLimites || resultado.TipoResultado == TipoResultado.FuncionIncorrecta)
            {
                labelResultado.Height             = 40;
                labelResultado.Text               = resultado.Mensaje;
                labelResultado.Visible            = true;
                labelDetalles.Visible             = false;
                labelRaiz.Visible                 = false;
                txtRaiz.Visible                   = false;
                labelIteraciones.Visible          = false;
                labelIteracionesResultado.Visible = false;
                labelError.Visible                = false;
                labelErrorResultado.Visible       = false;
            }

            if (resultado.TipoResultado == TipoResultado.Constante || resultado.TipoResultado == TipoResultado.FuncionIncorrecta && parametros.TipoMetodo == TipoMetodo.Tangente)
            {
                labelResultado.Text               = resultado.Mensaje;
                labelResultado.Visible            = true;
                labelResultado.Height             = 100;
                labelDetalles.Visible             = false;
                labelRaiz.Visible                 = false;
                txtRaiz.Visible                   = false;
                labelIteraciones.Visible          = false;
                labelIteracionesResultado.Visible = false;
                labelError.Visible                = false;
                labelErrorResultado.Visible       = false;
            }
        }
Ejemplo n.º 2
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);
        }
Ejemplo n.º 3
0
 public Resultado MetodoReglaFalsa(ParametrosRaiz parametros)
 {
     return(this.MetodoRaiz(parametros, AveriguarXrReglaFalsa));
 }
Ejemplo n.º 4
0
 public Resultado MetodoBiseccion(ParametrosRaiz parametros)
 {
     return(this.MetodoRaiz(parametros, AveriguarXrBiseccion));
 }
Ejemplo n.º 5
0
        private Resultado MetodoRaiz(ParametrosRaiz parametros, MetodoAbiertoDelegate averiguarXr)
        {
            var funcion = new Function(parametros.Funcion);

            var    xi     = new Argument("x", parametros.ValorInicial);
            double x1     = parametros.ValorInicial;
            var    nombre = parametros.Funcion.Split('=')[0].Trim();
            double fxi    = 0;
            double fxii   = 0;
            double fxd    = 0;
            double x11    = 0;
            double x2     = 0;
            double dfx    = 0;

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

            Resultado res = new Resultado();

            if (parametros.TipoMetodo == TipoMetodo.Tangente)
            {
                var xii = new Argument("x", (parametros.ValorInicial + parametros.Tolerancia));
                x11  = (parametros.ValorInicial + parametros.Tolerancia);
                fxi  = EvaluarExpresion(nombre, funcion, xi);
                fxii = EvaluarExpresion(nombre, funcion, xii);
                if (fxi == 0)
                {
                    res.Raiz          = x1;
                    res.Error         = ErrorRelativo;
                    res.Iteraciones   = 1;
                    res.TipoResultado = TipoResultado.Raiz;
                    return(res);
                }
                dfx = ((fxii - fxi) / parametros.Tolerancia);

                if (double.IsNaN(fxi) || double.IsNaN(fxii))
                {
                    res.Raiz          = null;
                    res.TipoResultado = TipoResultado.FuncionIncorrecta;
                    return(res);
                }
            }
            else
            {
                var xd = new Argument("x", parametros.ValorFinal);
                x2  = parametros.ValorFinal;
                fxi = EvaluarExpresion(nombre, funcion, xi);
                fxd = EvaluarExpresion(nombre, funcion, xd);
                if (fxi * fxd == 0)
                {
                    res.Iteraciones   = 1;
                    res.TipoResultado = TipoResultado.Raiz;
                    res.Raiz          = x1;

                    if (fxd == 0)
                    {
                        res.Raiz = x2;
                    }
                    return(res);
                }
                if (double.IsNaN(fxi) || double.IsNaN(fxd))
                {
                    res.Raiz          = null;
                    res.TipoResultado = TipoResultado.FuncionIncorrecta;
                    return(res);
                }
            }
            this.AveriguarDatos(averiguarXr, x1, x2, fxi, fxd, dfx, nombre, funcion);
            if (Math.Round(fXr, 2) == 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)))
            {
                Xant = Xr;
                if (parametros.TipoMetodo == TipoMetodo.Secante)
                {
                    x2  = x1;
                    x1  = Xr;
                    fxi = EvaluarExpresion(nombre, funcion, new Argument("x", x1));
                    fxd = EvaluarExpresion(nombre, funcion, new Argument("x", x2));
                }
                else
                {
                    x1  = Xr;
                    fxi = EvaluarExpresion(nombre, funcion, new Argument("x", x1));
                }

                this.AveriguarDatos(averiguarXr, x1, x2, fxi, fxd, dfx, nombre, funcion);
            }

            if (contador == parametros.Iteraciones && double.IsNaN(ErrorRelativo) && double.IsNaN(Xr))
            {
                res.Raiz          = null;
                res.Error         = null;
                res.TipoResultado = TipoResultado.Constante;
                return(res);
            }
            else
            {
                res.Raiz          = Math.Round(Xr, 6);
                res.TipoResultado = TipoResultado.Raiz;
                res.Iteraciones   = contador;
                res.Error         = ErrorRelativo;
                return(res);
            }
        }
Ejemplo n.º 6
0
 public Resultado MetodoSecante(ParametrosRaiz parametros)
 {
     return(this.MetodoRaiz(parametros, AveriguarXrSecante));
 }