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

2024-04-20 05:43:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图在我的程序中数值积分一个任意的(在我编写代码时已知的)函数 使用数值积分方法。我正在使用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)

我觉得这种行为很奇怪,因为-
一。在普通积分中,全周期积分为零。
2。在数值积分中,不一定是这样,因为 近似曲线下的总面积。

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

有人能解释一下为什么会这样吗?这真的不一致吗?有人能告诉我我是否遗漏了一些关于数值方法的基本知识吗?

无论如何,在我的最终应用程序中,我计划使用上述方法来查找函数的弧长。如果有人在这方面有经验,请告诉我在Python中执行此操作的最佳策略。

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

我读过维基百科上的文章。正如Dimitry所指出的,我将积分sqrt(1+diff(f(x),x)^2)来得到弧长。我想问的是-是否有更好的近似/最佳实践/更快的方法。如果需要更多的上下文,我将在这里单独发布/发布上下文,如您所愿。


Tags: 方法函数代码fromimport程序pimath
3条回答

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

毫无疑问,两个积分都应该返回零。返回的值是1/(10万亿)相当接近于零!这些细微差别是由于quadsin上滚动并改变其步长的方式造成的。对于您计划的任务,quad将是您所需要的全部。

编辑: 对于你所做的,我认为quad是好的。它是快速和相当准确的。我的最后一句话是要自信地使用它,除非你发现有些事情确实出了差错。如果它没有返回一个荒谬的答案,那么它可能工作得很好。别担心。

我认为这可能是机器精度,因为两个答案实际上都是零。

如果你想从马嘴里得到答案,我会把这个问题贴在scipy discussion board

我想说,数字O(10^-14)实际上是零。你的容忍度是多少?

这可能是因为基于quad的算法不是最好的。您可以尝试另一种集成方法,看看这是否能改善情况。五阶龙格库塔可以是一个非常好的通用技术。

这可能只是浮点数的性质:"What Every Computer Scientist Should Know About Floating Point Arithmetic".

相关问题 更多 >