积分或陷阱,哪一个在MATLAB中更合适?

时间:2017-03-12 21:45:03

标签: matlab numerical numerical-integration

我正在使用MATLAB计算多个积分。

我正在使用integral函数来计算积分,但我想知道使用trapz而不是使用integral会更快吗?

我知道trapz在计算中引入了一些误差,但尽管如此,在MATLAB中计算积分的最佳函数是什么?

1 个答案:

答案 0 :(得分:6)

短而甜蜜:

  • 如果您不关心(可能非常)低整数值的准确度,请将trapz用于离散数据或选定的功能数据
  • 使用integral用于具有功能形式的集成,根据速度调整公差。

正如MATLAB文档中所提到的,trapz旨在对离散数据集进行数值积分"并利用梯形规则进行集成。真积分与trapz近似之间的误差几乎完全取决于输入x向量(有时在积分用语中称为横坐标),没有自动适应性。好的部分是,如果潜在的功能是"很好" (即,连续,平滑,没有尖峰或过度振荡等),trapz可能是最快的函数来近似积分,因为它

  1. 不必为值调用函数(它们是'重新输入)

  2. 不会自动适应(这需要时间并且可能很复杂 实现)。

  3. 但是,对于一般积分, trapz也可能是最不准确的,可能需要更密集的x向量来计算低错误值。

    对于离散数据,这是一个必须存在的短路,但如果被积函数具有函数形式,则强烈建议使用integral及其族。

    MATLAB中的黑盒数值积分器多年来不断发展,MathWorks联合创始人Clever Moler对一些演变进行了很好的blog post。该帖子讨论了quadquadlquadgk函数以及quadgk如何成为integral及其同类的核心。这三个函数的基本细分是

    • quad使用三点和五点的辛普森规则
    • quadl使用了一个四点七十三点 1 Lobatto-Kronrod 2 规则
    • quadgk a使用七点十五分高斯 - 克朗罗德 2 规则

    获得积分的近似值和自适应正交的误差近似值。历史课和测试问题的摘要是quadgk是用向量化 3 编写的,使用排除端点的高阶规则,并且比其更快地给出非常准确的答案。竞争对手。因此,quadgk是新推荐的integral家庭的核心。

    1 自适应正交通常列出用于形成其值和误差近似值的点数。通常,有两个数字表示形成低阶和高阶近似的点数。 quadl很有意思,它使用四点Gaus​​s-Lobatto规则和七点十三点Kronrod扩展来进行错误处理。

    2 Gaussian Quadrature,这是一种集成技术,它选择横坐标以在给定的时间间隔内精确地集成一族多项式,而不是像Newton-Cotes那样对它们进行处方,与它相关的许多名称表示很多"东西"这是在没有明确表达的情况下进行的(这对新手来说非常烦人)。 "高斯" “上述方法”指的是选择横坐标的上述方法和用于积分的相关权重。 " Lobatto"表示对包含端点的Gauss-Legendre integration方法的扩展(其他方法可能不喜欢我在这两个方面之间的链接,但我发现其相似之处)。 " Kronrod"表示任何特定高斯规则的扩展,该规则使用给定的横坐标集创建高阶规则并添加到其中;这会创建一个"嵌套" (低阶点是高阶点集的一部分),导致整体函数评估更少。

    3 由于矢量化被写入integral,因此矢量化的集合或限制必须使用'ArrayValued' flag来告诉程序以不同方式进行功能评估,以免创建大小不匹配错误。有可能在某种程度上对此进行编程,但MathWorks决定不这样做。