2014-01-12 13 views
6

私は文字列方程式(0に等しい)を解析し、アクセス可能な変数の辞書を使用して解くことができます。例えばSymPyを使用して一般的に解析して方程式を解く

s = '(x/z)-y' 
eq = parse(s) 
eq.solve({'x': 10, 'y': 5}) 
print(eq) 
>>> {'z': 2} 

は、今私はヶ月前にこのような何かをしたコードを書いていたが、私はちょうどそれを見つけることができません。しかし、私はSymPyとそのsympify関数を解決関数と共に使用したことを覚えています。私はこれらの関数に関するドキュメントをチェックしましたが、私が望むようにそれらを動作させる方法について私の頭を覆すことはできませんでした。

その他の質問: 変数を何とかしてラップすることができますか?私は単なる文字以上のものを使うことができますか? 例:代わりに '{MYVAR-42}' だけ 'X' 私が持っている可能性の

EDIT:

私は最終的に私が欲しかったものでしたいくつかのコードの書き込みに成功オーケー:

eq = sympify('(x/y)-z', locals={'x': 10, 'z': 5}) 
solution = solve(eq, dict=True) 
print(solution) 
>>> [{'z': 2}] 

をしかし、私の "余分な"質問は残っています。

+0

' 'MYVAR-42'' - ちょうど文字列を解析します。 – aIKid

+0

@alKidどうやって?角括弧を含む文字列でsympifyを使用すると、エラーが発生します(辞書などと思うので)。私はすべての{*}の正規表現を置き換えて文字で置き換えることができました。そして、解決が完了したら、私が置き換えたときに作成した辞書を使ってそれらを戻すことができました。 – fgblomqvist

答えて

5

あなたが発見したように、sympifyは、文字列をSymPy式に変換します。

あなたの他の質問に答えるために、Symbolの名前は何でもかまいませんが、sympifyは、有効なPython識別子をSymbol名にしか解析しません。しかし、できること

>>> Symbol('{myvar-42}') + 1 
{myvar-42} + 1 

有効なPythonのidenfifiersは単一の文字である必要はないことに注意してください。数字で始まらない文字、数字、およびアンダースコアの組み合わせ(例:x_2またはabc123)を使用できます。それでも最後に

>>> expr = sympify('x + 1') 
>>> expr.subs(Symbol('x'), Symbol('{myvar-42}') 
{myvar-42} + 1 

のように、文字列解析を行うが、シンボル名などの非有効なPython識別子、おそらくクリーンな方法は、通常の名前を使用し、他のもののためにそれらを置換するだろうしたいする必要がある場合は

、あなたが行ったように文字と記号を置き換えるために、あなたは、sympifyするlocals引数を使用することができ、あるいは、あなたが後でそれらを交換したい場合は、使用潜水艦:

>>> x, y, z = symbols('x y z') 
>>> expr = sympify('x/z - y') 
>>> expr.subs({x: 10, y: 5}) 
10/z - 5 
+0

これはまさに私が探していたものでした、ありがとう! – fgblomqvist

+0

これはauto_symbolとどのように機能しますか? – denfromufa

+0

私はそれがNameErrorsをキャッチし、シンボルとして定義された未定義の名前で式を再実行すると信じています。 – asmeurer

関連する問題