我一直在使用 SymPy 将表达式转换为乳胶(然后由 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 等等;这不是我想要的(不要问!)。
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 评论的回复,这可能不是您想要的。
实际上,当您调用 sympify(str) 时,它会尝试解析表达式并将它们转换为默认类。在这种情况下Add(2*x,2*x)
将被调用(使用默认参数 evalaute=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")
使用你的 gloabl 变量evalute=True
,第二次使用evaluate=False
. 在这两种情况下,由于缓存,您都会得到相同的结果。因此,您需要更新core->expr 类中的( add,mul )等方法。像下面的东西
def __add__(self, other):
#simplifychange:
evaluate_expr=self.get_evaluate()
return Add(self, other,evaluate=evaluate_expr)
但我会建议如果你不使用评估=假会更好。sympy 的行为将发生巨大变化。我在这篇文章中遇到的问题
>>> 重新导入
>>> re.sub("(^|[\(\[\{\+\-\*/ ,\:=])(\-?[0-9]*\.?[0-9]+ )", "\\1Dummy('\\2')", '2*x + 3*x')
“虚拟('2')*x + 虚拟('3')*x”
>>> 评估(_)
2⋅x + 3⋅x
>>> 乳胶(_)
'2 x + 3 x'