为什么 sympy 在积分功率分数时给出不同/错误的答案?

问题描述 投票:0回答:1

我正在运行定积分,但 sympy 给了我不同的答案。 我不知道出了什么问题。

对方程进行Wolfram积分,结果如预期的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

python sympy calculus symbolic-integration
1个回答
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.1
nsimplify
函数可用于将 float 转换为有理数(它试图猜测您真正的意思是什么有理数)。

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

© www.soinside.com 2019 - 2024. All rights reserved.