Это решение предполагает квадратичное соответствие (хотя это можно изменить) и избегает использования polyfit
только для демонстрации альтернативного подхода. Не утверждать, что это лучше, чем другие методы.
1. Fit многочлен
( a ) Этот подход использует fminsearch
, чтобы быстро получить числовое соответствие. Обратите внимание, что для этого требуется найти разумную отправную точку для полиномиальных коэффициентов c0
.
% MATLAB R2017a
x = [53, 62, 69, 71, 78, 89, 99, 106, 118, 133, 140, 151, 157, 164];
y = [211, 227, 233, 245, 262, 278, 283, 289, 282, 276, 268, 259, 252, 246];
fh=@(c) c(1) + c(2)*((x-c(3)).^2); % to pass to fminsearch
errh=@(c) sum((fh(c)-y).^2); % uses Least Sum of Squared Error
% err2h=@(c) sum(abs(fh(c)-y)); % sum of absolute error
qh=@(X,c) c(1) + c(2)*((X-c(3)).^2); % for plotting
c0 = [300 -0.07 100]; % initial guess at coefficients
[c, SSE] = fminsearch(errh,[300 -0.1 100])
( b ) Другие методы, доступные для этого шага, включают использование polyfit
( см. Здесь ). Другие методы также опции.
2. Нахождение максимальной ординаты
( a ) Используйте базовое исчисление, чтобы найти максимумы. Если вы знаете форму многочлена, возьмите 1-ую производную (dy / dx) и установите равной нулю. Решить для х. Если 2-я производная, если отрицательная, у вас есть локальный максимум. Это может быть достигнуто аналитически.
( b ) Численно найти эту координату с некоторым допуском.
xstep = 0.01;
Xrng = min(x)-10:.01:max(x)+10;
figure, hold on
plot(x,y,'ko')
xlim([0 180])
ylim([0 300])
plot(Xrng,ones(size(Xrng))*c(1),'r-')
plot(Xrng,qh(Xrng,c),'b--')
[y_max,ind] = max(qh(Xrng,c));
x_max = Xrng(ind);
disp(['Maximum occurs at (' num2str(x_max) ', ' num2str(y_max) ')'])
Максимум достигается при (115,75, 285,4542)

( c ) Вы также можете использовать findpeaks
из панели инструментов обработки сигналов.
[y_max,locs] = findpeaks(qh(Xrng,c))
x_max = Xrng(locs)
Расширения:
Хотя это и не показано, можно (1) заставить максимум подогнанного многочлена быть таким же, как максимум из данных (либо как значение y, либо как координата (x, y)), так и (2) определить вес, который разделяет данных, которые вы хотите более плотно прилегать.