この質問は前の質問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では関数呼び出しを渡す必要があります。)2つのライブラリの実装が異なるためですか? Iは、関数名を持つ関数呼び出しを置き換える場合は、上記の例では、例外が発生する。ソルバーがパラメータ(func(x), x)
を設ける場合
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関数に関する非常に基本的な知識がなくなっているようです...自分自身を見てください私がそれを正しければ答えて、私に知らせてください。 – Ryan
そうです。はい –