Код Matlab для определения максимального пика (координаты) полиномиальной кривой - PullRequest
1 голос
/ 14 марта 2019

У меня есть этот набор данных x и y, которые вписываются в полиномиальную кривую. Есть ли способ использовать Matlab (или Excel) для построения графика этих данных, отследить полиномиальную подгонку к ним и определить координаты (x, y) для максимального пика кривой; не максимальная точка из тех, что я вставил, а самая высокая точка самой кривой.

Я нашел этот код, который отображает данные и отмечает максимальные и минимальные точки, но он отображает максимальные и минимальные значения из тех, которые я вставил, а не пиков самой кривой. Кроме того, он не отслеживает полиномиальное совпадение.

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];

idxmin = find(y == max(y));
idxmax = find(y == min(y));
plot(x,y,'-p','MarkerIndices',[idxmin idxmax],...
    'MarkerFaceColor','red',...
    'MarkerSize',15)

Вот сюжет, который я получаю:

Figure showing data with minimum and maximum annotated.

То, что я хочу знать, это точная координата самого высокого пика полиномиальной аппроксимации.

1 Ответ

1 голос
/ 15 марта 2019

Это решение предполагает квадратичное соответствие (хотя это можно изменить) и избегает использования 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)

Plot showing data, fitted polynomial (quadratic), and maximum

( c ) Вы также можете использовать findpeaks из панели инструментов обработки сигналов.

[y_max,locs] = findpeaks(qh(Xrng,c))
x_max = Xrng(locs)

Расширения: Хотя это и не показано, можно (1) заставить максимум подогнанного многочлена быть таким же, как максимум из данных (либо как значение y, либо как координата (x, y)), так и (2) определить вес, который разделяет данных, которые вы хотите более плотно прилегать.

...