为啥 sympy 在整合部分功率时给出不同/错误的答案?

Posted

技术标签:

【中文标题】为啥 sympy 在整合部分功率时给出不同/错误的答案?【英文标题】:Why sympy gives different/wrong answer when integrate fraction of power?为什么 sympy 在整合部分功率时给出不同/错误的答案? 【发布时间】:2021-12-19 23:32:02 【问题描述】:

我正在运行一个定积分,但 sympy 给了我一个不同的答案。 我不知道出了什么问题? 任何人都可以帮忙吗?谢谢

The equation integrated by Wolfram, the result is as expected 1.097

import sympy as sp
y=sp.Symbol('y')
fy=(y-2.4)**2*sp.sqrt(y)*0.1875
print(sp.integrate(fy,(y,0,4)))

这给了我 0.485255751108899

【问题讨论】:

对于它的价值,scipy.integrate.quad 同意 Wolfram。 @TimRoberts, quad(f,2.4,4) 是 0.485,sp.integrate 也是如此。出于某种原因,sympy 错过了第一个驼峰,在 (0,2.4) 范围内返回 0。更具体地说,sympy 首先上升,(0, .5) 错误。 integrate(fy,(y,0.001,4)) 是 1.0971。出于某种原因,从 0 开始集成会给它带来问题。也许是因为绘图线在 0 处是垂直的。数值积分不会受到影响。 @蒂姆罗伯茨 【参考方案1】:

这看起来像是一个与浮点数有关的错误,在集成中可能会出现问题:

In [15]: from sympy import *

In [16]: y = symbols('y')

In [17]: fy=(y-2.4)**2*sp.sqrt(y)*0.1875

In [18]: fy
Out[18]: 
                                 2
1.08⋅√y⋅(0.416666666666667⋅y - 1) 

In [19]: integ = Integral(fy, (y, 0, 4))

In [20]: integ
Out[20]: 
4                                      
⌠                                      
⎮                                  2   
⎮ 1.08⋅√y⋅(0.416666666666667⋅y - 1)  dy
⌡                                      
0   

In [21]: integ.doit() # symbolic integration with floats
Out[21]: 0.485255751108899

In [22]: integ.evalf() # numeric integration
Out[22]: 1.09714285714286

In [23]: integ_rational = Integral(nsimplify(fy), (y, 0, 4))

In [24]: integ_rational # same integral with Rational instead of Float
Out[24]: 
4                    
⌠                    
⎮                2   
⎮       ⎛5⋅y    ⎞    
⎮ 27⋅√y⋅⎜─── - 1⎟    
⎮       ⎝ 12    ⎠    
⎮ ──────────────── dy
⎮        25          
⌡                    
0                    

In [25]: integ_rational.doit() # symbolic integration with rationals
Out[25]: 
192
───
175

In [26]: _.n() # numerically evaluate the last result
Out[26]: 1.09714285714286

首先不要使用带有 sympy 的浮点数,除非你有充分的理由,例如使用Rational('0.1')S(1)/10 等而不是0.1nsimplify 函数可用于将 float 转换为 Rational(它会尝试猜测您的真正意思是什么)。

其次,这是一个错误,因此应将其报告给 github 而不是 SO: https://github.com/sympy/sympy/issues

【讨论】:

您好,奥斯卡,感谢您的回复。我会向github报告。 github.com/sympy/sympy/issues/22435 使用nsimplify(2.4) 足以让这个工作正常。

以上是关于为啥 sympy 在整合部分功率时给出不同/错误的答案?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的交叉验证错误分类错误率与测试数据集成功率相矛盾

为啥我的进程只消耗 5% 的处理器功率?

为啥我们需要整合不同版本的包?

将 UTC 日期和时间转换为 UNIX 时间会给出错误的(时区不同)值。为啥?

使用 buildozer 打包 apk 时出现 mpmath 和 sympy 错误

使用sympy进行表达式化简