59用高斯列主元消元法解线性方程组.docx
- 文档编号:30154379
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:22
- 大小:50.04KB
59用高斯列主元消元法解线性方程组.docx
《59用高斯列主元消元法解线性方程组.docx》由会员分享,可在线阅读,更多相关《59用高斯列主元消元法解线性方程组.docx(22页珍藏版)》请在冰豆网上搜索。
59用高斯列主元消元法解线性方程组
沈阳航空工业学院
课程设计
学号200704033059
班级7403302
姓名孙卫华
指导教师王晓岩
2009年3月3日
沈阳航空工业学院
课程设计任务书
院系:
航空宇航工程学院专业:
飞行器设计与工程班级:
7403302
学号:
200704033059题目:
用高斯列主元消元法解线性方程组
一、课程设计时间
2008~09第2学期第1周,共计1周,20学时。
二、课程设计内容
用C语言编写程序完成以下任务:
请用高斯列主元消元法解下列线性方程组:
三、课程设计要求
1.程序质量:
✧贯彻结构化的程序设计思想。
✧用户界面友好,功能明确,操作方便。
✧用户界面中的菜单至少应包括“输入数据”、“开始计算”、“退出”3项。
✧代码应适当缩进,并给出必要的注释,以增强程序的可读性。
2.课程设计说明书:
课程结束后,上交课程设计说明书和源程序。
课程设计说明书的格式和内容参见提供的模板。
四、指导教师和学生签字
指导教师:
________学生签名:
________
五、说明书成绩
六、教师评语
目录
一、需求分析1
二、程序流程图2
三、核心技术的实现说明及相应程序段6
四、课设总结12
五、参考文献13
六、源程序13
一、需求分析
经过对程序设计题目的分析可知,整个程序的设计实现大致分为六个模块,其中每一个模块对应一个函数,它们的功能分别是:
输入矩阵、更改错误、显示矩阵、开始计算、显示结果、重新输入、退出。
在这些函数当中,第一个、第四个和第七个函数的实现严格按照题目的要求,而其他函数属于附加功能。
1、输出矩阵主要实现程序计算时所需要的数据,这里增加了一些程序,可以计算任何阶数小于100的矩阵;
2、更改错误本函数主要对于输入的数据进行改正,如果错误较少,而且易于改正,可以应用此函数,对错误的数据进行更改,将免去重新输入的麻烦;
3、显示矩阵把输入的矩阵显示出来,检查是否有错误;
4、开始计算实现的功能是把第一步输入的矩阵进行高斯消元,化成上三角矩阵,求出X[N]的解;
5、显示结果计算完成后,通过此函数来显示结果,此函数可以显示消元后的的上三角矩阵和最终结果;
6、重新输入如果检查后发现输入的错误太多,可以应用此函数直接清除第一步所输入的数据,重新开始;
除上面介绍的功能之外,程序还具有退出功能,可以在程序的一次运行当中循环执行所有的功能,并根据需要终止程序的执行。
每一个要计算的方程都有三部分,方程的系数矩阵a[N][N]、矩阵b[N]、存储结果的矩阵x[N],此程序把a[N][N]和b[N]设为全局变量,有利于每一个模块对数组a[N][N]和b[N]的调用,每次所输入的矩阵都会记录在两个数组当中,通过输出的数足与要求的数足作比较通过计算函数对数组进行调用,当计算结束后,又把计算所得到的上三角矩阵存入数组a[N][N]中,这样就充分的利用了数组,在显示结果时还可以通过输出函数将消元后的上三角矩阵输出出来,这样对结果一目了然,还可以检查是否出现错误,因为上三角矩阵下方都应当为零,结果只能先算出最后一个x的值,然后依次往上计算最终算出x[1]的值;
二、程序流程图
1、程序总体结构图
图1程序总体结构图
2、具体功能框图
(1)输入矩阵函数PrintIn()
图2输入矩阵函数
(2)显示矩阵函数show1()
图3显示矩阵函数
(3)更改错误函数Change()
图4更改错误函数
(4)开始计算函数Begin()
图5开始计算函数
(5)显示结果函数show2()
图6显示结果函数
三、核心技术的实现说明及相应程序段
本程序主要由七个自定义函数和一个主函数组成,其中主函数以菜单的形式调用其它函数来实现要求的所有功能。
在这些函数当中,输入矩阵函数、显示矩阵函数、更改错误函数、开始计算函数和显示最终结果的函数是程序中较为核心的部分,下面分别进行说明。
1、输入矩阵函数
因为此程序开始定义全局变量是就已经为a[N][N]、b[N]赋初值,这样对显示矩阵项有好处,输入矩阵,其实就是对矩阵值的修改,首先输出的是N值,从而知道是几阶矩阵,然而N值不可以超出100,不然会显示输出错误,而后输入的是矩阵a[N][N]的值,当输入完毕后,在输入矩阵b[N]的值,b[N]的值是一一输入的,避免出现错误。
具体的程序段如下:
voidPrintIn()//输入矩阵
{
printf("请输入矩阵的阶数:
");
scanf("%d",&N);
printf("\n");
while(N<1||N>100)//矩阵的阶数不能超出100
{
printf("输入有错误!
:
\n");
printf("****请输入正确的值(0 scanf("%d",&N); } printf("请输入矩阵a[%d][%d]: \n",N,N);//输入矩阵a[N][N] for(i=0;i { for(j=0;j { scanf("%lf",&a[i][j]); } } for(i=0,center=0.0;i { printf("请输入矩阵b[%d]的值: ",i+1); scanf("%lf",¢er); printf("\n"); b[i]=center; } } 2、显示矩阵函数 本函数是对已经输入的矩阵a[N][N],b[N]进行输出,这样可以对矩阵进行检查,看是否有错误,如果有错误可选择更改错误项进行更改。 voidshow1() { printf("输入的矩阵a[%d][%d]为: \n",N,N);//确定所输入的矩阵a[N][N] for(i=0;i { for(j=0;j { printf("%lf",a[i][j]); } printf("\n"); } printf("输入的矩阵b[%d]为: \n",N);//确定所输入的矩阵b[N] for(i=0;i { printf("%lf",b[i]); printf("\n"); } } 3、更改错误 本函数主要对矩阵输入的错误进行更改,如果输入的错误较少,可以通过四函数对出现的错误进行纠正,免去了重新输入的麻烦节省时间,提高效率,此函数先判断输入数据错误的个数,然后依次对输入的错误进行更改,最后输出更改后的结果,再次判断输入的是否有错误。 具体程序段如下: voidChange()//更改错误 { intm,l,i,j,s; printf("发现错误数据的个数: "); scanf("%d",&s); for(i=1;i<=s;i++) { printf("请输入第%d个错误的行序号: ",i); scanf("%d",&m); printf("请输入第%d个错误的列序号: ",i); scanf("%d",&l); printf("请输入改正的值: "); scanf("%lf",&a[m-1][l-1]); printf("\n"); } printf("*****请检查改正后的矩阵是否正确*****\n"); for(i=0;i { for(j=0;j { printf("%lf",a[i][j]); } printf("\n"); } } 4、开始计算函数 此函数是得出结果最重要的部分,开始计算函数首先判断第一列中绝对值最大的数即主元,然后通过for语句使第一行与主元所在的行进行交换,随后进行消元工作,使第一列中除主元外的所有数都通过消元变成零,而且在此时也要对b[N]中的元素进行修改,然后通过主循环依次对每一列进行选主元和消元工作,最终得到上三角矩阵和最终的b[N]矩阵,这时我们可以通过计算算出x[N]的值。 最后一次计算,得出x[N-1]、x[N-2]、[x[N-3]、x[N-4]······最终得出x[1]的值,当输出计算成功时计算工作就算完成了,具体程序段如下: voidBegin()//开始计算 { longdoublesum; intk,I; for(k=0;k { center=fabs(a[k][k]); for(i=k+1,I=k;i { if(center { center=fabs(a[i][k]); I=i; } } if(i>k) { for(j=k;j { center=a[k][j]; a[k][j]=a[I][j]; a[I][j]=center; } center=b[k]; b[k]=b[I]; b[I]=center; } for(i=k+1;i { center=a[i][k]; for(j=k;j { a[i][j]-=(center*a[k][j]/a[k][k]); } b[i]-=(center*b[k]/a[k][k]); } } x[N-1]=b[N-1]/a[N-1][N-1];//得出x[N]的值 for(i=N-2;i>=0;i--) { sum=b[i]; for(j=N-1;j>i;j--)//for循环得出全部x[N]的值 { sum=sum-a[i][j]*x[j]; x[i]=sum/a[i][i]; } } printf("\n计算成功! \n"); } 5、显示结果函数 本函数就是对计算出来的结果进行显示,有助于我们利用计算出来的结果,本函数不但可以输出x[N]的结果,还可以输出上三角矩阵a[N][N]和b[N],具体的程序段如下: voidshow2() { printf("\n上三角矩阵为: \n");//输出消元后的上三角矩阵a[N][N] for(i=0;i { for(j=0;j { printf("%lf",a[i][j]); } printf("\n"); } printf("矩阵b[N]为: \n");//输出消元后的上三角矩阵b[N] for(i=0;i { printf("%lf\n",b[i]); } printf("输出的结果为: \n"); for(i=0;i { printf("x[%d]=%f\n",i+1,x[i]); } } 四、课设总结 我很感谢老师和同学的帮助,在老师的指导下,我很快掌握了C++应用,并且了解到C++编程的主要过程,要先想自己的程序需要多少函数,需要多少变量,先对这些做整体的设计,再通过C++软件对自己的程序进行输出,并运行更改其中的错误,这样既节省时间又提高工作的效率,通过此次课程设计,我深入的学习了C++软件,同时也掌握了它的操作技巧,很感谢工程实践中心安排这样的课程,使我受益匪浅。 五、参考文献 1谭浩强.C程序设计.北京: 清华大学出版社,2005 2刘成等.C语言程序设计实验指导与习题集.北京: 中国铁道出版社,2006 3王晓东,C程序设计简明教程,中国水利水电出版社,2006 六、源程序 /************************************************************************ 该函数的优点为 1,不但可以计算出规定的方程组2x+2y+5z=5 3x+4y+7z=6 x+3y+3z=5 还可以计算出矩阵小于100的所有x[N]的解; 2,如果输入错误较少,可以直接进行修改,不用重新输入,节省时间,提高效率! 3,用户界面友好,功能明确,操作方便。 4,代码缩进适当,并给出了必要的注释,增强了程序的可读性。 *************************************************************************/ #include"stdio.h" #include"conio.h"//其中定义了getch()函数。 #include"stdlib.h"//其中定义了system()函数。 #include"math.h"//其中定义了fabs()函数。 /*定义全局变量并对数组a,b初始化,center为中间变量*/ longdoublea[100][100]={0},b[100]={0},center,x[100]={0}; inti,j,N; voidmenu() { voidkuang();//函数声明 kuang();//函数调用 /*程序主界面*/ puts("欢迎进入高斯列主元消元法解线性方程组界面"); kuang(); puts("1.输入矩阵"); puts("2.更改错误"); puts("3.显示矩阵"); puts("4.开始计算"); puts("5.显示结果"); puts("6.重新输入"); puts("7.退出"); kuang(); printf("\n"); printf("请输入选择的操作序号,按回车键确认: \n"); } voidkuang()//设定主界面边框 { printf("\n"); printf("-※-*-*-*-*-*-※-*-*-*-*-*-*-*-*-*-※-*-*-*-*-*-*-*-*-*-※-*-*-*-*-*-*-*-※-"); } voidPrintIn()//输入矩阵 { printf("请输入矩阵的阶数: "); scanf("%d",&N); printf("\n"); while(N<1||N>100)//矩阵的阶数不能超出100 { printf("输入有错误! : \n"); printf("****请输入正确的值(0 scanf("%d",&N); } printf("请输入矩阵a[%d][%d]: \n",N,N);//输入矩阵a[N][N] for(i=0;i { for(j=0;j { scanf("%lf",&a[i][j]); } } for(i=0,center=0.0;i { printf("请输入矩阵b[%d]的值: ",i+1); scanf("%lf",¢er); printf("\n"); b[i]=center; } } voidshow1() { printf("输入的矩阵a[%d][%d]为: \n",N,N);//确定所输入的矩阵a[N][N] for(i=0;i { for(j=0;j { printf("%lf",a[i][j]); } printf("\n"); } printf("输入的矩阵b[%d]为: \n",N);//确定所输入的矩阵b[N] for(i=0;i { printf("%lf",b[i]); printf("\n"); } } voidBegin()//开始计算 { longdoublesum; intk,I; for(k=0;k { center=fabs(a[k][k]); for(i=k+1,I=k;i { if(center { center=fabs(a[i][k]); I=i; } } if(i>k) { for(j=k;j { center=a[k][j]; a[k][j]=a[I][j]; a[I][j]=center; } center=b[k]; b[k]=b[I]; b[I]=center; } for(i=k+1;i { center=a[i][k]; for(j=k;j { a[i][j]-=(center*a[k][j]/a[k][k]); } b[i]-=(center*b[k]/a[k][k]); } } x[N-1]=b[N-1]/a[N-1][N-1];//得出x[N]的值 for(i=N-2;i>=0;i--) { sum=b[i]; for(j=N-1;j>i;j--)//for循环得出全部x[N]的值 { sum=sum-a[i][j]*x[j]; x[i]=sum/a[i][i]; } } printf("\n\n"); } voidshow2() { printf("\n上三角矩阵为: \n");//输出消元后的上三角矩阵a[N][N] for(i=0;i { for(j=0;j { printf("%lf",a[i][j]); } printf("\n"); } printf("矩阵b[N]为: \n");//输出消元后的上三角矩阵b[N] for(i=0;i { printf("%lf\n",b[i]); } printf("输出的结果为: \n"); for(i=0;i { printf("x[%d]=%f\n",i+1,x[i]); } } voidChange()//更改错误 { intm,l,i,j,s; printf("发现错误数据的个数: "); scanf("%d",&s); for(i=1;i<=s;i++) { printf("请输入第%d个错误的行序号: ",i); scanf("%d",&m); printf("请输入第%d个错误的列序号: ",i); scanf("%d",&l); printf("请输入改正的值: "); scanf("%lf",&a[m-1][l-1]); printf("\n"); } printf("*****请检查改正后的矩阵是否正确*****\n"); for(i=0;i { for(j=0;j { printf("%lf",a[i][j]); } printf("\n"); } } voidclear() { system("cls"); PrintIn(); } voidmain()//主函数 { intchoice; menu();//函数调用 scanf("%d",&choice); while (1) { switch(choice)//选择相应的操作应用程序 { case1: PrintIn();break; case2: Change();break; case3: show1();break; case4: Begin();break; case5: show2();break; case6: clear();break; case7: exit(0); default: printf("输入错误,请输入列表中存在的序号! \n"); } menu(); scanf("%d",&choice); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 59 用高斯列主元消元法解 线性方程组