private void btn_Calcular_Click(object sender, EventArgs e)
        {
            ParametroSimple parametros = new ParametroSimple()
            {
                Xi          = Convert.ToDouble(txt_ValorXi.Text),
                Tolerancia  = Convert.ToDouble(txt_Tolerancia.Text),
                Iteraciones = Convert.ToInt32(txt_Iteraciones.Text),
                Funcion     = txt_Funcion.Text
            };

            ResultadoRegresion resultado;

            try
            {
                resultado                  = MetodosRaices.NewtonRaphson(parametros);
                txt_Error.Text             = resultado.ErrorRelativo.ToString("0.000000000000");
                txt_IteracionesActual.Text = resultado.Iteraciones.ToString();
                txt_Raiz.Text              = resultado.Raiz.ToString("0.000000000000");
            }
            catch (NoRaizException exception)
            {
                var mensaje = exception.Message;
                MessageBox.Show(mensaje);
                txt_Raiz.Text = exception.Valor.ToString();
                txt_IteracionesActual.Text = exception.Iteraciones.ToString();
            }
        }
        public ResultadoRegresion NewtonRaphson(ParametroSimple parametros)
        {
            ResultadoRegresion resultado = new ResultadoRegresion()
            {
                Iteraciones   = 0,
                ErrorRelativo = 0
            };

            double resultadoXr = Utilidad.EvaluarFuncion(parametros.Funcion, parametros.Xi);

            if (resultadoXr.Equals(Double.NaN))
            {
                throw new ArgumentException("Verificar Funcion", "Funcion");
            }

            if (resultadoXr == 0)
            {
                resultado.Raiz = parametros.Xi;
                return(resultado);
            }

            double Anterior       = 0;
            int    Contador       = 0;
            double ValorX         = parametros.Xi;
            double Tolerancia     = parametros.Tolerancia;
            double ValorXTole     = (ValorX + Tolerancia);
            double ValorFXTole    = Utilidad.EvaluarFuncion(parametros.Funcion, ValorXTole);
            double ValorXfun      = Utilidad.EvaluarFuncion(parametros.Funcion, ValorX);
            double ValorNumerador = ValorFXTole - ValorXfun;
            double Derivada       = ValorNumerador / Tolerancia;
            double xr             = 0;
            double errorRelativo  = 0;

            do
            {
                if (Math.Abs(Derivada) < parametros.Tolerancia)
                {
                    throw new NoRaizException(ValorX, "La Recta TG en este punto es horizontal", Contador);
                }

                xr          = ValorX - (Utilidad.EvaluarFuncion(parametros.Funcion, ValorX) / Derivada);
                resultadoXr = Utilidad.EvaluarFuncion(parametros.Funcion, xr);

                if (resultadoXr.Equals(double.NaN))
                {
                    throw new NoRaizException(xr, "El valor no pertenece al dominio de la Funcion", Contador);
                }

                errorRelativo = (xr - Anterior) / xr;
                Contador     += 1;

                Anterior       = xr;
                ValorX         = xr;
                ValorXTole     = (ValorX + Tolerancia);
                ValorFXTole    = Utilidad.EvaluarFuncion(parametros.Funcion, ValorXTole);
                ValorXfun      = Utilidad.EvaluarFuncion(parametros.Funcion, ValorX);
                ValorNumerador = ValorFXTole - ValorXfun;
                Derivada       = ValorNumerador / Tolerancia;
            } while (Math.Abs(resultadoXr) > Tolerancia && Contador < parametros.Iteraciones && (Math.Abs(errorRelativo) > Tolerancia || xr == 0));


            if (Math.Abs(resultadoXr) > Tolerancia * 100)
            {
                throw new NoRaizException(xr, "Valor muy alejado de la raiz", Contador);
            }

            resultado.Raiz          = xr;
            resultado.ErrorRelativo = Math.Abs(errorRelativo);
            resultado.Iteraciones   = Contador;

            return(resultado);
        }