2011-06-28 26 views
7

Làm cách nào để phân biệt số lượng một danh sách trong Mathematica mà không trước hết phù hợp với một biểu thức toán học (ví dụ: sử dụng FindFit)?Sự khác biệt số của danh sách trong Mathematica

Cụ thể, tôi muốn tìm điểm có độ dốc tối đa trong danh sách.

Tôi đã xem xét sử dụng Differences và tìm sự khác biệt tối đa, nhưng tiếng ồn trong dữ liệu hiển thị không chính xác. Làm mịn dữ liệu với MovingAverage cũng không giúp được gì.

Xin cảm ơn trước.

+6

Câu hỏi thực sự ở đây là cách ước tính đạo hàm khi dữ liệu của bạn bị nhiễu. Một khi chúng ta có một phương pháp cho điều này, chúng ta có thể suy nghĩ về việc thực hiện nó trong Mathematica. Google quay lên, ví dụ: này: 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, cảm ơn các liên kết. – rcollyer

Trả lời

6

Bạn có thể thử một số ListConvolve với hạt nhân Gaussian để làm mịn dữ liệu của bạn. Một trong những tính năng tốt đẹp của việc này là các phái sinh của chập với một hạt nhân Gaussian là tương đương với convolving với một phái sinh của hạt nhân Gaussian.

Dưới đây là một số dữ liệu mẫu:

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

enter image description here

Đây là một chập đơn giản với một hạt nhân Gaussian:

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

Convolution với đạo hàm đầu tiên của một 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

Bạn có thể muốn chơi với các tham số sigma để xem những gì nhận được kết quả tối ưu trong trường hợp của bạn.

Toàn bộ lý thuyết đằng sau điều này được gọi là Scale Space. Lưu ý rằng câu lệnh trên về convolution giữ cho không gian liên tục. For a discrete implementation, the kernel could be chosen somewhat better.

Lưu ý thêm rằng, cũng giống như MovingAverage, một chập chững có thể di chuyển các tính năng của dữ liệu của bạn.

+0

Câu trả lời hay, cảm ơn! –

+0

Hằng số chuẩn hóa đang tìm kiếm cha mẹ nuôi ... –

+0

@belisarius Cho tôi biết nơi tôi đã quên một –

Các vấn đề liên quan