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; } }
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); }
public Resultado MetodoReglaFalsa(ParametrosRaiz parametros) { return(this.MetodoRaiz(parametros, AveriguarXrReglaFalsa)); }
public Resultado MetodoBiseccion(ParametrosRaiz parametros) { return(this.MetodoRaiz(parametros, AveriguarXrBiseccion)); }
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); } }
public Resultado MetodoSecante(ParametrosRaiz parametros) { return(this.MetodoRaiz(parametros, AveriguarXrSecante)); }