如何在Matlab中获取多条多项式拟合曲线的精确峰值坐标
解决多项式拟合曲线精确峰值提取与展示问题
我来帮你搞定这个需求!要获取拟合曲线的精确峰值坐标(不是原始数据的最大值),我们可以通过多项式求导找临界点、筛选最大值点的方式实现,同时支持灵活调整拟合阶数。下面是修改后的完整MATLAB代码,附带详细注释:
% 原始数据定义 x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]; z1 = [1, 4, 9, 16, 25, 36, 49, 36, 25, 16, 8, 1]; z2 = [1, 5, 10, 17, 26, 38, 26, 17, 10, 9, 7, 1]; z3 = [1, 8, 18, 30, 40, 30, 18, 8, 7, 4, 3, 1]; z_data = {z1, z2, z3}; % 把数据打包成cell数组,方便循环处理 marker_types = {'*', 's', 'd'}; % 原始数据标记类型 fit_colors = {'b', 'g', 'r'}; % 拟合曲线颜色 % 可调整的拟合阶数 fit_order = 5; figure('Position', [100, 100, 800, 600]); % 创建画布 hold on; grid on; xlabel('X轴'); ylabel('Y轴'); title('多项式拟合曲线及峰值点'); % 循环处理每条数据 for i = 1:length(z_data) z = z_data{i}; % 1. 多项式拟合 p = polyfit(x, z, fit_order); z_fit = polyval(p, x); % 2. 绘制原始数据和拟合曲线 plot(x, z, marker_types{i}, 'Color', fit_colors{i}, 'DisplayName', sprintf('原始数据%d', i)); plot(x, z_fit, '-', 'Color', fit_colors{i}, 'DisplayName', sprintf('拟合曲线%d', i)); % 3. 提取拟合曲线的精确峰值 dp = polyder(p); % 对拟合多项式求导 critical_points = roots(dp); % 找到导数为0的临界点(可能包含复数) critical_points = critical_points(imag(critical_points) == 0); % 只保留实数临界点 critical_points = critical_points(critical_points >= min(x) & critical_points <= max(x)); % 筛选在原始x范围内的点 if ~isempty(critical_points) % 计算临界点对应的拟合函数值 critical_values = polyval(p, critical_points); % 找到最大值对应的索引 [max_val, max_idx] = max(critical_values); peak_x = critical_points(max_idx); peak_y = max_val; % 4. 绘制峰值点并显示坐标 plot(peak_x, peak_y, 'ko', 'MarkerFaceColor', 'y', 'MarkerSize', 10, 'DisplayName', sprintf('峰值点%d', i)); text(peak_x + 0.2, peak_y + 1, sprintf('(%.2f, %.2f)', peak_x, peak_y), 'Color', fit_colors{i}, 'FontSize', 10); end end legend('Location', 'best'); hold off;
关键步骤说明:
- 打包数据循环处理:把三组z数据放进cell数组,避免重复写三次相同的拟合、绘图代码,更易维护。
- 多项式求导找临界点:用
polyder生成拟合多项式的导数,再通过roots找到导数为0的点,这些点是拟合曲线的极值候选点。 - 筛选有效临界点:剔除复数解和超出原始x范围的点,确保只关注我们关心的区间内的极值。
- 提取峰值并可视化:计算所有有效临界点的拟合值,找到最大值对应的坐标,用醒目的黄色实心圆点标注,同时在旁边显示精确坐标值。
你只需要修改fit_order变量,就能轻松调整多项式拟合的阶数,代码会自动重新计算并展示对应拟合曲线的峰值点。
内容的提问来源于stack exchange,提问作者JI JIN
相关产品推荐
相关产品推荐

