【问题标题】:Different results when passing function / method to equation solver将函数/方法传递给方程求解器时的不同结果
【发布时间】:2017-08-21 14:49:22
【问题描述】:

这个问题是上一个问题pass class method to fsolve的后续问题。

@jim 在关于函数对象名称和函数调用之间差异的问题中的回答澄清了我的困惑并解决了问题。但是,当我在 sympy 中尝试类似的事情时:

from sympy.solvers import solve
from sympy import Symbol

class Demo():
    def __init__(self, var):
        self.i = var
    def func(self):
        return self.i ** 2 - 4

x = Symbol('x')
def func(v):
    return v ** 2 - 4
new = Demo(x)
solve(new.func(), x) # This works fine, even as a function call
solve(func(x), x) # This works fine, even as a function call

为什么会有不同的结果? (在 scipy 中我需要将函数名传递给求解器,而在 sympy 中我需要传递函数调用。)是因为这两个库的实现不同吗?在上面的例子中,如果我用函数名替换函数调用,就会引发异常:

File "<ipython-input-26-3554c1f86646>", line 13, in <module>
solve(new.func, x)

File "Anaconda3\lib\site-packages\sympy\solvers\solvers.py", line 817, in solve
f, symbols = (_sympified_list(w) for w in [f, symbols])

File "Anaconda3\lib\site-packages\sympy\solvers\solvers.py", line 817, in <genexpr>
f, symbols = (_sympified_list(w) for w in [f, symbols])

File "Anaconda3\lib\site-packages\sympy\solvers\solvers.py", line 808, in _sympified_list
return list(map(sympify, w if iterable(w) else [w]))

File "Anaconda3\lib\site-packages\sympy\core\sympify.py", line 324, in sympify
raise SympifyError('could not parse %r' % a, exc)

SympifyError: Sympify of expression 'could not parse '<bound method Demo.func of <__main__.Demo object at 0x0000018A37DA6518>>'' failed, because of exception being raised:
SyntaxError: invalid syntax (<string>, line 1)

【问题讨论】:

  • 你没有传递函数名...你传递函数返回值是因为你调用了函数
  • @cricket_007 似乎我错过了关于函数的非常基本的知识......请查看我自己的答案,如果我做对了,请告诉我。
  • 看起来不错。是的

标签: python python-3.x scipy sympy


【解决方案1】:

当求解器提供参数(func(x), x)时,相当于提供(x ** 2 - 4, x),其中第一部分是一个包含声明符号x的表达式。

但是,当参数列表为(func, x) 时,函数定义中的变量v 未定义,并且与作为第二个参数提供的变量x 不匹配。这会引发异常。

在scipy的情况下,函数定义的返回表达式有一个变量var需要求解,因此可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    相关资源
    最近更新 更多