调用定义为的函数optimization((时
def optimization():
bound1 = {
'type': 'eq',
'fun': bound1Expr}
bound2 = {
'type': 'eq',
'fun': bound2Expr}
optimizeResult = minimize(
toOptimize,
(0,0,0),
method = "SLSQP",
options = {'disp': False},
constraints = (
bound1,
bound2
)
)
return optimizeResult.x
def bound1Expr(x,y,z):
return x + y + z -1
def bound2Expr(x,y,z):
return x^2 + y^2 + z^2 - 10
def toOptimize(x,y,z):
return (x^2 + y^2 + z^2)**0.5
我得到错误
File "C:ProgramDataAnaconda3libsite-packagesscipyoptimizeslsqp.py", line 313, in <listcomp>
for c in cons['eq']]))
TypeError: bound1Expr() missing 2 required positional arguments: 'y' and 'z'
我查看了所有能找到的错误源,但仍然不知道该怎么办。错误通常与Self变量有关,但我在这里不处理类。即使Self被隐式添加到lambda函数中,如果我不使用它,我也不知道为什么会出现问题。
您的代码被修改为接受一个参数,而不是3个。我还将^
电源更改为**
电源。
In [105]: def optimization():
...: bound1 = {
...: 'type': 'eq',
...: 'fun': bound1Expr}
...: bound2 = {
...: 'type': 'eq',
...: 'fun': bound2Expr}
...: optimizeResult = minimize(
...: toOptimize,
...: (0,0,0),
...: method = "SLSQP",
...: options = {'disp': False},
...: constraints = (
...: bound1,
...: bound2
...: )
...: )
...: return optimizeResult.x
...:
...: def bound1Expr(xyz):
...: x,y,z=xyz
...: return x + y + z -1
...:
...: def bound2Expr(xyz):
...: x,y,z=xyz
...: return x**2 + y**2 + z**2 - 10
...:
...: def toOptimize(*args):
...: print('args',args)
...: x,y,z=args[0]
...: return (x**2 + y**2 + z**2)**0.5
...:
In [106]: optimization()
args (array([0., 0., 0.]),)
args (array([1.49011612e-08, 0.00000000e+00, 0.00000000e+00]),)
args (array([0.00000000e+00, 1.49011612e-08, 0.00000000e+00]),)
args (array([0.00000000e+00, 0.00000000e+00, 1.49011612e-08]),)
Out[106]: array([0., 0., 0.])
如toOptimize
所示,minimize
传递一个值,一个数组作为参数(如果您提供args
参数,它会传递更多(。该数组有3个元素,对应于初始值数组(元组(。
在使用这些scipy
函数时,正确地定义函数通常是一个问题。用户忽略或不理解的文档定义
fun : callable
The objective function to be minimized.
``fun(x, *args) -> float``
where ``x`` is an 1-D array with shape (n,) and ``args``
is a tuple of the fixed parameters needed to completely
我的第一条评论是对你最后一段关于";来源";。看起来您在web上搜索了有关缺少或必需的位置参数的错误。这是一个相当普遍的问题。是的,当人们没有考虑类方法的self
参数时,经常会发生这种情况。但这里的情况并非如此,因此网络搜索效率低下。
当(新(用户应该首先查看文档时,他们往往会转向网络(或SO(搜索。有一个地方可以进行网络搜索(例如,独特的错误或非常新的错误发布(,但对于像这样的基本使用问题,你应该首先确保你了解如何正确使用该功能。