Scipy Optimize-缺少2个必需的位置参数



我在尝试最小化非常直接的代码时遇到了这个问题。

from scipy.optimize import fsolve
from scipy.optimize import minimize
design_var_0 = (0.1, 500, 0.5)
def height_equation(h, D, n, m_batt):
return return h - D*n*m_batt
def height(design_var):
return fsolve(height_equation, x0=10000, args=design_var)[0]
def respro_height(design_var):
return 1/height(design_var)
minimize(respro_height, design_var_0)
File "solver.py", line 36, in height
return fsolve(height_equation, x0=10000, args=design_var)[0]
File "C:UserskjAnaconda3libsite-packagesscipyoptimizeminpack.py", line 160, in fsolve
res = _root_hybr(func, x0, args, jac=fprime, **options)
File "C:UserskjAnaconda3libsite-packagesscipyoptimizeminpack.py", line 226, in _root_hybr
shape, dtype = _check_func('fsolve', 'func', func, x0, args, n, (n,))
File "C:UserskjAnaconda3libsite-packagesscipyoptimizeminpack.py", line 24, in _check_func
res = atleast_1d(thefunc(*((x0[:numinputs],) + args)))
TypeError: height_equation() missing 2 required positional arguments: 'n' and 'm_batt'

因此,fsolve的内部优化循环似乎给了我这个错误。但是,如果我只是用元组调用respro_height,我会得到预期的浮点答案。

>>> respro_height(design_var_0)
0.0012771435682421253

有人能告诉我,为什么我会出现这个错误,以及如何修复它吗?

请注意,函数height_equation指的是一个解析函数,该函数的形式为lambert-W,不能直接求解高度。这就是为什么我使用fsolve来获得高度

当通过minimize调用时,height()中的deisgn_var参数将作为数组而不是元组传递。我对最小化的内部工作原理不够熟悉,无法理解原因。但是下面的小修改,明确地将参数转换为元组,应该会修复
def height(design_var):
return fsolve(height_equation, x0=10000, args=tuple(design_var))[0]

输出

fun: 4.363615312479626e-05
hess_inv: array([[6.05302726e+04, 6.37807548e+01, 5.21903776e+04],
[6.37807548e+01, 1.06720689e+00, 5.49938958e+01],
[5.21903776e+04, 5.49938958e+01, 4.50012847e+04]])
jac: array([-6.05549531e-06, -8.72714736e-08, -6.86066005e-06])
message: 'Optimization terminated successfully.'
nfev: 64
nit: 14
njev: 16
status: 0
success: True
x: array([  7.20604199, 500.00712565,   6.36034335])

最新更新