有人可以解释为什么scipy.integrate.quad给出了同样长的范围不同的结果,同时整合SIN(X)?

StackOverflow https://stackoverflow.com/questions/581186

我想在我的程序数值积分任意(已知当我代码)功能 采用数值积分方法。我使用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为True,我发现的行为不一致。或者都集成(-pi到pi和0至2 * PI)应返回0.0(在元组第一值是结果,第二个是错误)或返回2.257 ...

能有人请解释为什么发生这种情况?这真的是一个矛盾?可有人还告诉我,如果我缺少真正的基本约数值方法的东西吗?

在任何情况下,在我的最终应用,我打算使用上述方法找到的功能的弧长。如果有人有这方面的经验,请告诉我关于在Python这样做最好的政策。

修改结果 注意结果 我已经在存储在数组中的范围内的所有点的第一差分的值。结果, 电流误差是可以容忍的。结果 <强>结束注意

我已经在这个阅读Wikipaedia。正如迪米特里已经指出的那样,我将整合的sqrt(1个+差异(F(X),X)^ 2),以获得弧长。我想问的是 - 有没有更好的逼近/最佳实践/快做这样(?)。如果需要更多的情况下,我会单独/后背景下张贴在这里,你的愿望。

有帮助吗?

解决方案

quad功能是从旧的Fortran库中的函数。它的工作原理,通过它整合如何对待它采用数值积分步长,以最大限度地提高效率的功能的平整度和坡度判断。这意味着,你可以从一个区域获得略有不同的答案下一即使他们分析的一样。

毫无疑问两者集成应返回零。返回的东西是1 /(10万亿美元)是相当接近零!有细微的差异是由于方式quad被滚过sin和改变其步长。为了您的计划任务,quad将是你所需要的。

编辑: 对于自己在做什么,我认为quad是罚款。它是快速和相当准确。我的最后陈述是放心地使用它,除非你找到的东西,真的已经非常出错。如果它不返回一个荒谬的答案则可能工作得很好。不用担心。

其他提示

我觉得它可能是机器精度,因为两个答案都有效地为零。

如果你想从马的嘴的答案,我会张贴在 SciPy的讨论这个问题板

我要说的是一个数O(10 ^ -14)实际上为零。什么是你的宽容?

这可能是该算法基本四边形是不是最好的。你可以尝试整合另一种方法,看看是否能提高的东西。 5阶龙格 - 库塔可以是一个非常好的通用技术。

这可能是浮点数只是性质:“什么每台计算机科学家应该知道关于浮点运算”。

这似乎输出正确的我,因为你在这里有绝对的错误估计。罪的积分值(X)确实应该在这两个普通和数字集成和你的结果全周期(2 * PI长度的任何区间)具有零值接近该值。结果 为了评价电弧长度应该计算积分的sqrt(1个+ DIFF(F(X)中,x)^ 2)函数,其中差异(F(X)中,x)是导函数f(x)的。也参见弧长

0.0 == 2.3e-16 (absolute error tolerance 4.4e-14)

这两个答案是相同的并且正确即零给定的公差范围内。

的差异来自这一事实的sin(x)= - SIN(-x)完全相同,即使在有限的精度。而有限精度只给出的sin(x)〜的sin(x + 2 * PI)约。当然这将是很好,如果四是足够聪明,算出这个,但它确实没有办法知道先验的方式,积分超过你给等价或两个区间的首先是一个更好的结果。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top