Python 如何为scipy.optimize指定约束列表?

Python 如何为scipy.optimize指定约束列表?,python,scipy,Python,Scipy,我正在努力从优化手册中找出如何做到这一点 (使用最小化例程SLSQP)。我的问题有一个变量数组x0,从中我试图为我的函数构造一个约束列表 L = 2 N = 2 x0 = np.random.uniform(-1.0, 1.0, size=(L*L*N*2,)) x0 = x0.reshape(L,L,N,2) ff = x0[:, :, :, 0] + 1j*x0[:, :, :, 1] 约束的形式必须为:ff[x,y,1]**2+ff[x,y,2]**2+…+ff[x,y,N]**2=1

我正在努力从优化手册中找出如何做到这一点 (使用最小化例程SLSQP)。我的问题有一个变量数组x0,从中我试图为我的函数构造一个约束列表

L = 2
N = 2

x0 = np.random.uniform(-1.0, 1.0, size=(L*L*N*2,))
x0 = x0.reshape(L,L,N,2)
ff = x0[:, :, :, 0] + 1j*x0[:, :, :, 1]
约束的形式必须为:ff[x,y,1]**2+ff[x,y,2]**2+…+ff[x,y,N]**2=1

我认为这应该是可行的,但我正在学习Python,因为我要解决这个问题。我希望这不是一个被卡住的小地方。我迄今为止的努力

for i_x in range(L):
for i_y in range(L):
    cons = {'type':'eq', 'fun': np.sum(np.abs(ff[i_x, i_y, :])**2) - 1}

x0 = x0.reshape(L*L*N*2, )
scipy.optimize.minimize(func, x0, constraints=cons)
现在

def constraints(x0, L, N, cons):
x0 = x0.reshape(L, L, N, 2)

for i_x in range(L):
    for i_y in range(L):
            def con(x0, i_x = i_x, i_y = i_y):
                return np.sum(np.abs((x0[i_x, i_y, :, 0] + 1j*x0[i_x, i_y, :, 1])**2)) - 1
            cons.append({'type':'eq', 'fun': con})

return cons

但是我收到错误,“数组的索引太多”

我认为您的代码有一个问题,它覆盖了约束
cons
。因此,
scipy.optimize.minimize
函数看到的唯一约束是
np.sum(np.abs(ff[-1,-1,:])**2)=1
,其中
-1
表示最后一个元素L-1。我建议初始化一个空列表,然后附加到它:

    cons = []
    for i_x in range(L):
        for i_y in range(L):
            cons.append({'type':'eq', 'fun': ...)

第二个问题是,约束必须由与您试图最小化的函数相同的向量参数化,即它必须是具有形状(L*L*N*2,)的向量的函数。相反,您的函数是
ff
,它具有形状(L,L,N),是一个常数(“冻结”在创建时,初始值
x0
),不依赖于最小化算法的当前迭代。

感谢这一点,我更新了我的尝试。我认为现在的问题是,最小化需要一个列表中的变量,我已经使用数组定义了约束。正在研究解决方案,但我没有任何直接的想法。因为约束函数的参数是一个一维向量,所以在使用许多索引之前,需要对其进行重塑,例如:
x0。重塑(L,L,N,2)[I_x,I_y,:,0]