SymPy自动处理表达式

4
我一直在使用SymPy将表达式转换为latex(然后由Matplotlib渲染)。例如:
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等等;这不是我想要的(不要问为什么!)。

也许你应该只是复制你的原始字符串... - phimuemue
我真的希望这个方程能够正确地呈现分数线、根号符号等。不过还是谢谢你! - Geddes
1
所以你只是想进行排版吗?在这种情况下,像SymPy这样的计算机代数系统可能不太合适...也许可以考虑使用某种LaTeX公式编辑器?如果这不是你想要的,请编辑你的问题以更具体地描述。 - Simon
3个回答

6
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评论的回复,这可能不完全符合您的要求。

我的目标是让学龄学生输入数学表达式,程序将呈现出来。所以,是的,这不完全是我需要的,但非常感谢您的帮助! - Geddes

1
实际上,当您调用 sympify(str) 时,它会尝试解析表达式并将其转换为默认类。在这种情况下,将调用 Add(2*x,2*x)(使用默认参数 evaluate=True),因此变成了 5*x。如果您想避免这种情况,您可以调用 Add(2*x,3*x,evaluate=False) 或者在 core->operation.py 中的 AssocOp 类的 init 方法中使用一些全局变量并进行检查。
我正在做这件事。
 try:
        import __builtin__
        evaluate_expr=__builtin__.evaluate_expr
    except AttributeError ,ex:
        pass 

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

**注意 - sympy对函数使用缓存,因此如果您两次调用相同的函数(例如:sympy(“2 * x + 3 * x”)),第一次使用全局变量evalute=True,第二次使用evaluate=False。由于缓存,您将获得相同的结果。 因此,您需要更新core-> expr类中的方法,例如addmul。如下所示:

def __add__(self, other):
        #simplifychange:
        evaluate_expr=self.get_evaluate()
        return Add(self, other,evaluate=evaluate_expr)

但我建议最好不要使用 evaluate=False。SymPy的行为会发生巨大变化,就像我在这个post中遇到的问题一样。


很高兴知道sympy依赖于自动处理来测试相等性!省时! - jeromej

-1

>>> import re

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

"Dummy('2')*x + Dummy('3')*x"

>>> eval(_)

2⋅x + 3⋅x

>>> latex(_)

'2 x + 3 x'


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接