您好,欢迎来到五一七教育网。
搜索
您的当前位置:首页用高斯列主元消元法解线性方程分析解析

用高斯列主元消元法解线性方程分析解析

来源:五一七教育网
 沈 阳 航 空 工 业 学 院 课程设计 学 号************* 班 级 84020103 姓 名 李荣飞 指导教师 尹 航 2009年 9月 11 日 沈阳航空工业学院

课程设计任务书

电子信息工程学院 电子信息工程专业 84020103班 学号2008040201105

一、课程设计题目:用高斯列主元消元法解线性方程

二、课程设计工作自2009年9月6日起至2009年9月11日止 三、课程设计内容:

运用所学的C语言知识,编制和调试程序,具有如下功能:

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

2x13x1x12x24x23x25x37x33x3565

四、课程设计要求:

程序质量:

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

 用户界面友好,功能明确,操作方便;可以加以其它功能或修饰。  用户界面中的菜单至少应包括“输入数据”、“开始计算”、 “退

出”3项。

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

课程设计说明书:

课程结束后,上交课程设计说明书(打印稿和电子稿),其内容如下:  封面

 课程设计任务书  目录

 需求分析(分析题目的要求)

 程序流程图(总体流程图和主要功能模块流程图)  核心技术的实现说明及相应程序段  个人总结  参考资料

 源程序及适当的注释

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

目录

一、需求分析 ............................................................ 1 二、程序流程图........................................................ 2 三、核心技术的实现说明及相应程序段 ............... 8 四、个人总结 ........................................................... 11 五、参考文献 ........................................................... 11 六、源程序 ............................................................... 11

沈 阳 航 院 设 计 用 纸

一、需求分析

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

计算方程组模块对应三个函数,其函数名和功能如下: 一、交换行的距函数(huanhang):主要实现线性代数高斯列主元

消元法求解线性方程组中的初等行变换。 二、比较系数大小的函数(bijiao):实现比较系数大小的算法。 三、实现菜单选择的函数(caidan):使用户界面友好,操作方便。

除上面介绍的功能之外,程序还具有“继续运算/退出”功能,可以在程序的一次运行当中循环执行所有的功能,并根据需要,终止程序的执行。

1

沈 阳 航 院 设 计 用 纸

二、程序流程图

1、程序总体结构图

图1: 程序总体结构图

输出: 用Gauss列主元消元法解线性方程组 输出: 解方程组请按1. 输出: 退出程式请按2. 输入:所须选择的序号. 根据输入信息进行选择 2 1 其他 退出 调用 输出 error Yunsuan 调用 caidan() 调用 caidan()

2

沈 阳 航 院 设 计 用 纸

图1程序总体结构图

2、具体功能框图

(1)界面 caidan函数

图2 caidan函数

输出: 继续运算按 1 ,退出程序按 2! 根据getcher()值选择 Enter Ecs 其他 调用 退出 输出: 不合法的输入! Yunsuan 调用 caidan() (2) 比较 bijiao函数

图3: bijiao函数

temp=0 i=k

当i<=n时 A[i][k]的绝对值>temp 真 假

temp=A[i][k]的绝对值 flag=i return(temp) 3

沈 阳 航 院 设 计 用 纸

(3) 交换行的矩函数 huanhang函数

i=1 当i<=u+1时 A[0][i]=A[r][i] i++ i=1 当i<=u+1时 A[r][i]=A[k][i] i++ i=1 当i<=u+1 时 A[k][i]=A[0][i] i++

4

沈 阳 航 院 设 计 用 纸

图4: huanhang函数

(4) 运算 yunsuan函数 输出: 输入方程组的维数:n= 输入:n 输出: 现在输入系数矩阵A和向量b: i=1 当i<=n 当 输出:请输入系数和向量 j=1 当 i<=n+1时 输入A[i][j] i++ j++ k=1 当k<=n-1时 ark=bijiao(k) ark==0 真 假 输出:此方程组不合法!error! flag!=k 真 假 调用caidan() 调用huanhang()并 代入flog,k的值 i=k+1 (接下页) 5 沈 阳 航 院 设 计 用 纸

接上一页: i=k+1 (接上一页) 当i<=n i=k+1 当 j<=n+1 A[i][j]=A[i][j]-A[k][j]*A[i][k]/A[k][k] j++ i++ k++ x[n]=A[n][n+1]/A[n][n] k=n-1 当k>=1时 me=0 j=k+1 当i<=n me=me+A[k][j]*X[j] j++ x[k]=(A[k][n+1]-me)/A[k][k] k-- i=1 (接下一页) 6 沈 阳 航 院 设 计 用 纸

接上一页:

i=1(接上一页) 当i<=n时 输出: i,x[i] i++ 调用caidan() 图5: yunsuan函数

7

沈 阳 航 院 设 计 用 纸

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

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

1、比较系数大小的函数

比较系数大小的函数主要是为 运算函数 所做准备的, fabs是求双精度浮点数的绝对值的函数。 输入参数是双精度浮点数,计算结果送返绝对值,也是双精度浮点数这样才可以保证以前已经存在的数据不丢失。具体的程序段如下: float bijiao(int k) /*比较系数大小的函数*/ { int i;

float temp=0; for(i=k;i<=n;i++ ) if(fabs(A[i][k])>temp) {

temp=fabs(A[i][k]); flag=i; }

return temp; }

2、运算函数

8

沈 阳 航 院 设 计 用 纸

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

float yunsuan() {

float x[NUMBER]; /*此数组用于存放方程解*/ int r,k,i,j;

printf(\"\\n\\n 输入方程组的维数:n=\"); scanf(\"%d\

printf(\" \\n\\n现在输入系数矩阵A和向量b:\"); for(i=1;i<=n;i++ ) {

printf(\"\\n\\n请输入a?-a%d%d系数和向量b%d:\ /*实现将每一行中的系数和向量一次性输入,数之间用空格格开,输完后回车确定*/

for(j=1;j<=n+1;j++ ) /*将刚才输入的数存入数组*/ scanf(\"%f\}

for(k=1;k<=n-1;k++ ) {

ark=bijiao(k);

if(ark==0) /*判断方程是否为线性方程,即是否合法*/

9

沈 阳 航 院 设 计 用 纸

{

printf(\"\\n\\n此方程组不合法!error!\");caidan(); }

else if(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--) {

float me=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\}

10

沈 阳 航 院 设 计 用 纸

四、个人总结

这次课设让我更熟悉的掌握了通过C语言运用高斯定理解方程组,也使我对二维数组的认识更加深入了解,也对C语言有了更深入的学习研究,我已感觉到我已经从C语言的门口迈入了殿堂,对C语言有了更好的认识。在完成程序中,遇到过较大的困难,但通过重新深入教材和对资料的理解,最终逐步完成。

五、参考文献

1 谭浩强.《C程序设计》.北京:清华大学出版社,2005 2 刘成等.《C语言程序设计实验指导与习题集》.北京:中国铁道出版社,2006

六、源程序

#include #include #include #define NUMBER 20

float A[NUMBER][NUMBER+1] ,ark; int flag,n;

huanhang(int r,int k); float bijiao(int k); caidan();

float yunsuan(); char celect; void main() {

11

沈 阳 航 院 设 计 用 纸

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(); }

float yunsuan() {

float x[NUMBER]; /*此数组用于存放方程解*/ int r,k,i,j;

printf(\"\\n\\n 输入方程组的维数:n=\"); scanf(\"%d\

printf(\" \\n\\n现在输入系数矩阵A和向量b:\"); for(i=1;i<=n;i++ ) {

printf(\"\\n\\n请输入a0-a%d%d系数和向量b%d:\

printf(\"\\n(即将每一行中的系数和向量一次性输入,数之间用空格格开,输完后回车确定)\\n\");

/*实现将每一行中的系数和向量一次性输入,数之间用空格格开,输完后回车确定*/

for(j=1;j<=n+1;j++ ) /*将刚才输入的数存入数组*/ scanf(\"%f\}

for(k=1;k<=n-1;k++ ) {

12

沈 阳 航 院 设 计 用 纸

ark=bijiao(k);

if(ark==0) /*判断方程是否为线性方程,即是否合法*/ {

printf(\"\\n\\n此方程组不合法!error!\");caidan(); }

else if(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--) {

float me=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\}

return caidan(); }

huanhang(int r,int k) /*交换行的矩函数*/ {

int i;

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];

13

沈 阳 航 院 设 计 用 纸

for(i=1;i<=n+1;i++ ) A[k][i]=A[0][i]; }

float bijiao(int k) /*比较系数大小的函数*/ {

int i;

float temp=0;

for(i=k;i<=n;i++ )

if(fabs(A[i][k])>temp) {

temp=fabs(A[i][k]); flag=i; }

return temp; }

caidan() /*实现菜单选择的函数*/ {

printf(\"\\n\\n 继续运算按1 ,退出程序按2!\"); switch(getchar()) {

case '1': yunsuan(); case '2': exit(0);

default:{printf(\"\\n\\n不合法的输入!\");caidan();} } }

14

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 517ttc.cn 版权所有 赣ICP备2024042791号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务