lavoro convolve con funzioni interpolati in Mathematica
-
05-10-2019 - |
Domanda
Sto utilizzando Mathematica 7.
Ho una funzione interpolato, ecco un esempio:
pressures =
WeatherData["Chicago", "Pressure", {2010, 8}] //
DeleteCases[#, {_, _Missing}] & //
Map[{AbsoluteTime[#[[1]]], #[[2]]} &, #] & // Interpolation;
Mi piacerebbe calcolare è derivato, che è dritto in avanti:
dpressures = D[pressures[x], x]
Ora, se si traccia questo funciton
Plot[3600*dpressures, {x, AbsoluteTime[{2010, 8, 2}], AbsoluteTime[{2010, 8, 30}]}]
(mi dispiace, non so come inserire l'immagine all'interno di Mathematica, e non hanno il tempo per capirlo.) Troverete che è molto rumoroso. Così, mi piacerebbe per lisciare fuori. Il mio primo pensiero è stato quello di utilizzare Convolve, e integrarlo nei confronti di un kernel gaussiano, qualcosa di simile al seguente:
a = Convolve[PDF[NormalDistribution[0, 5], x], 3600*dpressures, x, y]
I ritorni
360 Sqrt[2/\[Pi]] Convolve[E^(-(x^2/50)), InterpolatingFunction[{{3.48961266 10^9, 3.49228746 10^9}},<>], ][x], x, y]
Il che sembra ragionevole per me. Purtroppo, credo di aver fatto un qualche errore, perché il risultato torno non sembra essere valutabili. Cioè:
a /. y -> AbsoluteTime[{2010, 8, 2}]
I ritorni
360 Sqrt[2/\[Pi]] Convolve[E^(-(x^2/50)), InterpolatingFunction[{{3.48961266 10^9, 3.49228746 10^9}},<>][x], x, 3489696000]]
Il che non è proprio quello che stavo cercando di mi aspetto un numero compreso tra -1 e 1.
Soluzione
Convolve cerca una forma chiusa per la convoluzione. Si potrebbe provare una convoluzione numerica, a partire con qualcosa di simile
NConvolve[f_, g_, x_, y_?NumericQ] :=
NIntegrate[f (g /. x -> y - x), {x, -Infinity, Infinity}]
Tuttavia, per questa funzione rumorosa non liscia l'integrazione numerica si lotta. (Non funzionerà con le impostazioni predefinite, e sarebbe lento anche con le impostazioni scelti con cura.)
Vi suggerisco di operare direttamente sui dati sottostanti, invece di interpolare i dati di rumorosi.
I limiti del vostro intervallo di tempo:
In[89]:= {lower = Min[First[pressures]], upper = Max[First[pressures]]}
Out[89]= {3.48961*10^9, 3.49229*10^9}
Usa il tuo interpolazione per ottenere campioni ogni ora *:
data = Table[pressures[x], {x, lower, upper, 3600}];
Ora confrontare
ListLinePlot[Differences[data]]
con la versione lisciato sopra la finestra cinque ore:
ListLinePlot[GaussianFilter[Differences[data], 5]]
- Si consiglia di utilizzare InterpolationOrder -.> 1 per i dati rumorosi