用高斯列主元消元法解线性方程分析解析.docx
《用高斯列主元消元法解线性方程分析解析.docx》由会员分享,可在线阅读,更多相关《用高斯列主元消元法解线性方程分析解析.docx(15页珍藏版)》请在冰豆网上搜索。
用高斯列主元消元法解线性方程分析解析
沈阳航空工业学院
课程设计
学号200**********
班级84020103
姓名李荣飞
指导教师尹航
2009年9月11日
沈阳航空工业学院
课程设计任务书
电子信息工程学院电子信息工程专业********班学号200**********
一、课程设计题目:
用高斯列主元消元法解线性方程
二、课程设计工作自2009年9月6日起至2009年9月11日止
三、课程设计内容:
运用所学的C语言知识,编制和调试程序,具有如下功能:
请用高斯列主元消元法解下列方程组:
四、课程设计要求:
程序质量:
●贯彻结构化程序设计思想。
●用户界面友好,功能明确,操作方便;可以加以其它功能或修饰。
●用户界面中的菜单至少应包括“输入数据”、“开始计算”、“退出”3项。
●代码应适当缩进,并给出必要的注释,以增强程序的可读性。
课程设计说明书:
课程结束后,上交课程设计说明书(打印稿和电子稿),其内容如下:
●封面
●课程设计任务书
●目录
●需求分析(分析题目的要求)
●程序流程图(总体流程图和主要功能模块流程图)
●核心技术的实现说明及相应程序段
●个人总结
●参考资料
●源程序及适当的注释
指导教师:
________学生签名:
________
一、需求分析
经过对程序设计题目的分析可知,整个程序的设计实现大致分为三个模块,分别是:
输入方程组,计算方程组,继续运算/退出。
计算方程组模块对应三个函数,其函数名和功能如下:
一、交换行的距函数(huanhang):
主要实现线性代数高斯列主元消元法求解线性方程组中的初等行变换。
二、比较系数大小的函数(bijiao):
实现比较系数大小的算法。
三、实现菜单选择的函数(caidan):
使用户界面友好,操作方便。
除上面介绍的功能之外,程序还具有“继续运算/退出”功能,可以在程序的一次运行当中循环执行所有的功能,并根据需要,终止程序的执行。
二、程序流程图
1、程序总体结构图
图1:
程序总体结构图
图1程序总体结构图
2、具体功能框图
(1)界面caidan函数
图2caidan函数
(2)比较bijiao函数
图3:
bijiao函数
(3)
交换行的矩函数huanhang函数
图4:
huanhang函数
(4)运算yunsuan函数
当
接上一页:
接上一页:
图5:
yunsuan函数
三、核心技术的实现说明及相应程序段
本程序一共由四个自定义函数和一个主函数组成,其中主函数以菜单的形式调用其他函数来实现要求的所有功能。
在这些函数当中,比较系数大小的函数、运算函数是程序中较为核心的部分,下面分别进行说明。
1、比较系数大小的函数
比较系数大小的函数主要是为运算函数所做准备的,fabs是求双精度浮点数的绝对值的函数。
输入参数是双精度浮点数,计算结果送返绝对值,也是双精度浮点数这样才可以保证以前已经存在的数据不丢失。
具体的程序段如下:
floatbijiao(intk)/*比较系数大小的函数*/
{
inti;
floattemp=0;
for(i=k;i<=n;i++)
if(fabs(A[i][k])>temp)
{
temp=fabs(A[i][k]);
flag=i;
}
returntemp;
}
2、运算函数
运算函数是本程序的主要部分,首先输入系数和向量后存入数组,判断方程是否合法,不合法则返回菜单,然后通过循环解二维数组,最后输出结果i,x[i],具体程序段如下:
floatyunsuan()
{
floatx[NUMBER];/*此数组用于存放方程解*/
intr,k,i,j;
printf("\n\n输入方程组的维数:
n=");
scanf("%d",&n);
printf("\n\n现在输入系数矩阵A和向量b:
");
for(i=1;i<=n;i++)
{
printf("\n\n请输入a?
-a%d%d系数和向量b%d:
",i,i,n);
/*实现将每一行中的系数和向量一次性输入,数之间用空格格开,输完后回车确定*/
for(j=1;j<=n+1;j++)/*将刚才输入的数存入数组*/
scanf("%f",&A[i][j]);
}
for(k=1;k<=n-1;k++)
{
ark=bijiao(k);
if(ark==0)/*判断方程是否为线性方程,即是否合法*/
{
printf("\n\n此方程组不合法!
error!
");caidan();
}
elseif(flag!
=k)
huanhang(flag,k);
for(i=k+1;i<=n;i++)
for(j=k+1;j<=n+1;j++)
A[i][j]=A[i][j]-A[k][j]*A[i][k]/A[k][k];
}
x[n]=A[n][n+1]/A[n][n];
for(k=n-1;k>=1;k--)
{
floatme=0;
for(j=k+1;j<=n;j++)
{
me=me+A[k][j]*x[j];
}
x[k]=(A[k][n+1]-me)/A[k][k];
}
for(i=1;i<=n;i++)
{
printf("\n\nx%d=%f",i,x[i]);
}
四、个人总结
这次课设让我更熟悉的掌握了通过C语言运用高斯定理解方程组,也使我对二维数组的认识更加深入了解,也对C语言有了更深入的学习研究,我已感觉到我已经从C语言的门口迈入了殿堂,对C语言有了更好的认识。
在完成程序中,遇到过较大的困难,但通过重新深入教材和对资料的理解,最终逐步完成。
五、参考文献
1谭浩强.《C程序设计》.北京:
清华大学出版社,2005
2刘成等.《C语言程序设计实验指导与习题集》.北京:
中国铁道出版社,2006
六、源程序
#include
#include
#include
#defineNUMBER20
floatA[NUMBER][NUMBER+1],ark;
intflag,n;
huanhang(intr,intk);
floatbijiao(intk);
caidan();
floatyunsuan();
charcelect;
voidmain()
{
printf("\n\n用Gauss列主元消元法解线性方程组");
printf("\n\n1.解方程组请按1.");
printf("\n\n2.退出程式请按2.");
celect=getchar();
switch(celect)
{
case'2':
exit(0);
case'1':
yunsuan();
default:
{printf("error");caidan();}
}
caidan();
}
floatyunsuan()
{
floatx[NUMBER];/*此数组用于存放方程解*/
intr,k,i,j;
printf("\n\n输入方程组的维数:
n=");
scanf("%d",&n);
printf("\n\n现在输入系数矩阵A和向量b:
");
for(i=1;i<=n;i++)
{
printf("\n\n请输入a0-a%d%d系数和向量b%d:
",i,i,n);
printf("\n(即将每一行中的系数和向量一次性输入,数之间用空格格开,输完后回车确定)\n");
/*实现将每一行中的系数和向量一次性输入,数之间用空格格开,输完后回车确定*/
for(j=1;j<=n+1;j++)/*将刚才输入的数存入数组*/
scanf("%f",&A[i][j]);
}
for(k=1;k<=n-1;k++)
{
ark=bijiao(k);
if(ark==0)/*判断方程是否为线性方程,即是否合法*/
{
printf("\n\n此方程组不合法!
error!
");caidan();
}
elseif(flag!
=k)
huanhang(flag,k);
for(i=k+1;i<=n;i++)
for(j=k+1;j<=n+1;j++)
A[i][j]=A[i][j]-A[k][j]*A[i][k]/A[k][k];
}
x[n]=A[n][n+1]/A[n][n];
for(k=n-1;k>=1;k--)
{
floatme=0;
for(j=k+1;j<=n;j++)
{
me=me+A[k][j]*x[j];
}
x[k]=(A[k][n+1]-me)/A[k][k];
}
for(i=1;i<=n;i++)
{
printf("\n\nx%d=%f",i,x[i]);
}
returncaidan();
}
huanhang(intr,intk)/*交换行的矩函数*/
{
inti;
for(i=1;i<=n+1;i++)
A[0][i]=A[r][i];
for(i=1;i<=n+1;i++)
A[r][i]=A[k][i];
for(i=1;i<=n+1;i++)
A[k][i]=A[0][i];
}
floatbijiao(intk)/*比较系数大小的函数*/
{
inti;
floattemp=0;
for(i=k;i<=n;i++)
if(fabs(A[i][k])>temp)
{
temp=fabs(A[i][k]);
flag=i;
}
returntemp;
}
caidan()/*实现菜单选择的函数*/
{
printf("\n\n继续运算按1,退出程序按2!
");
switch(getchar())
{
case'1':
yunsuan();
case'2':
exit(0);
default:
{printf("\n\n不合法的输入!
");caidan();}
}
}