logo资料库

C语言程序设计实现解非齐次线性方程.doc

第1页 / 共20页
第2页 / 共20页
第3页 / 共20页
第4页 / 共20页
第5页 / 共20页
第6页 / 共20页
第7页 / 共20页
第8页 / 共20页
资料共20页,剩余部分请下载后查看
学号 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
分享到:
收藏