Ecuación implícita

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
1
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"

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas