【问题标题】:Reformat pieces of expressions in SymPy to prevent distribution of constant coefficient重新格式化 SymPy 中的表达式以防止常数系数的分布
【发布时间】:2018-11-10 21:07:22
【问题描述】:

假设我定义了以下表达式:

poly1 = 6/(25*(x + 3)) + 1/(5*(x + 3)**2)

打印出来的:

6/(25*x + 75) + 1/(5*(x + 3)**2)

关于这个表达我有两个问题。首先,有没有办法让表达式保持我输入的格式?特别是,为了将第一个术语的分母保留为25*(x + 3),我可以做些什么吗?

其次,如果我有打印形式的表达式,拆分表达式,重新格式化第一项的分母,然后将其重新组合在一起的最佳方法是什么?理想情况下,我可以使用一系列args 调用来挖掘表达式以获取第一项的分母,然后使用 factor 函数对其进行适当的分解,如poly1.args[0].args[1].args[0].factor()。问题是,由于组成表达式的元组是不可变的,我不能只用上面计算的表达式替换 poly1 的一部分。有没有比从头开始重建整个表达式更好的方法来替换因式多项式?

注意:我宁愿不使用 subs() 方法,因为它会搜索整个表达式,而且在某些情况下,您可能希望非常具体地了解您修改的不同部分。

【问题讨论】:

    标签: python sympy


    【解决方案1】:

    常量的自动分配是touchy subject。有一个选项可以禁用它,如下所示:

    from sympy.core.evaluate import distribute
    with distribute(False):
        poly1 = 6/(25*(x+3)) + 1/(5*(x + 3)**2)
        print(poly1)  #  6/(25*(x + 3)) + 1/(5*(x + 3)**2)
    

    或者您可以将 25 包裹在 UnevaluatedExpr 中以防止其与其他术语交互。

    poly1 = 6/(UnevaluatedExpr(25)*(x+3)) + 1/(5*(x + 3)**2)
    print(poly1)  #  6*25**(-1)/(x + 3) + 1/(5*(x + 3)**2)
    

    或者在分母中使用未评估的产品(Mul):

    poly1 = 6/Mul(25, x+3, evaluate=False) + 1/(5*(x + 3)**2)
    print(poly1)  #  6/(25*(x + 3)) + 1/(5*(x + 3)**2)
    

    或者将分母包含在 factor_terms 中——factor 的一种更温和的形式,它可以提取系数而不会过多地干扰表达式。

    poly1 = 6/factor_terms(25*(x+3)) + 1/(5*(x + 3)**2)
    print(poly1)  #  6/(25*(x + 3)) + 1/(5*(x + 3)**2)
    

    或者通过引入一个看起来像数字的符号来作弊:

    c25 = symbols('25')
    poly1 = 6/(c25*(x+3)) + 1/(5*(x + 3)**2)
    print(poly1)  #  1/(5*(x + 3)**2) + 6/(25*(x + 3))
    

    推荐阅读:Prevent expression evaluation

    第二个问题,关于有针对性的替换,很难笼统地回答。必须recurse through the expression tree,将expr 重建为expr.func(*args),其中argsexpr.args,可能已修改。主要问题是您如何知道25*x + 75this 实例应该被替换。

    【讨论】:

    • 关于它的覆盖!很好的方法总结。至于第二个问题,看一下simplified中不常提及的遍历工具。
    • @smichr,traversaltools 的文档似乎很少,所以澄清一下:use()将某些函数应用于表达式树上给定级别的每个参数?有没有办法指定图形的一个特定节点(即表达式的一个参数)来应用某个函数? @Welcome to Stack Overflow,我正在寻找类似 Mathematica 中的 ReplacePart 函数的东西——它替换表达式图上的给定节点,而不是通过图递归来搜索与特定形式匹配的东西.
    • 对不起...我的意思是epathtools 在同一个文件夹中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    • 2016-07-06
    • 1970-01-01
    相关资源
    最近更新 更多