我正在使用MATLAB计算多个积分。
我正在使用integral
函数来计算积分,但我想知道使用trapz
而不是使用integral
会更快吗?
我知道trapz
在计算中引入了一些误差,但尽管如此,在MATLAB中计算积分的最佳函数是什么?
答案 0 :(得分:6)
短而甜蜜:
trapz
用于离散数据或选定的功能数据integral
用于具有功能形式的集成,根据速度调整公差。正如MATLAB文档中所提到的,trapz
旨在对离散数据集进行数值积分"并利用梯形规则进行集成。真积分与trapz
近似之间的误差几乎完全取决于输入x
向量(有时在积分用语中称为横坐标),没有自动适应性。好的部分是,如果潜在的功能是"很好" (即,连续,平滑,没有尖峰或过度振荡等),trapz
将可能是最快的函数来近似积分,因为它
不必为值调用函数(它们是'重新输入)
不会自动适应(这需要时间并且可能很复杂 实现)。
但是,对于一般积分, trapz
也可能是最不准确的,可能需要更密集的x
向量来计算低错误值。
对于离散数据,这是一个必须存在的短路,但如果被积函数具有函数形式,则强烈建议使用integral
及其族。
MATLAB中的黑盒数值积分器多年来不断发展,MathWorks联合创始人Clever Moler对一些演变进行了很好的blog post。该帖子讨论了quad
,quadl
和quadgk
函数以及quadgk
如何成为integral
及其同类的核心。这三个函数的基本细分是
quad
使用三点和五点的辛普森规则quadl
使用了一个四点七十三点 1 Lobatto-Kronrod 2 规则quadgk
a使用七点十五分高斯 - 克朗罗德 2 规则获得积分的近似值和自适应正交的误差近似值。历史课和测试问题的摘要是quadgk
是用向量化 3 编写的,使用排除端点的高阶规则,并且比其更快地给出非常准确的答案。竞争对手。因此,quadgk
是新推荐的integral
家庭的核心。
1 自适应正交通常列出用于形成其值和误差近似值的点数。通常,有两个数字表示形成低阶和高阶近似的点数。 quadl
很有意思,它使用四点Gauss-Lobatto规则和七点十三点Kronrod扩展来进行错误处理。
2 Gaussian Quadrature,这是一种集成技术,它选择横坐标以在给定的时间间隔内精确地集成一族多项式,而不是像Newton-Cotes那样对它们进行处方,与它相关的许多名称表示很多"东西"这是在没有明确表达的情况下进行的(这对新手来说非常烦人)。 "高斯" “上述方法”指的是选择横坐标的上述方法和用于积分的相关权重。 " Lobatto"表示对包含端点的Gauss-Legendre integration方法的扩展(其他方法可能不喜欢我在这两个方面之间的链接,但我发现其相似之处)。 " Kronrod"表示任何特定高斯规则的扩展,该规则使用给定的横坐标集创建高阶规则并添加到其中;这会创建一个"嵌套" (低阶点是高阶点集的一部分),导致整体函数评估更少。
3 由于矢量化被写入integral
,因此矢量化的集合或限制必须使用'ArrayValued'
flag来告诉程序以不同方式进行功能评估,以免创建大小不匹配错误。有可能在某种程度上对此进行编程,但MathWorks决定不这样做。