为了账号安全,请及时绑定邮箱和手机立即绑定

重新格式化 SymPy 中的表达式片段以防止常数系数的分布

重新格式化 SymPy 中的表达式片段以防止常数系数的分布

慕尼黑5688855 2021-08-14 13:45:12
假设我定义了以下表达式: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()方法,因为它会搜索整个表达式,而且在某些情况下,您似乎希望对修改的不同部分非常具体。
查看完整描述

1 回答

?
饮歌长啸

TA贡献1951条经验 获得超3个赞

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


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


第二个问题,关于有针对性的替换,在这种笼统的情况下很难回答。必须通过表达式树递归,重建expr为expr.func(*args)where argsare expr.args,可能已修改。主要问题是您如何知道该实例25*x + 75是应该替换的实例。


查看完整回答
反对 回复 2021-08-14
  • 1 回答
  • 0 关注
  • 122 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信