在Octave中完成这个实验任务,我们可以按照以下步骤进行: 1. 准备数据 ```octave X = [46 49 51 52 54 56 57 58 59 60 61 62 63 64 66 67 68 71 72 71]'; Y = [40 50 55 63 72 70 77 73 90 93 96 88 99 110 113 120 127 137 132 137]'; ``` 2. 分割数据为拟合集和预测集 ```octave train_idx = 1:2:20; % 奇数索引作为训练集 test_idx = 2:2:20; % 偶数索引作为测试集 X_train = X(train_idx); Y_train = Y(train_idx); X_test = X(test_idx); Y_test = Y(test_idx); ``` 3. 线性拟合(不使用polyfit) ```octave % 构建设计矩阵 A_linear = [ones(size(X_train)), X_train]; % 最小二乘法求解 theta_linear = (A_linear' * A_linear) \ (A_linear' * Y_train); % 计算预测值 Y_pred_linear_train = A_linear * theta_linear; Y_pred_linear_test = [ones(size(X_test)), X_test] * theta_linear; ``` 4. 二次多项式拟合 ```octave % 构建设计矩阵 A_quad = [ones(size(X_train)), X_train, X_train.^2]; % 最小二乘法求解 theta_quad = (A_quad' * A_quad) \ (A_quad' * Y_train); % 计算预测值 Y_pred_quad_train = A_quad * theta_quad; Y_pred_quad_test = [ones(size(X_test)), X_test, X_test.^2] * theta_quad; ``` 5. 计算相对误差 ```octave % 线性模型 rel_err_linear = abs(Y_test - Y_pred_linear_test) ./ Y_test; avg_rel_err_linear = mean(rel_err_linear); max_rel_err_linear = max(rel_err_linear); min_rel_err_linear = min(rel_err_linear); % 二次模型 rel_err_quad = abs(Y_test - Y_pred_quad_test) ./ Y_test; avg_rel_err_quad = mean(rel_err_quad); max_rel_err_quad = max(rel_err_quad); min_rel_err_quad = min(rel_err_quad); ``` 6. 绘制结果 ```octave % 生成平滑曲线用的X值 X_plot = linspace(min(X), max(X), 100)'; % 准备预测值 Y_plot_linear = [ones(size(X_plot)), X_plot] * theta_linear; Y_plot_quad = [ones(size(X_plot)), X_plot, X_plot.^2] * theta_quad; % 绘制图形 figure; hold on; scatter(X_train, Y_train, 'b', 'filled'); % 训练数据 scatter(X_test, Y_test, 'r', 'filled'); % 测试数据 plot(X_plot, Y_plot_linear, 'g-', 'LineWidth', 2); % 线性拟合 plot(X_plot, Y_plot_quad, 'm-', 'LineWidth', 2); % 二次拟合 legend('训练数据', '测试数据', '线性拟合', '二次拟合'); xlabel('华氏温度'); ylabel('鸣叫次数'); title('蟋蟀鸣叫次数与温度关系拟合'); hold off; ``` 7. 显示误差结果 ```octave printf('线性模型:\n'); printf('平均相对误差: %.2f%%\n', avg_rel_err_linear*100); printf('最大相对误差: %.2f%%\n', max_rel_err_linear*100); printf('最小相对误差: %.2f%%\n\n', min_rel_err_linear*100); printf('二次模型:\n'); printf('平均相对误差: %.2f%%\n', avg_rel_err_quad*100); printf('最大相对误差: %.2f%%\n', max_rel_err_quad*100); printf('最小相对误差: %.2f%%\n', min_rel_err_quad*100); ``` 运行这段代码后,你将得到: 1. 拟合曲线图,显示训练数据、测试数据以及两种拟合曲线 2. 两种模型的预测相对误差的平均值、最大值和最小值 从结果可以看出,二次多项式模型通常会比线性模型有更好的拟合效果,但也要注意过拟合的可能性。相对误差的统计量可以帮助评估模型的预测性能。 [2025-04-06 09:01:47 | AI问答 | 1030点数解答]