Sympy不会评估2x但会评估x * 2

时间:2011-02-23 00:40:24

标签: python math sympy

我正在使用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 表单吗?

如果没有,是否有其他库可以使用此表单?

2 个答案:

答案 0 :(得分:3)

好吧,你可以修改sympy词法分析器(或解析器/语法/其他)。

你也可以用一个为你改变输入字符串的函数来包装它,使用类似这样的东西:

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

但问问自己为什么这个符号不是从那里开始的。

例如,所有这些都是有效的python,虽然已经很长一段时间了,因为我搞惹了同情,但我敢打赌它们除了表示同意之外还有其他意义:

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)。我故意将这个案例从上面的正则表达式中删除,因为它太模糊了。

答案 1 :(得分:1)

SymPy的开发版本能够解析这些表达式。见http://docs.sympy.org/dev/modules/parsing#sympy.parsing.sympy_parser.implicit_multiplication_application。它在sympify中默认仍未启用,因为sympify仅对Python语法进行了非常基本的扩展(即包装数字文字和未定义的名称,并将^转换为{{ 1}})。但是有一个例子说明了如何使用它。

请注意,这也适用于隐式函数应用程序。可能这两个功能应该分开。

编辑:这些功能正在pull request中分开。