gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:51:00 25 4
gpt4 key购买 nike

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

其中没有一个效果令人满意。二阶导数在步长方面非常不稳定,derivest 套件中的自适应方法效果非常糟糕。也许我只是以错误的方式使用它!

感谢任何帮助!

提前致谢

最佳答案

我想前几天是您在 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 个等间距的结
  • 强制曲线具有处处为正的二阶导数
  • 设末尾的二阶导数为零

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

curve and data

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

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

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

2nd derivative

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

2nd derivative, 50 knots

你可以找到SLM (here)在 MATLAB 中央。它确实需要优化工具箱。

关于matlab - 使用 9 个数据点进行数值微分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9905226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com