【问题标题】:SymPy - Treating numbers as symbolsSymPy - 将数字视为符号
【发布时间】:2019-05-01 18:49:34
【问题描述】:

如何在 SymPy 中将数字视为符号?

例如,如果我使用符号执行分解,我会得到:

from sympy import factor
factor('a*c*d + a*c*e + a*c*f + b*c*d + b*c*e + b*c*f')
c*(a + b)*(d + e + f)

当我在表达式中使用数字时,我想要同样的行为。 而不是

from sympy import factor
factor('2006*c*d + 2006*c*e + 2006*c*f + 2007*c*d + 2007*c*e + 2007*c*f')
4013*c*(d + e + f)

我想得到

from sympy import factor
factor('2006*c*d + 2006*c*e + 2006*c*f + 2007*c*d + 2007*c*e + 2007*c*f')
c*(2006 + 2007)*(d + e + f)

【问题讨论】:

    标签: python numbers sympy symbols factorization


    【解决方案1】:

    拯救符号诡计:用具有由数字给出的名称的符号替换您的数字。在您的情况下,您不必注意否定版本,因此以下内容很简单:

    >>> s = '2006*c*d + 2006*c*e + 2006*c*f + 2007*c*d + 2007*c*e + 2007*c*f'
    >>> eq = S(s, evaluate=False); eq
    2006*c*d + 2007*c*d + 2006*c*e + 2007*c*e + 2006*c*f + 2007*c*f
    >>> reps = dict([(i,Symbol(str(i))) for i in _.atoms(Integer)]); reps
    {2006: 2006, 2007: 2007}
    >>> factor(eq.subs(reps))
    c*(2006 + 2007)*(d + e + f)
    

    注意:evaluate=False 用于防止相似词组合成4013*c*d + 4013*c*e + 4013*c*f

    【讨论】:

      【解决方案2】:

      用唯一的符号替换每个常量。 分解结果表达式。 用常量替换唯一符号。

      对于您给定的情况,如下所示:

      simple = factor('const2006*c*d + const2006*c*e + const2006*c*f + const2007*c*d + const2007*c*e + const2007*c*f')
      simple.replace("const", '')
      print(simple)
      

      这应该会给你想要的输出。您可以使用简单的正则表达式或简单的解析器来识别表达式中的数字标记——其中任何一个都在许多其他位置进行了介绍。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-11
        • 1970-01-01
        • 2013-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多