数值分析高斯实验报告Word格式.docx
《数值分析高斯实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《数值分析高斯实验报告Word格式.docx(13页珍藏版)》请在冰点文库上搜索。
![数值分析高斯实验报告Word格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/1/2f850cf6-ceaf-4017-9427-4bad6da38340/2f850cf6-ceaf-4017-9427-4bad6da383401.gif)
1.高斯消元法基本思路
如果一个线性方程组的系数矩阵是上三角矩阵时,这种方程组我们称之为上三角方程组,它是很容易求解的。
只要把方程组的最下面的一个方程求解出来,在把求得的解带入倒数第二个方程,求出第二个解,依次往上回代求解。
高斯消元法的目的就是把一般线性方程组简化成上三角方程组。
于是高斯消元法的基本思想是:
通过逐次消元将所给的线性方程组化为上三角形方程组,继而通过回代过程求解线性方程组。
2.高斯列主消元法计算步骤
将方程组用增广矩阵
表示。
步骤1:
消元过程,对
。
选主元,找
使得
,如果
,则矩阵
奇异,程序结束。
如果
,则交换第
行与第
行对应元素位置,
,
消元,对
,计算
对
步骤2:
回代过程:
若
则矩阵奇异,程序结束;
四、分析
1时间复杂度
时间频度一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。
但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。
并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。
一个算法中的语句执行次数称为语句频度或时间频度。
记为T(n)。
常数阶O
(1),对数阶O(log2n),线性阶O(n),线性对数阶O(nlog2n),平方阶O(n2),立方阶O(n3),...,k次方阶O(nk),指数阶O(2n)。
随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。
就本程序而言,因为出现了三个for循环的嵌套所以时间复杂度为O(n^3)
2空间复杂度
空间复杂度与时间复杂度类似,空间复杂度是指算法在计算机内执行时所需存储空间的度量。
记作:
S(n)=O(f(n))我们一般所讨论的是除正常占用内存开销外的辅助存储单元规模。
空间复杂度为O
(1)。
五、程序流程图
六、程序描述
程序要用到的函数
(1、)matrix_getElement(array,n,m);
此函数的作用是获得用户输入的线性方程组的系数矩阵。
(2、)matrix_outputElement(array,n,m);
此函数的作用是显示用户输入的矩阵。
(3、)selectMaxElement(array,n,m,row);
此函数的作用是选择主元素,并把此时对角线上的那列元素与主元素行交换。
(4、)GAUSSProcess(array,n,m,row);
此函数的作用是用主元素列进行高斯消元,把此行以后所有的行的,此列的元素变为0。
(5、)GAUSSProcess_result(array,n,m);
此函数的作用是显示经过高斯消元后的矩阵,此时的系数矩阵为一个上下三角矩阵。
(6、)GAUSSCalculate_result(array,n,m);
此函数的作用是对已经消元好的矩阵,进行回代求解。
并将结果输出。
七、程序代码
#include<
stdio.h>
math.h>
iostream.h>
#include<
iomanip.h>
constintN=60;
//最大
constintM=61;
//60列,再加上等号右边的一列值
//输入要计算方程组的矩阵
voidmatrix_getElement(doubleARRAY[N][M],intn,intm){
for(inti=0;
i<
n;
i++){
cout<
<
"
请您输入第"
\t"
(i+1)<
行:
endl;
for(intj=0;
j<
m;
j++){
cin>
>
ARRAY[i][j];
}
}
return;
}
//输出用户刚才用户输入的矩阵,以便用户检测是否输入正确
voidmatrix_outputElement(doubleARRAY[N][M],intn,intm){
cout<
yourhaveinputthematrixasfllows:
\n"
;
i<
i++){
cout<
ARRAY[i][j]<
"
endl<
//选择主元素,并把主元行与对角线上的那一行交换
voidselectMaxElement(doubleARRAY[N][M],intn,intm,intline){
doublemax=0;
doublet=0;
intj=0;
inti=line;
max=ARRAY[line][line];
for(i=line+1;
if(fabs(ARRAY[i][line])>
fabs(max)){
max=ARRAY[i][line];
j=i;
if(j>
line){
for(i=0;
i++){
t=ARRAY[j][i];
ARRAY[j][i]=ARRAY[line][i];
ARRAY[line][i]=t;
//用对角线上的元素消元后续行中此列的元素
voidGAUSSProcess(doubleARRAY[N][M],intn,intm,introw)
{
doubleROW1[M];
for(intt=0;
t<
(m-row);
t++){
ROW1[t]=ARRAY[row][row+t];
for(intj=(row+1);
j<
n;
j++){
doubleROW_CHANGE[M];
for(intr=0;
r<
r++){
doublemainElement=ROW1[0];
if(fabs(mainElement)<
1e-7){
cout<
Single!
pressanykeyreturn...\n"
getchar();
return;
}
ROW_CHANGE[r]=ROW1[r]*ARRAY[j][row]/ROW1[0];
for(inth=0;
h<
h++){
ARRAY[j][h+row]=ARRAY[j][h+row]-ROW_CHANGE[h];
//用回代的方法求出线性方程组的解
voidGAUSSCalculate_result(doubleARRAY[N][M],intn,intm){
doublea[N];
a[n-1]=ARRAY[n-1][m-1]/ARRAY[n-1][n-1];
for(intp=n-2;
p>
=0;
p--){
for(intq=n-1;
q>
p;
q--){
ARRAY[p][m-1]=ARRAY[p][m-1]-ARRAY[p][q]*a[q];
a[p]=ARRAY[q][m-1]/ARRAY[p][p];
-------thefinalresultasfollows-----------:
for(inte=0;
e<
e++){
x"
e+1<
="
<
a[e]<
endl;
//输出经过高斯消元法处理后得到的矩阵
voidGAUSSProcess_result(doubleARRAY[N][M],intn,intm){
您输入的矩阵经过高斯消元法处理后得到如下形式:
//main函数
voidmain()
doublearray[N][M];
请输入您要运算的矩阵的大小!
intn=0,m=0;
请输入您要运算的矩阵的行数:
cin>
请输入您要运算的矩阵的列数:
您所输入的行为:
n<
您所输入的列为:
m<
matrix_getElement(array,n,m);
//获得矩阵的元素
matrix_outputElement(array,n,m);
//显示输入的矩阵
for(introw=0;
row<
row++)//高斯消元法的主体
{
selectMaxElement(array,n,m,row);
GAUSSProcess(array,n,m,row);
GAUSSProcess_result(array,n,m);
//显示消元后的矩阵
GAUSSCalculate_result(array,n,m);
//回代求解并显示解结果
cout<
Thisistheend!
八、运行程序
本程序可以自己选择线性方程组的行数和列数。
例子如下:
2x1+x2-5x3+x4=8;
x1-3x2-6x4=9;
2x2-x3+2x4=-5;
x1+4x2-7x3+6x4=0;
输入您要运算的矩阵的大小!
4
5
4您所输入的列为:
请您输入第1行:
21-518
请您输入第2行:
1-30-69
请您输入第3行:
02-12-5
请您输入第4行:
14-760
完成以上的数据输入后,出现结果如下图所示:
此图片为用户运行程序后所看到的结果,即:
x1=3
x2=-4
x3=-1
x4=1
九、感想
该程序完成不是一帆风顺的,在编写过程中遇到了许多的疑难问题有幸得到了同学与老师的帮助,同时自己也翻阅了相关书籍,努力编好与完善。
刚开始对自己解线性方程组的课题无从下手,对用“高斯列主消元法”更是莫名其妙。
这次的程序基本上是参考的别人的,不过通过我的不懈努力,也算是对高斯列主消元法有了基本的了解和认识。
这次课设在一定程度上给自己打下了基础,希望以后能有更多的机会参加课程设计。
十、参考文献
【1】谭浩强《C程序设计教程》北京清华大学出版社
【2】刘成等《C语言程序设计实验指导与习题集》北京中国铁道出版社