为什么 scipy.integrate.quad return 0 而不是积分的正确值?
Why does scipy.integrate.quad return 0 instead of the correct value of the integral?
我有一个代码将 scipy.integrate.quad 包用作过程的一部分。这应该会产生下图中红线之后的值(蓝色方块)。一些蓝色方块不遵循趋势,这只能是 scipy.integrate.quad 过程中的错误导数。有谁知道为什么 quad 包可能只对某些响应失败?可能与浮点运算或其他一些潜在问题有关?
注意:我以前在其他函数中见过这个问题,我确定错误的来源是 quad 包,而不是我的代码的其余部分。
quad
返回接近 0 的值的一个可能原因是函数相对于积分区间的大小明显局部化,而算法只是错过了它。一个例子:
from scipy.integrate import quad
import numpy as np
np.around([quad(lambda x: np.exp(-x**2), -100, 100*n)[0] for n in range(1, 10)], 3)
returns [1.772, 1.772, 1.772, 0., 0., 1.772, 0., 1.772, 0.])
其中零不正确。这里高斯在 0 附近得到支持,当积分区间为 [-100, 300] 或类似区间时,quad
永远不会在 0 附近对其值进行采样。(对于其他一些区间,它偶然会这样做。)
补救方法:使用参数points
来表示函数所在的位置,大概。随着
quad(lambda x: np.exp(-x**2), -100, 100*n, points=[-10, 10])
上面的代码returns 1.772 for every n.
我有一个代码将 scipy.integrate.quad 包用作过程的一部分。这应该会产生下图中红线之后的值(蓝色方块)。一些蓝色方块不遵循趋势,这只能是 scipy.integrate.quad 过程中的错误导数。有谁知道为什么 quad 包可能只对某些响应失败?可能与浮点运算或其他一些潜在问题有关?
注意:我以前在其他函数中见过这个问题,我确定错误的来源是 quad 包,而不是我的代码的其余部分。
quad
返回接近 0 的值的一个可能原因是函数相对于积分区间的大小明显局部化,而算法只是错过了它。一个例子:
from scipy.integrate import quad
import numpy as np
np.around([quad(lambda x: np.exp(-x**2), -100, 100*n)[0] for n in range(1, 10)], 3)
returns [1.772, 1.772, 1.772, 0., 0., 1.772, 0., 1.772, 0.])
其中零不正确。这里高斯在 0 附近得到支持,当积分区间为 [-100, 300] 或类似区间时,quad
永远不会在 0 附近对其值进行采样。(对于其他一些区间,它偶然会这样做。)
补救方法:使用参数points
来表示函数所在的位置,大概。随着
quad(lambda x: np.exp(-x**2), -100, 100*n, points=[-10, 10])
上面的代码returns 1.772 for every n.