4

当我尝试在 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.9511, 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

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

任何帮助表示赞赏!

提前致谢

4

2 回答 2

9

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

二阶导数的估计是一件困难的事情。这是一个不适定的问题。微分本身就是一个噪声放大器,因此估计二阶导数是“两倍”的糟糕。这根本不是一件容易的事情,当然也不是很好。

使用这组点,我选择使用我的SLM 工具箱来估计样条模型。

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];

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

纯数据图

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

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

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

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

在上述电话中,我指示 SLM:

  • 完成后绘制结果图
  • 创建 x 的单调递减函数
  • 使用 20 个等距的结
  • 强制曲线具有处处为正的二阶导数
  • 将最后的二阶导数设置为零

生成的图本身就是一个 gui,允许您绘制函数和数据,还可以绘制结果的导数。垂直的绿线是节点位置。

曲线和数据

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

二阶导数情节如何?当然,SLM 是一种分段三次工具。因此二阶导数只是分段线性的。这是一个问题吗?你会要求我提供高阶样条曲线的工具吗?太糟糕了,但不,我不会。这些高阶导数的估计太差,无法要求高度平滑的结果。事实上,我对这个预测很满意。请注意,二阶导数中的故障是一致的。如果我使用更多或更少的结,它们仍然存在。这是了解您看到的形状是曲线的特征还是仅仅是结放置的人工制品的好方法。

看到我对曲线形状施加的约束导致了非常合理的拟合,尽管事实上我使用的节点比我拥有的数据点多得多。SLM 在估计上没有问题。

二阶导数

如果我想尝试更平滑地估计二阶导数,只需使用更多节点。SLM 相对较快。因此,对于 50 节,我们得到二阶导数曲线的非常相似的结果。

二阶导数,50 节

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

于 2012-03-28T12:56:13.703 回答
1

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

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

我没有,也不会绘制你的函数图,所以我不会冒险猜测什么是合理的函数类型。

如果您对该函数一无所知,那么您可以拟合任何曲线给您最喜欢的结果——只是不要自欺欺人地认为您已经得到了该函数的二阶导数。您将拥有所选函数的二阶导数,但对创建数据的函数的二阶导数的了解并不多于一开始时的知识。

于 2012-03-28T10:45:10.470 回答