200704033020用高斯列主元消元法解线性方程组

  • 格式:doc
  • 大小:105.50 KB
  • 文档页数:19

沈 阳 航 空 工 业 学 院

课程设计

学 号200704033020

班 级 7403301

姓 名 刘阳

指导教师 王晓岩

2009年 3月 6日 沈阳航空工业学院

课程设计任务书

院系:航空宇航工程学院 专业:飞行器设计与工程 班级:7403301

学号:200704033020 题目:用高斯列主元消元法解线性方程组

一、课程设计时间

2008~09第2学期第1周,共计1周,20学时。

二、课程设计内容

用C语言编写程序完成以下任务:

请用高斯列主元消元法解下列线性方程组:

53367435522321321321xxxxxxxxx

三、课程设计要求

1. 程序质量:

 贯彻结构化的程序设计思想。

 用户界面友好,功能明确,操作方便。

 用户界面中的菜单至少应包括“输入数据”、“开始计算”、 “退出”3项。

 代码应适当缩进,并给出必要的注释,以增强程序的可读性。

2. 课程设计说明书:

课程结束后,上交课程设计说明书和源程序。课程设计说明书的格式和内容参见提供的模板。

高斯消元法解题步骤:(AX=b):

nnnnnnnnbbbxxxaaaaaaaaa2121212222111211

方法说明(以4阶为例)

 第一步消元——在增广矩阵(A,b)第一列中找到绝对值最大的元素,将其所在行与第一行交换,再对(A,b)做初等行变换使原方程组转化为如下形式: *******0***0***0****4321xxxx

 第二步消元——在增广矩阵(A,b)中的第二列中(从第二行开始)找到绝对值最大的元素,将其所在行与第二行交换,再对(A,b)做初等行变换使原方程组转化为:

******00**00***0****4321xxxx

 第三步消元——在增广矩阵(A,b)中的第三列中(从第三行开始)找到绝对值最大的元素,将其所在行与第二行交换,再对(A,b)做初等行变换使原方程组转化为:

*****000**00***0****4321xxxx

按x4  x3 x2 x1 的顺序回代求解出方程组的解。

指导教师:________ 学生签名:________

五、说明书成绩:

六、教师评语:

目录

一、需求分析 ............................................................ 1

二、程序流程图........................................................ 2

三、核心技术的实现说明及相应程序段 ............... 8

四、个人总结 ........................................................... 11

五、参考文献 ........................................................... 11

六、源程序 ............................................................... 11

沈 阳 航 院 设 计 用 纸

1 一、需求分析

经过对程序设计题目的分析可知,整个程序的设计实现大致分为三个模块,分别是:输入方程组系数及结果,计算方程组,继续运算或退出。

计算方程组模块对应如下:

一、添加数据(行列式每行的系数和结果):主要实现程序最初运行时学生数据的录入。

二、进行运算:运用gauss函数进行运算, 并最终显示结果。

三、继续运算/退出:可以在程序的一次运行当中循环执行所有的功能,并根据需要,终止程序的执行。

沈 阳 航 院 设 计 用 纸

2

二、程序流程图

1、程序总体结构图

图1: 程序总体结构图

显示文本模式窗口

输出: 用Gauss列主元消元法解线性方程组

输出: 解方程组请按Enter.

输出: 退出程式请按Esc.

输入:所须选择的序号.

根据输入信息进行选择

ESC Enter 其他

退出 输出 “无根或大于二个

调用gauss函数 沈 阳 航 院 设 计 用 纸

3

图1程序总体结构图

2、具体功能框图

(1)菜单函数

图1

(2) 添加系数:

Putin函数,输入行列式系数和结果 沈 阳 航 院 设 计 用 纸

4

图2

图3 沈 阳 航 院 设 计 用 纸

5 (3)guass

沈 阳 航 院 设 计 用 纸

6 沈 阳 航 院 设 计 用 纸

7

图4

沈 阳 航 院 设 计 用 纸

8 三、核心技术的实现说明及相应程序段

本程序一共由两个自定义函数和一个主函数组成,其中主函数以菜单的形式调用其他函数来实现要求的所有功能。在这些函数当中,运算函数是程序中较为核心的部分,下面分别进行说明。

1、运算函数

运算函数是本程序的主要部分,首先输入系数和向量后存入数组,判断方程是否合法,不合法则返回菜单,然后通过循环解二维数组,最后输出结果x[i],具体程序段如下:

void gauss()

{

//double a[n][n];

//double b[n];

double x[n];

for(int k=0;k<(n-1);k++)

{

double amax=abc(a[k][k]); 沈 阳 航 院 设 计 用 纸

9 int l=k;

for(int i=k+1;i

{

if(amax

{

amax=abc(a[i][k]);

l=i;

}

}

if(amax==0)

{printf("无根或根大于二个\n");

return;

}

if(l!=k)

{

double t=0;

for(int j=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(int j=k+1;j

10 {

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(int i=n-2;i>=0;i--)

{

double s=0;

for(int j=i+1;j

{

s+=a[i][j]*x[j];

}

b[i]=x[i]=(b[i]-s)/a[i][i];

}

}

printf("方程组的解为x=(");

for(int i=0;i

{

printf("%lf",x[i]);