python - 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
解决方案
那是因为x_
是一个列表列表:
>>> x_
[[1.0, 1.0, 1.0], [1.0, 1.0, 1.0]]
因此将该行替换为x_=[c_,d_]
:
>>> x_ = c_ + d_
您还必须修改您的hamiltonian
for1xN
或Nx1
列表/数组。
我能想到的最简单的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))])
推荐阅读
- database - Cloud Firestore 更改字段名称
- python - discord.py 机器人未启动
- javascript - 为什么“somefile.hbs”不允许使用把手/胡子在 html 上发送动态消息?
- transactions - 我可以在前端显示sql事务运行状态吗
- html - 如何使用 css 或 javascript 将复杂形状重塑为另一种形状?
- python-3.x - 有效地生成两个具有依赖性的随机样本的方法
- javascript - 无法在 React JS 页面上呈现 Django Rest Framework 错误
- android - Android - 如何在另一个应用程序的目标编辑视图中更改不同的字体
- bash - 根据域名使 URL 唯一
- rust - Rustlings if2.rs 任务问题。控制流问题