如何将符号变量转换为可迭代变量?

时间:2017-08-04 05:01:38

标签: scipy minimize

我正在尝试使用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

如何将符号转换为可迭代或直接定义迭代?

1 个答案:

答案 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}开始变化xy,以寻求最小化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.])