2011-06-28 17 views
7

¿Cómo diferencio numéricamente una lista en Mathematica sin primero ajustándola a una expresión matemática (es decir, usando FindFit)?Diferenciación numérica de la lista en Mathematica

Específicamente, me gustaría encontrar el punto de pendiente máxima en la lista.

He considerado usar Differences y encontrar la diferencia máxima, pero el ruido en los datos lo vuelve inexacto. Suavizar los datos con MovingAverage tampoco ayuda.

Gracias de antemano.

+6

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

+1

http://math.lanl.gov/Research/Publications/Docs/chartrand-2007-numerical.pdf – Szabolcs

+0

@Szabolcs, gracias por los enlaces. – rcollyer

Respuesta

6

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] 

enter image description here

É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] 

enter image description here

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] 

enter image description here

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.

+0

¡Gran respuesta, gracias! –

+0

Una constante de normalización está buscando un padre de crianza ... –

+0

@belisarius Dime dónde olvidé uno –

Cuestiones relacionadas