【问题标题】:Numerical differentiation using 9 data points使用 9 个数据点进行数值微分
【发布时间】:2012-03-28 10:03:16
【问题描述】:

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

这些都不令人满意。二阶导数在步长方面非常不稳定,并且派生套件中的自适应方法非常糟糕。可能是我用错了!

感谢任何帮助!

提前致谢

【问题讨论】:

  • 那些数据点是什么?他们是有错误的实际测量,他们是测试数据来检查数据点吗?函数本身看起来像指数衰减。
  • 感谢您的回复Thorsten!它们是有误差的实际测量值,这里是插值的“函数”:i.imgur.com/j3AZl.png
  • 鉴于您在高性能标记下的回答“它们只是来自股票市场的数据点”,我的水晶球说您的主管正试图预测股票走势,而您正试图在到目前为止,您使用的每种方法都失败的最后一点......?
  • 不,不过猜对了!我实际上试图通过使用 Dupire 的一个众所周知的关系来从期权价格中恢复风险中性密度,即密度函数等于看涨期权价格的贴现二阶导数!

标签: matlab numerical-methods numerical-analysis


【解决方案1】:

我想是你前几天在 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];

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

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

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

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

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

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

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

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

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

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

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

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

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

【讨论】:

  • 天哪,约翰!我现在用你的 SLM 工具花了一个小时,它真的可以用所有其他工具拖地!我得到了我所期望的结果,非常感谢您抽出宝贵的时间对我的问题做出如此详尽的答复。附言前几天问的可能不是我。然而,我今天确实在 Matlab Central 提出了这个问题!
  • 非常好的答案,不仅解释了如何执行此操作,还解释了如何解释结果。 +1,因为我不能给 +5。
【解决方案2】:

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

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

我没有,也不会画出你的函数图,所以我不会冒险猜测什么是合理的函数开始。

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

【讨论】:

  • 感谢您的评论,让我意识到我在原始帖子中遗漏了许多细节。不幸的是,我对“功能” f 一无所知。它们只是来自股票市场的数据点。我绘制了 f(x) 的图形,这里是:i.imgur.com/j3AZl.png 二阶导数应该看起来像高斯钟形曲线。我用派生套件得到了类似的东西,但它太粗糙了!可能是因为我一开始只有 9 个数据点吗?
猜你喜欢
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-22
  • 1970-01-01
相关资源
最近更新 更多