C++课程设计-线性方程组求解.doc_第1页
C++课程设计-线性方程组求解.doc_第2页
C++课程设计-线性方程组求解.doc_第3页
C++课程设计-线性方程组求解.doc_第4页
C++课程设计-线性方程组求解.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

信息系统开发语言(课程设计)信息系统开发语言(一)课程设计线性方程组求解一、课程设计目的通过课程设计要达到两个目的,一是检验和巩固专业知识、二是提高综合素质和能力。课程设计主要是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 = bDX = (D - A) x + bX = (I D-1A) x + D-1b记 B = I D-1A F = D-1 b则迭代格式的向量表示为称为雅克比迭代矩阵。2算法描述前面已经提到用雅克比迭代法求线性方程组的解,这是总体思路。(1)计算迭代矩阵:将系数矩阵的所有值分别处以各自所在行的主对角线值,然后将主对角线赋值为0。1)输入矩阵方程矩阵Aij;输入右边向量bi;2)规定迭代精度0.000000001;3)据算迭代矩阵。设有n阶方程组 (9)若系数矩阵非奇异,且 (i = 1, 2, n),将方程组(9)改写成然后写成迭代格式 (10)(10)式也可以简单地写为 (11)由上得,bi=bi/Aij当i=j时,xii=0;当ij时,xij=-Aij/Aij(2)输入迭代初值,进行迭代将迭代初值存入yn矩阵,然后利用迭代式nn=nn+xij*yj; yi=nn+bi;经过有限次迭代得到误差要求以内的值(3)流程图步骤实现开始输入方程组的元n;输入方程组等式左边的系数矩阵,即曾广矩阵AKK;输入方程组等式右边的向量bi。给方程最高次数K赋值。计算方程组的迭代矩阵y。判断max|xi-yi|是否成立,成立则方程存在接,否则方程无解。判断kN?是否成立;成立则输出方程的解yi;不成立,则返回循环,直到出结果为止。结束输入数据,初始向量,增广矩阵是是输出迭代失败标志输出开始结束否k=N?否kN?是否五、程序设计1程序设计的基本思路从上面的算法分析可以看到,本题面临的计算问题的关键是矩阵运算。可以定义一个矩阵Matrix作为基类,用来存放系数矩阵成员A,以及存放方程编右边量b,方程迭代矩阵X,迭代初始变量y。Matrix- bi:double* - Aii:double*- xij:double*- yi:double*+one(int i,int n,int j):void+two(int i,int n,int j):void+three(int i,int n,int j):void+four(int I,int n,int j):void2程序代码及说明/Matrix.h 文件一,Matrix类定义#ifndef _MATRIX_H#define _MATRIX_Hclass matrix /类Matrix类定义public: /外部接口void one(int i,int n,int j); /赋方程系数矩阵 void two(int i,int n,int j); /赋方程右端向量 void three(int i,int n,int j) /赋示迭代矩阵 void four(int i,int n,int j); /赋迭代初值private:double*bi; /存放右端向量数值 double*Aii; /存放方程系数矩阵double*xij; /存放迭代矩阵double*yi; /存放迭代初值#endif/ Matrix.ccp 文件二, Matrix类实现 /包含类的定义头文件#includeMatrix.h#includeusing namespace std;void matrix:one(int i,int n,int j) /显示方程系数矩阵for(i=0;in;i+)for(j=0;jAij;void matrix:two(int i,int n,int j) /显示方程右端向量for(i=0;ibi;void matrix:three(int i,int n,int j) /显示迭代矩阵for(i=0;in;i+) bi=bi/Aii; for(j=0;jn;j+) if(i=j) xii=0; else xij=-Aij/Aii; void matrix:four /显示代初值cout输入迭代初值endl; for(i=0;iyi; int f=1;/线性方程求解.cpp 文件三,主函数#includeMatrix.h /包含类的定义头文件#include#includeusing namespace std;void matrix:one(int i,int n,int j)for(i=0;in;i+)for(j=0;jAij;void matrix:two(int i,int n,int j)for(i=0;ibi;void matrix:three(int i,int n,int j)for(i=0;in;i+) bi=bi/Aii; for(j=0;jn;j+) if(i=j) xii=0; else xij=-Aij/Aii; void matrix:fourcout输入迭代初值endl; for(i=0;iyi; int f=1;void main() #define kk 50 /定义最大方程元数 int hh,gg,mm; double Akkkk,xkkkk,bkk,ykk,akk,zkk,m,nn,d,e=1,w,fff ;matrix cxy: cout输入的方程元数n; cout请输入方程系数矩阵:endl;cxy.one( ); /按n行n列输出矩阵cout请输入右边向量:endl; cxy.two(); /给 bi输入n个数cout输入你想要的迭代精度(建议1e-5以上)!fff; /输入迭代精度值 cout输入最大迭代次数(建议300次以上)!mm; /输入迭代次数 cout计算出迭代矩阵为:endl; cxy.three( ) /输出迭代矩阵cout ; /输出空格 for(i=1;in+1;i+) couttXi t; /输出Xicout精度; /输出跌打精度值 coutendl; /换行cout迭代初值为: ; /输出迭代初值 coutsetiosflags(ios:fixed); /输出浮点型数据 cxy.four(); /给yi输入n个数coutfff) /雅克比迭代法实现方程部分 for(i=0;in;i+) zi=yi; nn=0; for(j=0;je) e=fabs(zi-yi); if(i=0) coutsetiosflags(ios:fixed); cout第setw(3)setprecision(3)f+次迭代 ; coutsetiosflags(ios:fixed); coutsetw(8)setprecision(8)yi ; coute; coutmm) cout迭代次数大于mm次endl; cout认为方程发散,迭代不收敛endl; exit(1); coutendl; coutendl; cout方程迭代了f-1次,达到你所要求的精度fffendl; cout最后结果为:endl; coutendl; for(i=0;in;i+) coutXi+1=yi; cout 附加项和宏文件,选中 FileTool Developer Studio Add-in 附加项,这个时候就会出现 A 和 O 的文件栏按钮: Add File To Project Open今后再打开文件/工程或是添加文件到工程的时候,用这两个按钮,不要用VC6默认的了,这样就不会再出问题了。更详细方案请参考:/%D2%C5%C2%E4%CC%EC%BC%CA%B1%DF/blog/item/23b064206cec7d2c8644f9e7.html。2程序运行结果分析(多组数据测试)按照提示依次输入 方程元数,系数矩阵,右边向量和迭代初值。结果如下:1)有限解情况:本例的方程组来自凌道盛的著作非线性有限元及程序,计算结果与原著作完全吻合。2)无限解情况:本例的方程组来自百度百科,计算结果与原答案一致,详情请登入:/question/417024798.html。3)无解情况本例的方程组来自百度百科,计算结果与原答案一致,详情请登入:/question/417024798.html。七、总结与体会经过一个学期对C+课程设计的学习,我学习到了一些基本知识,解了C+语言程序设计中面向对象的思想,这些知识都为我在课程实践和进一步的学习打下了一定的基础。在近三周的C+课程设计中,我体会颇多,学到了很多东西。我加强了对C+课程设计这门课程的认识!总之,通过这次课程设计,我收获颇丰,相信会为自己以后的学习和工作带来很大好处。像解线性方程组这样的程序设计,经历了平时在课堂和考试中不会出现的问题和考验。而这些问题,这并不是我们平时只靠课本,就可以轻易解决的。所以,锻炼了我们挑战难题,学会用已掌握的知识去解决具体问题的能力,进一步培养了独立思考问题和解决问题的能力。特别是学会了在Visual C+中如何调试程序的方法。当然,老师的指导和同学的帮助也是不可忽视的,他们给了我许多提示和帮助,教会了我编译复杂程序的方法。在老师和同学的帮助下,通过自己的努力,终于完成了这次求线性方程组的简单课程设计。我经过这段时间的编程,对其中的艰辛,我是深有体会。从刚开始上网查资料,了解什么是迭代法,通过迭代法如何求得线性方程组的解,然后选择自己认为比较简单的迭代法雅克比迭代求线性方程组的解。选择了一个大致的算法后,就没有一开始那么无从下手了,按课程设计的模板开始写课程设计的目的、问题描述、问题分析、算法分析与设计。算法分析与设计,其实就是运用选择的方法一步一步实现程序,也是一个大致的设计思路,这要求我们对自己所选算法的熟悉掌握,大量查找资料研读。对于迭代法,以前没接触过,书本上只有关于用高斯消元法求线性方程组的解,所以查阅资料是免不了的。接下来是画流程图,这可是一个大问题,在WORD在画流程图本身就是一项挑战,罢了,慢慢来吧!也就是把算法步骤用图文表示出来。通过前面的算法分析与设计和流程图的构建,相信对于程序设计的思路描述,应该是简单的。接下来在选择程序、理解程序到后来的调试程序以及改进程序这个过程中,我遇到了各种各样的困难和挫折。但是我坚定信念,对自己充满了信心,想尽一切办法克服重重困难。通过课程设计的训练,我进一步学习和掌握了对程序的设计和编写,从中体会到了面向对象程序设计的方便和巧妙。懂得了在进行编写一个程序之前,要有明确的目标和整体的设计思想。另外某些具体的细节内容也是相当的重要。这些宝贵的编程思想和从中摸索到的经验都是在编程的过程中获得的宝贵财富。这些经验对我以后的编程会有很大的帮助的,我要好好利用。虽然这次课程设计是在参

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论