matlab 离散数值求导,在MATLAB中计算数值导数的最佳方法是什么?

这些只是一些快速肮脏的建议.希望有人会发现他们有帮助!

你有符号功能还是一组点?

>如果你有一个符号功能,你可能可以分析地计算导数. (可能的话,如果这样做很简单,你就会做到这一点,你不会在这里寻找替代品.)

>如果您具有符号功能,无法分析计算导数,您可以随时评估一组点上的函数,并使用本页列出的其他方法来评估导数.

>在大多数情况下,您有一组点(xi,fi),并且必须使用以下方法之一….

你的网格是平均的还是不均匀的?

>如果您的网格间隔均匀,您可能需要使用有限差分方案(参见维基百科文章here或here),除非您使用周期性边界条件(见下文). Here是在网格上求解普通微分方程的上下文中有限差分法的一个体面的介绍(特别是幻灯片9-14).这些方法通常在计算上是有效的,易于实现,并且该方法的误差可以被简单地估计为用于导出它的泰勒展开的截断误差.

>如果您的网格不均匀,您仍然可以使用有限差分方案,但是表达式更加困难,并且精度随着网格的均匀程度而非常强烈地变化.如果您的网格非常不均匀,您可能需要使用大的模具尺寸(更多相邻点)来计算给定点处的导数.人们经常构造内插多项式(通常为Lagrange polynomial),并区分该多项式以计算导数.参见例如this StackExchange问​​题.通过使用这些方法来估计错误通常很困难(尽管有些尝试这样做:here和here).在这些情况下,Fornberg’s method通常非常有用….

>必须注意您的域的边界,因为模板通常涉及域外的点.有些人引入“鬼点”,或者将边界条件与不同顺序的导数组合起来,以消除这些“鬼点”并简化模板.另一种方法是使用右侧或左侧的有限差分法.

> Here’s是有限差分方法的优秀“作弊表”,包括低阶中心,左右方式.我在工作站附近保存打印输出,因为我发现它很有用.

你的域定期吗?你能假定周期边界条件吗?

>如果您的域是周期性的,您可以使用傅立叶光谱方法计算导数到非常高的精度.这种技术有一些牺牲性能以获得高精度.事实上,如果你使用N点,那么你对衍生的估计大概是N ^ th的准确度.有关更多信息,请参阅(例如)this WikiBook.

傅立叶方法通常使用快速傅里叶变换(FFT)算法来实现大致O(N log(N))性能,而不是天真实现的离散傅里叶变换(DFT)可能采用的O(N ^ 2)算法.

>如果您的功能和域不是周期性的,则不应使用傅立叶光谱方法.如果您尝试使用不是周期性的功能,您将收到较大的错误和不良的“振铃”现象.

>任何阶数的计算导数需要1)从网格空间到谱空间的变换(O(N log(N))),2)傅里叶系数乘以它们的光谱波数(O(N)),以及2)从频谱空间到网格空间的反向变换(再次为O(N log(N))).

>将傅里叶系数乘以其光谱波数时必须小心. FFT算法的每个实现似乎都有自己的频谱模式和归一化参数的排序.例如,参见Math StackExchange上的this question的答案,有关在MATLAB中执行此操作的注意事项.

你正在寻找什么级别的准确性?您是否需要在给定的公差范围内计算衍生物?

>出于许多目的,一阶或二阶有限差分方案可能就足够了.为了获得更高的精度,您可以使用更高阶的泰勒扩展,降低高阶项.

>如果您需要在给定的公差范围内计算衍生工具,您可能需要查找具有所需错误的高阶方案.

通常,减少误差的最佳方法是在有限差分方案中减少网格间距,但这并不总是可能的.

>请注意,高阶有限差分方案几乎总是需要较大的模板尺寸(更邻近点).这可能会导致边界的问题. (见上面关于鬼点的讨论)

5.您对衍生工具是否与您的功能定义相同点进行评估是否重要?

> MATLAB提供了diff函数来计算相邻数组元素之间的差异.这可以用于通过一阶前向差分(或前向有限差​​分)方案计算近似导数,但估计是低阶估计.如在MATLAB的diff(link)文档中所述,如果输入长度为N的数组,则返回长度为N-1的数组.当您在N点上使用此方法估计衍生品时,您只能对N-1点的衍生工具进行估计. (注意,如果按照升序排序,可以在不均匀的网格上使用.)

>在大多数情况下,我们希望在所有点评估导数,这意味着我们要使用diff方法以外的东西.

你需要计算多个衍生品的订单吗?

>可以设置一个方程组,其中网格点函数值和这些点上的一阶和二阶导数都依赖于彼此.这可以通过在相邻点像往常一样组合泰勒展开,但保持衍生项而不是取消它们,并将它们与相邻点相连接.这些方程可以通过线性代数求解,不仅仅是一阶导数,而是第二类(或更高的顺序,如果设置正确).我相信这些被称为组合有限差分方案,它们通常与紧密有限差分方案结合使用,这将在下面讨论.

>紧密有限差分方案(link).在这些方案中,设置一个设计矩阵,并通过矩阵求解同时计算所有点的导数.它们被称为“紧凑”,因为它们通常被设计为比具有相当精度的普通有限差分方案要少得多的模板点.因为它们涉及将所有点连接在一起的矩阵方程,所以某些紧凑的有限差分方案被称为具有“谱分辨率”(例如,Lele’s 1992 paper-优异的),这意味着它们通过取决于所有节点值来模拟光谱方案,因此,他们保持所有长度尺度的准确性.相比之下,典型的有限差分法仅局部准确(例如,点#13处的导数通常不依赖于点#200处的函数值).

>目前的研究领域是如何最好地在紧凑型模具中解决多种衍生物.尽管许多研究人员倾向于针对特定需求(性能,准确性,稳定性或特定的流体动力学研究领域)来调整这些研究结果,结合紧凑的有限差分方法是有力且广泛适用的.

即将到来的例程

>如上所述,可以使用diff函数(link)来计算相邻数组元素之间的粗略导数.

> MATLAB的梯度程序(link到文档)是许多目的的一个很好的选择.它实现了二阶中心差异方案.它具有计算多维度的导数并支持任意格网间距的优点. (感谢@thewaywewalk指出这个明显的遗漏!)

>我使用Fornberg的方法(见上文)开发一个小程序(nderiv_fornberg)来计算任意网格间距的一维维数.我觉得很容易使用.它使用边界上6点的双面模板和内部中心的5点模板.它可以在MATLAB文件交换here中找到.

结论

数值分化领域非常多样化.对于上面列出的每种方法,有许多变体具有自己的优点和缺点.这个职位几乎不是数字化差异的完全处理.

每个应用程序都不同希望这篇文章给感兴趣的读者一个有选择的考虑和资源的列表,以选择一种适合自己需要的方法.

可以通过代码片段和MATLAB特有的示例来改进此社区wiki.

你可能感兴趣的:(matlab,离散数值求导)