Свернуть работу с интерполированными функциями в Mathematica
Я использую 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.
1 ответ
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 для шумных данных.