ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:399.83KB ,
资源ID:3490152      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3490152.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(东南大学C程序课程设计报告概述.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

东南大学C程序课程设计报告概述.docx

1、东南大学C 程序课程设计报告概述姓名: 学号:指导老师:提交日期:程序课程设计 迭代法求解线性方程(级) 程序设计原理与功能简介2课程设计要求5源程序分析7新程序设计思路10新增模块源代码与功能介绍11程序设计中遇到的问题与解决方法14程序运行测试结果与分析16程序缺陷与大致优化思路20设计心得与个人体会201程序设计原理与功能简介迭代法是线性方程的一种常用解法,首先选取适当的初值,然后用同样的计算步骤重复计算,在满足精度的情况下,停止迭代,求得近似解。迭代法简介:也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。迭代法又分为精确

2、迭代和近似迭代。“二分法”和“牛顿迭代法”属于近似迭代法。迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。最常见的迭代法是牛顿法。其他还包括最速下降法、共轭迭代法、变尺度迭代法、最小二乘法、线性规划、非线性规划、单纯型法、惩罚函数法、斜率投影法、遗传算法、模拟退火等等。 本程序所用的主要为赛德尔迭代法和简单迭代法,分别进行求解,然后将求解的结果参数列出进行比较。还可以选择不同的松弛因子进行算法上的比较。其中新增的部分主要是文本的输入与输出,

3、仿照源程序编写简单迭代法的部分。赛德尔迭代法:设有线性方程:首先将系数矩阵变换成:形式。设上述线性方程组写成: (1)系数矩阵A可逆且主对角元素均不为零,令 并将A分解成 从而(1)可写成 令:其中M=, 即: 其中:M= 这就是原程序所变换的矩阵。赛德尔迭代法的不同之处在于:每算出一个分量的近似值,立即用到下一个分量的计算中去,即用迭代公式:即: 选用松弛因子代入上述线性方程得到松弛的赛德尔公式: 通常在(0,2)内选取,当1,成为超松弛,当1时,成为亚松弛。松弛因子的恰当选择,可以大大提高收敛速度,(经查资料,可以证明利用赛德尔法计算方程,收敛则方程组有解,且收敛充分条件有多个,在此不一一

4、例举),在实际计算中,往往要靠经验找到最优松弛因子。一般迭代法:由赛德尔迭代法与一般迭代法比较可知,在迭代的每一步计算过程中一般迭代法是用的全部分量来计算的所有分量,显然在计算第i个分量时,已经计算出的最新分量没有被利用,从直观上看,最新计算出的分量可能比旧的分量要好些.因此,对这些最新计算出来的第次近似的分量加以利用,就得到所谓解方程组的高斯塞德(Gauss-Seidel)迭代法.下面就用程序来验证这一点。二课程设计要求1.重载类的构造函数,可以在定义类的对象时利用函数参数输入方程的各项参数,便于程序调试。2.增加类的成员函数,可以将一个线性方程用文本文件的编辑器(如记事本)写入一个文件中,

5、然后由新增的成员函数中读取,运行结束后写回文件中。3.原程序是高斯-赛德尔算法解线性方程,仿照源程序编写简单迭代法求解线性方程的程序,并利用相同方程组与塞德尔算法进行验证比较,分别求出他们的收敛次数。4.设计并对主程序进行测试:本次测试所选线性方程组为:一般迭代法的大致运算: 0 1 2 3 4 5 600.71.421.7832.03382.182300.81.491.8622.11012.259402.43.183.8764.24624.4948赛德尔迭代法大致运算: 0 1 2 3 4 5 600.71.67261.93372.14162.327101.011.97141.92242.3

6、0742.433003.3482.71164.32474.67434.81183源程序分析源程序首先定义了一个类。在这个类中,先定义了两个友元函数,分别重载输出与输入运算符。后又定义了一些对象,包括矩阵行列数,方程解的个数,存放方程的解,迭代次数,松弛因子。也定义了几个成员函数,包括误差函数,构造函数,输入行列数,变换矩阵函数,主要算法部分,输出最后结果的函数。构造函数的作用是为行列数分配内存空间,是动态生成的。输入行列数要求用户自己输入,来初始化行列数。变换矩阵要求将原矩阵作出的变换是:实对角线上的系数为0,每一行的其他数都是原数除以原每一行第一个数的相反数。然后是进行一轮迭代,参数是松弛因

7、子,求出最新的迭代解,每求出的一个新解都立即用到下一个分量的计算中去,继续迭代,直到满足解的精度才停止迭代,最后输出函数结果。源程序代码:源程序头文件部分# include# include# include# include(源程序主要由类和类的声明构成)class Matrix /高斯-赛德尔矩阵乘法类 friend void operator(istream &,Matrix &); /重载输入运算符protected: int row,column; /矩阵行列数 double * * mat; /矩阵 int varnum; /方程解的个数 double * variable; /存

8、放方程解 int itercount; /迭代次数 void iteration(double); /迭代算法,参数是松弛因子 bool epsilon(double *,double *,int,double); /误差函数public: Matrix(int,int); /构造函数 static void initialize(int &,int &); /要求用户输入行列数 void rearrange(); /变换矩阵 void solve(double); /主要算法部分,参数是松弛因子 void show_answer(); /输出最后结果;(动态生成方程系数的数组)Matrix:

9、Matrix(int r=1,int c=1):row(r),column(c) mat=new double * row; /动态生成for(int i=0;irow;i+) mati=new doublecolumn;(输入行列数,确定线性方程的大小)void Matrix:initialize(int &i,int &j) /*初始化,输入行列(ROWS:线性方程数,COLUNMNS:系数) 及常数的个数*/ cout;cini;cout;cinj;(将矩阵转化为求解形式)void Matrix:rearrange() /高斯-赛德尔矩阵变换函数,在进行迭代之前需将原矩阵做变换 varn

10、um=column-1; /方程解的个数 variable=new doublevarnum; /存放方程解 for(int i=0;irow;i+) double coefficient=matii; /对角线上的系数 for(int j=0;jcolumn;j+) matij/=coefficient; /实对角线上的系数为1 for(i=0;irow;i+) for(int j=0;jcolumn-1;j+) matij*=-1; /变换 matii=0; /对角线上的系数为0 (利用松弛因子进行迭代求解)void Matrix:iteration(double lambda) /进行一

11、轮迭代,参数为松弛因子 double last; /为最新求出的迭代解 for(int i=0;ivarnum;i+) last=variablei; variablei=0; /最新的方程解,i为行次,求xi for(int j=0;jvarnum;j+) variablei+=matij*variablej; /*根据已解出的x0,x1,x2,x(i-1)的最新值 求xi*/ variablei+=maticolumn-1; /加上常数项系数 variablei=last+lambda*(variablei-last); /利用松弛因子调整收敛速度 (明示精度要求,进行新解和旧解的转换和保

12、存,如不满足要求返回上一级继续迭代)void Matrix:solve(double lambda)/求解方程 for(int i=0;ivarnum;i+)variablei=0;itercount=0;double criterion=0.0001;/迭代误差double *newest=new doublevarnum;double *last=new doublevarnum;for(i=0;ivarnum;i+)newesti=variablei;dofor(int i=0;ivarnum;i+)lasti=newesti;/保存前一轮的解,计算误差用iteration(lambda

13、);/一轮迭代for(i=0;ivarnum;i+)newesti=variablei;/保存新一轮的解itercount+;/整个迭代次数加1while(epsilon(newest,last,varnum,criterion);/计算误差/计算迭代误差,看是否满足解得精度,返回0停止迭代,给出最后结果(精度验证,不满足则继续迭代)bool Matrix:epsilon(double*newest,double*last,int size,double criterion)for(int i=0;icriterion)/如果不满足精度 return 1;/继续迭代return 0;(输出求解

14、结果)void Matrix:show_answer()/输出求解结果函数for(int i=0;ivarnum;i+)coutX(i+1)=variableiendl;coutendlendlNumber of Iteration=itercountendl;void operator(ostream&out,Matrix&m) /矩阵输入,输出流重载函数for(int i=0;im.row;i+)for(int j=0;jm.column;j+)outm.matijsetw(10);outendl(istream&in,Matrix&m) for(int i=0;im.row;i+)for

15、(int j=0;jm.column;j+)coutvalue of indice(i+1)(j+1)m.matij;主函数的部分void main()coutThis Program Solve linear by the Gauss-Seigel MethoaendlTry to input the Matrix so that there is Diagonal Dominanceendlone;char X;cout;cinX;if(X=y)coutone;one.rearrange();double relax_coaf;for(char x=y;x=y&x!=n;)coutendl

16、;cinrelax_coaf;one.solve(relax_coaf);one.show_answer();coutendl;cinx;cin.ignore(128,n);cin.ignore(128,n); 4新程序设计思路由于源程序的内容比较详细全面,所以新程序的内容不多,只需在原类中添加两个成员函数,还有将主函数适当修改一下即可。添加的两个类的成员函数的功能分别是读取文本文件中内容和将结果保存在文本文件中。由于文本文件中是线性方程的初始形式,即a11*x+a12*x+a13*x=b的形式。所以要将它们读取出来是比较困难的事情。这也是这个程序的难点之一。首先应将它们以字符的形式读取出来,

17、然后将前面的系数识别出来,送入到原类的矩阵中去,进行矩阵变换。然后将运行结果存入到另一个文本文件中去。这将采用文件的输入与输出功能来解决这个问题。至于主函数的修改,也是一个重点。主函数将采取菜单的模式,让用户选择输入方程组的方式,同一个方程组用两种方法进行计算求解,即定义两个对象(赛德尔迭代法和简单迭代法),分别进行求解,然后将求解的结果参数列出进行比较。如果希望作进一步研究,还可以选择不同的松弛因子进行算法上的比较,得出一个比较完善的结论。5新增模块源代码与功能介绍新增的模块主要有两个:一个模块的功能是读取一个文本文件。除了读取外,还要将线性方程未知数前面的系数识别出来,然后送入原类的矩阵中

18、去,进行矩阵变换。另一个模块的功能是将运行的结果存入这个文本文件里去。这两个模块如下:算法类中添加两个函数:void Read(int ,int ); /新增函数:读取文件中方程组的系数void Write(); /新增函数:将计算结果写入文件中两个函数具体函数体内容:读取文件内容函数void matrix:Read(int r,int c) ifstream infile; infile.open(d:线性方程组.txt); /读取文件 char a; for(int h=0;hr;h+) for(int g=0;g=48&a=64)i+; else if(a=n) k+; i=0; inf

19、ile.close();写入文件内容函数void matrix:Write() ofstream outfile; outfile.open(d:赛德尔迭代法的解.txt); for(int i=0;ivarnum;i+) outfilex(i+1)=variablei(istream& in,matrix& m) cout请选择输入线性方程组系数的方式:endl; cout1、从D盘文本文档中提取系数(注意:文档中的系数为1或-1时要添上)endl; cout2、手动输入系数(注意:按照系数矩阵的顺序输入)choice; switch(choice) case 1: for(int i=0;

20、im.row;i+) for(int j=0;jm.column;j+) coutvalue of indice(i+1)(j+1)m.matijendl; break; case 2: for(int i=0;im.row;i+) for(int j=0;jm.column;j+) coutvalue of indice(i+1)(j+1)m.matij; break; 6程序设计中遇到的问题与解决方法1).最大的困难当属对于如何从文件中将线性方程组的系数与常数读入程序中,这个方面主要是从文件中如何读取字符串,并从字符串中将系数和常数读取出来,然后将字符型转化成数字。从上面的读取文件函数设计

21、中已经知道所用的方法,这主要是查找资料所得:参考程序1:# include# includeusing namespace std;int main() ofstream ofile;ofile.open(d:my.doc);ofile3x+8y=11n2x+3y=5endl;ofile.close();ifstream ifile;ifile.open(d:my.doc);char a;int s100100;for(int h=0;h100;h+) for(int g=0;g=48&a=64) i+;else if(a=n) k+;couts00endls10endl;ifile.clos

22、e();return 0;参考程序2:#include #include void main(void) FILE *fp = fopen(D:1.txt, r); int nChar; int i = 0; char buf64; float a, b; int n; while (nChar = fgetc(fp) != EOF) /EOF=end of file bufi+ = (char)nChar; if (nChar = n) bufi = 0; i = 0; sscanf(buf, 第%d点坐标: x=%f y=%f, &n, &a, &b); printf(%ft%fn, a,

23、 b); fclose(fp);但第一段程序只针对于正整数,对于负数和系数为1时没有具体的设计,因此有较大的局限性,本想通过第二段程序中的方式将数字读入源程序的,但运行效果不佳,且有许多陌生的程序代码,如FIFE类型的数据处理等,但经过参考此段代码,结合学过的内容,经过个人修改,在源文件中的添加了一些条件,使得程序运行环境更完善,运行效果更好。2).在不断完善程序的过程中,还遇到许多小问题,比如还是线性方程组系数的写入问题,小数问题还没有解决,即如何从文本中将小数的系数或常数读入程序中,于是,在此,提供了两种写入系数的方式,一种即上述的文件写入,另一种即按照系数矩阵的顺序输入系数与常数,这样,只要采用后一种方法,小数的问题也可以解决了。3).在程序不断运行和调试中,还遇到一些小问题,但都在调试中解决了,主要是语法错误。7程序运行测试结果和分析程序中主要的示例线性方程为:运行结果:1.D盘文件中输入线性方程组:2.赛德尔迭代法:选择赛德尔迭代法,并输入系数矩阵的行数与列数,而后从文本文档中提取系数:将所有系数以矩阵形式展示出来,这样便于使用者与已知的线性方程组的系数和常数进行比较,并第一次输入松弛因子大小为1.1,进行运算,由下示运行结果可知迭代共进行了8次:由于松弛因子的选择具有不确定性,因此在此选用其他松弛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1