Puede probar ListConvolve
con un kernel gaussiano para suavizar sus datos. Una de las características interesantes de esto es que el derivado de la convolución con un núcleo de Gauss es equivalente a la convolución de con un derivado del kernel de Gauss.
Aquí es un poco de datos de ejemplo:
data = Table[Sin[x] + .5 RandomReal[{-1, 1}], {x, 0, 6 \[Pi], .05}];
ListLinePlot[data]
Ésta es una convolución simple con un kernel de Gauss:
data2 =
Block[{\[Sigma] = 2},
ListConvolve[
Table[1/(Sqrt[2 \[Pi]] \[Sigma]) E^(-x^2/(2 \[Sigma])),
{x, -2 , 2, 1/10}
], data, {11, 11}
]
];
ListLinePlot[data2]
convolución con la primera derivada de un gaussiano:
data3 =
Block[{\[Sigma] = 1},
ListConvolve[
Table[-((E^(-(x^2/(2 \[Sigma]))) x)/(Sqrt[2 \[Pi]] \[Sigma]^2)),
{x, -2 \[Sigma],2 \[Sigma], \[Sigma]/10}
], data, {11, 11}
]
];
ListLinePlot[data3]
Es posible que desee jugar con el parámetro sigma para ver lo que se obtienen resultados óptimos en su caso.
Toda la teoría detrás de esto se llama Scale Space. Tenga en cuenta que la afirmación anterior sobre la convolución se mantiene para el espacio continuo. For a discrete implementation, the kernel could be chosen somewhat better.
Además, al igual que MovingAverage, una convolución puede mover las características de sus datos.
La verdadera pregunta aquí es cómo estimar la derivada cuando sus datos son ruidosos. Una vez que tenemos un método para esto, podemos pensar en implementarlo en Mathematica. Google aparece, p. esto: http://math.lanl.gov/Research/Highlights/PDF/tvdiff.pdf – Szabolcs
http://math.lanl.gov/Research/Publications/Docs/chartrand-2007-numerical.pdf – Szabolcs
@Szabolcs, gracias por los enlaces. – rcollyer