一、实验目的(本次实验所涉及并要求掌握的知识点)
掌握初等模型的建模方法,对简单的初等模型能借助Matlab工具软件进行辅助建模、求解和检验。
二、实验内容与设计思想(设计思路、主要数据结构、主要代码结构、主要代码段分析、电路图)
1、 第一题:一垂钓俱乐部鼓励垂钓者将钓上的鱼放生,打算按照放生的鱼的质量给予奖励,俱乐部只准备了一把软尺用于测量,请你设计按照测量的长度估计鱼的质量的方法。假设鱼池中只有一种鲈鱼,并且得到8条鱼的数据见教材P56第2题。请用机理分析法建立模型,并编写Matlab程序,以利用上表中的数据确定模型中参数。
1) 设计思路
代码的设计思路是利用多元线性回归模型来探讨身长和胸围对鱼的质量(重量)的影响。整体流程如下:
- 数据准备:提供鱼的身长、胸围和重量的数据。
- 设计矩阵构建:将输入数据整合为设计矩阵,以便于线性回归的计算。
- 回归模型拟合:通过最小二乘法估计回归系数。
- 质量预测:基于拟合的模型参数,计算鱼的预测质量。
- 误差分析:计算预测质量与实际质量之间的相对误差。
- 结果可视化:以三维图形展示原始数据及拟合的平面,便于观察模型的效果。
2) 主要数据结构
- 输入数据:
lengths:鱼的身长(单位:厘米)的数组。
weights:鱼的质量(单位:克)的数组。
girths:鱼的胸围(单位:厘米)的数组。
- 设计矩阵:
X:包含常数项、身长和胸围的数据矩阵。其结构为 ( n \times 3 ) 的矩阵,其中 ( n ) 是数据点的数量。
- 回归参数:
params:一个列向量,包含拟合得到的回归系数,包括截距和两个自变量(身长和胸围)的系数。
3) 主要代码结构
- 数据输入与初始化:
定义 lengths、weights 和 girths 变量,初始化输入数据。
- 设计矩阵的构建:
生成设计矩阵 X,包括常数项、身长和胸围数据。
- 多元线性回归参数求解:
利用最小二乘法计算回归系数。
- 质量预测与误差计算:
计算根据模型预测的质量并与实际质量进行比较,计算误差。
- 结果可视化:
使用三维散点图展示原始数据和拟合的回归平面。
4) 主要代码段分析
X = [ones(length(lengths), 1), lengths', girths'];
设计矩阵构建:通过 ones(length(lengths), 1) 创建一列常数项,并与身长和胸围的转置合并成一个设计矩阵 X。这个矩阵为后续线性回归提供了必要的输入格式。
params = X \ weights';
参数求解:使用反斜杠运算符 \ 来求解线性方程 ( X \cdot \text{params} = \text{weights} )。这个操作可以有效计算出回归系数,最小化预测值与实际值之间的平方误差。
predictedWeights = X * params;
质量预测:利用设计矩阵和回归参数计算预测的质量。这个步骤通过矩阵乘法实现。
errors = abs(predictedWeights - weights') / weights' * 100;
disp('相对误差 (%)');
disp(errors);
误差计算:计算预测质量与实际质量之间的相对误差,以百分比形式显示。这个步骤帮助评估模型的准确性。
figure;
scatter3(lengths, girths, weights, 'filled');
hold on;
[Xq,Yq] = meshgrid(min(lengths):0.1:max(lengths), min(girths):0.1:max(girths));
Zq = params(1) + params(2)*Xq + params(3)*Yq;
surf(Xq, Yq, Zq, 'FaceAlpha', 0.5, 'EdgeColor', 'none');
可视化部分:创建一个三维图形,使用 scatter3 绘制原始数据点。通过 meshgrid 创建网格并计算回归平面的高度(质量预测值),使用 surf 绘制拟合平面。FaceAlpha 参数设置透明度,使得散点和表面都可以可视化。
- 实验结果图
图 1 第一题实验结果图
图 2 实验代码1
图 3 实验代码2
2. 第二题:老式的录像机上都有计数器,而没有计时器,一些录音机也有类似的情况。这种计数器有什么用呢,让我们从这样一个问题开始:一盘标明180分钟的录像带从头转到尾,用时184分钟,计数器读数从0000变到6061。在某一次使用中录像带已经转过大半,计数器读数为4450,问剩下的一段还能否录下一小时的节目。请用机理分析法建立模型,并编写Matlab程序求解模型
1) 设计思路
- 数据准备:准备计数器读数与时间的数据集,以便进行模型拟合。
- 模型定义:定义一个非线性模型来描述计数器读数与时间之间的关系,选择对数函数进行拟合。
- 参数估计:使用非线性最小二乘法计算模型的参数,使模型与原始数据最匹配。
- 结果输出:输出拟合的参数,使用模型进行预测,并绘制原始数据与拟合曲线。
- 解方程:通过求解模型计算出在计数器读数为4450时的时间,并分析剩余时间是否足够进行额外录制。
2) 主要数据结构
- 输入数据:
lengths:鱼的身长(单位:厘米)的数组。
weights:鱼的质量(单位:克)的数组。
girths:鱼的胸围(单位:厘米)的数组。
- 设计矩阵:
X:包含常数项、身长和胸围的数据矩阵。其结构为 ( n \times 3 ) 的矩阵,其中 ( n ) 是数据点的数量。
- 回归参数:
params:一个列向量,包含拟合得到的回归系数,包括截距和两个自变量(身长和胸围)的系数。
3)主要代码结构
- 数据输入与初始化:
定义 lengths、weights 和 girths 变量,初始化输入数据。
- 设计矩阵的构建:
生成设计矩阵 X,包括常数项、身长和胸围数据。
- 多元线性回归参数求解:
利用最小二乘法计算回归系数。
- 质量预测与误差计算:
计算根据模型预测的质量并与实际质量进行比较,计算误差。
- 结果可视化:
使用三维散点图展示原始数据和拟合的回归平面。
4) 主要代码段分析
X = [ones(length(lengths), 1), lengths', girths'];
设计矩阵构建:通过 ones(length(lengths), 1) 创建一列常数项,并与身长和胸围的转置合并成一个设计矩阵 X。这个矩阵为后续线性回归提供了必要的输入格式。
params = X \ weights';
参数求解:使用反斜杠运算符 \ 来求解线性方程 ( X \cdot \text{params} = \text{weights} )。这个操作可以有效计算出回归系数,最小化预测值与实际值之间的平方误差。
predictedWeights = X * params;
质量预测:利用设计矩阵和回归参数计算预测的质量。这个步骤通过矩阵乘法实现。
errors = abs(predictedWeights - weights') / weights' * 100;
disp('相对误差 (%)');
disp(errors);
误差计算:计算预测质量与实际质量之间的相对误差,以百分比形式显示。这个步骤帮助评估模型的准确性。
- 实验结果图
图 4 第二题实验结果图
图 5 代码运行结果
图 6 实验代码1
图 7 实验代码2
三、实验使用环境(本次实验所使用的平台和相关软件)
MATLAB R2022
四、实验步骤和调试过程(实验步骤、测试数据设计、测试结果分析)
1、 第一题
1) 实验步骤
- 数据准备:定义鲈鱼的身长、质量和胸围。
- 构建设计矩阵:将常数项、身长和胸围组合成一个设计矩阵 X。
- 多元线性回归:使用左除运算符 \ 进行多元线性回归,求解系数 params。
- 预测质量:使用拟合的参数计算预测的质量。
- 误差分析:计算并显示相对误差。
- 绘制图形:绘制原始数据点和拟合平面。
2)测试数据设计
使用给定的数据集(8条鱼的身长、质量和胸围)。
3) 测试结果分析
- 检查拟合得到的参数是否合理,即 a0, a1, a2 是否符合预期。
- 对比原始质量和预测质量,检查预测值与实际值的接近程度。
- 分析相对误差,评估模型的准确性。
- 观察散点图和拟合平面,确保拟合曲线能够较好地覆盖数据点。
2、 第二题
1) 实验步骤
- 数据准备:定义时间 t 和对应的计数器读数 n。
- 绘制原始数据:绘制时间与计数器读数的关系图。
- 定义模型函数:假设模型为 n=a+blog(c+t)。
- 初始猜测值:提供一个初始猜测值用于拟合。
- 非线性最小二乘法拟合:使用 lsqcurvefit 进行拟合,求解参数 a, b, c。
- 预测计数器读数:使用拟合的参数计算预测的计数器读数。
- 绘制拟合曲线:在同一图上绘制拟合曲线。
- 求解方程:定义一个函数 solveFun 来求解 4450=a+blog(c+t),并使用 fzero 求解 t。
- 计算剩余时间:计算剩余时间并判断是否足够录制一个小时的节目。
2) 测试数据设计
使用给定的时间 t 和计数器读数 n 数据集。
3) 测试结果分析
- 检查拟合得到的参数 a, b, c 是否合理。
- 对比原始计数器读数和预测计数器读数,检查预测值与实际值的接近程度。
- 观察原始数据点和拟合曲线,确保拟合曲线能够较好地覆盖数据点。
- 计算当计数器读数为4450时对应的时间,并判断剩余时间是否足够录制一个小时的节目。
五、实验小结(实验中遇到的问题及解决过程、实验中产生的错误及原因分析、实验体会和收获)
- 通过本次实验三,我初步掌握了初等模型的建模方法,对简单的初等模型能借助Matlab工具软件进行辅助建模、求解和检验。
- 在做第二题的时候,一开始我选择的模型函数不适合数据。后来我利用MATLAB先绘制了一个数据的图,通过观察数据趋势,选择了对数函数模型 n=a+blog(c+t),并通过拟合验证其合理性。