高斯列主元消元法
课程设计任务书
一、课程设计题目:用高斯列主元消元法解线性方程
二、课程设计工作自2008年6月23日起至2008年6月27日止 三、课程设计内容:
运用所学的C 语言知识, 编制和调试程序, 具有如下功能:
请用高斯列主元消元法解下列方程组:
⎧2x 1⎪⎨3x 1⎪x ⎩1
+++
2x 24x 23x 2
+++
5x 37x 33x 3
===
565
四、课程设计要求:
程序质量:
● ● ●
用模快化程序设计方法;在程序界面,以菜单的形式调用各功能函数:程序可读性强,界面友好;输出形式尽量美观。
用户界面友好,功能明确,操作方便;可以加以其它功能或修饰。 用户界面中的菜单至少应包括“输入数据”、“开始计算”、 “退
出”3项。
● 代码应适当缩进,并给出必要的注释,以增强程序的可读性。
附:高斯列主元消元法求解线性方程组AX=b的简要步骤
(高斯消元过程)
AX=b:
⎡a 11⎢a ⎢21⎢ ⎢⎣a n 1
a 12a 22 a n 2
a 1n ⎤⎡x 1⎤⎡b 1⎤
⎥⎢⎥⎢⎥a 2n x b
⎥⋅⎢2⎥=⎢2⎥ ⎥⎢ ⎥⎢ ⎥⎥⎢⎥⎢⎥a nn ⎦⎣x n ⎦⎣b n ⎦
●
方法说明(以4阶为例)
第一步消元——在增广矩阵(A ,b )第一列中找到绝对值最大的元素,将其所在行与第一行交换,再对(A ,b )做初等行变换使原方程组转化为如下形式:
⎡*⎢0⎢⎢0⎢⎣0
****
****
*⎤⎡x 1⎤⎡*⎤⎥⎢⎥⎢⎥
x **⎥⋅⎢2⎥=⎢⎥ *⎥⎢x 3⎥⎢*⎥⎥⎢⎥⎢⎥*⎦⎣x 4⎦⎣*⎦
●
第二步消元——在增广矩阵(A ,b )中的第二列中(从第二行开始)找到绝对值最大的元素,将其所在行与第二行交换,再对(A ,b )做初等行变换使原方程组转化为:
⎡*⎢0⎢⎢0⎢⎣0
**00
****
*⎤⎡x 1⎤⎡*⎤⎥⎢⎥⎢⎥
x **⎥⋅⎢2⎥=⎢⎥ *⎥⎢x 3⎥⎢*⎥⎥⎢⎥⎢⎥*⎦⎣x 4⎦⎣*⎦
● 第三步消元——在增广矩阵(A ,b )中的第三列中(从第三行开始)找到绝对值最大的元素,将其所在行与第二行交换,再对(A ,b )做初等行变换使原方程组转化为:
⎡*⎢0⎢⎢0⎢⎣0
**00
***0
*⎤⎡x 1⎤⎡*⎤⎥⎢⎥⎢⎥
x **⎥⋅⎢2⎥=⎢⎥ *⎥⎢x 3⎥⎢*⎥⎥⎢⎥⎢⎥*⎦⎣x 4⎦⎣*⎦
按x 4 → x 3→ x2→ x1 的顺序回代求解出方程组的解。
课程设计说明书:
课程结束后,上交课程设计说明书(打印稿和电子稿),其内容如下: ● 封面
● 课程设计任务书 ● ● ● ● ● ● ●
目录
需求分析(分析题目的要求)
程序流程图(总体流程图和主要功能模块流程图) 核心技术的实现说明及相应程序段 个人总结 参考资料
源程序及适当的注释
指导教师:________ 学生签名:________
目录
一、需求分析 . ...........................................................1 二、程序流程图 . .......................................................1 三、核心技术的实现说明及相应程序段 ............... 4 四、个人总结 . ...........................................................8 五、参考文献 . ...........................................................9 六、源程序 . ...............................................................9
一、需求分析
经过对程序设计题目的分析可知,整个程序的设计实现大致分为三个模块,分别是:输入方程组,计算方程组,继续运算/退出。
计算方程组模块对应三个函数,其函数名和功能如下: 一、菜单(menu ):使用户界面友好,操作方便。 二、调换(swap ):实现两个传递系数之间调换。 三、输入数据函数(input ):其功能是输入方程系数
四、计算函数:( count):核心部分,列主元消元法,并输出
。二、程序流程图 1、程序总体结构图
图1: 程序总体结构图
2、具体功能框图
1:SWAP 函数
2:INPUT 函数
3COUNT 函数
三、核心技术的实现说明及相应程序段
本程序一共由三个自定义函数和一个主函数组成,其中主函数以菜单的形式调用其他函数来实现要求的所有功能。在这些函数当中,交换函数,运算函数是程序中较为核心的部分,其他的函数为辅,整个程序运行的主界面如下:
下面作分布解说: 1、交换赋值函数
{ }
t = a; a = b; b = t;
void swap(float &a,float &b)
2、输入函数,为方程赋予初值
void input() {
printf("a1X1 + b1X2 + c1X3 = d1\na2X1 + b2X2 + c2X3 = d2\na3X1 + b3X2 + c3X3 = d3\n"); printf("!!!以逗号隔开, 回车结束!!!\n");
}
printf("input three num for a1,a2,a3:"); scanf("%f,%f,%f",&a1,&a2,&a3); printf("input three num for b1,b2,b3:"); scanf("%f,%f,%f",&b1,&b2,&b3); printf("input three num for c1,c2,c3:"); scanf("%f,%f,%f",&c1,&c2,&c3);
printf("input three num for d1,d2,d3:"); scanf("%f,%f,%f",&d1,&d2,&d3);
3、运算函数
运算函数是本程序的主要部分,首先列第一列主元(找到第一列的最大系数)然后通过调用SWAP 函数,掉到第一行,依此类推。求出Xn 然后回带,最后打印出来
void count()
{
if(a1 * a1
}
b2=b1*(a2/a1*(-1))+b2;
b3=b1*(a3/a1*(-1))+b3; c2=c1*(a2/a1*(-1))+c2; c3=c1*(a3/a1*(-1))+c3;
d2=d1*(a2/a1*(-1))+d2;
d3=d1*(a3/a1*(-1))+d3;
if(b2 * b2
{ } swap(b2,b3); swap(c2,c3); swap(d2,d3); c3 = c2 * ( b3/b2 * (-1)) + c3 ; d3 = d2 * ( b3/b2 * (-1)) + d3 ; x3 = d3 / c3; x2 = ( d2 - (x3 * c2) )/b2; x1 = (d1 - (x2 * b1) - (x3 * c1))/a1;
} printf("x1 = %.3f\nx2 = %.3f\nx3 = %.3f\n",x1,x2,x3);
四、个人总结
这次课设让我更熟悉的掌握了通过C 语言运用高斯定理解方程组,也使我对二维数组的认识更加深入了解,在完成程序中,遇到过较大的困难,但通过重新深入教材和对资料理解的基础逐步完成。
五、参考文献
1 谭浩强.《C 程序设计》.北京:清华大学出版社,2006 2 刘成等.《C 语言程序设计实验指导与习题集》.北京:中国铁道出版社,2007
六、源程序
#include "stdio.h"
#include "conio.h"//其中定义了getch()函数。
void menu()
{
puts("1. 数据输入");
puts("2. 开始计算");
puts("3. 退出");
}
float a1,a2,a3,b1,b2,b3,c1,c2,c3,d1,d2,d3;
float t;
float x1,x2,x3;
void swap(float &a,float &b)
{
t = a;
a = b;
b = t;
}
void input()
{
printf("a1X1 + b1X2 + c1X3 = d1\na2X1 + b2X2 + c2X3 =
d2\na3X1 + b3X2 + c3X3 = d3\n");
printf("!!!以逗号隔开, 回车结束!!!\n");
printf("input three num for a1,a2,a3:");
scanf("%f,%f,%f",&a1,&a2,&a3);
printf("input three num for b1,b2,b3:");
scanf("%f,%f,%f",&b1,&b2,&b3);
printf("input three num for c1,c2,c3:");
scanf("%f,%f,%f",&c1,&c2,&c3);
printf("input three num for d1,d2,d3:");
scanf("%f,%f,%f",&d1,&d2,&d3);
}
void count()
{
if(a1 * a1
{
swap(a1,a2);
swap(b1,b2);
swap(c1,c2);
swap(d1,d2);
}
if(a1 * a1
{
swap(a1,a3);
swap(b1,b3);
swap(c1,c3);
swap(d1,d3);
}
b2=b1*(a2/a1*(-1))+b2;
b3=b1*(a3/a1*(-1))+b3;
c2=c1*(a2/a1*(-1))+c2;
c3=c1*(a3/a1*(-1))+c3;
d2=d1*(a2/a1*(-1))+d2;
d3=d1*(a3/a1*(-1))+d3;
if(b2 * b2
{
swap(b2,b3);
swap(c2,c3);
swap(d2,d3);
}
c3 = c2 * ( b3/b2 * (-1)) + c3 ;
d3 = d2 * ( b3/b2 * (-1)) + d3 ;
x3 = d3 / c3;
x2 = ( d2 - (x3 * c2) )/b2;
x1 = (d1 - (x2 * b1) - (x3 * c1))/a1;
printf("x1 = %.3f\nx2 = %.3f\nx3 = %.3f\n",x1,x2,x3);
}
void main()
{
char choice;
menu();
choice=getch();
while(1)
{
switch(choice)
{
case '1':input();break;
case '2':count();break;
case '3':return;break;
}
choice=getch();
}
}