public void DeberiaCalcularLabiseccion( ) { var parametros = new ParametrosRaices { Iteraciones = 100, Tolerancia = 1, Ok = true, ValorFinal = -1, ValorInicial = 10, Funcion = "f(x)=x-7" }; var resul = new ResultadoRaices(); }
private void Calcular_Click(object sender, EventArgs e) { var parametros = new ParametrosRaices(); // Se comprueba que no exista texbox sin datos if (String.IsNullOrWhiteSpace(textBox_Funcion.Text) || String.IsNullOrWhiteSpace(textBox_Iteraciones.Text) || String.IsNullOrWhiteSpace(textBox_Toleranciia.Text) || String.IsNullOrWhiteSpace(textBox_ValorInicial.Text)) { MessageBox.Show("Faltan ingresar datos", "Notificación", MessageBoxButtons.OK); } else { parametros.Funcion = textBox_Funcion.Text; parametros.Iteraciones = int.Parse(textBox_Iteraciones.Text); parametros.Tolerancia = double.Parse(textBox_Toleranciia.Text); parametros.ValorInicial = double.Parse(textBox_ValorInicial.Text); var resultado = metodosRaices.MetodoTangente(parametros); if (resultado.Texto == "") { textBox_Merror.Text = resultado.Error.ToString("N8"); textBox_Miteraciones.Text = resultado.Iteraciones.ToString(); textBox_Mraiz.Text = resultado.Raiz.ToString("N8"); } else { MessageBox.Show("Error al calcular la raiz", "Notificación", MessageBoxButtons.OK); } } }
private void button_Calcular_Click(object sender, EventArgs e) { var parametros = new ParametrosRaices(); // Se comprueba que no exista texbox sin datos if (String.IsNullOrWhiteSpace(textBox_Funcion.Text) || String.IsNullOrWhiteSpace(textBox_Tolerancia.Text) || String.IsNullOrWhiteSpace(textBox_Iteraciones.Text) || String.IsNullOrWhiteSpace(textBox_ValorFinal.Text) || String.IsNullOrWhiteSpace(textBox_ValorInical.Text)) { MessageBox.Show("Faltan ingresar datos", "Notificación", MessageBoxButtons.OK); } else { parametros.Funcion = textBox_Funcion.Text; parametros.Iteraciones = int.Parse(textBox_Iteraciones.Text); parametros.Tolerancia = double.Parse(textBox_Tolerancia.Text); parametros.ValorFinal = double.Parse(textBox_ValorFinal.Text); parametros.ValorInicial = double.Parse(textBox_ValorInical.Text); parametros.Ok = okey; var resultado = metodosRaices.MetodoBiseccionReglaFalsa(parametros); if (resultado.Texto == "") { textBox_MostrarError.Text = resultado.Error.ToString("N8"); textBox_MostrarIteraciones.Text = resultado.Iteraciones.ToString(); textBox_MostrarRaiz.Text = resultado.Raiz.ToString("N8"); } else { MessageBox.Show("Los extremos ingresados no son válidos", "Notificación", MessageBoxButtons.OK); } } }
public ResultadoRaices MetodoBiseccionReglaFalsa(ParametrosRaices parametros) { var funcion = new Function(parametros.Funcion); var argumento1 = new Argument("x", parametros.ValorInicial); var argumento2 = new Argument("x", parametros.ValorFinal); var nombre = parametros.Funcion.Split('=')[0].Trim(); var expresion1 = new Expression(nombre, funcion, argumento1); var expresion2 = new Expression(nombre, funcion, argumento2); bool termino = false; ResultadoRaices resultado = new ResultadoRaices(); resultado.Texto = ""; if (expresion1.calculate() * expresion2.calculate() > 0) { resultado.Texto = "Ingrese otra vez los valores"; termino = true; } else if (expresion1.calculate() * expresion2.calculate() == 0) { if (expresion1.calculate() == 0) { resultado.Raiz = parametros.ValorInicial; } else { resultado.Raiz = parametros.ValorFinal; } } else { int cInteraciones = 0; double antXr = 0; double Erel = 0; double Xr = 0; while (!termino) { if (parametros.Ok) { Xr = CalcularXrBiseccion(parametros.ValorInicial, parametros.ValorFinal); } else { Xr = CalcularXrReglaFalsa(parametros.ValorInicial, parametros.ValorFinal, parametros.Funcion); } cInteraciones++; Erel = (Xr - antXr) / Xr; //Ver el caso que divide por 0 //var argumentoXr = new Argument("x", Xr); //var expresionXr = new Expression(nombre, funcion, argumentoXr); if ((Math.Abs(RetornarImagen(parametros.Funcion, Xr)) < parametros.Tolerancia) || (cInteraciones > parametros.Iteraciones) || (Math.Abs(Erel) < parametros.Tolerancia)) { resultado.Raiz = Xr; termino = true; } else { //var imagenvalorinicial = expresion1.calculate(); //var imagenvalorxr = RetornarImagen(parametros.Funcion, Xr); if ((expresion1.calculate()) * RetornarImagen(parametros.Funcion, Xr) > 0) { parametros.ValorInicial = Xr; } else { parametros.ValorFinal = Xr; } antXr = Xr; } } resultado.Iteraciones = cInteraciones; resultado.Error = Math.Abs(Erel); } return(resultado); }
public ResultadoRaices MetodoSecante(ParametrosRaices parametros) { var funcion = new Function(parametros.Funcion); var argumento1 = new Argument("x", parametros.ValorInicial); var argumento2 = new Argument("x", parametros.ValorFinal); var nombre = parametros.Funcion.Split('=')[0].Trim(); var expresion1 = new Expression(nombre, funcion, argumento1); var expresion2 = new Expression(nombre, funcion, argumento2); bool termino = false; ResultadoRaices resultado = new ResultadoRaices(); resultado.Texto = ""; double Xini0 = parametros.ValorInicial; double Xini1 = parametros.ValorFinal; double Xini2 = 0; double Xant = 0; var imagen1 = RetornarImagen(parametros.Funcion, Xini1); var imagen11 = RetornarImagen(parametros.Funcion, Xini0); Xini2 = ((RetornarImagen(parametros.Funcion, Xini1) * Xini0) - (RetornarImagen(parametros.Funcion, Xini0) * Xini1) / (RetornarImagen(parametros.Funcion, Xini1) - RetornarImagen(parametros.Funcion, Xini0))); if ((RetornarImagen(parametros.Funcion, Xini0) * RetornarImagen(parametros.Funcion, Xini1)) == 0) { // x1 es raiz resultado.Raiz = Xini0; } else { int cInteraciones = 0; double Erel = 0; while (!termino) { cInteraciones++; Xant = Xini2; Xini0 = Xini1; Xini1 = Xini2; Xini2 = ((RetornarImagen(parametros.Funcion, Xini1) * Xini0) - RetornarImagen(parametros.Funcion, Xini0) * Xini1) / (RetornarImagen(parametros.Funcion, Xini1) - RetornarImagen(parametros.Funcion, Xini0)); Erel = (Xini2 - Xant) / Xini2; if ((Math.Abs(RetornarImagen(parametros.Funcion, Xini2)) < parametros.Tolerancia) || (Math.Abs(Erel) < parametros.Tolerancia) || (cInteraciones > parametros.Iteraciones)) { resultado.Raiz = Xini2; resultado.Error = Erel; termino = true; break; } } resultado.Iteraciones = cInteraciones; resultado.Error = Erel; } return(resultado); }
public ResultadoRaices MetodoTangente(ParametrosRaices parametros) { var funcion = new Function(parametros.Funcion); var argumento1 = new Argument("x", parametros.ValorInicial); var nombre = parametros.Funcion.Split('=')[0].Trim(); var expresion1 = new Expression(nombre, funcion, argumento1); bool termino = false; ResultadoRaices resultado = new ResultadoRaices(); resultado.Texto = ""; double Xini = parametros.ValorInicial; if (RetornarImagen(parametros.Funcion, Xini) == 0) // si el F(x1) es 0 { // x1 es raiz resultado.Raiz = Xini; } else { int cInteraciones = 0; double antXr = 0; double Erel = 0; double Xr = 0; double dFx = 0; while (!termino) { double aproximacion = Xini + parametros.Tolerancia; var imagenaproximaxion = RetornarImagen(parametros.Funcion, aproximacion); var imagenxini = RetornarImagen(parametros.Funcion, Xini); dFx = (RetornarImagen(parametros.Funcion, aproximacion) - RetornarImagen(parametros.Funcion, Xini)) / parametros.Tolerancia; Xr = parametros.ValorInicial - (RetornarImagen(parametros.Funcion, parametros.ValorInicial) / dFx); cInteraciones++; Erel = Math.Abs(Xr - antXr) / Xr; if ((Math.Abs(RetornarImagen(parametros.Funcion, Xr)) < parametros.Tolerancia) || (Math.Abs(Erel) < parametros.Tolerancia) || (cInteraciones > parametros.Iteraciones)) { resultado.Raiz = Xr; termino = true; break; } else { antXr = Xini; Xini = Xr; } } resultado.Iteraciones = cInteraciones; resultado.Error = Math.Abs(Erel); } return(resultado); }
public ResultadoRaices MetodoTangente(ParametrosRaices parametros) { bool ban = false; var Resultado = new ResultadoRaices { Iteraciones = 0 }; var nombre = parametros.Funcion.Split('=')[0].Trim(); var funcion = new Function(parametros.Funcion); var argumento1 = new Argument("x", parametros.Xi); var expresion1 = new Expression(nombre, funcion, argumento1); double Fxi = expresion1.calculate(); double xant = 0; double derFx = 0; bool bandera = false; while (bandera == false) { if (Math.Abs(Fxi) == 0) { Resultado.Raiz = parametros.Xi; bandera = true; } else { Fxi = CalculoFuncion(parametros.Funcion, parametros.Xi); var xi = parametros.Xi + parametros.Tolerancia; var Fxitole = CalculoFuncion(parametros.Funcion, xi); derFx = (Fxitole - Fxi) / parametros.Tolerancia; if (derFx < 0.001 && derFx > -0.001) { bandera = true; Resultado.Mensaje = "Pendiente cero."; break; } double xr = parametros.Xi - (Fxi / derFx); //ESTAN COLOCADOS CON 4 DECIMALES PORQUE NO SABIA CUANTOS DEBERIA PONER PARA //QUE LA IGUALDAD SEA LA CORRECTA ("N4"). SUPONGO QUE TODOS PERO ES DIFICIL ENCONTRAR JUSTO LA QUE DE. if (xr.ToString("N4") == xant.ToString("N4")) { ban = true; } Resultado.Iteraciones++; Resultado.Error = Math.Abs((xr - xant) / xr); var Fxr = CalculoFuncion(parametros.Funcion, xr); if (Math.Abs(Fxr) < parametros.Tolerancia || Resultado.Iteraciones > parametros.Iteraciones || Resultado.Error < parametros.Tolerancia) { Resultado.Raiz = xr; bandera = true; if (Resultado.Iteraciones > parametros.Iteraciones) { if (ban) { Resultado.Mensaje = "Supero la cantidad máxima de iteraciones. Cicla entre dos valores."; } else { Resultado.Mensaje = "Supero la cantidad máxima de iteraciones. Posible punto de inflexion."; } } } else { xant = parametros.Xi; parametros.Xi = xr; } } } return(Resultado); }
public ResultadoRaices MetodoSecante(ParametrosRaices parametros) { var nombre = parametros.Funcion.Split('=')[0].Trim(); var funcion = new Function(parametros.Funcion); var argumento1 = new Argument("x", parametros.Xi); var argumento2 = new Argument("x", parametros.Xd); var expresion1 = new Expression(nombre, funcion, argumento1); var expresion2 = new Expression(nombre, funcion, argumento2); double Fxi = expresion1.calculate(); double Fxd = expresion2.calculate(); var Resultado = new ResultadoRaices(); double xant = parametros.Xi; //de otro modo en la primera iteracion el error siempre seria 1 double xr = 0; double CalcularSec(double x0, double x1) { var Fx0 = CalculoFuncion(parametros.Funcion, x0); var Fx1 = CalculoFuncion(parametros.Funcion, x1); return((Fx1 * x0 - Fx0 * x1) / (Fx1 - Fx0)); } bool bandera = false; while (bandera == false) { if (Fxi * Fxd == 0) { if (Fxi == 0) { Resultado.Raiz = parametros.Xi; bandera = true; } else { Resultado.Raiz = parametros.Xd; bandera = true; } } else { if (Fxd - Fxi == 0) { Resultado.Mensaje = "La recta secante nunca corta al eje x."; bandera = true; } Resultado.Iteraciones++; xr = CalcularSec(parametros.Xi, parametros.Xd); var calculo = Math.Abs(CalculoFuncion(parametros.Funcion, xr)); string calculo2 = calculo.ToString(); if (calculo2 == "NaN") { Resultado.Mensaje = "f(x) es de la familia del logaritmo. La función evaluada en x2 no existe"; bandera = true; } Resultado.Error = Math.Abs((xr - xant) / xr); if (Math.Abs(Fxd) < parametros.Tolerancia || Resultado.Iteraciones >= parametros.Iteraciones || Resultado.Error < parametros.Tolerancia) { Resultado.Raiz = xr; bandera = true; } else { parametros.Xi = parametros.Xd; parametros.Xd = xr; xant = parametros.Xd; Fxi = CalculoFuncion(parametros.Funcion, parametros.Xi); Fxd = CalculoFuncion(parametros.Funcion, parametros.Xd); } } } return(Resultado); }
public ResultadoRaices MetodosCerrados(ParametrosRaices parametros) { double xr = 0; var Resultado = new ResultadoRaices { Iteraciones = 0 }; var nombre = parametros.Funcion.Split('=')[0].Trim(); var funcion = new Function(parametros.Funcion); var argumento1 = new Argument("x", parametros.Xi); var argumento2 = new Argument("x", parametros.Xd); var expresion1 = new Expression(nombre, funcion, argumento1); var expresion2 = new Expression(nombre, funcion, argumento2); double Fxi = expresion1.calculate(); double Fxd = expresion2.calculate(); double R = Fxi * Fxd; double xant = 0; bool bandera = false; while (bandera == false) { if (R > 0) { Resultado.Raiz = 00; bandera = true; } else if (R < 0) { Fxi = expresion1.calculate(); Fxd = expresion2.calculate(); if (parametros.Tipo) { xr = (parametros.Xi + parametros.Xd) / 2; } else { xr = (Fxd * parametros.Xi - Fxi * parametros.Xd) / (Fxd - Fxi); } var Fxr = CalculoFuncion(parametros.Funcion, xr); Resultado.Iteraciones++; Resultado.Error = Math.Abs((xr - xant) / xr); if (Math.Abs(Fxr) < parametros.Tolerancia || Resultado.Error < parametros.Tolerancia || Resultado.Iteraciones >= parametros.Iteraciones) { Resultado.Raiz = xr; bandera = true; } else if (Fxi * Fxr > 0) { parametros.Xi = xr; xant = xr; } else { parametros.Xd = xr; xant = xr; } } else { if (Fxi == 0) { Resultado.Raiz = parametros.Xi; bandera = true; } else { Resultado.Raiz = parametros.Xd; bandera = true; } } } return(Resultado); }