【问题标题】:SymPy automatically processes expressionsSymPy 自动处理表达式
【发布时间】:2011-06-22 18:25:16
【问题描述】:

我一直在使用 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 这样的 CAS 可能不合适......也许some sort of LaTeX equation editor?如果这不是您想要的,您可以将您的问题编辑得更具体吗?

标签: python latex sympy tex


【解决方案1】:

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 评论的回复,这可能不是您想要的。

【讨论】:

  • 我的目标是学龄学生可以输入程序将呈现的数学表达式。所以,是的,这不是我所需要的,但非常感谢您的帮助!
【解决方案2】:

实际上,当您调用 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)

但我会建议,如果您不使用evaluate=False 会更好。 sympy 的行为将发生巨大变化。像我在post 中遇到的问题

【讨论】:

  • 很高兴知道 sympy 依赖于自动处理来测试相等性!节省时间!
【解决方案3】:

>>> 重新导入

>>> 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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多