7

私はSympysympify関数を使用して 2 つの式を単純化し、それらを比較して等しいかどうかを調べています。

例えば:

expr1 = sympify("(2 * x) + (x + 10)")
expr2 = sympify("(x + 10) + (x * 2)")

if expr1 == expr2:
   print "Congrats those are essentially the same!"

ただし、フォーム2xをx*2に並置して使用すると、解析例外が発生します。

expr1 = sympify("2x + (x + 10)")

2xフォームを理解するために sympy を取得する方法はありますか?

そうでない場合、このフォームを許可する他のライブラリはありますか?

4

2 に答える 2

3

まあ、sympy lexer (またはパーサー/文法/何でも) を変更できます。

次のようなものを使用して、入力文字列を変換する関数でラップすることもできます。

>>> import re
>>> expr = '2x + 1'
>>> re.sub(r"(\d+)(\w+)", r"(\1 * \2)", expr)
'(2 * x) + 1'

しかし、そもそもなぜこの表記がないのかを自問してみてください。

たとえば、これらはすべて有効な python であり、sympy をいじってから長い時間が経ちましたが、sympy の乗算以外にも何かを意味していると思います。

0x32  # hex for 50
5e-3  # 0.005
2j    # 2 * sqrt(-1) (so that one *is* multiplication, but by 1j, not j!)
15L   # 15 (L used to represent long integers in python)

とはx2どういう意味ですか? という名前の変数ですか、x2それとも(x * 2). このケースはあいまいなので、上記の正規表現から意図的に除外しました。

于 2011-02-23T01:06:42.837 に答える
2

SymPy の開発バージョンには、そのような式を解析する機能があります。http://docs.sympy.org/dev/modules/parsing#sympy.parsing.sympy_parser.implicit_multiplication_applicationを参照してください。Python 構文の非常に基本的な拡張 (つまり、数値リテラルと未定義の名前のラップ、および への変換) のみを行うためsympify、 ではまだデフォルトで有効になっていません。しかし、それを使用する方法を示す例があります。sympify^**

これは現在、暗黙的な関数の適用にも適用されることに注意してください。おそらく、2 つの機能を分割する必要があります。

編集: これらの機能は、プル リクエストで分割されています。

于 2013-03-03T22:02:19.617 に答える