我试图了解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是什么?有人能解释一下吗?
答案 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.0
和4.0
之间。
答案 1 :(得分:0)
它可能会将你的域分成间隔,并且它的近似值恰好是因为你的被积函数是一个低次多项式。