Python+Scipy+集成 : dealing with precision errors in functions with spikes

标签 python scipy precision integrate numerical-methods

我正在尝试使用 scipy.integrate.quad 在非常大的范围内 (0..10,000) 对函数进行积分。该函数在其大部分范围内为零,但在非常小的范围内有尖峰(例如 1,602..1,618)。

积分时,我希望输出为正,但我猜 quad 的猜测算法不知何故变得困惑并输出零。我想知道的是,有没有办法克服这个问题(例如,通过使用不同的算法、其他一些参数等)?我通常不知道尖峰会出现在哪里,所以我不能只分割积分范围并对各部分求和(除非有人知道如何做到这一点)。

谢谢!

示例输出:

>>>scipy.integrate.quad(weighted_ftag_2, 0, 10000)
(0.0, 0.0)
>>>scipy.integrate.quad(weighted_ftag_2, 0, 1602)
(0.0, 0.0)
>>>scipy.integrate.quad(weighted_ftag_2, 1602, 1618)
(3.2710994652983256, 3.6297354011338712e-014)
>>>scipy.integrate.quad(weighted_ftag_2, 1618, 10000)
(0.0, 0.0)

最佳答案

您可能想尝试其他集成方法,例如 integrate.romberg() 方法。

或者,您可以使用 weighted_ftag_2(x_samples).argmax() 获取函数较大的点的位置,然后使用一些试探法来缩短积分区间的最大值您的函数(位于 x_samples[….argmax()]。您必须根据您的问题对采样横坐标列表 (x_samples) 进行调整:它必须始终包含点位于您的功能最大的区域。

更一般地说,有关要集成的功能的任何特定信息都可以帮助您获得其积分的良好值(value)。我会结合一种对您的函数(Scipy 提供的 many methods 之一)有效的方法与积分区间的合理分割(例如,按照上面建议的方式)。

关于Python+Scipy+集成 : dealing with precision errors in functions with spikes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3186196/

相关文章:

python - 在 PyQt QLineEdit 中显示 Pandas Dataframe 的总和

Numpy/Scipy - 稀疏矩阵到向量

python - 解决解决方案不可行的不平等系统

c++ - 如何在大型 C++ 程序中为所有 double 类型的数字设置小数精度

javascript - 如何将 11 到 30 之间的整数乘以 0.015?

python - 在 matplotlib 中设置最小 y 上限和最大下 ylim

python - 相当于Python微框架的rails' "devise"?

python - 正则表达式:如何使用不包括数字的空格/连字符捕获单词?

python - 基于网格的多元三次插值

c++ - 设置C++中的默认浮点打印精度