Macro para resolver una ec. No lineal de una incógnita

Necesito hacer una macro para resolver una ec. No lineal de una incógnita en función de valores que tomen tres variables distintas la ecuación es:

1/sqrt(f)=-2log(((k/d)/3.71)+(2.51/(Re*sqrt(f))))

Las variables que, Re y de quiero referenciarlas a unas celdas donde pueda ir metiendo valores, serán datos.

F es la incógnita de la ecuación, como veréis está en ambos lados de la igualdad.

1 respuesta

Respuesta

Esto se resuelve de dos maneras con algoritmos genéticos VBA o por una variación de la simulación de montecarlo, desafortunadamente a un no entiendo bien la programación de los primeros así que voy a usar la segunda opción, te explico se primero como puedes ver en la imagen la macro no busca la solución exacta sino aquellas que tiendan a aproximarse a 0 por asignación de valores aleatorios en las 4 variables, se hacen 1000 simulaciones y la macro descarta los números negativos así como los valores con resultados mayores a 0.10, ya que los calcula hace un filtro de valores repetidos en las 3 primeras columnas (porque se van a generar valores repetidos) y te deja ordenados de menor a mayor los resultados dejando en primer lugar el valor más próximo a 0

y esta es la macro

Sub datos()
cant = InputBox("cantidad de soluciones?")
If cant = vbNullString Then GoTo sal
Range("b4").CurrentRegion.ClearContents
Set soluciones = Range("b4").Resize(cant, 8)
matriz = soluciones
For i = 1 To 1000
atras:
    Randomize
    f = 1 + Rnd * (10 - 1)
     k = 1 + Rnd * (100 - 1)
    d = 1 + Rnd * (100 - 1)
    re = 1 + Rnd * (100 - 1)
    Formula = 1 / Sqr(f)
    Formula2 = -2 * WorksheetFunction.Log(((k / d) / 3.71) + (2.51 / (re * Sqr(f))))
    resultado = Formula2 - Formula
    If resultado < 0 Or resultado > 0.05 Then GoTo atras
    matriz(i, 1) = k
    matriz(i, 2) = d
    matriz(i, 3) = re
    matriz(i, 4) = f
    matriz(i, 5) = Formula2
    matriz(i, 6) = Formula
    matriz(i, 7) = Formula2 - Formula
Next i
With soluciones
    Range(.Address) = matriz
    .Sort key1:=Range(.Columns(7).Address), order1:=xlAscending
    .RemoveDuplicates Columns:=Array(1, 2, 3)
    .Cells(0, 1) = "K"
    .Cells(0, 2) = "D"
    .Cells(0, 3) = "RE"
    .Cells(0, 4) = "F"
    .Cells(0, 5) = "LADO IZQ. DE LA FORMULA"
    .Cells(0, 6) = "LADO DER. DE LA FORMULA"
    .Cells(0, 7) = "RESULTADO"
    .Rows(0).Font.Bold = True
    .CurrentRegion.EntireColumn.AutoFit
End With
sal:
Erase matriz
Set soluciones = Nothing
End Sub

Te recomiendo que la cantidad a simular sea de mínimo 1000 combinaciones

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas