Этот пример показывает, как использовать команды сплайна от Curve Fitting Toolbox™, чтобы сглаживать гистограмму.
Вот гистограмма некоторых случайных значений, которые могут представлять данные, которые были собраны по некоторому измерению.
y = randn(1,5001); hist(y);
Мы хотели бы вывести от этой гистограммы более сглаженное приближение к базовому распределению. Мы делаем это путем построения сплайна функционирует f
, среднее значение которого на каждом интервале панели равняется высоте той панели.
Если h
является высотой одной из этих панелей, и ее левые и правые ребра в L
и R
, то мы хотим, чтобы сплайн f
удовлетворил
integral {f(x) : L < x < R}/(R - L) = h,
или, с F
неопределенный интеграл f
, т.е. DF = f
,
F(R) - F(L) = h*(R - L).
[heights,centers] = hist(y); hold on ax = gca; ax.XTickLabel = []; n = length(centers); w = centers(2)-centers(1); t = linspace(centers(1)-w/2,centers(end)+w/2,n+1); p = fix(n/2); fill(t([p p p+1 p+1]),[0 heights([p p]),0],'w') plot(centers([p p]),[0 heights(p)],'r:') h = text(centers(p)-.2,heights(p)/2,' h'); dep = -70; tL = text(t(p),dep,'L'); tR = text(t(p+1),dep,'R'); hold off
Так, с n
количество панелей, t(i)
левый край i
-th панель, dt(i)
ее ширина и h(i)
ее высота, мы хотим
F(t(i+1)) - F(t(i)) = h(i) * dt(i), for i = 1:n,
или, устанавливая произвольно F(t(1))
= 0,
F(t(i)) = sum {h(j)*dt(j) : j=1:i-1}, for i = 1:n+1.
dt = diff(t); Fvals = cumsum([0,heights.*dt]);
Добавьте в это эти два граничных условия DF(t(1)) = 0 = DF(t(n+1))
, и у нас есть все данные, мы должны получить F
как полный кубический сплайн interpolant.
F = spline(t, [0, Fvals, 0]);
Два дополнительных нулевых значения во втором аргументе указывают на нуль endslope условия.
Наконец, производная, f = DF
, сплайна F
являются сглаживавшей версией гистограммы.
DF = fnder(F); % computes its first derivative h.String = 'h(i)'; tL.String = 't(i)'; tR.String = 't(i+1)'; hold on fnplt(DF, 'r', 2) hold off ylims = ylim; ylim([0,ylims(2)]);