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.

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top