使用scipy.integrate.simps进行集成

时间:2013-12-25 01:02:08

标签: python math scipy integrate

我试图了解scipy包,但我遇到了一些我无法理解的东西。

from scipy.integrate import simps
import numpy as np
def f1(x):
    ...:     return x**2
x = np.array([1,3,4])
y1 = f1(x)
I1 = integrate.simps(y1,x)
print(I1)
21.0

这完全符合

1 4 x 2 dx = 21,

我没有得到的是x = np.array([1, 3, 4])行。为什么我们需要3? 1和4是积分的极限,那么3是什么?有人能解释一下吗?

2 个答案:

答案 0 :(得分:3)

scipy.integrate.simps的{​​{3}}说:

y : array_like

    Array to be integrated.

x : array_like, optional

    If given, the points at which y is sampled.

这些是对函数进行采样的点。由于您没有将要直接集成的函数传递给算法,因此必须提供样本点。第二个数组给出了您在上一行中计算的y值y1的x位置。虽然数值积分方法的某些实现直接采用了被积函数,但它们总是会像你在这里提供的那样创建样本点。

所以数组x 积分间隔,​​尽管它的最大值和最小值给出了间隔。

一般来说,对于任何数值积分算法,在积分区间内分布的更多样本点将提高数值结果的准确性,只有3个点几乎肯定会导致非常差的近似。

然而在你的例子中,被积函数是2阶的简单多项式。这样很容易整合(分析和数字)。您与scipy.integrate.simps一起使用的算法是documentation,它基于将被积函数扩展到2阶。因此,此方法可以精确地求解您的样本积分。

要完全定义二阶多项式,您需要指定3个系数,并且为了能够推导出这些系数,算法需要知道二阶多项式的至少3个点。然而,另外的第四点不会提供更多信息,因为曲线已经由三个点完全指定。这就是为什么在这个例子中为什么3分足以给出确切的结果。

如果您没有为列表x提供样本位置,则结果通常是错误的,因为y1中各个y值之间的间距将被假定为1。 (见上面的文档链接)

另外作为使用Python 2.7与Numpy 1.6和Scipy 0.10的附注,上面代码的结果是20.75,可能是因为x的类型被假定为整数。用

明确说明它们是浮动的
x = np.array([1.0,3.0,4.0])

解决了这个问题,结果始终是21.0。您还可以看到实际中间值无关紧要,只要介于1.04.0之间。

答案 1 :(得分:0)

它可能会将你的域分成间隔,并且它的近似值恰好是因为你的被积函数是一个低次多项式。