Programación General > Visual Basic para principiantes

 metodo de powell

(1/1)

acevedoram:
Hola!!
necesito realizar un  codigo para hallar un minimo de una ecuacion utilizando  el metodo de powell multidimensional... pero no encuentro ninguna informacion
si alguien sabe alguna pagina donde pueda encontrar codigo me la podria faiciltar?
gracias

Nebire:
Búscalo como 'fórmula DFP', o 'solución DFP' o por lo menos en inglés, seguro que te aparecen páginas.

DFP = Davidon, Fletcher y Powell

0Y0L@:
No sé si sea tarde, pero, para los que lo necesiten en el futuro, :hitcomp:
 
--- Código: Visual Basic ---Sub Powell_Multidimensional()    Dim Lambda As Double    Dim Epsilon As Double    Dim x(3, 2) As Double    Dim v(3, 2) As Double    Dim Iteracion As Integer    Dim I As Integer    Dim n As Integer    Dim p As Integer        n = 2    p = 3        x(0, 0) = -0.5      ' Punto inicial    x(0, 1) = 0.5       ' Punto inicial        v(1, 0) = -0.5      ' Conjunto inicial de direcciones    v(1, 1) = 0    v(2, 0) = 0    v(2, 1) = 0.5    Iteracion = 0        Limpiar             ' Limpio los resultados anteriores    Titulos             ' Imprimo titulos de columnas    r = Imprime(p, I, x(0, 0), x(0, 1), v(0, 0), v(0, 1), Lambda, fx(x(0, 0), x(0, 1)), 0)        p = p + 1        Do        Range("A" & p).Select        ActiveCell.FormulaR1C1 = Iteracion                For I = 1 To n            Lambda = Lambda_Optimo(x(I - 1, 0), x(I - 1, 1), v(I, 0), v(I, 1))            x(I, 0) = x(I - 1, 0) + Lambda * v(I, 0)            x(I, 1) = x(I - 1, 1) + Lambda * v(I, 1)            r = Imprime(p, I, x(I, 0), x(I, 1), v(I, 0), v(I, 1), Lambda, fx(x(I, 0), x(I, 1)), 0)            p = p + 1        Next I                For I = 1 To n - 1            v(I, 0) = v(I + 1, 0)            v(I, 1) = v(I + 1, 1)        Next I                v(n, 0) = x(n, 0) - x(0, 0)        v(n, 1) = x(n, 1) - x(0, 1)                Lambda = Lambda_Optimo(x(n, 0), x(n, 1), v(n, 0), v(n, 1))                x(0, 0) = x(n, 0) + Lambda * v(n, 0)        x(0, 1) = x(n, 1) + Lambda * v(n, 1)        Distancia = v(n, 0) ^ 2 + v(n, 1) ^ 2                r = Imprime(p, 0, x(0, 0), x(0, 1), v(n, 0), v(n, 1), Lambda, fx(x(0, 0), x(0, 1)), Distancia)                        Epsilon = 1        p = p + 1        Iteracion = Iteracion + 1    Loop Until Distancia <= 1 * 10 ^ (-25) Or Iteracion > 1000End SubPublic Function Lambda_Optimo(ByVal prmx1 As Double, ByVal prmx2 As Double, ByVal prmv1 As Double, ByVal prmv2 As Double) As Double    Dim px1k, px2k, A, B, C, Epsilon As Double    Dim fx1, fx2 As Double    Dim x1 As Double    Dim x2 As Double    Dim x1Ant, x2Ant As Double    Dim Distancia, Iteracion As Double    Dim Maxlteraciones As Boolean        Iteracion = 0    A = -10    B = 10    Epsilon = 0.000001    Maxlteraciones = False        Do        x1Ant = x1        x2Ant = x2        C = (A + B) / 2        x1 = C - Epsilon        x2 = C + Epsilon        fx1 = fp(prmx1, prmx2, prmv1, prmv2, x1)        fx2 = fp(prmx1, prmx2, prmv1, prmv2, x2)        If fx1 > fx2 Then A = x1 Else B = x2        Iteracion = Iteracion + 1        If Iteracion > 100 Then Maxlteraciones = True        Distancia = ((x1 - x1Ant) ^ 2 + (x2 - x2Ant) ^ 2) ^ (0.5)    Loop Until Distancia <= Epsilon Or MaxIteraciones    Lambda_Optimo = CEnd FunctionPublic Function fx(x1 As Double, x2 As Double) As Double    fx = 100 * (x2 - x1 ^ 2) ^ 2 + (1 - x1) ^ 2End FunctionPublic Function fp(x1k As Double, x2k, v1k As Double, v2k As Double, t As Double)    fp = fx((x1k + t * v1k), (x2k + t * v2k))End FunctionPublic Function Limpiar()    Columns("A:F").Select    Selection.ClearContentsEnd FunctionPublic Function Titulos()    Range("A2").Select    ActiveCell.FormulaR1C1 = "Interación"    Range("B2").Select    ActiveCell.FormulaR1C1 = "Dirección"    Range("C2").Select    ActiveCell.FormulaR1C1 = "X1"    Range("D2").Select    ActiveCell.FormulaR1C1 = "X2"    Range("E2").Select    ActiveCell.FormulaR1C1 = "V1"    Range("F2").Select    ActiveCell.FormulaR1C1 = "V2"    Range("G2").Select    ActiveCell.FormulaR1C1 = "Lambda"    Range("H2").Select    ActiveCell.FormulaR1C1 = "Fx(x)"    Range("I2").Select    ActiveCell.FormulaR1C1 = "Distancia"End FunctionFunction Imprime(ByVal p As Double, ByVal I As Double, ByVal xa As Double, ByVal xb As Double, ByVal va As Double, ByVal vb As Double, ByVal Lam As Double, ByVal fxx As Double, ByVal Dist As Double)    Range("B" & p).Select    ActiveCell.FormulaR1C1 = I    Range("C" & p).Select    ActiveCell.FormulaR1C1 = xa    Range("D" & p).Select    ActiveCell.FormulaR1C1 = xb    Range("E" & p).Select    ActiveCell.FormulaR1C1 = va    Range("F" & p).Select    ActiveCell.FormulaR1C1 = vb    Range("G" & p).Select    ActiveCell.FormulaR1C1 = Lam    Range("H" & p).Select    ActiveCell.FormulaR1C1 = fxx    Range("I" & p).Select    ActiveCell.FormulaR1C1 = DistEnd Function  

Navegación

[0] Índice de Mensajes

Ir a la versión completa