分块线性回归实现求助:sin(x)+2曲线区间拟合与绘图
完整MATLAB实现方案
我帮你把整个流程梳理并完成代码实现,包括完善你的线性回归函数、实现分段拟合逻辑以及绘图功能:
1. 完善线性回归函数
你提供的f_regresionLineal函数有一些语法错误和未完成的部分,我帮你修正并补充完整,它会返回拟合的斜率m、截距b、区间内的最大百分比误差,以及拟合的y值:
function [m,b,max_error, yApp] = f_regresionLineal(x,y) xp = mean(x); yp = mean(y); n = length(x); % 修正点乘和标量乘法的语法错误 m = (sum(x.*y) - n*xp*yp) / (sum(x.^2) - n*xp^2); b = yp - m*xp; yApp = m*x + b; % 计算最大百分比误差(相对于真实y值) relative_errors = abs((yApp - y)./y) * 100; max_error = max(relative_errors); end
2. 完整主程序实现
下面是包含样本生成、分段拟合、绘图的完整代码:
%% 步骤1:生成sin(x)+2的25个样本点 % 修正linspace参数,确保生成25个点(你原代码的linspace(0.2*pi,25)默认生成100个点) xS = linspace(0.2*pi, 25, 25); yS = sin(xS) + 2; %% 步骤2:分段直线拟合(每个区间误差<5%) segment_x = []; % 存储各分段的x区间 segment_y = []; % 存储各分段的拟合y值 segment_params = []; % 存储各分段的[m,b]参数 start_idx = 1; total_points = length(xS); while start_idx <= total_points end_idx = start_idx; current_max_error = 0; % 逐步扩展区间,直到误差超过5%或到达最后一个点 while end_idx <= total_points && current_max_error <= 5 % 截取当前区间的点 current_x = xS(start_idx:end_idx); current_y = yS(start_idx:end_idx); % 调用线性回归函数 [m,b,current_max_error, yApp] = f_regresionLineal(current_x, current_y); if current_max_error <= 5 % 误差符合要求,继续扩展 end_idx = end_idx + 1; else % 误差超过5%,回退到上一个点 end_idx = end_idx - 1; % 重新计算符合要求的区间参数 current_x = xS(start_idx:end_idx); current_y = yS(start_idx:end_idx); [m,b,~, yApp] = f_regresionLineal(current_x, current_y); break; end end % 处理最后一个区间的边界情况(刚好到最后一个点且误差符合要求) if end_idx > total_points end_idx = total_points; current_x = xS(start_idx:end_idx); current_y = yS(start_idx:end_idx); [m,b,~, yApp] = f_regresionLineal(current_x, current_y); end % 存储当前分段的信息 segment_x = [segment_x, current_x]; segment_y = [segment_y, yApp]; segment_params = [segment_params; m, b]; % 移动到下一个区间的起始点 start_idx = end_idx + 1; end %% 步骤3:绘制拟合直线与样本点 figure('Color','w'); % 绘制样本点 plot(xS, yS, 'ro', 'MarkerFaceColor','r', 'DisplayName','样本点'); hold on; % 绘制分段拟合直线 plot(segment_x, segment_y, 'b-', 'LineWidth',1.5, 'DisplayName','分段拟合直线'); % 添加标注 xlabel('x'); ylabel('y = sin(x)+2'); title('分段直线拟合sin(x)+2(误差<5%)'); legend('Location','best'); grid on;
代码说明
- 样本生成:修正了
linspace的参数,确保生成指定的25个样本点;如果你原本想的是0到2π的区间,只需要把xS = linspace(0.2*pi, 25, 25);改成xS = linspace(0, 2*pi, 25);即可。 - 分段拟合逻辑:从第一个点开始逐步扩展区间,每次调用线性回归函数计算当前区间的最大百分比误差,一旦误差超过5%就停止扩展,将当前区间保存后开始下一段拟合,确保每个分段的误差都满足要求。
- 绘图:用红色圆点标记样本点,蓝色实线绘制分段拟合直线,添加了清晰的标注和图例,方便查看结果。
内容的提问来源于stack exchange,提问作者user9689345
相关产品推荐
相关产品推荐

