(注意:这是一个社区Wiki。)
假设我有一组点 xi = { x0 , x1 , x2 , ... xn }和相应的函数值 fi = f(xi)= { f0 , f1 ,< em> f2 ,..., fn },其中 f ( x )通常是未知函数。 (在某些情况下,我们可能会提前知道 f ( x ),但我们通常会这样做,因为我们经常 don'提前知道 f ( x )。)近似 f 的衍生物有什么好办法(<每个点的em> x ) xi ?也就是说,如何估算 dfi == d / d x的值 fi == d f ( xi )/ d x 在每个点 XI
不幸的是,MATLAB没有一个非常好的通用数值微分程序。造成这种情况的部分原因可能是因为选择一个好的例程可能很困难!
那有什么样的方法?有哪些例程?我们如何为特定问题选择一个好的例行程序?
在选择如何区分MATLAB时需要考虑几个因素:
最好的方法是什么?
答案 0 :(得分:19)
这些只是一些快速而肮脏的建议。希望有人会发现它们有用!
<强> 1。你有一个象征性的功能或一组点吗?
<强> 2。你的网格是均匀的还是不均匀的?
第3。您的域名是定期的吗?你能假设周期性边界条件吗?
<强> 4。您在寻找什么样的准确度?您是否需要在给定的容差范围内计算导数?
<强> 5。您的衍生产品是否与您定义的函数在相同的点上进行评估是否重要?
diff
函数来计算相邻数组元素之间的差异。这可以用于通过一阶前向差分(或前向有限差分)方案计算近似导数,但估计是低阶估计。正如MATLAB的diff
(link)文档中所述,如果输入长度为N的数组,它将返回一个长度为N-1的数组。当您在N点上使用此方法估计导数时,您将只能估算出N-1点的导数。 (请注意,如果它们按升序排序,则可以在不均匀网格上使用。)diff
方法之外的其他东西。 <强> 6。您需要计算多个衍生品订单吗?
即将开始的例行程序
diff
函数(link来记录文档)来计算相邻数组元素之间的粗略导数。 MATLAB的gradient
例程(link到文档)是一个很好的选择,用于许多目的。它实现了二阶中心差分方案。它具有计算多维导数并支持任意网格间距的优点。 (感谢@thewaywewalk指出这个明显的遗漏!)
我使用Fornberg的方法(见上文)开发了一个小例程(nderiv_fornberg
)来计算任意网格间距的一维的有限差分。我觉得它很容易使用。它在边界处使用6个点的侧面模板,在内部使用中心的5点模板。它可以在MATLAB文件交换here中找到。
<强>结论强>
数值微分领域非常多样化。对于上面列出的每种方法,有许多变体具有各自的优点和缺点。这篇文章几乎不是数值微分的完整处理。
每个应用程序都不同。希望这篇文章能够为感兴趣的读者提供有组织的考虑因素和资源清单,以便选择适合自己需要的方法。
可以使用特定于MATLAB的代码片段和示例来改进此社区wiki。
答案 1 :(得分:2)
我相信这些特定问题还有更多内容。所以我进一步详细阐述了这个问题:
(4)问:您在寻找什么样的准确度?您是否需要在给定的容差范围内计算导数?
答:数值微分的准确性对于兴趣的应用是主观的。通常它的工作方式是,如果你在前向问题中使用ND近似导数来估计感兴趣的信号的特征,那么你应该知道噪声扰动。通常这种伪像包含高频分量,并且通过微分器的定义,噪声效应将以$ i \ omega ^ n $的幅度顺序放大。因此,提高微分器的精度(增加多项式精度)将毫无帮助。在这种情况下,您应该能够取消噪声对差异化的影响。这可以在casecade顺序中完成:首先平滑信号,然后进行区分。但更好的方法是使用&#34; Lowpass Differentiator&#34;。可以找到MATLAB库的一个很好的例子here。
但是,如果情况并非如此,并且您在反问题中使用ND,例如solvign PDE,那么微分器的全局精度非常重要。根据您的问题适合哪种条件(BC),设计将相应调整。砰砰声的规则是增加已知的数值精度是全频带微分器。您需要设计一个处理合适BC的衍生矩阵。您可以使用上述链接找到此类设计的综合解决方案。
(5)您的衍生产品是否与您定义的功能在相同的点上进行评估是否重要? 答:绝对是的。 ND在相同网格点上的评估被称为&#34;集中式&#34;并且关闭点&#34;交错&#34;方案。注意,使用奇数阶导数,集中式ND将偏离微分器的频率响应精度。因此,如果您在逆问题中使用此类设计,则会扰乱您的近似值。而且,相反的情况适用于交错方案所使用的均匀分化顺序的情况。您可以使用上面的链接找到有关此主题的全面说明。
(6)您是否需要计算多个衍生品订单? 这完全取决于您的应用程序。您可以参考我提供的相同链接并处理多种衍生设计。