用于识别多项式曲线的最大峰值(坐标)的Matlab代码

问题描述 投票:1回答:1

我有这组xy数据,适合多项式曲线。有没有办法使用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)

这是我得到的情节:

我想知道的是多项式拟合的最高峰的精确坐标。

matlab max coordinates polynomials
1个回答
1
投票

这个解决方案假定二次拟合(虽然这可以改变)并避免使用polyfit只是为了显示替代方法。没有声称这比其他方法更好。

1.拟合多项式 (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)此步骤可用的其他方法包括使用polyfitsee here)。其他methods也有选择。

2.找到最大纵坐标 (a)使用基本微积分找到最大值。如果知道多项式的形式,则取一阶导数(dy / dx)并设置为零。解决x。如果是二阶导数,如果为负数,则为局部最大值。这可以通过分析实现。

(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)您也可以使用Signal Processing Toolbox中的findpeaks

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

扩展:虽然没有显示,但有可能(1)强制拟合多项式的最大值与数据的最大值相同(作为y值或作为(x,y)坐标),或(2)权重您希望哪些部分数据更紧密。

© www.soinside.com 2019 - 2024. All rights reserved.