c解非齐次线性方程组C语言课程设计报告.docx
- 文档编号:27119062
- 上传时间:2023-06-27
- 格式:DOCX
- 页数:16
- 大小:36.81KB
c解非齐次线性方程组C语言课程设计报告.docx
《c解非齐次线性方程组C语言课程设计报告.docx》由会员分享,可在线阅读,更多相关《c解非齐次线性方程组C语言课程设计报告.docx(16页珍藏版)》请在冰豆网上搜索。
c解非齐次线性方程组C语言课程设计报告
学号
2016-2017学年第2学期
1608220203
《C语言程序设计》
课程设计报告
题目:
解非齐次线性方程组
专业:
网络工程
班级:
16(3)班
姓名:
代应豪
指导教师:
代美丽
成绩:
计算机学院
2017年4月21日(课外的,第十周答辩和总结)
2017年5月21日(课内的,第十四周答辩和总结)
1设计内容及要求......................................3
1.1设计内容.........................................3
1.2具体要求.........................................3
2概要设计.............................................3
2.1判断是否有解....................................3
2.2实现方法........................................5
2.3主要函数介绍....................................6
2.4计算非齐次线性方程组的计算程序...................7
33设计过程及程序代码.................................7
3.1源代码..........................................7
3.2程序运行时的屏幕信息及运行示例..................16
4设计结果分析.......................................18
5参考文献...........................................19
致谢................................................19
小结................................................20
1、设计内容及要求
1.1设计内容
采用阶梯矩阵找出非齐次线性方程组的增广矩阵的秩,用大小为未知量个数的双向栈存栈储自由未知量与非自由未知量,并给出在微机上运行的模拟人工解题的C语言计算程序。
1.2要求
明确课程设计的目的,能根据课程设计的要求,查阅相关文献,为完成设计准备必要的知识;提高学生用高级语言进行程序设计的能力,重点提高用C语言进行算法编程技术水平;初步了解软件开发的一般方法和步骤;提高撰写技术文档的能力。
2、概要设计
2.1判断是否有解
根据线性方程组的系数矩阵与增广矩阵的秩是否相等来判断方程组是否有解,若无解程序运行结束,若有解则进行求解。
求系数矩阵的秩r,增广矩阵的秩zr方法是将增广矩化成阶梯形,观察方程组中的哪些未知量是一般未知量,哪些是自由未知量,并赋一个相应的标记vf,对第i个未知量(此处设想常数项所对应的未知量为第n+1个未知量)来说,标志函数的定义可写成下面的
(2)式,这样方程组系数的矩阵的秩就可由下面的(3)式计算,增广矩阵的秩可由下面的(4)计算得到。
n
Vf(i)={1第i个未知量是一般未知量0第i个未知量是自由未知量i=1,2…,n+1
(2)
r=
Ʃ
j=1
(3)
Zr=r+vf(n+1)(4)
若系数矩阵的秩r等于增广矩阵的秩zr,则方程组有解,否则无解。
当方程组有解时从原方程组
(1)中选出r个方程组成新的方程组(5)。
这里line(i)i=1,2,…r,i代表新方程组的第i个方程line(i)指出新方程组中的第i个方程是原方程组中的第line(i)个方程。
j=1
n
Ʃ
r
Ʃ
j=1
aline(i)varx(j)xvarx(j)=(-aline(i)xvarx(j))+aline(i),n+1i=1,
2.…,r(6)
r
Ʃ
j=1
r
j=r+1
Ʃ
Cijxvarx(j)=Cijxvarx(j)+ci,n+1i=1,2…,r(7)
1≤j≤r
aline(i)varx(j)
j
{
r+1≤j≤n,i=1,2…,r
-aline(i)varx(j)
)
其中
aline(i)varx(j)
Cij=
J=n+1
由于自由未知量个数有n-r个,故上述方程组等
价于下面的n-r+1个方程组成的方程组:
{
k=1,…,n-r+1
C11xk,varx
(1)+…+C1rxk,varx(x)=c1,r+k
j
Cr,1xk,varx
(1)+…+crrxk,varx(r)=cr,r+k
……………………………………………………
当k=1,…,r时求得的是基础解系,当k=n-r+1时求得的是特解。
第k个解得分量xk,varx(j)=Dk,varx(j)/Dj=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]]与x2[k][varx[j]]中,最后根据数组x1与x2的存储情况给出方程组
(1)的通解。
2.3主要函数介绍
将增广矩阵化成阶梯形函数panbijeq0
该函数有四个整型参数。
第一个参数(inti)是增广矩阵的行号,初始值为增广矩阵的首行标(在C语言中为0)。
第二个参数(intj)是增广矩阵的列,初始值为增广矩阵第一列元素的列下标(在C语言中为0)。
第三个参数(intm)与第四个参数(intn)分别为增广矩阵的行数和列数。
该函数在完成将增广矩阵化成阶梯形的同时还完成未知量是一般未知量还是自由未知量的确定。
该函数的特点是递归调用,适合任意大小的矩阵。
交换两个行的函数change
该函数有四个整型参数。
第一个参数(inti)与第三个参数(intk)是要交换的两个行的行号。
第二个参数给出开始交换的位置,减少交换次数。
第四个参数的作用同panbijeq0的第四个参数。
该函数在交换两个行时还给line数组赋相应的新值。
计算行列式的函数det与deter
此二函数联合使用完成行列式的计算。
deter函数是中心部分,det函数是用户接口。
det函数有三个整型参数:
第一个参数(intn)是要计算的行列式的阶数,第二个参数(inta[])是二维数组的地址,第三个参数(intcolumn)是第二个参数在主程序中的列数。
该函数调用deter函数完成行列式的计算。
deter函数有七个整型参数:
第一个是行列式的阶数,第二个指二维数组的行,第三个在函数中做循环变量,第四个是行列式的累加值,第五个是行列式定义[1]中计算一个项的累乘器(第六个与det的第二个相同,第七个与det的第三个相同。
函数det与deter共同起作用完成任意阶行列式的计算(是文献[1]中计算部分的推广,从理论上讲,行列式的定义已完全搬上了计算机。
2.4计算非齐次线性方程组的计算程序
程序中M是方程的个数,N是方程中未知量的个数(可以任意取值(这里暂定为10)。
3设计过程及程序代码
3.1源代码:
#include
#include
#defineM10
#defineN10
inta[M][N+1];
intline[M];
intvf[N+1],varx[N+1];
intb[M][N+1];
intgcd(intu,intv);
intdeter(intn,inti,intj[],intd,intt,inta[],intcolumn);
intdet(intn,inta[],intcolumn);
voidpanbijeq0(inti,intj,intm,intn);
voidchange(inti,intj,intk,intn);
voidmain()
{inti,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 for(j=0;j printf("a%d%d=",i+1,j+1); scanf("%d",&a[i][j]); b[i][j]=a[i][j]; if(j==n) printf("\n"); } for(i=0;i line[i]=i; for(j=0;j vf[j]=0; panbijeq0(0,0,m,n); r=0; for(i=0;i r+=vf[i]; zr=r+vf[n]; if(r exit(0); lu=0; lf=r; for(i=0;i if(vf[i]==1){ varx[lu]=i; lu++; }else{ varx[lf]=i; lf++; } for(i=0;i for(j=0;j c[i][j]=a[line[i]][varx[j]]; for(j=r;j c[i][j]=-a[line[i]][varx[j]]; c[i][n]=a[line[i]][n]; } d=det(r,c[0],N+1); printf("d=%d\n",d); for(i=0;i<=n-r;i++) for(j=0;j dsolution[i][j]=0; for(j=0;j for(i=0;i changecol[i]=c[i][j]; for(k=r;k<=n;k++){ for(i=0;i c[i][j]=a[i][k]; dsolution[k-r][varx[j]]=det(r,c[0],N+1); } for(i=0;i c[i][j]=changecol[i]; } for(i=0;i<=n-r;i++) for(j=0;j g=gcd(dsolution[i][varx[j]],d); x1[i][varx[j]]=dsolution[i][varx[j]]/g; x2[i][varx[j]]=d/g; } for(i=0;i<=n-r;i++) for(j=r;j x2[i][varx[j]]=1; if(j==i+r) x1[i][varx[j]]=1; else x1[i][varx[j]]=0; } printf("generalsolution\n="); for(i=0;i<=n-r;i++){ if(i printf("k%d(",i+1); else printf("("); for(j=0;j if(x2[i][j]==1) printf("%d",x1[i][j]); else printf("%d%d",x1[i][j],x2[i][j]); if(i printf(")'\n+"); else printf(")'\n"); } for(i=0;i printf("k%d",i+1); if(i>0) printf("belong(s)toR\n"); } voidpanbijeq0(inti,intj,intm,intn) {intk,s,find; intc; if(b[i][j]! =0){ vf[j]=1; for(k=i+1;k if(b[k][j]! =0){ c=b[k][j]/b[i][j]; b[k][j]=0; for(s=j+1;s b[k][s]-=b[i][s]*c; } i++; j++; if(i panbijeq0(i,j,m,n); }else{ find=0; k=i+1; while(find==0&&(k if(b[k++][j]! =0) find=1; if(find==1){ change(i,j,m,n); panbijeq0(i,j,m,n); }else{ j++; if(j panbijeq0(i,j,m,n); } } } voidchange(inti,intj,intk,intn) {ints; inta; s=line[i]; line[i]=line[k]; line[k]=s; for(s=j;s a=b[i][s]; b[i][s]=b[k][s]; b[k][s]=a; } } intdet(intn,inta[],intcolumn) {intd=0,t=1; intj[N]; d=deter(n,0,j,d,t,a,column); return(d); } intdeter(intn,inti,intj[],intd,intt,inta[],intcolumn) {intk,sign,flag; if(i for(j[i]=0;j[i] flag=0; k=0; while((flag==0)&&(k if(j[i]==j[k]) flag=1; if(flag==1) continue; if(a[i*column+j[i]]==0) continue; sign=1; for(k=0;k if(j[i] sign=-sign; d=deter(n,i+1,j,d,t*sign*a[i*column+j[i]],a,column); }else d+=t; return(d); } intgcd(intu,intv) {intr,t=v; if(u<0) u=-u; if(v<0) v=-v; while(v! =0) {r=u%v; return(t>0? u: -u); } } 3.2程序运行时的屏幕信息及运行示例 在运行中I计算机屏幕上显示”m=1,2,…,10”与”n=1,2,…,10”的信息是告诉用户程序预定义m,n的值为10,可计算含有10个方程10个未知量的线性方程组,若m或n大于10时只要修改预定义的值即可。 ”m=”与”n=”的信息是请用户输入具体的方程数与未知量数,这里为1到10的任何整数,现以下面的方程组为例进行说明。 例求解方程组 X1-x2-x3+x4=0 X1-x2+x3-3x4=1 2x1-2x2-4x3+6x4=-1 { 运行如下 m=1,2,……..,10 m=2 n=1,2,……..,10 n=3 a11=1a12=-1a13=1a14=-1 a21=1a22=-1a23=1a24=-1 d=1 generalsolution =k1(-110)’ +k2(101)’ +(-100)’ k1k2belong(s)toR 4设计结果与分析 当把程序写好并进行调试时,并不是一帆风顺的,总会遇到很多在调试时遇到的错误。 1.首先在定义函数时,不能输入汉字。 否则会程序会显示错误。 2.在程序中,如果类型不同不可以直接赋值,会出现相应的警告 3.前后定义变量要统一。 4.如果要调用添加函数,修改函数,修改函数,查找函数,统计函数等要在主函数前面进行申明。 否则会显示警告。 5.如果程序在运行的过程中,对于一个循环语句,如果你返回的值始终是真的,那么程序将进如死循环。 6.未注意int,float型数据的数值范围,int型数据的数值范围(-32768~32768)。 7.对应该有花括弧的复合语句,忘记加花括弧。 8.所调用的函数在调用语句之后才定义,而又在调用前未加说明。 5参考文献 [1]智东杰R用定义计算行列的C语言程序设计[A].雷式祖,杨绍先,王爱民,薛瑞丰.中国高等教育研究论丛(第四卷)[C]成都: 成都科技大学出版社,1993.606-609. [2]智东杰.用C语言设计克莱姆法则的计算程序[A].张正新,薛瑞丰,黄天民,徐扬,王爱民,中国高等教育研究论丛(第六卷)[C].成都: 西南交通大学出版社,1994.263-266. 小结 在本课程设计的设计过程中,我刚开始感觉到有点头痛。 要通过一学期C语言的学习后将所学知识运用起来有点困难,但回过头来再去看教课书,对于这些知识点有关的背景,概念和解决方案更进一步的理解,感觉也不是很难。 另外我还体会了从事C语言课程设计工作需要特别谨慎认真地态度和作风,一点都不能马虎。 每个细微的细节都必须十分注意,如果不认真思考,就会出现或大或小的错误。 如果把早期的错误隐藏下来,对后面的工作影响就会很大,甚至有时会推倒很多前面做的工作。 有时候,我自己觉得我写的程序非常正确,但是就是编译通不过,在查找错误的过程中,面临着否认自己的过程,非常的痛苦,而且由于自己的经验及各方面的能力的不足,所以进展的速度非常的缓慢,往往几天的时间没有一点进展。 这时候,我一般是先自己通过书本,手册和资料找解决办法,实在没辙才向老师同学请教。 在开始编写程序的时候,我看到别人的程序功能非常的详细,而且界面非常漂亮,总是希望自己的程序也非常的完善,但是,发现编一个好的程序不是一蹴而就的事情,需要长时间的积累和经验。 致谢 在这次C语言课程设计中,我的老师和同学给了我及大的帮助。 特别是我的指导老师代美丽老师。 在此,我对他们表示感谢! 感谢他们在我面对困难时给了我帮助和支持。 也感谢那些给我帮助的所有同学!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 解非齐次 线性方程组 语言 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)