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