Hier ist eine Möglichkeit, dies zu tun.
import sympy as sp
definieren (Vektor) Variablen und Parameter:
# vector size (integer, user input):
n = 2
# vector variables:
x = sp.var('x0:'+str(n), positive = True)
y = sp.var('y0:'+str(n), positive = True)
# vector parameters:
p = sp.var('p0:'+str(n), positive = True)
q = sp.var('q0:'+str(n), positive = True)
# scalar parameters
b = sp.var('b', real = True)
c = sp.var('c', real = True)
# Lagrange multiplier for sum constraint:
l = sp.var('lambda')
Objektive Funktion:
U = reduce(lambda xi, xj: xi * xj, [(xi/pi)**b * (yi/qi)**c for xi,pi,yi,qi in zip(x,p,y,q)],1)
U
(X0/p0) ** b * (x1/p1) ** b * (y0/q0) ** c * (y1/q1) ** c
Lagran Gian:
L = U + l * (sum(x+y)-1)
KKT Bedingungen (jedes Listenelement muss gleich Null sein):
KKT = sp.simplify([sp.numer(sp.together(sp.diff(L, xi))) for xi in x]+\
[sp.numer(sp.together(sp.diff(L, xi))) for yi in y] + [sp.diff(L, l)])
Ich habe nur der Zähler der Derivate berücksichtigt, um den Solver zu helfen. Dies bedeutet, dass einige Lösungen, die auf diesem Ansatz basieren, aufgrund eines entsprechenden Null-Nenners ungültig sein können (sie müssen manuell überprüft werden).
Die Lösung erhielt nun wie
sp.solve(KKT,sp.flatten([x,y,l]))
Es scheint, dass für allgemeine Werte des Parameters b
und c
, Sympy nicht in der Lage ist, eine Lösung zu geben. Für bestimmte Auswahlmöglichkeiten dieser Parameter können jedoch Lösungen erhalten werden. Zum Beispiel für b=2
und c=2
, da die Lösung
[{lambda: y0**2*y1**2*(y0 + y1 - 1)**3/(4*p0**2*p1**2*q0**2*q1**2),
x0: -y0/2 - y1/2 + 1/2,
x1: -y0/2 - y1/2 + 1/2}]
SymPy umfasst Matrizen; Ich habe auf die Verwendung von Spaltenmatrizen zur Darstellung von Vektoren zurückgegriffen. Ich bin jedoch weder mit dem besprochenen Optimierungsproblem noch mit einem fortgeschrittenen SymPy-Benutzer vertraut, der diese Antwort mit "Matrix" - und/oder "MatrixSymbol" -Objekten erfolgreich umgeschrieben hat. – chrstphrchvz