我正在尝试使用数值积分方法在我的程序中对任意(我编码时已知)函数进行数值积分。我正在使用 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) 以获得弧长。我想问的是 - 是否有更好的近似/最佳实践(?)/更快的方法来做到这一点。如果需要更多上下文,我会按照您的意愿单独发布/在此处发布上下文。