04033020用高斯列主元消元法解线性方程组.docx
《04033020用高斯列主元消元法解线性方程组.docx》由会员分享,可在线阅读,更多相关《04033020用高斯列主元消元法解线性方程组.docx(17页珍藏版)》请在冰点文库上搜索。
04033020用高斯列主元消元法解线性方程组
沈阳航空工业学院
课程设计
学号200704033020
班级7403301
姓名刘阳
指导教师王晓岩
2009年3月6日
沈阳航空工业学院
课程设计任务书
院系:
航空宇航工程学院专业:
飞行器设计与工程班级:
7403301
学号:
200704033020题目:
用高斯列主元消元法解线性方程组
一、课程设计时间
2008~09第2学期第1周,共计1周,20学时。
二、课程设计内容
用C语言编写程序完成以下任务:
请用高斯列主元消元法解下列线性方程组:
三、课程设计要求
1.程序质量:
✧贯彻结构化的程序设计思想。
✧用户界面友好,功能明确,操作方便。
✧用户界面中的菜单至少应包括“输入数据”、“开始计算”、“退出”3项。
✧代码应适当缩进,并给出必要的注释,以增强程序的可读性。
2.课程设计说明书:
课程结束后,上交课程设计说明书和源程序。
课程设计说明书的格式和内容参见提供的模板。
高斯消元法解题步骤:
(AX=b):
方法说明(以4阶为例)
●第一步消元——在增广矩阵(A,b)第一列中找到绝对值最大的元素,将其所在行与第一行交换,再对(A,b)做初等行变换使原方程组转化为如下形式:
●第二步消元——在增广矩阵(A,b)中的第二列中(从第二行开始)找到绝对值最大的元素,将其所在行与第二行交换,再对(A,b)做初等行变换使原方程组转化为:
●第三步消元——在增广矩阵(A,b)中的第三列中(从第三行开始)找到绝对值最大的元素,将其所在行与第二行交换,再对(A,b)做初等行变换使原方程组转化为:
按x4x3x2x1的顺序回代求解出方程组的解。
指导教师:
________学生签名:
________
五、说明书成绩:
六、教师评语:
目录
一、需求分析1
二、程序流程图2
三、核心技术的实现说明及相应程序段8
四、个人总结11
五、参考文献11
六、源程序11
一、需求分析
经过对程序设计题目的分析可知,整个程序的设计实现大致分为三个模块,分别是:
输入方程组系数及结果,计算方程组,继续运算或退出。
计算方程组模块对应如下:
一、添加数据(行列式每行的系数和结果):
主要实现程序最初运行时学生数据的录入。
二、进行运算:
运用gauss函数进行运算,并最终显示结果。
三、继续运算/退出:
可以在程序的一次运行当中循环执行所有的功能,并根据需要,终止程序的执行。
二、程序流程图
1、程序总体结构图
图1:
程序总体结构图
显示文本模式窗口
输出:
用Gauss列主元消元法解线性方程组
输出:
解方程组请按Enter.
输出:
退出程式请按Esc.
输入:
所须选择的序号.
根据输入信息进行选择
ESCEnter其他
退出输出“无根或大于二个
调用gauss函数
图1程序总体结构图
2、具体功能框图
(1)菜单函数
图1
(2)添加系数:
Putin函数,输入行列式系数和结果
图2
图3
(3)guass
图4
三、核心技术的实现说明及相应程序段
本程序一共由两个自定义函数和一个主函数组成,其中主函数以菜单的形式调用其他函数来实现要求的所有功能。
在这些函数当中,运算函数是程序中较为核心的部分,下面分别进行说明。
1、运算函数
运算函数是本程序的主要部分,首先输入系数和向量后存入数组,判断方程是否合法,不合法则返回菜单,然后通过循环解二维数组,最后输出结果x[i],具体程序段如下:
voidgauss()
{
//doublea[n][n];
//doubleb[n];
doublex[n];
for(intk=0;k<(n-1);k++)
{
doubleamax=abc(a[k][k]);
intl=k;
for(inti=k+1;i{
if(amax{
amax=abc(a[i][k]);
l=i;
}
}
if(amax==0)
{printf("无根或根大于二个\n");
return;
}
if(l!
=k)
{
doublet=0;
for(intj=k;j{
t=a[k][j];a[k][j]=a[l][j];a[l][j]=t;
}
t=b[k];b[k]=b[l];b[l]=t;
}
for(i=k+1;i{a[i][k]=a[i][k]/a[k][k];
b[i]=b[i]-a[i][k]*b[k];
for(intj=k+1;j{
a[i][j]=a[i][j]-a[i][k]*a[k][j];
}
}
}
if(a[n-1][n-1]==0)
{printf("无根或根大于二个\n");
return;
}
else
{
b[n-1]=x[n-1]=b[n-1]/a[n-1][n-1];
for(inti=n-2;i>=0;i--)
{
doubles=0;
for(intj=i+1;j{
s+=a[i][j]*x[j];
}
b[i]=x[i]=(b[i]-s)/a[i][i];
}
}
printf("方程组的解为x=(");
for(inti=0;i{
printf("%lf",x[i]);
if(i!
=(n-1))
printf(",");
}
printf(")");
}
四、个人总结
这次课设让我更熟悉的掌握了通过C语言运用高斯定理解方程组,也使我对二维数组的认识更加深入了解,在完成程序中,遇到过较大的困难,但通过重新深入教材和对资料理解的基础逐步完成。
五、参考文献
1谭浩强.《C程序设计》.北京:
清华大学出版社,2005
2刘成等.《C语言程序设计实验指导与习题集》.北京:
中国铁道出版社,2006
六、源程序
#include
#include
#include
#include"stdlib.h"//其中定义了system()函数
#definen3
doublea[n][n];
doubleb[n];
voidmenu();
voidputin();
voidstart();
voidmenu()
{printf("*************************高斯消去法*************************");
printf("\n1输入数据");
printf("\n2开始计算");
printf("\n3退出");
}
voidputin()
{
intp,j;
for(p=0;p{
printf("输入第");
printf("%d",p+1);
printf("行系数:
\n");
for(j=0;jscanf("%lf",&a[p][j]);
}
for(p=0;p{
printf("输入第");
printf("%d",p+1);
printf("行结果:
\n");
scanf("%lf",&b[p]);
}
}
doubleabc(doublex)
{
if(x<0)return((-1)*x);
returnx;
}
voidgauss()
{
//doublea[n][n];
//doubleb[n];
doublex[n];
for(intk=0;k<(n-1);k++)
{
doubleamax=abc(a[k][k]);
intl=k;
for(inti=k+1;i{
if(amax{
amax=abc(a[i][k]);
l=i;
}
}
if(amax==0)
{printf("无根或根大于二个\n");
return;
}
if(l!
=k)
{
doublet=0;
for(intj=k;j{
t=a[k][j];a[k][j]=a[l][j];a[l][j]=t;
}
t=b[k];b[k]=b[l];b[l]=t;
}
for(i=k+1;i{a[i][k]=a[i][k]/a[k][k];
b[i]=b[i]-a[i][k]*b[k];
for(intj=k+1;j{
a[i][j]=a[i][j]-a[i][k]*a[k][j];
}
}
}
if(a[n-1][n-1]==0)
{printf("无根或根大于二个\n");
return;
}
else
{
b[n-1]=x[n-1]=b[n-1]/a[n-1][n-1];
for(inti=n-2;i>=0;i--)
{
doubles=0;
for(intj=i+1;j{
s+=a[i][j]*x[j];
}
b[i]=x[i]=(b[i]-s)/a[i][i];
}
}
printf("方程组的解为x=(");
for(inti=0;i{
printf("%lf",x[i]);
if(i!
=(n-1))
printf(",");
}
printf(")");
}
voidmain()
{
while
(1)
{
intq;
menu();
printf("\n请输入您要选择的操作序列号,按回车键确认:
");
scanf("%d",&q);
switch(q)
{
case1:
putin();break;
case2:
gauss();break;
case3:
exit(0);break;
default:
printf("输入错误,请输入列表中存在的序列号!
\n");
}
}
}