使用9个数据点进行数值微分

时间:2012-03-28 10:03:16

标签: matlab numerical-methods numerical-analysis

当我在Matlab中尝试进行数值微分时,我遇到了问题。但我的问题可能更多是关于数值分析而不是Matlab。

我有一个包含9个数据点的数组,代表9个不同x的f(x)。我需要在数字上找到f''(x)。我对x和f(x)的值是

x = [2271.38,2555.30,2697.26,2768.24,2839.22,2910.20,2981.18,3123.14,3407.06]

f(x)= [577.4063,311.3341,193.0833,141.3048,95.1501,58.8130 32.4931,6.9525,0.1481]

我可以进行插值以获得平滑的曲线。我使用样条插值,但是当你想要区分时,还有其他一些插值吗?

我尝试了不同的方法:

只是简单的向前,向后和中央差异商

基于小波的方法:http://www.mathworks.com/matlabcentral/fileexchange/13948-numerical-differentiation-based-on-wavelet-transforms

和衍生套件:http://www.mathworks.com/matlabcentral/fileexchange/13490-adaptive-robust-numerical-differentiation

非此类工作令人满意。二阶导数在步长方面非常不稳定,并且导出套件中的自适应方法工作非常糟糕。也许我只是以错误的方式使用它!

感谢任何帮助!

提前致谢

2 个答案:

答案 0 :(得分:9)

我想你前几天在MATLAB Central上问了类似的问题。你没有在那里发布你的数据,所以我当时无法给出一个好的答案。

估算二阶导数是一件困难的事情。这是一个不适定的问题。微分本身就是一个噪声放大器,所以估计二阶导数是“两次”坏。这根本不是一件容易的事情,当然不是很好。

使用这组点,我选择使用SLM toolbox来估计样条模型。

x = [2271.38, 2555.30, 2697.26, 2768.24, 2839.22, 2910.20, 2981.18, 3123.14, 3407.06];
f = [577.4063, 311.3341, 193.0833, 141.3048, 95.1501, 58.8130 32.4931, 6.9511, 0.1481];

首先,绘制数据。我可以从那个情节中学到什么?我可能会选择做出任何推论吗?

pure data plot

简单的情节告诉我,连同你的评论,我希望这个函数是一个单调递减函数。它似乎在每一端渐近线性,如双曲线段,在整个域上具有正曲率。

现在,我将使用此信息使用我的SLM工具箱为您的数据构建模型。

slm = slmengine(x,f,'plot','on','decreasing','on','knots',20, ...
    'concaveup','on','endconditions','natural');

slmengine旨在以曲线形状的处方形式从您那里获取信息。您会发现,通过提供此类信息,它可以极大地规范结果的形状,以符合您对过程的了解。在这里,我只是从你的评论中对曲线形状做了一些猜测。

在上面的电话中,我指示SLM:

  • 完成后的结果图
  • 创建x
  • 的单调递减函数
  • 使用20个等间距的结
  • 强制曲线到处都是正二阶导数
  • 将末尾的二阶导数设为零

生成的图是gui本身,允许您绘制函数和数据,也可以绘制结果的导数。垂直绿线是结点。

curve and data

在这里,我们看到曲线拟合是您正在寻找的合理近似值。

二阶导数图怎么样?当然,SLM是一种分段立方体工具。因此,二阶导数仅是分段线性的。这是一个问题吗?您是否会要求我提供更高阶样条的工具?太糟糕了,但不,我不会。那些高阶导数的估计太差,无法要求高度平滑的结果。事实上,我对这个预测很满意。请注意,二阶导数中的毛刺是一致的。如果我使用更多的结或更少,他们仍然在那里。这是一种很好的方法,可以知道您看到的形状是曲线的特征,还是仅仅是结点放置的神器。

看到我对曲线形状的约束导致了一个非常合理的拟合,尽管事实上我使用了比我的数据点更多的结。 SLM在评估中没有遇到任何麻烦。

2nd derivative

如果我想尝试更准确地估计二阶导数,只需使用更多的结。 SLM相对较快。因此,在50节的情况下,我们得到了二阶导数曲线非常相似的结果。

2nd derivative, 50 knots

您可以在MATLAB Central上找到SLM (here)。它确实需要优化工具箱。

答案 1 :(得分:1)

这是一个扩展的评论,而不是答案:

您对产生这些点的功能了解多少?例如,如果你有充分的理由相信它是一个2次多项式,那么你的第一步就是找到最适合你的点的2次多项式,然后取它的二阶导数。如果您认为某个样条(某种样式)是对f的更好描述,则拟合样条曲线。

我没有,而且我不会,绘制你的函数图,所以我不会想到开始时会有什么合理的函数。

如果您对该功能一无所知,那么您可以适应任何曲线,为您提供您最喜欢的结果 - 只是不要自欺欺人地说您已经获得了该函数的二阶导数。你将拥有你所选择的函数的二阶导数,但是对于创建数据的函数的二阶导数比你在开始时没有更多的知识。