python - 有人可以解释为什么 scipy.integrate.quad 在积分 sin(X) 时对同样长的范围给出不同的结果吗?

标签 python integration scipy numerical-methods

我正在尝试在我的程序中对任意(在我编写代码时已知)函数进行数值积分 使用数值积分方法。我正在使用 Python 2.5.2 以及 SciPy 的数值积分包。为了感受一下,我决定尝试积分 sin(x) 并观察到这种行为-

>>> from math import pi
>>> from scipy.integrate import quad
>>> from math import sin
>>> def integrand(x):
...     return sin(x)
... 
>>> quad(integrand, -pi, pi)
(0.0, 4.3998892617846002e-14)
>>> quad(integrand, 0, 2*pi)
(2.2579473462709165e-16, 4.3998892617846002e-14)

我觉得这种行为很奇怪,因为 -
1. 在普通积分中,整个周期的积分为零。
2. 在数值积分中,这 (1) 不一定是这样,因为你可能只是 近似曲线下的总面积。

无论如何,假设 1 为真或假设 2 为真,我发现行为不一致。两个积分(-pi 到 pi 和 0 到 2*pi)都应该返回 0.0(元组中的第一个值是结果,第二个是错误)或者返回 2.257...

有人可以解释为什么会这样吗?这真的是矛盾吗?如果我遗漏了一些关于数值方法的真正基础知识,有人能告诉我吗?

无论如何,在我最终的应用中,我打算使用上面的方法来求一个函数的弧长。如果有人在这方面有经验,请告诉我在 Python 中执行此操作的最佳策略。

编辑
注意
我已经在数组中存储了范围内所有点的第一个微分值。
目前的误差是可以容忍的。
尾注

我已经阅读了关于此的维基百科。正如 Dimitry 指出的那样,我将积分 sqrt(1+diff(f(x), x)^2) 以获得弧长。我想问的是 - 是否有更好的近似/最佳实践(?)/更快的方法来做到这一点。如果需要更多上下文,我会单独发布/在这里发布上下文,如您所愿。

最佳答案

quad 函数是旧 Fortran 库中的一个函数。它的工作原理是根据它正在积分的函数的平坦度和斜率来判断如何处理它用于数值积分的步长,以最大限度地提高效率。这意味着您可能会从一个区域到另一个区域得到略有不同的答案,即使它们在分析上是相同的。

毫无疑问,两个积分都应该返回零。返回 1/(10 万亿) 的值非常接近于零!细微差别是由于 quad 滚动 sin 并更改其步长的方式所致。对于您计划的任务,quad 将是您所需要的一切。

编辑: 对于你正在做的事情,我认为 quad 很好。它快速且非常准确。我的最后声明是放心地使用它,除非你发现某些东西确实出了问题。如果它没有返回无意义的答案,那么它可能工作正常。不用担心。

关于python - 有人可以解释为什么 scipy.integrate.quad 在积分 sin(X) 时对同样长的范围给出不同的结果吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/581186/

相关文章:

python - 使用 numpy/python 从头开始​​进行多项式展开

python - python Hackerrank 中的 EOF 错误

javascript - 带有 JSON 数据的 D3 线,未渲染

reactjs - React 项目(或组件库)的标准目录结构?

python - 密集数组与稀疏矩阵的右乘

python - python 中休假报告逻辑和函数所需的指导

eclipse - Gradle Integration for Eclipse 守护程序启动失败

c++ - Cocoa:将 NSApplication 集成到现有的 c++ 主循环中

python - 具有不规则和交替箱的分箱统计

python - scipy 优化最小化函数不强制约束