微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当 `powsimp` 和 `collect` 都什么都不做时,`simplify` 应用什么转换?

如何解决当 `powsimp` 和 `collect` 都什么都不做时,`simplify` 应用什么转换?

我有以下表达式,并希望按变量 e 的幂对其进行分组:

from sympy import symbols

e = symbols('e')
expr = (
    0.363635891123757*e
    + 1.27444227529689*(0.006290933064*e + 0.526290933064)*(0.12408152*e + 0.12408152)
    + 2.76494336639746*(0.0483917928*e + 1.0483917928)*(0.12408152*e + 0.12408152)
    + 1.27444227529689*(0.12408152*e + 0.12408152)*(
        0.012581866128*e
        + 0.39*(0.006290933064*e + 0.526290933064)*(0.12408152*e + 0.12408152)
        + 0.922581866128
    )
    + 2.76494336639746*(0.12408152*e + 0.12408152)*(
        0.0967835856*e
        + 0.39*(0.0483917928*e + 1.0483917928)*(0.12408152*e + 0.12408152)
        + 1.0967835856
    )
    + 1.63807816642065
)

从它们的描述来看,powsimpcollect 都应该可以工作,但是它们返回未修改的表达式。当我应用 simplify 时,表达式会按预期简化。所以我想知道在调用 simplify 期间应用了哪些其他类型的转换?

from sympy.simplify import simplify,powsimp,collect

print(f'{powsimp(expr) = }')
print(f'{collect(expr,e) = }')
print(f'{simplify(expr) = }')

这会产生以下输出

powsimp(expr) = 0.363635891123757*e + (0.0080174310478246*e + 0.670727414202207)*(0.12408152*e + 0.12408152) + (0.12408152*e + 0.12408152)*(0.13380056649044*e + 2.8987439328879) + (0.158134734671097*e + 0.158134734671097)*(0.012581866128*e + (0.00245346389496*e + 0.20525346389496)*(0.12408152*e + 0.12408152) + 0.922581866128) + (0.343078375616514*e + 0.343078375616514)*(0.0967835856*e + (0.018872799192*e + 0.408872799192)*(0.12408152*e + 0.12408152) + 1.0967835856) + 1.63807816642065
collect(expr,e) = 0.363635891123757*e + (0.0080174310478246*e + 0.670727414202207)*(0.12408152*e + 0.12408152) + (0.12408152*e + 0.12408152)*(0.13380056649044*e + 2.8987439328879) + (0.158134734671097*e + 0.158134734671097)*(0.012581866128*e + (0.00245346389496*e + 0.20525346389496)*(0.12408152*e + 0.12408152) + 0.922581866128) + (0.343078375616514*e + 0.343078375616514)*(0.0967835856*e + (0.018872799192*e + 0.408872799192)*(0.12408152*e + 0.12408152) + 1.0967835856) + 1.63807816642065
simplify(expr) = 0.000851550024540092*e**3 + 0.0759270659579648*e**2 + 1.42522479477876*e + 2.62459155414223

P.S.:对于我的用例,这个表达式是一个更大的表达式的一部分,我无法通过 simplify 进行转换,因为我得到了描述为 here错误

$ conda list | grep sympy
sympy                     1.8              py39hf3d152e_0    conda-forge

解决方法

通常你需要在 collect 之前使用 expand 虽然在这种情况下 expand 就足够了:

In [7]: expr.expand()
Out[7]: 
                      3                       2                                        
0.000851550024540092⋅e  + 0.0759270659579648⋅e  + 1.42522479477876⋅e + 2.62459155414223

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?