Estoy realizando una macro para realizar cálculos de ecuaciones, pero esta particularmente es implícita y quisiera saber como escribir el código para que realice las iteraciones hasta encontrar el valor que la resuelve, ya que en algún momento el valor dentro de la raíz es negativo y me da error de argumento. Esta es la ecuacion X = sqrt(0.0677489+X (-0.142769)).
1 Respuesta
Respuesta de santiagomf
1
1
santiagomf, Más de 35 años en la informática y más de 20 trabajando con...
En lugar de plantear la ecuación como la has puesto, he realizado un ligero cambio pasando la por al otro lado de la igualdad y comparando, lógicamente, con 0. Sería: sqr(0.677489+X*0.142769)-X=0 El código quedaría así: Option Explicit Function calculaSolucionEcuacion() Const maxErr = 1E-20 Dim vMax As Double Dim vMin As Double Dim vMed As Double Dim v As Double Dim n As Integer vMax = 1E+20 vMin = -1E+20 n = 0 Do n = n + 1 DoEvents vMed = (vMax + vMin) / 2 v = calculaValorFuncion(vMed) If Abs(v) < maxErr Then Exit Do If v < 0 Then ' Como es una función decreciente, tenemos que hacer que el resultado de la función ' sea más alto, por lo que la vMed tiene que ser más bajo. Para ello pondremos ' el valor medio en el valor máximo vMax = vMed Else vMin = vMed End If Loop calculaSolucionEcuacion = vMed MsgBox "Resuelto en " & n & " vueltas" End Function Function calculaValorFuncion(ByVal x As Double) Dim aux As Double On Error Resume Next aux = Sqr(0.0677489 + x * (-0.142769)) If Err = 5 Then aux = -999999 ' Error por calcular una raiz cuadrada de un número negativo. If Err <> 5 And Err <> 0 Then Stop On Error GoTo 0 calculaValorFuncion = aux - x End Function He puesto un contador de vueltas a modo de curiosidad.
Saludos... Me ha sido de mucha utilidad lo anterior pero tengo un par de dudas que ojala puedas aclararme, no comprendo el termino "doevents", quizá lo desconozco porque tengo poco tiempo en esto. Y por otra parte estas funciones que señalas, como se pueden llamar desde dentro de un If .. then, que es lo que tengo antes de ejecutarlas. Gracias...
El doevents es una instrucción que indica al Visual Basic que atienda también a otras aplicaciones. Cuando un programa se mete en un bucle largo (o no) es conveniente poner esa instrucción para evitar que el programa llegue a dejar el sistema 'medio' bloqueado. En cuanto a la forma de llamar a la ecuación es como a cualquier función: CalculaSolucionEcuacion() Si quieres ponerla en un 'if' podría ser: if calculaSolucionEcuacion() < 0 then msgbox "Resultado Negativo" else "Resultado positivo o cero"