2016-06-11 8 views
0

Ich habe einen preisvektor und eine menge vektor. Ich möchte die beiden Vektoren sympatisch symbolisch teilen. Ich kann nicht einmal eine Vektoreinrichtung finden. Ich bin total verstimmt darüber, wie ich Vektorsymbole erstellen und manipulieren kann.sympy element weise einteilung des vektors

Schließlich möchte ich die Lagrange-Methode verwenden, um zu maximieren ist prod ((x/p) ** b) der erzwungenen Summe (x) = 1 unterworfen. Ich kann dies mit Skalaren tun, aber nicht mit Vektoren:

import sympy as sp 
import sympy 
from sympy.abc import,p1, p2, l, x1, x2, b1, b2 
sp.init_printing() 
U = ((x1/p1)**b1)*((x2/p2)**b2) 
L = U - l*(x1 + x2 - 1) 
dL_dy = sp.diff(L, x1) 
dL_dx = sp.diff(L, x2) 
dL_dl = sp.diff(L, l) 
sp.solve([dL_dy, dL_dx, dL_dl], (x1, x2, l)) 

Antwort

2

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}] 
+0

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

Verwandte Themen