2011-06-28 23 views
7

Jak numerycznie rozróżnić listę w Mathematica bez najpierw dopasowując ją do wyrażenia matematycznego (tj. Używając FindFit)?Numeryczne różnicowanie listy w Mathematica

W szczególności chciałbym znaleźć punkt maksymalnego nachylenia na liście.

Rozważałem użycie Differences i znalezienie maksymalnej różnicy, ale szum w renderach danych, które są niedokładne. Wygładzanie danych przy pomocy MovingAverage również nie pomaga.

Z góry dziękuję.

+6

Prawdziwym pytaniem jest tutaj, jak oszacować pochodną, ​​gdy dane są głośne. Kiedy mamy już taką metodę, możemy pomyśleć o jej wdrożeniu w Mathematica. Google pojawia się np. to: 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, dzięki za linki. – rcollyer

Odpowiedz

6

Możesz wypróbować ListConvolve z jądrem Gaussa, aby wygładzić dane. Jedną z miłych cech jest to, że pochodna z splotu z jądrem Gaussa jest równoważna splatanie z pochodnego jądra Gaussa.

Oto dane próbki:

data = Table[Sin[x] + .5 RandomReal[{-1, 1}], {x, 0, 6 \[Pi], .05}]; 
ListLinePlot[data] 

enter image description here

Jest to prosty splot z jądrem Gaussa:

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

Splot z pierwszej pochodnej a Gaussian:

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

Możesz grać z parametru sigma, aby zobaczyć, co dostaje optymalne wyniki w danym przypadku.

Cała teoria nazywa się Scale Space. Zauważ, że powyższe stwierdzenie o splotach dotyczy przestrzeni ciągłej. For a discrete implementation, the kernel could be chosen somewhat better.

Pamiętaj, że podobnie jak MovingAverage, splot może przenosić cechy twoich danych.

+0

Świetna odpowiedź, dzięki! –

+0

Stała normalizacyjna szuka przybranego rodzica ... –

+0

@belisarius Powiedz mi, gdzie zapomniałem –