首页 > 解决方案 > scipy.optimize,IndexError:标量变量的索引无效

问题描述

我正在尝试使用 nelder-mead 方法在多元标量函数上实现 scipy.optimize.minimize。在打印函数中调用我的函数定义时工作得很好。当我打开最小化时,它会抛出 IndexError。

from scipy.optimize import minimize
import math
import numpy as np

c_ = [1.,1.,1.]
d_ = [1.,1.,1.]
x_=[c_,d_]

def hamiltonian(x_):
    N=len(c_)
    return np.sum([(1/n**3.0)*(n-i)*i*(x_[0][(n-i)]*x_[0][i]+x_[1][(n-i)]*x_[1][i])-(1/n**3.0/alpha**2.0)*np.sum([x_[0][(n-i-j)]*x_[0][i]*x_[1][j] for j in range(0,(n-i+1))])  for n in range(1,N) for i in range(0,(n+1))])

print hamiltonian(x_) #no problem here

res = minimize(hamiltonian, x_, method='nelder-mead') #problem here

标签: pythonscipy

解决方案


那是因为x_是一个列表列表:

>>> x_
[[1.0, 1.0, 1.0], [1.0, 1.0, 1.0]]

因此将该行替换为x_=[c_,d_]

>>> x_ = c_ + d_

您还必须修改您的hamiltonianfor1xNNx1列表/数组。

我能想到的最简单的hack是:

def hamiltonian(x_):
    N=len(c_)
    if type(x_[0]) == np.array:
        x_ = np.concatenate((x_[0:N], x_[N:]), axis=0)
    return np.sum([(1/n**3.0)*(n-i)*i*(x_[0][(n-i)]*x_[0][i]+x_[1][(n-i)]*x_[1][i])-(1/n**3.0/alpha**2.0)*np.sum([x_[0][(n-i-j)]*x_[0][i]*x_[1][j] for j in range(0,(n-i+1))])  for n in range(1,N) for i in range(0,(n+1))])

推荐阅读