Одним из подходов будет подгонка кривой наименьших квадратов.
Вам нужно будет соответствовать параметризованной кривой [x(t), y(t)]
, а не простой кривой y(x)
. По вашей ссылке похоже, что вы пытаетесь подогнать простую кривую y(x)
.
Существует удобный инструмент для подгонки сплайнов по методу наименьших квадратов SPLINEFIT
, доступный на бирже файлов MATLAB здесь .
Используя этот инструмент, ниже приведен простой пример того, как можно использовать подбор сплайнов методом наименьших квадратов для подгонки плавной кривой к набору зашумленных данных. В этом случае я сгенерировал 10 случайно выбранных наборов данных окружности, а затем подгонил сплайн порядка 5 к данным методом наименьших квадратов. ![enter image description here](https://i.stack.imgur.com/FEkIP.png)
function spline_test
%% generate a set of perturbed data sets for a circle
xx = [];
yy = [];
tt = [];
for iter = 1 : 10
%% random discretisation of a circle
nn = ceil(50 * rand(1))
%% uniform discretisation in theta
TT = linspace(0.0, 2.0 * pi, nn)';
%% uniform discretisation
rtemp = 1.0 + 0.1 * rand(1);
xtemp = rtemp * cos(TT);
ytemp = rtemp * sin(TT);
%% parameterise [xtemp, ytemp] on the interval [0,2*pi]
ttemp = TT;
%% push onto global arrays
xx = [xx; xtemp];
yy = [yy; ytemp];
tt = [tt; ttemp];
end
%% sample the fitted curve on the interval [0,2*pi]
ts = linspace(0.0, 2.0 * pi, 100);
%% do the least-squares spline fit for [xx(tt), yy(tt)]
sx = splinefit(tt, xx, 5, 'p');
sy = splinefit(tt, yy, 5, 'p');
%% evaluate the fitted curve at ts
xs = ppval(sx, ts);
ys = ppval(sy, ts);
%% plot data set and curve fit
figure; axis equal; grid on; hold on;
plot(xx, yy, 'b.');
plot(xs, ys, 'r-');
end %% spline_test()
Ваши данные, очевидно, более сложны, чем эта, но это может помочь вам начать.
Надеюсь, это поможет.