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

reb*_*oma 1 matlab numerical numerical-integration

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

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

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

Tro*_*kin 6

短而甜蜜:

  • trapz如果您不关心(可能非常)低的积分值精度,请用于离散数据或选定的功能数据
  • 使用integral对于具有功能形式被积式,根据需要为速度调整公差.

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

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

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

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

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


MATLAB中的黑盒数值积分器已经发展了多年,MathWorks联合创始人Clever Moler有一篇很好的博客文章介绍了一些演变.这篇文章讨论了quad,quadlquadgk功能,以及如何quadgk成为其中的核心integral.这三个功能的基本细分是

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

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


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

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

3由于向量化被写入integral,向量化的映射或限制必须使用该'ArrayValued'标志来告诉程序以不同方式进行功能评估,以免产生大小不匹配错误.也许可以在一定程度上围绕这个进行编程,但是MathWorks决定不这样做.