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]
Đâ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]
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]
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.
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
http://math.lanl.gov/Research/Publications/Docs/chartrand-2007-numerical.pdf – Szabolcs
@Szabolcs, cảm ơn các liên kết. – rcollyer