python - 使用 scipy.integrate.simps 进行集成

标签 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

这完全对应于

14 x2 dx = 21,

我没有得到的是 x = np.array([1, 3, 4]) 行。为什么这里需要 3 个? 1和4是积分的极限,那么3是多少呢?有人可以向我解释一下吗?

最佳答案

documentation 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's rule ,它基于将被积函数扩展至 2 阶。因此该方法能够准确求解您的样本积分。

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

如果您不提供带有示例位置的列表 x,结果通常会是错误的,因为 y1< 中各个 y 值之间的间距将被假定为 1/。 (请参阅上面的文档链接)

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

x = np.array([1.0,3.0,4.0])

解决了这个问题,结果始终是21.0。您还可以看到,只要在 1.04.0 之间,实际的中间值并不重要。

关于python - 使用 scipy.integrate.simps 进行集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20768215/

相关文章:

python - 添加两个 DataFrame 的 len

c - 做数学时如何强制编译器将变量提升为 float

python - 对巨大的矩阵进行排序,然后在列表中找到最小的元素及其索引

python - 通过查找其他行中的值创建新的 pandas 数据框列

python - 写入 CSV 文件时出现 Unicode 问题

javascript - 生成一个无重复数字的随机 4 位数字

matlab - 计算向量中所有差异的可能性

python - 就速度和内存而言,迭代非常大的循环并将 scipy 稀疏矩阵存储到文件中的最有效方法

python - 解决解决方案不可行的不平等系统

python - 如何处理Python错误:tornado.application:Uncaught exception