学号
2016-2017 学年 第 2 学期
《C 语言程序设计》
课程设计报告
题 目 :
解非齐次线性方程
专 业 :
班 级 :
姓 名 :
指导教师:
成 绩 :
计算机学院
2017 年 4 月 21 日
1
计算机学院 《C 语言程序设计》课程设计报告
目录
1 设计内容及要求......................................3
1.1 设计内容.........................................3
1.2 具体要求.........................................3
2 概要设计.............................................3
2.1 判断是否有解....................................3
2.2 实现方法........................................5
2.3 主要函数介绍....................................6
2.4 计算非齐次线性方程组的计算程序...................7
3 3 设计过程及程序代码.................................7
3.1 源代码..........................................7
3.2 程序运行时的屏幕信息及运行示例..................16
4 设计结果分析.......................................18
5 参考文献...........................................19
致谢................................................19
小结................................................20
2
计算机学院 《C 语言程序设计》课程设计报告
1、设计内容及要求
1.1 设计内容
采用阶梯矩阵找出非齐次线性方程组的增广矩阵的秩,用大
小为未知量个数的双向栈存栈储自由未知量与非自由未知量,并
给出在微机上运行的模拟人工解题的 C 语言计算程序。
1.2 要求
明确课程设计的目的,能根据课程设计的要求,查阅相关文
献,为完成设计准备必要的知识; 提高学生用高级语言进行程序
设计的能力,重点提高用 C 语言进行算法编程技术水平;初步了
解软件开发的一般方法和步骤; 提高撰写技术文档的能力。
2 、概要设计
2.1 判断是否有解
根据线性方程组的系数矩阵与增广矩阵的秩是否相等
来判断方程组是否有解,若无解程序运行结束,若有解则进
行求解。
求系数矩阵的秩 r,增广矩阵的秩 zr 方法是将增广矩化
成阶梯形,观察方程组中的哪些未知量是一般未知量,哪些
是自由未知量,并赋一个相应的标记 vf,对第 i 个未知量(此
处设想常数项所对应的未知量为第 n+1 个未知量)来说,标
志函数的定义可写成下面的(2)式,这样方程组系数的矩
阵的秩就可由下面的(3)式计算,增广矩阵的秩可由下面
的(4)计算得到。
3
计算机学院 《C 语言程序设计》课程设计报告
Vf(i)={1 第 i 个未知量是一般未知量 0 第 i 个未知量是自
由未知量 i=1,2…,n+1
n
(2)
r=
Ʃ
j=1
Zr=r+vf(n+1)
(3)
(4)
若系数矩阵的秩 r 等于增广矩阵的秩 zr,则方程组有解,
否则无解。当方程组有解时从原方程组(1)中选出 r 个方
程组成新的方程组(5)。这里 line(i)
i=1,2,…r,i 代表新方程组
的第 i 个方程 line(i)指出新方程组中的第 i 个方程是原方程组
中的第 line(i)个方程。
r
j=1Ʃ
2.…,r
r
j=1Ʃ
其中
Cij=
aline(i)varx(j)xvarx(j)=
Cijxvarx(j)=
r
j=r+1Ʃ
{aline(i)varx(j)
-aline(i)varx(j)
aline(i)varx(j)
n
Ʃ
j=1
(-aline(i) xvarx(j))+aline(i),n+1
(6)
i=1,
Cijxvarx(j)+ci,n+1 i=1,2…,r (7)
1≤j≤r
r+1≤j≤n,i=1,2…,r
J=n+1
由于自由未知量个数有 n-r 个,故上述方程组等
4
计算机学院 《C 语言程序设计》课程设计报告
价于下面的 n-r+1 个方程组成的方程组:
{ C11xk,varx(1)+…+C1rxk,varx(x)=c1,r+k
Cr,1xk,varx(1)+…+cr rxk, varx(r)=cr,r+k
…
…………………………………………………
k=1,…,n-r+1
当 k=1,…,r 时求得的是基础解系,当 k=n-r+1 时求得的
是特解。
第 k 个解得分量 xk,varx(j)=Dk,varx(j)/D j=1,2,…,r,k=1,2,…,
n-r+1,D 是上式的系数行列式,上式中用等号 Dk,varx(j)右边的
常数项代替第 j 列元素后所得到的行列式。
2.2 实现方法
Vf(i)的值在将增广矩阵化成阶梯形的过程中实现,其初
值 vf(i)=0,i=1,2…,n+1。
Line(i)的值也在将增广矩阵化成阶梯形的过程中实现,
其初值为 line(i)=I,i=1,2,…,m。
Varx(i)指(7)式中第 i 个未知量 xvarx(i)是(1)式中的第 varx(i)
个未知量。
Vf,line,varx 在程序中为一维数组。
系数矩阵与增广矩阵都用数组 a 表示,在求矩阵的秩时
使 用 数 组 b( 由 a 拷 贝 得 到 ),c 为 二 维 数 组 (Dk,varx(j),j=1, …
r,k=1,…n-r+1 的值存于二维数组 dsolution 中,获得的解分量
xk,varx(j)的分子,分母分别存与二维数组存储单元 x1[k][varx][j]]
5
计算机学院 《C 语言程序设计》课程设计报告
与 x2[k][varx[j]]中,最后根据数组 x1 与 x2 的存储情况给出
方程组(1)的通解。
2.3 主要函数介绍
将增广矩阵化成阶梯形函数 panbijeq0
该函数有四个整型参数。第一个参数(int i)是增广矩阵的
行号,初始值为增广矩阵的首行标(在 C 语言中为 0)。第二
个参数(int j)是增广矩阵的列,初始值为增广矩阵第一列元素
的列下标(在 C 语言中为 0)。
第三个参数(int m)与第四个参数(int n)分别为增广矩阵
的行数和列数。该函数在完成将增广矩阵化成阶梯形的同时
还完成未知量是一般未知量还是自由未知量的确定。该函数
的特点是递归调用,适合任意大小的矩阵。
交换两个行的函数 change
该函数有四个整型参数。第一个参数(int i)与第三个参数
(int k)是要交换的两个行的行号。第二个参数给出开始交换
的位置,减少交换次数。第四个参数的作用同 panbijeq0 的
第四个参数。该函数在交换两个行时还给 line 数组赋相应的
新值。
计算行列式的函数 det 与 deter
此二函数联合使用完成行列式的计算。deter 函数是中
心部分,det 函数是用户接口。det 函数有三个整型参数:第
一个参数(int n)是要计算的行列式的阶数,第二个参数(int
6
计算机学院 《C 语言程序设计》课程设计报告
a[ ])是二维数组的地址,第三个参数(int column)是第二个参
数在主程序中的列数。该函数调用 deter 函数完成行列式的
计算。
deter 函数有七个整型参数:第一个是行列式的阶数,第二个指
二维数组的行,第三个在函数中做循环变量,第四个是行列式
的累加值,第五个是行列式定义[1]中计算一个项的累乘器(第
六个与 det 的第二个相同,第七个与 det 的第三个相同。
函数 det 与 deter 共同起作用完成任意阶行列式的计算(是文
献[1]中计算部分的推广,从理论上讲,行列式的定义已完全搬
上了计算机。
2.4 计算非齐次线性方程组的计算程序
程序中 M 是方程的个数,N 是方程中未知量的个数(可以
任意取值(这里暂定为 10)。
3 设计过程及程序代码
3.1 源代码:
#include
#include
#define M 10
#define N 10
int a[M][N+1];
int line[M];
int vf[N+1],varx[N+1];
7
计算机学院 《C 语言程序设计》课程设计报告
int b[M][N+1];
int gcd(int u,int v);
int deter(int n,int i,int j[],int d,int t,int a[],int column);
int det(int n,int a[],int column);
void panbijeq0(int i,int j,int m,int n);
void change(int i,int j,int k,int n);
void main()
int
{
i,j,m,n,r,zr,lu,lf,d,k,g,c[M][N+1],changecol[M],dsolution[N][
N],x1[M][N],x2[M][N];
printf("m=1,2,......,%d\n",M);
printf("m=");
scanf("%d",&m);
printf("n=1,2,......,%d\n",M);
printf("n=");
scanf("%d",&n);
for(i=0;i