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

mwkjh3gx  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(103)

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

如何将symbol转换为iterable或直接定义iterable?

rbl8hiat

rbl8hiat1#

在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,3)开始改变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.])

相关问题