3

我正在使用 Mathematica 7。

我有一个插值函数,这是一个例子:

pressures = 
  WeatherData["Chicago", "Pressure", {2010, 8}] // 
     DeleteCases[#, {_, _Missing}] & // 
    Map[{AbsoluteTime[#[[1]]], #[[2]]} &, #] & // Interpolation;

我想计算它的导数,这很简单:

dpressures = D[pressures[x], x]

现在,如果你绘制这个函数

Plot[3600*dpressures, {x, AbsoluteTime[{2010, 8, 2}], AbsoluteTime[{2010, 8, 30}]}]

(抱歉,不知道如何从 Mathematica 中发布图像,也没有时间弄清楚。)你会发现它非常嘈杂。所以,我想把它弄平。我的第一个想法是使用 Convolve,并将其与高斯核集成,如下所示:

a = Convolve[PDF[NormalDistribution[0, 5], x], 3600*dpressures, x, y]

退货

360 Sqrt[2/\[Pi]] Convolve[E^(-(x^2/50)), InterpolatingFunction[{{3.48961266 10^9, 3.49228746 10^9}},<>], ][x], x, y]

这在我看来是合理的。不幸的是,我相信我在某个地方犯了错误,因为我得到的结果似乎无法评估。那是:

a /. y -> AbsoluteTime[{2010, 8, 2}]

退货

360 Sqrt[2/\[Pi]] Convolve[E^(-(x^2/50)), InterpolatingFunction[{{3.48961266 10^9, 3.49228746 10^9}},<>][x], x, 3489696000]]

这不是我想要的,我期待一个介于 -1 和 1 之间的数字。

4

1 回答 1

5

Convolve 为卷积寻找一个封闭的形式。你可以尝试一个数字卷积,从类似的东西开始

NConvolve[f_, g_, x_, y_?NumericQ] := 
 NIntegrate[f (g /. x -> y - x), {x, -Infinity, Infinity}]

然而,对于这种嘈杂的非光滑函数,数值积分将很困难。(它不适用于默认设置,即使使用精心选择的设置也会很慢。)

我建议您直接对基础数据进行操作,而不是对嘈杂的数据进行插值。

您的时间范围的界限:

In[89]:= {lower = Min[First[pressures]], upper = Max[First[pressures]]}    
Out[89]= {3.48961*10^9, 3.49229*10^9}

使用插值每小时获取样本*:

data = Table[pressures[x], {x, lower, upper, 3600}];

现在比较

ListLinePlot[Differences[data]]

平滑版本超过 5 小时窗口:

ListLinePlot[GaussianFilter[Differences[data], 5]]
  • 您可能希望将 InterpolationOrder -> 1 用于噪声数据。
于 2010-09-26T01:56:58.230 回答