integral 和 trapz,在 MATLAB 中哪个更合适?
integral or trapz, which one is the more appropriate in MATLAB?
我正在使用 MATLAB 计算多重积分。
我正在使用 integral
函数计算积分,但我想知道使用 trapz
比使用 integral
更快吗?
我知道 trapz
在计算中引入了一些错误,但尽管如此,with 是在 MATLAB 中计算积分的最佳函数吗?
简短而甜美:
- 如果您不关心(可能极其)低精度的积分值,则对离散数据或选定的函数数据使用
trapz
- 对具有函数形式的被积函数使用
integral
,根据速度需要调整公差。
如 MATLAB 文档所述,trapz
旨在 "to perform numerical integrations on discrete data sets" 并利用梯形规则进行积分。真实积分和trapz
近似值之间的误差几乎完全取决于输入x
向量(有时在积分术语中称为横坐标),没有自动适应性.好的部分是,如果基础函数是 "nice"(即连续、平滑、没有尖峰或过度振荡等),trapz
将 可能是最快的 函数来逼近积分,因为它
不必为值调用函数(它们是输入)
不会自动适应(这需要时间并且可能很复杂
实施)。
然而,对于一般积分,trapz
也可能是最不准确的并且可能需要更密集的x
向量来计算低误差值.
对于离散数据,这是一个必须忍受的缺点,但如果被积函数具有函数形式,则强烈建议 integral
及其系列。
多年来,MATLAB 中的黑盒数字积分器不断发展,MathWorks 联合创始人 Clever Moler 很好地 blog post 回顾了其中的一些演变。 post 讨论了 quad
、quadl
和 quadgk
函数以及 quadgk
如何成为 integral
及其同类函数的核心。三个函数的基本细分是
quad
使用三点和五点辛普森法则
quadl
使用四七十三点1 Lobatto-Kronrod2 规则
quadgk
a 使用 7-15 点 Gauss-Kronrod2 规则
获取积分的近似值和自适应正交的误差近似值。历史课和试题的总结是quadgk
写的是向量化合并3,使用排除端点的高阶规则,给出了极其准确的答案比其竞争对手更快。因此,quadgk
是新的和高度推荐的 integral
系列的核心。
1 Adaptive quadrature 通常会列出用于形成其近似值的点数和误差。通常,有两个数字表示形成低阶和高阶近似值的点数。 quadl
的有趣之处在于它使用四点 Gauss-Lobatto 规则和七点和十三点 Kronrod 扩展来处理错误。
2 Gaussian Quadrature, which is an integration technique that chooses it abscissa to exactly integrate a family of polynomials over a given interval instead of prescribing them as in Newton-Cotes, has a lot of names associated with it to indicate a lot of "stuff" that's going on without being explicit about it (which can be very annoying to newcomers). "Gauss" refers to the aforementioned method of choosing abscissa and associated weights for the integration. "Lobatto" indicates an extension to Gauss-Legendre integration 包含端点的方法(其他人可能不喜欢我在这两者之间的 link,但我发现相似之处令人愉悦)。 "Kronrod" 表示对任何特定高斯规则的扩展,该规则使用给定的一组横坐标创建高阶规则并添加到它;这将创建一个 "nesting"(低阶点是高阶点集的一部分),从而减少总体函数评估。
3 由于矢量化被写入 integral
,矢量化的被积函数或极限必须使用 'ArrayValued'
flag 来告诉程序使函数生效不同的评估,以免产生大小不匹配的错误。也许可以在一定程度上围绕此进行编程,但 MathWorks 决定不这样做。
我正在使用 MATLAB 计算多重积分。
我正在使用 integral
函数计算积分,但我想知道使用 trapz
比使用 integral
更快吗?
我知道 trapz
在计算中引入了一些错误,但尽管如此,with 是在 MATLAB 中计算积分的最佳函数吗?
简短而甜美:
- 如果您不关心(可能极其)低精度的积分值,则对离散数据或选定的函数数据使用
trapz
- 对具有函数形式的被积函数使用
integral
,根据速度需要调整公差。
如 MATLAB 文档所述,trapz
旨在 "to perform numerical integrations on discrete data sets" 并利用梯形规则进行积分。真实积分和trapz
近似值之间的误差几乎完全取决于输入x
向量(有时在积分术语中称为横坐标),没有自动适应性.好的部分是,如果基础函数是 "nice"(即连续、平滑、没有尖峰或过度振荡等),trapz
将 可能是最快的 函数来逼近积分,因为它
不必为值调用函数(它们是输入)
不会自动适应(这需要时间并且可能很复杂 实施)。
然而,对于一般积分,trapz
也可能是最不准确的并且可能需要更密集的x
向量来计算低误差值.
对于离散数据,这是一个必须忍受的缺点,但如果被积函数具有函数形式,则强烈建议 integral
及其系列。
多年来,MATLAB 中的黑盒数字积分器不断发展,MathWorks 联合创始人 Clever Moler 很好地 blog post 回顾了其中的一些演变。 post 讨论了 quad
、quadl
和 quadgk
函数以及 quadgk
如何成为 integral
及其同类函数的核心。三个函数的基本细分是
quad
使用三点和五点辛普森法则quadl
使用四七十三点1 Lobatto-Kronrod2 规则quadgk
a 使用 7-15 点 Gauss-Kronrod2 规则
获取积分的近似值和自适应正交的误差近似值。历史课和试题的总结是quadgk
写的是向量化合并3,使用排除端点的高阶规则,给出了极其准确的答案比其竞争对手更快。因此,quadgk
是新的和高度推荐的 integral
系列的核心。
1 Adaptive quadrature 通常会列出用于形成其近似值的点数和误差。通常,有两个数字表示形成低阶和高阶近似值的点数。 quadl
的有趣之处在于它使用四点 Gauss-Lobatto 规则和七点和十三点 Kronrod 扩展来处理错误。
2 Gaussian Quadrature, which is an integration technique that chooses it abscissa to exactly integrate a family of polynomials over a given interval instead of prescribing them as in Newton-Cotes, has a lot of names associated with it to indicate a lot of "stuff" that's going on without being explicit about it (which can be very annoying to newcomers). "Gauss" refers to the aforementioned method of choosing abscissa and associated weights for the integration. "Lobatto" indicates an extension to Gauss-Legendre integration 包含端点的方法(其他人可能不喜欢我在这两者之间的 link,但我发现相似之处令人愉悦)。 "Kronrod" 表示对任何特定高斯规则的扩展,该规则使用给定的一组横坐标创建高阶规则并添加到它;这将创建一个 "nesting"(低阶点是高阶点集的一部分),从而减少总体函数评估。
3 由于矢量化被写入 integral
,矢量化的被积函数或极限必须使用 'ArrayValued'
flag 来告诉程序使函数生效不同的评估,以免产生大小不匹配的错误。也许可以在一定程度上围绕此进行编程,但 MathWorks 决定不这样做。