是什么?
这些只是⼀些快速肮脏的建议.希望有⼈会发现他们有帮助!
你有符号功能还是⼀组点?
>如果你有⼀个符号功能,你可能可以分析地计算导数. (可能的话,如果这样做很简单,你就会做到这⼀点,你不会在这⾥寻替代品.)
>如果您具有符号功能,⽆法分析计算导数,您可以随时评估⼀组点上的函数,并使⽤本页列出的其他⽅法来评估导数.
>在⼤多数情况下,您有⼀组点(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求导
数值分化领域⾮常多样化.对于上⾯列出的每种⽅法,有许多变体具有⾃⼰的优点和缺点.这个职位⼏乎不是数字化差异的完全处理.
每个应⽤程序都不同希望这篇⽂章给感兴趣的读者⼀个有选择的考虑和资源的列表,以选择⼀种适合⾃⼰需要的⽅法.
可以通过代码⽚段和MATLAB特有的⽰例来改进此社区wiki.
发布评论