Joh*_*ohn 3 wolfram-mathematica curvesmoothing convolution
我正在使用Mathematica 7.
我有一个插值函数,这是一个例子:
pressures =
WeatherData["Chicago", "Pressure", {2010, 8}] //
DeleteCases[#, {_, _Missing}] & //
Map[{AbsoluteTime[#[[1]]], #[[2]]} &, #] & // Interpolation;
Run Code Online (Sandbox Code Playgroud)
我想计算它的衍生物,这是直截了当的:
dpressures = D[pressures[x], x]
Run Code Online (Sandbox Code Playgroud)
现在,如果你绘制这个功能
Plot[3600*dpressures, {x, AbsoluteTime[{2010, 8, 2}], AbsoluteTime[{2010, 8, 30}]}]
Run Code Online (Sandbox Code Playgroud)
(抱歉,不知道如何从Mathematica中发布图像,并且没有时间弄明白.)你会发现它非常嘈杂.所以,我想说清楚它.我的第一个想法是使用Convolve,并将其与高斯内核集成,如下所示:
a = Convolve[PDF[NormalDistribution[0, 5], x], 3600*dpressures, x, y]
Run Code Online (Sandbox Code Playgroud)
返回
360 Sqrt[2/\[Pi]] Convolve[E^(-(x^2/50)), InterpolatingFunction[{{3.48961266 10^9, 3.49228746 10^9}},<>], ][x], x, y]
Run Code Online (Sandbox Code Playgroud)
这对我来说看起来很合理.不幸的是,我相信我在某个地方犯了一个错误,因为我回来的结果似乎不是可评估的.那是:
a /. y -> AbsoluteTime[{2010, 8, 2}]
Run Code Online (Sandbox Code Playgroud)
返回
360 Sqrt[2/\[Pi]] Convolve[E^(-(x^2/50)), InterpolatingFunction[{{3.48961266 10^9, 3.49228746 10^9}},<>][x], x, 3489696000]]
Run Code Online (Sandbox Code Playgroud)
这不是我想要的东西我期待-1到1之间的数字.
Convolve寻求一个封闭的卷积形式.你可以尝试一个数字卷积,从类似的东西开始
NConvolve[f_, g_, x_, y_?NumericQ] :=
NIntegrate[f (g /. x -> y - x), {x, -Infinity, Infinity}]
Run Code Online (Sandbox Code Playgroud)
然而,对于这种嘈杂的非平滑函数,数值积分将很困难.(它不能用于默认设置,即使使用精心设置的设置也会很慢.)
我建议你直接在底层数据上操作,而不是插入噪声数据.
你的时间范围的界限:
In[89]:= {lower = Min[First[pressures]], upper = Max[First[pressures]]}
Out[89]= {3.48961*10^9, 3.49229*10^9}
Run Code Online (Sandbox Code Playgroud)
使用插值每小时获取样本*:
data = Table[pressures[x], {x, lower, upper, 3600}];
Run Code Online (Sandbox Code Playgroud)
现在比较
ListLinePlot[Differences[data]]
Run Code Online (Sandbox Code Playgroud)
平滑版超过5小时窗口:
ListLinePlot[GaussianFilter[Differences[data], 5]]
Run Code Online (Sandbox Code Playgroud)