Método de Bisección
El Método de Bisección consiste en encontrar dos puntos de la ecuación "a" , "b" donde al evaluar F(a) y F(b) tendremos que los valores encontrados son de signos diferentes, por lo que entonces se puede proceder con el método, de ahí se encuentra el promedio de "a" y "b" y obtendremos el valor "c", si "c" de evalúa F(c) y entonces encontraremos un valor el cual puede ser positivo o negativo y con respecto a ello si es que el valor de F(c) no paso por 0 entonces ese valor se le reasigna a "a" o "b" y se repite la evaluación de el nuevo F(c) hasta que F(c) sea lo mas cercano a 0.
Conociendo lo anterior empecemos con el programa
Primero el Diseño con el cual hice uso de 5 textbox ( 4 para la asignacion de datos y 1 para imprimir el resultado ), 1 botton encargado de realizar todas las operaciones y 3 paneles de los cuales 1 esta integrado a otro con sus respectivos labels para explicarle al usuario como se utiliza el programa.
Despues en el codigo vamos a ocupar un operador de una biblioteca, pero antes debemos importarala por lo que nos vamos al proyecto, le damos click derecho, de ahi nos vamos a agregar, de ahi a referencias...
Seguido palomeamos
Microsoft.JScriptDespués de haberle agregado la biblioteca vamos a importar esta biblioteca a nuestro código para poder acceder de forma mas sencilla a sus instrucciones.
Seguido también empezamos a definir unas cuantas variables globales
La variable que porta el operador de Java para solucionar una ecuación aritmética
Dim engine As VsaEngine = VsaEngine.CreateEngine()
Las variables que tendran el texto de los texboxFx
Dim Fx As String
Las variables para generar un texto de transicion donde se sustituyen las "x" por "xi" y "xp"
Dim Fxtrans, Fpxtrans As Object
Las variables que tendran el resultado de las Ecuaciones F(xi) , F(xp) o F(xprom)
Dim Fxval, Fpxval as Object
Y las varibales con las cuales se va a ev aluar F(x)
Dim Xi, Xp, Xprom As Double
De Ahi colocamos un Try-Catch que tendra todo el codigo, entendiendo que el operador de Java retorna error cuando no puede solcuionar la ecuacion porque hay incognitas no definidas, osea que solo resuelve ecuaciones aritmeticas y si el usuario introduce variables de mas Java regresara error
De ahi colocamos una serie de If´s Para comprobar que ningun textbox este vacio
(textboxValorBuscado, textboxFx, textboxXposterior, TextboxXinicial)
De ahí realizaremos un par de operaciones antes de Realizar el Método de Biseccion
Primero Tenemos que comprobar que F(xi) y F(xp) son de signos diferentes para poder realizar el método, por ello es que le asignamos valores a Xi y Xp
Xi = Val(TXTXi.Text)
Xp = Val(TXTXp.Text)
Seguido vamos a realizar un texto especial para F(x) ya que si el usuario desea encontrar un valor especifico se halla del otro lado de la ecuación y lo necesitamos del otro lado de la ecuación
F(x) + VB = "Ecuación"
F(x) = "Ecuación" - VB
por lo que para generar ese texto usaremos el siguiente codigo
Fx = String.Format("{0}-{1}", TXTFx.text , TXTVB.Text)
Donde {} acopla el valor que se halla después del coma
Y Ahora si empezamos a comprobar si son del mismo signo
Para ello tenemos que generar el texto para la ecuacion F(x) donde sustituyamos el caracter "x" por el valor Xi y otro para el valor de Xp
Fxtrans = Fx.Replace("x",Xi)
Fpxtrans = Fx.Replace("x",Xp)
Despues obtendremos los valores correspontiendes del resultado de la ecuacion y luego las pasaremos a un formato mas practico como lo es Double
Fxval = Eval.JScriptEvaluate(Fxtrans, engine)
System.Convert.ToDouble(Fxval)
Fpxval = Eval.JScriptEvaluate(Fpxtrans, engine)
System.Convert.ToDouble(Fpxval)
Ya que comprobamos que Son de signo diferente ya podemos empezar a Realizar el método de biseccion
Pero antes de poder realizar el ciclo necesitamos saber si "a" es positivo o negativo para de ahi basarnos en el remplazo de valores con "c"
Para el primer caso tenemos que "a" es positivo
If Math.Sign(Fxval) > 0 Then
y entonces entramos en el Ciclo
Primero sacaremos cuando vale "c"(Xprom)
Xprom = (Xi + Xp) / 2
Generamos el texto de transicion para evaluar F(c)
Fxtrans = Fx.Replace("x", Xprom)
Generamos el valor de F(c)
Fxval = Eval.JScriptEvaluate(Fxtrans, engine)
Entonces empieza una serie de If-ElseIf donde con respecto a F(c) si es positivo "a" se convertira en "c" y si es negativo "b" se convertira en "c"
If Math.Sign(Fxval) > 0 Then
Xi = Xprom
ElseIf Math.Sign(Fxval) < 0 Then
Xp = Xprom
End If
Y por ultimo el While que decide si se repite el codigo para ello tenemos que basarnos en que F(c) tiene que tender a 0 entonces mientras mas cerca del 0 este menor es nuestor error por lo que podemos afirmar a "c" como el valor buscado por lo que la condicion queda de la siguiente forma
Loop While Math.Abs(Fxval) > 0.0000001
Y Termina el Ciclo
Para el Caso 2 tenemos que a es negativo
ElseIf Math.Sign(Fxval) < 0 Then
y entonces entramos al ciclo
Primero sacaremos cuando vale "c"(Xprom)
Xprom = (Xi + Xp) / 2
Generamos el texto de transicion para evaluar F(c)
Fxtrans = Fx.Replace("x", Xprom)
Generamos el valor de F(c)
Fxval = Eval.JScriptEvaluate(Fxtrans, engine)
Entonces empieza una serie de If-ElseIf donde con respecto a F(c) si es negativo "a" se convertirá en "c" y si es positivo "b" se convertirá en "c"
If Math.Sign(Fxval) < 0 Then
Xi = Xprom
ElseIf Math.Sign(Fxval) > 0 Then
Xp = Xprom
End If
Y por ultimo el While que decide si se repite el codigo para ello tenemos que basarnos en que F(c) tiene que tender a 0 entonces mientras mas cerca del 0 este menor es nuestor error por lo que podemos afirmar a "c" como el valor buscado por lo que la condicion queda de la siguiente forma
Loop While Math.Abs(Fxval) > 0.0000001
Y Termina el Ciclo
Según halla sido el caso 1 o 2 al final imprimimos el Resultado
TXTResultado.Text = Xprom
A continuación en la imagen se vera el final del Try-Catch donde aparece el Catch con su respectivo mensaje sobre porque hallo un error
y seguido veremos una instrucción sobre si se le da click derecho a un panel que tiene una imagen del link. el porque coloque este link es para decirle al usuario como se escriben los operadores matemáticos( potencia, trigonométricas, logarítmicas, etc...) ya que para el solucionador de Java lo que hace es leer el texto como si fuese código y soluciona las operaciones pero los operadores matemáticos se basan en el código de la biblioteca System.Math entonces anexe el link para poder ver todos los comandos de System.Math
Bueno con ello terminamos el programa pero antes se realiza una demotración con el copilador de Visual Studio para corroborar que si este funcionando de forma correcta
Entonces lo Copilamos:
Le Asignamos la función:
x^2
pero como java no lee ^ tendremos que aplicar el comando correspondiente de System.Math que si nos vamos a la pagina dice que la potencia se escribe de la siguiente manera
Math.pow("Base", "Potencia")
por lo que la función escrita quedara de la forma
Math.pow(x,2)
El valor que buscamos para que cuando evaluemos x nos de:
1500
colocamos que Xinicial es 1
ya que si sustituimos nos da que F(1) es menor de 1500 por lo que es negativo
y colocamos Xposterior como 100
Ya que F(100) nos da un valor mayor a 1500 por lo que es positivo
ya con eso nos cercioramos de que los extremos son de signos contrarios
De ahí ya le damos Click al Botton para que Resuelva la ecuación con el método de Biseccion
Y le hacemos su respectiva comprobación con la calculador
Y pues listo ya comprobamos que el programa funciona
Espero les halla Servido y gracias por leer
Comentarios
Publicar un comentario