[英]Integrating using scipy.integrate.simps
我正在尝试了解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×2 DX = 21,
我没有得到的是x = np.array([1, 3, 4])
。 为什么我们需要3? 1和4是积分的极限,那么3是什么? 有人可以向我解释一下吗?
scipy.integrate.simps
的文档说:
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
的算法是Simpson的规则 ,它基于将被积函数扩展到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
之间即可。
它可能会将您的域划分为区间,并且其近似恰好是准确的,因为您的被积函数是低次多项式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.