一、 实验目的与要求
1.掌握高斯消元法求解线性方程组;
2.掌握Matlab编写代码,熟悉其画图工具,进行实验,并验证结果;
3.锻炼数学描述能力,提高报告的书写能力。
二、 问题
三、模型建立及求解
1.高斯消元法解方程组的解
(1)高斯消元法的原理
高斯消元法是一种用于解线性方程组的算法,它的原理是通过一系列行变换将线性方程组转化为简化的行阶梯形式,从而使得方程组的解易于求得。其原理的步骤:
①构建增广矩阵:将线性方程组的系数矩阵和常数向量合并,形成增广矩阵。
②主元选取:从第一行开始,选择当前列中绝对值最大的元素作为主元,避免了小主元作除数而引起的误差。
③消元过程:对于每一行,计算一个倍数因子,使得该倍数乘以主元所在列的元素与当前行的对应元素相等。然后将倍数因子乘以主元所在列的元素,减去当前行的对应元素,得到新的当前行,即将主元下方的元素全部消为零。重复这个操作,直到所有主元下方的元素都变为零。
④回代求解:从最后一行开始,利用已经消元得到的简化行阶梯形式,通过回代的方式求解未知数。最终得到整个线性方程组的解。
(2)公式推导
(3)代码实现
代码实现了构建增广矩阵、主元选取、消元和回代求解的高斯消元法过程,实现了计算过程可视化,输出结果后计算了误差。
gaussianElimination(A,b)//输入参数A:系数矩阵 b:常量向量 |
for k=1:n //遍历所有主元 Ab(k,:)=Ab(k,k);//主元所在行归一化 for i=1:n //消元操作 if i~=k :factor=Ab(i,k)/Ab(k,k); Ab(i,:)=Ab(i,:)-factor*Ab(k,:); |
图1 代码截图
(4)复杂度计算 (公式太难打了,全放截图了qwq)
2.高斯消元法求矩阵的逆
(1)原理
利用高斯消元法求解矩阵的逆步骤如下:
(2)代码实现
代码实现了构建单位矩阵和增广矩阵、主元选取、消元及归一化的高斯消元过程,得到一个左边是单位矩阵的n*2n的矩阵,右侧矩阵则为所求矩阵的逆。代码实现了计算过程可视化,输出结果后计算了误差。
gaussianEliminationInverse(A,b)//输入参数A:矩阵 |
n=size(A)//获得矩阵大小 I=eye(n)//生成对应大小的单位矩阵 Ab=[A,b]//构造增广矩阵 for k=1:n //遍历所有主元 Ab(k,:)=Ab(k,k);//主元所在行归一化 for i=1:n //消元操作 if i~=k :factor=Ab(i,k)/Ab(k,k); Ab(i,:)=Ab(i,:)-factor*Ab(k,:); A_inv = Ab(:,n+l:end); // 右侧部分即为 A 的逆矩阵 |
(3)结果及过程展示
以题目为例,高斯消元法求解计算过程和结果如下:
3.提高解的准确性
(1)提高解的准确性的方法---列主元
①主元选取策略:
选取主元绝对值最大的元素作为主元,减小计算误差对解的影响。
②行交换:
如果在消元过程中遇到主元为零的情况,进行行交换操作,将非零元素置于主元位置。即可避免出现除以零的情况,提高解的准确性。
(2)提高解的准确性的方法---增加计算精度
除了列主元消元法之外,还可以通过增加计算精度来提高准确性。MATLAB 默认的浮点数计算精度是双精度,可以使用更高精度的数据类型:在MATLAB 中安装Symbolic Math Toolbox工具包后使用的 vpa 函数进行可变精度计算。
(3)列主元优化代码实现
代码实现了构建增广矩阵、最大主元选取、换行策略、消元和回代求解的高斯消元法过程,实现了计算过程可视化,输出结果后计算了误差。
gaussianElimination_2(A,b)//输入参数A:矩阵 b:常量向量 |
n=size(A)//获得矩阵大小 Ab=[A,b]//构造增广矩阵 for k=1:n //遍历所有主元 //选取最大的主元并进行行交换 [~,maxIndex] = max(abs(Ab(k;end,k))); maxIndex = maxIndex + k - 1; Ab([k,maxIndex],:)= Ab([maxIndex,k],:); Ab(k,:)=Ab(k,k);//主元所在行归一化 for i=1:n //消元操作 if i~=k :factor=Ab(i,k)/Ab(k,k); Ab(i,:)=Ab(i,:)-factor*Ab(k,:); |
(3)结果及过程展示
4. 验证算法准确性
优化后的算法在寻找最大的列主元策略中,作为除数避免大数除小数造成的巨大误差。经过测试,由于matlab的浮点数精度过高,题目给的样例并不能测试出误差,则将MATLAB默认的双精度浮点型改为单精度浮点型。
通过对比优化高斯消元法的结果误差和普通高斯消元法的结果误差进行作图分析,发现优化后的高斯消元法准确性明显好于普通高斯消元法
四、小结(可含个人心得体会)
通过实验,我掌握了高斯消元法用于求解线性方程组的方法,并在Matlab中编写了相应的代码。通过实验验证,我发现高斯消元法能够有效地求解线性方程组,并得到准确的结果。同时,我还熟悉了Matlab的画图工具,可以用于可视化展示运算过程和结果。这个实验让我更深入地理解了线性方程组和矩阵逆的概念,提升了我在数值计算和编程方面的能力。总的来说,这次实验让我对线性代数和数值计算有了更深入的了解,也提升了我的编程和可视化能力。