实验类型:●验证性实验 ○综合性实验 ○设计性实验
实验目的:进一步熟练掌握高斯顺序消去法解线性方程组的算法并编写程序,进一步熟练掌握高斯列主元消去法解线性方程组的算法并编写程序,提高编程能力和解算线性方程组问题的实践技能。
实验内容:分别用高斯顺序消去法和高斯列主元消去法解线性方程组:
问题 1: 用两种算法求解右边给定的方程组 | 问题2:据电路图建立模型并用两种算法解方程组 | 电路图 |
实验原理:高斯顺序消去法;高斯列主元消去法;上三角线性方程组的回代解法
实验步骤:
- 要求上机实验前在A4纸上先分别按照高斯顺序消去法和高斯列主元消去法的算法步骤手工计算问题1,对其算法步骤和手工计算过程进行梳理和总结,分别画出高斯顺序消去法和高斯列主元消去法的程序设计流程图,然后编写出两个算法的函数程序代码。
- 编辑录入程序。
- 记录运行时的输入和输出(截图),调试程序并记录调试过程中出现的问题(截图)及修改程序的过程(截图);请将每次截图及时粘贴并编排在实验报告word文档中,要求对截图配上必要的文字解说,以便证明你的实验过程。每张截图的下方都必须有图号和图题。截图要有针对性有重点的截取能反映你实验过程的重要信息,截图打印后展现的文字不能小于宋体6号字,必须字迹清晰可见!。
- 经反复调试后,运行程序并验证程序运行是否正确,必须明确写出对比分析过程及其验证结论。若手工计算或计算机计算结果不一致,必须认真思考、仔细分析并查明原因(提醒:此时正是提高认识和纠正对数值计算方法算法错误理解的好机会!!,或者是纠正对编程语言语法规则理解错误的好机会),然后,或者纠正手工计算错误,或者纠正程序代码中的错误,直到完全掌握算法并使手工计算或计算机计算结果确实一致为止。(严禁不经严谨的对比分析而主观臆断地给出结论! )
实验思考 高斯顺序消去法潜在的算法漏洞是什么,如何对高斯顺序消去法做一完善以便消除潜在的算法漏洞。(提示:选主元。选主元都有哪些方法?)
数学建模与应用:请对给定的电路图建立数学模型并应用你的程序解决这道电路网络计算问题。分析建模时会用到基尔霍夫电压定律:电路网络中任意单向闭路的电压和为零。请利用基尔霍夫电压定律按照网孔分析法对每个网孔建立电压方程并构建整个电路网络的数学模型,然后对图中给出的电路网络问题的数学模型进行分析和编程计算。
- R1=1,R2=1,R3=2,R4=1,R5=2,R6=4,E1=23,E2=29
- R1=1, R2=0.75,R3=1,R4=2.5,R5=1,R6=4,E1=12,E2=21.5
- R1=1, R2=2,R3=4,R4=3,R5=1,R6=5,E1=41,E2=38
试用你的程序对上述三种情形电阻、电源电压取值情况分别求解电流I1,I2,I3. 试问含有n个网孔纯电阻电路网的电流分布模型是什么?(请查阅高教出版社傅恩锡等主编《电路分析简明教程》§2-3网孔电流法p60)
实验报告书写要求:根据实验过程情况和实验结果撰写并递交实验报告。实验报告应当有算法原理简介,算法流程图,程序代码,调试记录,计算结果阐释,人工计算和计算机程序计算的主要中间结果及最终计算结果列表对比;经列表对比分析后,给出验证结论。对于数学建模的应用问题要有分析建模的过程、模型特征的分析与描述、求解计算的算法过程描述、实际问题解答或阐释的内容。实验报告正文中的标题用加粗的宋体小四,正文的内容采用宋体五号,正文截图或插图中的文字不得大于宋体五号,也不得小于宋体六号(确保打印后字迹清晰)。报告中的文字内容或图片上的文字内容若看不清楚将直接影响实验报告评阅成绩。
应用高斯列主元消去法和上三角线性方程组的回代法手工解算线性方程组,并验证程序计算的中间结果与手工计算中间结果是否一致、程序计算最终结果与手工计算的最终结果是否一致,如果手工计算与计算机计算不一致必须分析并查明不一致的原因并予以纠正。提交在A4规格纸张上手工书写手工计算的过程内容,并给出机器解算中间计算量、最终结果和手工解算中间计算量、最终结果的列表比较及其分析验证结论, 请将详细手工计算过程及其验证结论拍照成JPG图片插入在实验报告的word 电子版中。
实验报告打印和装订顺序要求
实验报告打印要求:在A4纸上将实验报告的Word文档双面打印;
实验报告打印和装订顺序
- 实验任务(本文档版式不得做任何改动);
- 实验报告正文(Word文档);
- 写在A4纸上的手工计算(可以将A4纸上详细手工计算过程拍照成JPG图片插入在实验报告的word 电子版中随Word文档双面打印)。
实验总结(学会了...;掌握了....;训练了....;发现了....;今后学习中...有待提高。)
参考程序
电子报告word文件命名规则:专业班级-完整学号-实验X-姓名.doc, 如信息123班学号为201212030315的郭海涛同学实验2报告word文件命名则应是:信息123-201212030315-实验2-郭海涛.doc, 其中 .doc是Word文件扩展名。
特别提醒:学委负责检查电子文件命名规范,命名不规的将不接收。每人必需提交电子报告和纸质报告各一份(两者内容一致)。本实验任务书版式不得做任何改动。电子报告以班为单位提交压缩包.
问题一:
算法原理简介:
(1)高斯顺序消去法:
高斯消元法(Gauss Elimination Method)是一种规则化的加减消元法。基本思想是通过逐次消元计算把需要求解的线性方程组转化为上三角形方程组,也就是把线性方程组的系数矩阵转化为上三角矩阵,从而使一般线性方程组的求解转化为等价(同解)的上三角形方程组的求解。
(2)高斯列主元消去法:
列主元素消去法是为控制舍入误差而提出来的一种算法,列主元素消去法计算基本上能控制舍入误差的影响,其基本思想是:在进行第 k(k=1,2,...,n-1)步消元时,从第k列的 akk及其以下的各元素中选取绝对值最大的元素,然后通过行变换将它交换到主元素akk的位置上,再进行消元。
手工计算问题一:
图1手写计算问题一(两种解法)
实验代码:
- 高斯顺序消去法:
function x=Gauss_elimination(A,b)
tic
A=[1 2 1 4;2 0 4 3;4 2 2 1;-3 1 3 2];
b=[13;28;20;6];
[rows,~]=size(A);
aug_mat=[A,b];
for i=1:rows
if aug_mat(i,i)~=0
coefficient=aug_mat(:,i);
aug_mat(i,:)=aug_mat(i,:)./aug_mat(i,i);
coefficient=-coefficient;
coefficient(i)=0;
aug_mat=coefficient*aug_mat(i,:)+aug_mat;
disp(aug_mat);
else
aug_mat(:,rows+1:end)=nan;
break
end
end
x=aug_mat(:,rows+1:end);
toc
end
- 高斯列主元消去法:
function x=principal_element(A,b)
tic
A=[1 2 1 4;2 0 4 3;4 2 2 1;-3 1 3 2];
b=[13;28;20;6];
[rows,~]=size(A);
aug_mat=[A,b];
for i=1:rows
temp_list=aug_mat(:,i);
temp_list(1:max(1,i-1))=0;
[~,exchange_pos]=max(abs(temp_list));
aug_mat([i,exchange_pos],:)=aug_mat([exchange_pos,i],:);
coefficient=aug_mat(:,i);
coefficient=-coefficient./coefficient(i);
coefficient(i)=0;
aug_mat=coefficient*aug_mat(i,:)+aug_mat;
disp(aug_mat);
end
divisor=aug_mat((1:rows)+(0:rows:(rows*(rows-1))))';
aug_mat=aug_mat./divisor;
x=aug_mat(:,rows+1:end);
toc
end
程序运行界面及运行结果:
- 高斯顺序消去法
- 高斯列主元消去法:
问题二:
模型建立:
初次模型是
I1*R1+(I1-I2)*R3+(I1-I3)*R4=E1
I2*R2+(I2-I1)R3+(I2-I3)*R5=-E2
(I3-I1)*R4+(I3-I2)*R5+I3*R6=0
整理后可得
(R1+R3+R4)*I1-R3*I2-R4*I3=E1
-R3*I1+(R2+R3+R5)*I2-R5*I3=-E2
-R4*I1-R5*I2+(R4+R5+R6)*I3=0
实验代码:
程序代码1:
function x=Gauss_elimination(A,b)
tic
A=[];b=[];
[rows,~]=size(A);
aug_mat=[A,b];
for i=1:rows
if aug_mat(i,i)~=0
coefficient=aug_mat(:,i);
aug_mat(i,:)=aug_mat(i,:)./aug_mat(i,i);
coefficient=-coefficient;
coefficient(i)=0;
aug_mat=coefficient*aug_mat(i,:)+aug_mat;
disp(aug_mat);
else
aug_mat(:,rows+1:end)=nan;
break
end
end
x=aug_mat(:,rows+1:end);
toc
end
程序代码2:
function x=principal_element(A,b)
tic
A=[];b=[];
[rows,~]=size(A);
aug_mat=[A,b];
for i=1:rows
temp_list=aug_mat(:,i);
temp_list(1:max(1,i-1))=0;
[~,exchange_pos]=max(abs(temp_list));
aug_mat([i,exchange_pos],:)=aug_mat([exchange_pos,i],:);
coefficient=aug_mat(:,i);
coefficient=-coefficient./coefficient(i);
coefficient(i)=0;
aug_mat=coefficient*aug_mat(i,:)+aug_mat;
disp(aug_mat);
end
divisor=aug_mat((1:rows)+(0:rows:(rows*(rows-1))))';
aug_mat=aug_mat./divisor;
x=aug_mat(:,rows+1:end);
toc
end
- R1=1,R2=1,R3=2,R4=1,R5=2,R6=4,E1=23,E2=29
将上述代码的“A=[];b=[];”这两行语句改为“A=[4,-2,-1;-2,5,-2;-1,-2,7];b=[23;-29;0];”
- R1=1, R2=0.75,R3=1,R4=2.5,R5=1,R6=4,E1=12,E2=21.5
将上述代码的“A=[];b=[];”这两行语句改为“A=[4.5,-1,-2.5;-1,2.75,-1;-2.5,-1,7.5];b=[12;-21.5;0];”
- R1=1, R2=2,R3=4,R4=3,R5=1,R6=5,E1=41,E2=38
将上述代码的“A=[];b=[];”这两行语句改为“A=[8,-4,-3;-4,7,-1;-3,-1,9];b=[41;-38;0];”
程序运行界面及运行结果:
算法流程图:
(1)高斯顺序消去法:
图14高斯顺序消去法的程序流程图
(2)高斯列主元消去法:
图15高斯列主元消去法程序流程图
实验思考:
Gauss消去法有以下两个主要缺陷:
1)如果某个主元akk=0,则消元无法进行;
2)在akk=0,但相对很小,当其作为除数时,会导致其他元素数量级的增长,容易造成严重的舍入误差。
而主元素消去法则是对Gauss消去法存在的两个主要问题的一种解决方法。
主元素消去法使用地比较多的是列主元素消去法,与Gauss消去法的主要区别是在进行第k次更新时,首先需要对第k列的第k行以及该列后续元素进行排序,并交换得到最大元素的行。
实验总结:
在本次实验中,我学会了两种求解线性方程组的方法,分别是高斯顺序消去法、高斯列主元消去法;掌握了这两种方法的区别、缺陷以及在具体问题中的使用;训练了function函数的使用;发现了在程序运行缺某些输出时可以依赖disp()来实现,括号中填写想输出变量。
对于第二个问题就是对于第一个问题模型的应用,更多的考验的是将具体的实际问题,在应用基尔霍夫电压定律和网孔分析法建立电路网络的数学模型时将实际问题转化出来,我学会了将实际问题模型化。
今后学习中,对于题目的敏感度有待提高。对于函数的使用和变量的使用应更加细心,对于已经有结构的算法的实现也有待提高。