C++课程设计.docx
- 文档编号:8019912
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:18
- 大小:264.13KB
C++课程设计.docx
《C++课程设计.docx》由会员分享,可在线阅读,更多相关《C++课程设计.docx(18页珍藏版)》请在冰豆网上搜索。
C++课程设计
信息系统开发语言
(一)课程设计
——线性方程组求解
一、课程设计目的
通过课程设计要达到两个目的,一是检验和巩固专业知识、二是提高综合素质和能力。
课程设计主要是C++语言程序设计的实现。
通过该课程设计,可以将我们课堂上掌握的理论知识与处理数据的业务相结合,以检验我们掌握知识的宽度、深度及对知识的综合运用能力。
二、问题描述
1)利用迭代法求线性方程组的解。
2)输入线性方程组的系数矩阵和常数列——程序正常运行后,屏幕上显示一个文字菜单,当用户选定操作项目所对应的序号时,根据应用程序的提示信息,从键盘上输入相应的数据。
输出数据——应用程序正常运行后,要在屏幕上显示一个文字菜单,要求用户输入数据时,要给出清晰、明确的提示信息,包括输入的数据内容、格式及结束方式等。
三、问题分析
迭代法原理:
将原线性方程组Ax=b中系数矩阵的主对角线移到一边并将其系数化为一,然后在给定迭代初值的情况下通过迭代的方法求解线性方程组的值。
①题目要求用迭代法给线性方程组求解,首先要了解迭代法这一算法是怎么实现求解组方程组。
②用迭代法求线性方程时,需要输入一些什么数据,来实现方程求解的过程。
③在求解过程中,方程组如出现无解、有限解、无限解该怎么处理。
一般性用迭代法给方程求解如下:
给定实数域上光滑的实值函数f(x)以及初值
定义数列
(1)
称为f(x)的一个迭代序列。
给定迭代函数f(x)以及一个初值
利用
(1)迭代得到数列
如果数列
收敛于一个
,则有
(2)
即
是方程x=f(x)的解。
由此启发我们用如下的方法球方程g(x)=0的近似解。
将方程g(x)=0改写为等价的方程
x=f(x),(3)
然后选取一初值利用
(1)做迭代。
迭代数列
收敛的极限就是方程g(x)=0的解。
用上述方程求方程的根的一个首要问题是迭代是否收敛?
经过试验我们知道,使得迭代序列收敛并尽快收敛到方程g(x)=0的某一解的条件是迭代函数f(x)在解的附近的导数的绝对值近两小。
这启发我们将迭代方程修改成
(4)
我们需要选取
使得
得
于是
特别地,如果f(x)=g(x)+x,则我们得到迭代公式
(5)
四、算法分析、设计与描述
1.算法分析和设计
用雅克比(Jacobi)迭代法求解
设有n阶方程组
(6)
若系数矩阵非奇异,且
(i=1,2,…,n),将方程组(6)改写成
然后写成迭代格式
(7)
(7)式也可以简单地写为
(8)
对(7)或(8)给定一组初值
后,经反复迭代可得到一向量序列
,如果X(k)收敛于
,则
就是方程组(6)的解。
这一方法称为雅克比(Jacobi)迭代法或简单迭代法,(7)或(8)称为Jacobi迭代格式。
下面介绍迭代格式的矩阵表示:
设D=diag(a11,a22,…,ann),将AX=b改写为:
AX=(D–(D-A))x=b
DX=(D-A)x+b
X=(I–D-1A)x+D-1b
记B=I–D-1AF=D-1b
则迭代格式的向量表示为
B称为雅克比迭代矩阵。
2.算法描述
前面已经提到用雅克比迭代法求线性方程组的解,这是总体思路。
(1)计算迭代矩阵:
将系数矩阵的所有值分别处以各自所在行的主对角线值,然后将主对角线赋值为0。
1)输入矩阵方程矩阵A[i][j];输入右边向量b[i];
2)规定迭代精度0.000000001;
3)据算迭代矩阵。
设有n阶方程组
(9)
若系数矩阵非奇异,且
(i=1,2,…,n),将方程组(9)改写成
然后写成迭代格式
(10)
(10)式也可以简单地写为
(11)
由上得,
b[i]=b[i]/A[i][j]
当i=j时,x[i][i]=0;
当i≠j时,x[i][j]=-A[i][j]/A[i][j]
(2)输入迭代初值,进行迭代
将迭代初值存入y[n]矩阵,然后利用迭代式
nn=nn+x[i][j]*y[j];
y[i]=nn+b[i];经过有限次迭代得到误差要求以内的值
(3)流程图步骤实现
①开始
②输入方程组的元n;输入方程组等式左边的系数矩阵,即曾广矩阵A[KK];输入方程组等式右边的向量b[i]。
③给方程最高次数K赋值。
④计算方程组的迭代矩阵y。
⑤判断max|xi-yi|<ε是否成立,成立则方程存在接,否则方程无解。
⑥判断k<N?
是否成立;成立则输出方程的解yi;不成立,则返回循环,直到出结果为止。
⑦结束
五、程序设计
1.程序设计的基本思路
从上面的算法分析可以看到,本题面临的计算问题的关键是矩阵运算。
可以定义一个矩阵Matrix作为基类,用来存放系数矩阵成员A,以及存放方程编右边量b,方程迭代矩阵X,迭代初始变量y。
Matrix
-b[i]:
double*
-A[i][i]:
double*
-x[i][j]:
double*
-y[i]:
double*
+one(inti,intn,intj):
void
+two(inti,intn,intj):
void
+three(inti,intn,intj):
void
+four(intI,intn,intj):
void
2.程序代码及说明
//Matrix.h文件一,Matrix类定义
#ifndef_MATRIX_H
#define_MATRIX_H
classmatrix{//类Matrix类定义
public:
//外部接口
voidone(inti,intn,intj);//赋方程系数矩阵
voidtwo(inti,intn,intj);//赋方程右端向量
voidthree(inti,intn,intj)//赋示迭代矩阵
voidfour(inti,intn,intj);//赋迭代初值
private:
double*b[i];//存放右端向量数值
double*A[i][i];//存放方程系数矩阵
double*x[i][j];//存放迭代矩阵
double*y[i];//存放迭代初值
}
#endif
//Matrix.ccp文件二,Matrix类实现//包含类的定义头文件
#include"Matrix.h"
#include
usingnamespacestd;
voidmatrix:
:
one(inti,intn,intj){//显示方程系数矩阵
for(i=0;i for(j=0;j cin>>A[i][j]; } voidmatrix: : two(inti,intn,intj){//显示方程右端向量 for(i=0;i cin>>b[i]; } voidmatrix: : three(inti,intn,intj){//显示迭代矩阵 for(i=0;i { b[i]=b[i]/A[i][i]; for(j=0;j { if(i==j) { x[i][i]=0; } else { x[i][j]=-A[i][j]/A[i][i]; } } } } voidmatrix: : four{//显示代初值 cout<<"输入迭代初值"< for(i=0;i cin>>y[i]; intf=1; } //线性方程求解.cpp文件三,主函数 #include"Matrix.h"//包含类的定义头文件 #include #include usingnamespacestd; voidmatrix: : one(inti,intn,intj){ for(i=0;i for(j=0;j cin>>A[i][j]; } voidmatrix: : two(inti,intn,intj){ for(i=0;i cin>>b[i]; } voidmatrix: : three(inti,intn,intj){ for(i=0;i { b[i]=b[i]/A[i][i]; for(j=0;j { if(i==j) { x[i][i]=0; } else { x[i][j]=-A[i][j]/A[i][i]; } } } } voidmatrix: : four{ cout<<"输入迭代初值"< for(i=0;i cin>>y[i]; intf=1; } voidmain() { #definekk50//定义最大方程元数 inthh,gg,mm; doubleA[kk][kk],x[kk][kk],b[kk],y[kk],a[kk],z[kk],m,nn,d,e=1,w,fff; matrixcxy: cout<<"输入的方程元数"< cin>>n; cout<<"请输入方程系数矩阵: "< cxy.one();//按n行n列输出矩阵 cout<<"请输入右边向量: "< cxy.two();//给b[i]输入n个数 cout<<"输入你想要的迭代精度(建议1e-5以上)! "< cin>>fff;//输入迭代精度值 cout<<"输入最大迭代次数(建议300次以上)! "< cin>>mm;//输入迭代次数 cout<<"计算出迭代矩阵为: "< cxy.three()//输出迭代矩阵 cout<<"";//输出空格 for(i=1;i cout<<'\t'<<"X["< cout<<"精度";//输出跌打精度值 cout< cout<<"迭代初值为: ";//输出迭代初值 cout< : fixed);//输出浮点型数据 cxy.four();//给y[i]输入n个数 cout< while(e>fff)//雅克比迭代法实现方程部分 { for(i=0;i { z[i]=y[i]; nn=0; for(j=0;j { nn=nn+x[i][j]*y[j]; y[i]=nn+b[i]; } e=fabs(z[0]-y[0]); if(fabs(z[i]-y[i])>e) e=fabs(z[i]-y[i]); if(i==0) { cout< : fixed); cout<<"第"< } cout< : fixed); cout< } cout< cout< if(f>mm) { cout<<"迭代次数大于"< cout<<"认为方程发散,迭代不收敛"< exit (1); } } cout< cout< cout<<"方程迭代了"< cout<<"最后结果为: "< cout< for(i=0;i { cout<<"X"<<"["< cout< } exit (1); } 六、程序运行、调试和结果分析 1.程序运行中出现的问题及调试手段(包括异常处理) 1)问题: 找不到文件头iostream。 通过XX得知,原来的VC6.0在wind7下不兼容。 解决方案: 微软针对这个问题发布了一个补丁(),可以通过下载提供的已编译的FileTool.dll,使用方法: 1.把FileTool.dll文件拷贝至C: \ProgramFiles\MicrosoftVisualStudio\Common\MSDev98\AddIns文件夹下 2.在cmd下手动注册该dll文件: regsvr32"C: \ProgramFiles\MicrosoftVisualStudio\Common\MSDev98\AddIns\FileTool.dll" 3.打开VC6,右击工具栏,自定义...->附加项和宏文件,选中FileToolDeveloperStudioAdd-in附加项,这个时候就会出现A和O的文件栏按钮: •AddFileToProject•Open 今后再打开文件/工程或是添加文件到工程的时候,用这两个按钮,不要用VC6默认的了,这样就不会再出问题了。 更详细方案请参考: 2.程序运行结果分析(多组数据测试) 按照提示依次输入方程元数,系数矩阵,右边向量和迭代初值。 结果如下: 1)有限解情况: 本例的方程组来自凌道盛的著作《非线性有限元及程序》,计算结果与原著作完全吻合。 2)无限解情况: 本例的方程组来自XX百科,计算结果与原答案一致,详情请登入: 3)无解情况 本例的方程组来自XX百科,计算结果与原答案一致,详情请登入: 七、总结与体会 经过一个学期对《C++课程设计》的学习,我学习到了一些基本知识,解了C++语言程序设计中面向对象的思想,这些知识都为我在课程实践和进一步的学习打下了一定的基础。 在近三周的C++课程设计中,我体会颇多,学到了很多东西。 我加强了对C++课程设计这门课程的认识! 总之,通过这次课程设计,我收获颇丰,相信会为自己以后的学习和工作带来很大好处。 像解线性方程组这样的程序设计,经历了平时在课堂和考试中不会出现的问题和考验。 而这些问题,这并不是我们平时只靠课本,就可以轻易解决的。 所以,锻炼了我们挑战难题,学会用已掌握的知识去解决具体问题的能力,进一步培养了独立思考问题和解决问题的能力。 特别是学会了在VisualC++中如何调试程序的方法。 当然,老师的指导和同学的帮助也是不可忽视的,他们给了我许多提示和帮助,教会了我编译复杂程序的方法。 在老师和同学的帮助下,通过自己的努力,终于完成了这次求线性方程组的简单课程设计。 我经过这段时间的编程,对其中的艰辛,我是深有体会。 从刚开始上网查资料,了解什么是迭代法,通过迭代法如何求得线性方程组的解,然后选择自己认为比较简单的迭代法——雅克比迭代求线性方程组的解。 选择了一个大致的算法后,就没有一开始那么无从下手了,按课程设计的模板开始写课程设计的目的、问题描述、问题分析、算法分析与设计。 算法分析与设计,其实就是运用选择的方法一步一步实现程序,也是一个大致的设计思路,这要求我们对自己所选算法的熟悉掌握,大量查找资料研读。 对于迭代法,以前没接触过,书本上只有关于用高斯消元法求线性方程组的解,所以查阅资料是免不了的。 接下来是画流程图,这可是一个大问题,在WORD在画流程图本身就是一项挑战,罢了,慢慢来吧! 也就是把算法步骤用图文表示出来。 通过前面的算法分析与设计和流程图的构建,相信对于程序设计的思路描述,应该是简单的。 接下来在选择程序、理解程序到后来的调试程序以及改进程序这个过程中,我遇到了各种各样的困难和挫折。 但是我坚定信念,对自己充满了信心,想尽一切办法克服重重困难。 通过课程设计的训练,我进一步学习和掌握了对程序的设计和编写,从中体会到了面向对象程序设计的方便和巧妙。 懂得了在进行编写一个程序之前,要有明确的目标和整体的设计思想。 另外某些具体的细节内容也是相当的重要。 这些宝贵的编程思想和从中摸索到的经验都是在编程的过程中获得的宝贵财富。 这些经验对我以后的编程会有很大的帮助的,我要好好利用。 虽然这次课程设计是在参考程序的基础之上进行的,但是我觉得对自己是一个挑战和锻炼。 我很欣慰自己能在程序中加入自己的想法和有关程序内容,也就是对它的程序改进了一番改进,并有创新。 但是我感觉自己的创新还不够典型,总之还不是很满意。 另外由于时间的紧迫和对知识的了解不够广泛,造成了系统中还存在许多不足,功能上还不够完善。 以后我会继续努力,大胆创新,争取能编写出透射着自己思想的程序。 这次课程设计让我充分认识到了自己的不足,认识到了动手能力的重要性。 我会在以后的学习中更加努力锻炼自己,提高自己,让自己写出更好更完善的程序,为以后的编程打好基础! 总而言之,这次C++程序设计让我收获很大。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 课程设计