Python 向量的辛元分解

Python 向量的辛元分解,python,sympy,Python,Sympy,我有一个价格向量和一个数量向量。我想用sympy符号化地划分这两个向量。我甚至找不到矢量设备。所以我对sympy关于如何创建向量符号以及如何操作它们的内容完全迷茫了 最后,我想使用拉格朗日方法最大化的是prod((x/p)**b)受约束的sum(x)=1。我可以用标量,但不能用向量: import sympy as sp import sympy from sympy.abc import,p1, p2, l, x1, x2, b1, b2 sp.init_printing() U = (

我有一个价格向量和一个数量向量。我想用sympy符号化地划分这两个向量。我甚至找不到矢量设备。所以我对sympy关于如何创建向量符号以及如何操作它们的内容完全迷茫了

最后,我想使用拉格朗日方法最大化的是
prod((x/p)**b)
受约束的
sum(x)=1
。我可以用标量,但不能用向量:

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))

这里有一种方法可以做到这一点

import sympy as sp
定义(向量)变量和参数:

# 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')
目标函数:

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

拉格朗日:

L = U + l * (sum(x+y)-1) 
KKT条件(每个列表元素必须等于零):

为了帮助求解,我只考虑了导数的分子。这意味着基于此方法的某些解决方案可能由于相应的零分母而无效(必须手动检查)

现在可以得到如下的解:

sp.solve(KKT,sp.flatten([x,y,l]))
对于参数
b
c
的一般值,Symphy似乎无法给出解决方案。然而,对于这些参数的某些选择,可以获得解。例如,对于
b=2
c=2
,给出的解决方案如下


这里有一种方法可以做到这一点

import sympy as sp
定义(向量)变量和参数:

# 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')
目标函数:

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

拉格朗日:

L = U + l * (sum(x+y)-1) 
KKT条件(每个列表元素必须等于零):

为了帮助求解,我只考虑了导数的分子。这意味着基于此方法的某些解决方案可能由于相应的零分母而无效(必须手动检查)

现在可以得到如下的解:

sp.solve(KKT,sp.flatten([x,y,l]))
对于参数
b
c
的一般值,Symphy似乎无法给出解决方案。然而,对于这些参数的某些选择,可以获得解。例如,对于
b=2
c=2
,给出的解决方案如下


辛包括矩阵;我求助于使用列矩阵来表示向量。但是,我不熟悉所讨论的优化问题,也没有足够的高级Symphy用户能够使用
Matrix
和/或
MatrixSymbol
对象成功重写此答案;我求助于使用列矩阵来表示向量。但是,我不熟悉所讨论的优化问题,也不熟悉高级用户是否能够使用
Matrix
和/或
MatrixSymbol
对象成功重写此答案。