Python 如何为Powell设置合适的方向向量';在scipy.optimize.minimize上的s方法?

Python 如何为Powell设置合适的方向向量';在scipy.optimize.minimize上的s方法?,python,scipy,scipy-optimize,scipy-optimize-minimize,Python,Scipy,Scipy Optimize,Scipy Optimize Minimize,我正在建立一些spring网络,以便为橡胶牵引力测试建立一个模型。我在网络的一些节点上施加位移,锁定其他节点,然后对系统的能量运行最小化函数,以得到稳定的系统 首先,使用Nelder-Mead方法,我遇到了发散问题,系统的能量随着迭代次数的增加而增加,所以我尝试鲍威尔的方法。方向向量应该有助于我的函数以正确的方向“移动”我的节点 不幸的是,我仍然得到一个错误 这是我的密码: import scipy as sc import scipy.optimize as opt import numpy

我正在建立一些spring网络,以便为橡胶牵引力测试建立一个模型。我在网络的一些节点上施加位移,锁定其他节点,然后对系统的能量运行最小化函数,以得到稳定的系统

首先,使用
Nelder-Mead
方法,我遇到了发散问题,系统的能量随着迭代次数的增加而增加,所以我尝试鲍威尔的方法。方向向量应该有助于我的函数以正确的方向“移动”我的节点

不幸的是,我仍然得到一个错误

这是我的密码:

import scipy as sc
import scipy.optimize as opt
import numpy as np
### Scipy.optimize.minimize with Powell's method
# Algorithm' starting point
x0 = np.array([1., 1., 2., 1., 2., 3., 1., 2., 3., 1., 2., 3., 2., 3., 3., 0., 1.,
       0., 2., 1., 0., 3., 2., 1., 4., 3., 2., 4., 3., 4.])

# Setting up the variables we will need
Bounds= opt.Bounds(lb=0, ub=10)
Direc = (np.array([[1, 1, 2, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 2, 0, 1, 2,-1, 0, 1,-2,-1, 0,-2,-1,-2]]))

# Run the optimization function
x_pow = opt.minimize(minimize_energy, x0, method='Powell', tol=1e-6, bounds = Bounds,
                 options={'maxiter': 1e4, 'disp': True, 'direc':Direc}) 
下面是我得到的错误:

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-23-f0bb1bfcaa17> in <module>
      8 # Run the optimization function
      9 x_pow = opt.minimize(minimize_energy, x0, method='Powell', tol=1e-6, bounds = Bounds,
---> 10                  options={'maxiter': 1e4, 'disp': True, 'direc':Direc}) 
     11 
     12 print('final x')

C:\Bib\envs\statmath3\lib\site-packages\scipy\optimize\_minimize.py in minimize(fun, x0, args, method, jac, hess, hessp, bounds, constraints, tol, callback, options)
    598         return _minimize_neldermead(fun, x0, args, callback, **options)
    599     elif meth == 'powell':
--> 600         return _minimize_powell(fun, x0, args, callback, **options)
    601     elif meth == 'cg':
    602         return _minimize_cg(fun, x0, args, jac, callback, **options)

C:\Bib\envs\statmath3\lib\site-packages\scipy\optimize\optimize.py in _minimize_powell(func, x0, args, callback, xtol, ftol, maxiter, maxfev, disp, direc, return_all, **unknown_options)
   2638         delta = 0.0
   2639         for i in ilist:
-> 2640             direc1 = direc[i]
   2641             fx2 = fval
   2642             fval, x, direc1 = _linesearch_powell(func, x, direc1,

IndexError: index 2 is out of bounds for axis 0 with size 2
---------------------------------------------------------------------------
索引器回溯(最后一次最近调用)
在里面
8#运行优化功能
9 x_pow=opt.minimize(最小化能量,x0,方法='Powell',tol=1e-6,界限=界限,
--->10个选项={'maxiter':1e4,'disp':True,'direc':direc})
11
12打印(“最终x”)
C:\Bib\envs\statmath3\lib\site packages\scipy\optimize\\u minimize.py in minimize(fun、x0、args、method、jac、hess、hessp、bounds、constraints、tol、callback、options)
598 return _minimize _neldermead(fun、x0、args、callback、**选项)
599 elif meth==“鲍威尔”:
-->600返回_最小化_powell(乐趣、x0、args、回调、**选项)
601 elif meth==“cg”:
602返回最小化cg(乐趣、x0、参数、jac、回调、**选项)
C:\Bib\envs\statmath3\lib\site packages\scipy\optimize\optimize.py in_minimize_powell(func、x0、args、callback、xtol、ftol、maxiter、maxfev、disp、direc、return_all、**未知选项)
2638δ=0.0
2639对于ilist中的i:
->2640 direc1=direc[i]
2641 fx2=fval
2642 fval,x,direc1=\u linesearch\u powell(func,x,direc1,
索引器:索引2超出大小为2的轴0的界限
我不明白为什么当我的方向向量与要优化的参数向量
x0
长度相同时,我会得到一个越界。
感谢您的帮助!

Powell是否期望N个方向向量,其中N是x0的长度?我知道它在默认情况下使用的是N个方向向量,但我不确定它是否严格要求。