You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

分块线性回归实现求助: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:37:04