2011-06-28 22 views
7

如何在數學上區分Mathematica中的列表而不是首先將其適用於數學表達式(即使用FindFit)?Mathematica中的列表的數值微分

具體來說,我想在列表中找到最大斜率點。

我已考慮使用Differences並找到最大差異,但數據呈現中的噪點不準確。使用MovingAverage平滑數據也無濟於事。

在此先感謝。

+6

這裏真正的問題是如何在數據嘈雜時估計導數。一旦我們有了這個方法,我們可以考慮在Mathematica中實現它。 Google開啓了例如這: 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,感謝您的鏈接。 – rcollyer

回答

6

您可以嘗試使用高斯內核的ListConvolve來平滑數據。一本很好的特性是,卷積與高斯內核的衍生相當於卷積與高斯核的衍生

下面是一些示例數據:

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

enter image description here

這是一個簡單的卷積與高斯內核:

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

卷積用的一階導數高斯:

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

您可能希望與西格瑪參數玩,看看有什麼會擋住你的情況下,最佳的效果。

這個背後的全部理論被稱爲Scale Space。請注意,以上關於卷積的陳述適用於連續空間。 For a discrete implementation, the kernel could be chosen somewhat better.

請注意,正如MovingAverage一樣,卷積可以移動數據的特徵。

+0

很好的答案,謝謝! –

+0

規範化常數正在尋找一個寄養家長... –

+0

@belisarius告訴我,我忘了一個地方 –