优化python中的讨厌函数-错误

优化python中的讨厌函数-错误,python,python-2.7,scipy,minimize,Python,Python 2.7,Scipy,Minimize,我试图最小化一个由三个变量组成的函数,非线性的,非常大和讨厌的。它在Matlab中工作得很好,但我正在尝试转换到python(作为一种学习体验和更多的自由)。无论如何,它确实适用于最小化函数“Nelder Mead”,但它给了我一个没有意义的输出,所以我尝试给变量添加边界 代码如下: bnds = ((0, 1), (0, 1), (0, 1)) x0 = [0.004, 0.1, 0.1] res = minimize(myObjFun, x0, method='L-BFGS-B', boun

我试图最小化一个由三个变量组成的函数,非线性的,非常大和讨厌的。它在Matlab中工作得很好,但我正在尝试转换到python(作为一种学习体验和更多的自由)。无论如何,它确实适用于最小化函数“Nelder Mead”,但它给了我一个没有意义的输出,所以我尝试给变量添加边界

代码如下:

bnds = ((0, 1), (0, 1), (0, 1))
x0 = [0.004, 0.1, 0.1]
res = minimize(myObjFun, x0, method='L-BFGS-B', bounds=bnds)
print(res)
Matlab的输出给了我三个最小化函数的值:[0.2182,0.0684,0.0048],而python中的Nelder Mead给出了完全不同的结果,超出了我想要的范围(应该在0和1之间)

以下是错误:

File "****/fixedpoints.py", line 45, in <module>
    res = minimize(myObjFun, x0, method='L-BFGS-B', bounds=bnds)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/optimize/_minimize.py", line 380, in minimize
callback=callback, **options)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/optimize/lbfgsb.py", line 304, in _minimize_lbfgsb
isave, dsave)
TypeError: _lbfgsb.setulb() 6th argument (f) can't be converted to double
文件“***/fixedpoints.py”,第45行,在
res=最小化(myObjFun,x0,方法='L-BFGS-B',边界=bnds)
文件“/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/optimize/_-minimize.py”,最小化中第380行
回调=回调,**选项)
文件“/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/optimize/lbfgsb.py”,第304行,在_-lbfgsb中
(isave,dsave)
TypeError:_lbfgsb.setulb()第6个参数(f)无法转换为双精度

除非您为我们提供
myObjFun
或类似的函数(基于更简单或伪造的数据),该函数在优化过程中具有类似的行为,否则我们无法进行调试。更具体地说,您的代码将在行为良好的myObjFun上工作;e、 g

>>> import scipy.optimize
>>> def myObjFun(x):
        return (x[0]-.2182)**4 + (x[1]-.0684)**2 + 5*(x[2]-.0048)**2 + 3.2
>>> print scipy.optimize.minimize(myObjFun, [0.004,0.1,0.1], method='L-BFGS-B', bounds=((0,1),(0,1),(0,1)))
  status: 0
 success: True
    nfev: 18
     fun: 3.200000001787815
       x: array([ 0.21213686,  0.06837957,  0.00480194])
 message: 'CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH'
     jac: array([ -8.88178420e-07,  -4.08562073e-05,   1.94511074e-05])
     nit: 17
因此,在搜索空间的某个点上计算的目标函数的值似乎由于某种原因(这似乎是一个类型错误)在不经意间无法浮动

我可以得到一个类似的错误(但实际上是一个
溢出错误
),比如说这个目标函数,它通常表现良好,但每当
x[1]<0.0685
(应该在找到最小值之前发生):

>>def myObjFun(x):
如果x[1]>0.0684,则返回(x[0]-.2182)**4+(x[1]-.0684)**2+5*(x[2]-.0048)**2+3.2,否则返回10**999
....: 
>>>打印scipy.optimize.minimize(myObjFun[0.004,0.1,0.1],method='L-BFGS-B',bounds=((0,1)、(0,1)、(0,1)))
---------------------------------------------------------------------------
溢出错误回溯(上次最近调用)
在()
---->1打印scipy.optimize.minimize(myObjFun[0.004,0.1,0.1],method='L-BFGS-B',bounds=((0,1)、(0,1)、(0,1)))
最小化中的lib/python2.7/site-packages/scipy/optimize//u minimize.pyc(fun、x0、args、method、jac、hess、hessp、bounds、constraints、tol、callback、options)
376 elif meth==“l-bfgs-b”:
377返回_最小化_lbfgsb(fun,x0,args,jac,bounds,
-->378回调=回调,**选项)
379 elif meth=='tnc':
380返回最小值(fun,x0,args,jac,bounds,callback=callback,
lib/python2.7/site-packages/scipy/optimize/lbfgsb.pyc in_minimize_lbfgsb(fun、x0、args、jac、bounds、disp、maxcor、ftol、gtol、eps、maxfun、maxiter、iprint、callback、**未知选项)
302 _lbfgsb.setulb(m,x,low,upper,nbd,nbd,f,g,factr,
303 pgtol、wa、iwa、task、iprint、csave、lsave、,
-->304(isave,dsave)
305 task_str=task.tostring()
306如果任务从(b'FG')开始:
溢出错误:_lbfgsb.setulb()第6个参数(f)无法转换为双精度

因此,我会仔细检查您的myObjFun,并在搜索域中的多个点手动评估它,查看返回值是否合理、类型是否正确,以及是否与matlab返回的值相匹配。

如果没有看到函数
myObjFun
,很难解释为什么
scipy
难以找到其最小值嗯,你能展示一下功能吗?
   f is a double precision variable.
 On first entry f is unspecified.
 On final exit f is the value of the function at x.
>>> def myObjFun(x):                                                                                       
        return (x[0]-.2182)**4 + (x[1]-.0684)**2 + 5*(x[2]-.0048)**2 + 3.2 if x[1] > 0.0684 else 10**999
   ....: 

>>> print scipy.optimize.minimize(myObjFun, [0.004,0.1,0.1], method='L-BFGS-B', bounds=((0,1),(0,1),(0,1)))
---------------------------------------------------------------------------
OverflowError                             Traceback (most recent call last)
<ipython-input-44-9204b704b51a> in <module>()
----> 1 print scipy.optimize.minimize(myObjFun, [0.004,0.1,0.1], method='L-BFGS-B', bounds=((0,1),(0,1),(0,1)))

lib/python2.7/site-packages/scipy/optimize/_minimize.pyc in minimize(fun, x0, args, method, jac, hess, hessp, bounds, constraints, tol, callback, options)
    376     elif meth == 'l-bfgs-b':
    377         return _minimize_lbfgsb(fun, x0, args, jac, bounds,
--> 378                                 callback=callback, **options)
    379     elif meth == 'tnc':
    380         return _minimize_tnc(fun, x0, args, jac, bounds, callback=callback,

lib/python2.7/site-packages/scipy/optimize/lbfgsb.pyc in _minimize_lbfgsb(fun, x0, args, jac, bounds, disp, maxcor, ftol, gtol, eps, maxfun, maxiter, iprint, callback, **unknown_options)
    302         _lbfgsb.setulb(m, x, low_bnd, upper_bnd, nbd, f, g, factr,
    303                        pgtol, wa, iwa, task, iprint, csave, lsave,
--> 304                        isave, dsave)
    305         task_str = task.tostring()
    306         if task_str.startswith(b'FG'):

OverflowError: _lbfgsb.setulb() 6th argument (f) can't be converted to double