SymPy自动处理表达式

时间:2011-06-22 18:25:17

标签: python latex sympy tex

我一直在使用SymPy将表达式转换为乳胶(然后由Matplotlib渲染)。 e.g。

from sympy import latex, sympify
from sympy.abc import x

str = '2*x + 3*x'

TeX = latex(sympify(str))

问题是它会自动处理表达式,因此2 * x + 3 * x会自动变为5 * x等;这不是我想要的(不要问!)。

3 个答案:

答案 0 :(得分:5)

Sympy的Add类处理符号的添加。您可以提供关键字参数来停止自动收集术语。

from sympy import Add
from sympy.abc import x

eq = Add(2*x, 3*x, evaluate=False)

# this will print: 2*x + 3*x
print eq

根据您对phimuemue评论的回复,这可能不是您想要的。

答案 1 :(得分:1)

实际上当你调用sympify(str)时,它会尝试解析表达式并将它们转换为默认类。在这种情况下,Add(2*x,2*x)将被调用(默认参数evalaute = True),因此变为5*x。如果你想避免它,你必须调用Add(2*x,3*x,evaluate=False)或使用一些全局变量并检查core->中的AssocOp类的 init 方法。 operation.py

我正在做这个

 try:
        import __builtin__
        evaluate_expr=__builtin__.evaluate_expr
    except AttributeError ,ex:
        pass 

    if ((not options.pop('evaluate', True)) or (evaluate_expr==False)) :

**注意 - sympy使用缓存功能,所以如果你用你的gloabl变量sympy("2*x+3*x")调用相同的函数(比如说:evalute=True)两次。第一次调用evaluate=False第二次调用def __add__(self, other): #simplifychange: evaluate_expr=self.get_evaluate() return Add(self, other,evaluate=evaluate_expr) }。在这两种情况下,由于缓存你会得到相同的结果。 因此,您需要在core-> expr类中更新(添加 mul )等方法。类似下面的内容

{{1}}

但我会建议如果你不使用evaluate = False会更好。症状的行为将发生巨大变化。像我这样的问题post

答案 2 :(得分:-1)

  

>>>导入重新

     

>>> re.sub(“(^ | [\(\ [\ {\ + \ - \ * /,\:=])(\ - ?[0-9] * \。?[0-9] +)”, “\\ 1Dummy('\\ 2')”,'2 * x + 3 * x')

     

“假人('2')* x +假人('3')* x”

     

>>> EVAL(_)

     

2⋅x+3⋅x

     

>>>胶乳(_)

     

'2 x + 3 x'