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

标签 matlab max coordinates polynomials

我有一组可以拟合多项式曲线的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)

这是我得到的情节:

Figure showing data with minimum and maximum annotated.

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

最佳答案

此解决方案假设二次拟合(尽管这可以更改),并避免使用 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) 此步骤可用的其他方法包括使用 polyfit ( see 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) ')'])

Maximum occurs at (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) 权重哪些部分您想要更紧密地拟合的数据。

关于Matlab代码识别多项式曲线的最大峰值(坐标),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55169504/

相关文章:

javascript - 获取 DOM 元素的屏幕坐标

image - 图像到单张和正方形的转换

matlab - 如何在复杂的多段线旁边创建随机点?

c++ - 在 Ubuntu 上从 C++ 调用 Matlab

r - 在R中获取总和为274且最大值为4的所有组合

python - libusb-1.x 与 openUsb

c++ openmp for循环在循环执行期间的最大减少值

vbscript - 检测触摸板的坐标

http - OverPass API - 坐标周围的速度限制

c++ - 从 MATLAB diag(sqrt(v)) 转换为 C++ 中的 Eigen