【问题标题】:how to stop sympy from simplifying an expression?如何阻止 sympy 简化表达式?
【发布时间】:2020-05-23 14:11:48
【问题描述】:

当我在 Sympy (v. 1.5.1) 中编写正态分布的概率密度函数时,如下所示:

pdf_normal = (1 / (sigma*sqrt(2*pi))) * exp(-(1/2) * ((x - mu)/sigma)**2)

基于这样的等式表达式(维基百科):

sympy“简化”了表达式,但使其更难阅读:

有什么办法可以防止这种情况发生吗?

(这个discussion 没有帮助,因为建议的答案根本没有触及表达式)

提前致谢!

【问题讨论】:

    标签: python sympy simplify


    【解决方案1】:

    您可以使用evaluate=False 来控制它,但它可能最终会在后续操作中被评估:

    In [11]: Pow(Mul(sigma, sqrt(2*pi, evaluate=False), evaluate=False), -1, evaluate=False)                                          
    Out[11]: 
        1    
    ─────────
        _____
    σ⋅╲╱ 2⋅π 
    

    【讨论】:

    • 谢谢,除了你提出的一点(后续操作中的评估),我数了 4 个数学符号 3 次 'evaluate=False'-为整个等式推出这个似乎不是一个好的主意。但是,如果一个人可以用一个括号来表示整个事情并用'evaluate=False'标记它会很棒
    【解决方案2】:

    符号欺骗对你有用吗?

    >>> r2pi = Symbol('\\sqrt{2 \\pi}')
    >>> (1 / (sigma*r2pi)) * exp(-(1/2) * ((x - mu)/sigma)**2)
    

    【讨论】:

    • 谢谢,但这会降低代码的可读性,而方程式的表示形式只会稍微更易读。如果我对等式的所有部分都这样做,恐怕代码会很不愉快。
    【解决方案3】:

    UnevaluatedExpr 类将防止表达式在后续操作中被重新计算。随着suggested here 的更改,我认为它会解决您的问题:

    >>> from sympy import S
    >>> from sympy.abc import *
    >>> from sympy import S
    >>> usqrt = lambda x: UnevaluatedExpr(sqrt(x, evaluate=False))
    >>> (1 / (sigma*usqrt(2*pi))) * exp(((x - mu)/sigma)**2/-2)
    exp(-(-mu + x)**2/(2*sigma**2))/(sigma*sqrt(2*pi))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      • 1970-01-01
      相关资源
      最近更新 更多