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}

補間を使用して、1 時間ごとにサンプルを取得します*:

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 に答える