我正在尝试使用scipy.optimize最小化函数。这是我的程序,最后一行是错误消息。
import sympy as s
from scipy.optimize import minimize
x,y,z=s.symbols('x y z')
f= lambda z: x**2-y**2
bnds = ((70,None),(4,6))
res = minimize(lambda z: fun(*x),(70,4), bounds=bnds)
<lambda>() argument after * must be an iterable, not Symbol
如何将符号转换为可迭代或直接定义迭代?
答案 0 :(得分:1)
在Python中,使用f(*x)
调用函数意味着f(x[0], x[1], ...)
。那就是它期望x
到一个元组(或其他可迭代的),并且该函数应该具有类似
def f(*args):
<use args tuple>
我不太确定您要对sympy
代码做什么,或者为什么要使用它而不是直接在Python / numpy中定义函数。
类似的功能:
def f(z):
x,y = z # expand it to 2 variables
return x**2 - y**2
应该使用以下内容进行最小化调用:
minimize(f, (10,3))
这将从{10}开始变化x
和y
,以寻求最小化f
值。
In [20]: minimize(f, (70,4), bounds=((70,None),(4,6)))
Out[20]:
fun: 4864.0
hess_inv: <2x2 LbfgsInvHessProduct with dtype=float64>
jac: array([ 139.99988369, -11.99996404])
message: b'CONVERGENCE: NORM_OF_PROJECTED_GRADIENT_<=_PGTOL'
nfev: 9
nit: 1
status: 0
success: True
x: array([ 70., 6.])