2017-03-28 3 views
1

この質問は前の質問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) 
+3

あなたは関数名を渡していません...関数を呼び出したので関数戻り値を渡しています –

+0

@ cricket_007関数に関する非常に基本的な知識がなくなっているようです...自分自身を見てください私がそれを正しければ答えて、私に知らせてください。 – Ryan

+0

そうです。はい –

答えて

0

(x ** 2 - 4, x)を提供することと等価である、の最初の部分は、発現され宣言されたシンボルxを含む。

ただし、パラメータリストが(func, x)の場合、関数定義内の変数vは未定義であり、2番目の引数であるxと一致しません。これにより、例外が発生します。

scipyの場合、関数定義の返された式は解決される1つの変数varを持ち、正しく動作することができます。

関連する問題