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); }