13-14-1-数值分析-课程设计报告

上传人:细水****9 文档编号:57206543 上传时间:2022-02-23 格式:DOC 页数:26 大小:227.50KB
返回 下载 相关 举报
13-14-1-数值分析-课程设计报告_第1页
第1页 / 共26页
13-14-1-数值分析-课程设计报告_第2页
第2页 / 共26页
13-14-1-数值分析-课程设计报告_第3页
第3页 / 共26页
点击查看更多>>
资源描述
郑州轻工业学院数 值 分 析课 程 设 计 报 告题 目:1.非线性方程求解 8.最小二乘法姓 名:杨君芳院(系):数学与信息科学学院专业班级:信科 11-01学 号:指导教师:汪远征时 间:2013年12月30日至2014年1月4日摘 要本文的内容主要属于数值代数问题的迭代解法和差值问题。在VC+6.0环境下对非线性方程求根的三种迭代解法(即一般迭代法,牛顿迭代法和弦截法)的算法实现,将抽象问题转化为计算机编程的一般解法思想,实现运用计算机解非线性方程的根。同时完成了运用最小二乘法的思想解决实际问题的简单设计,本文也对该程序设计的难点、解决技巧、每种方法的理论基础、程序的算法分析、功能分析、模块设计以及算法的优点、缺点和主要参考文献等进行了详细的作答。, 目 录数 值 分 析1课 程 设 计 报 告1摘 要2目 录31 理论基础41.1 非线性方程的迭代解法41.2最小二乘法42 算法分析52.1 功能分析52.1.1非线性方程的迭代解法52.2 算法分析53 程序设计83.1 选单和主窗口设计83.1.1非线性方程的迭代解法83.1.2最小二乘法103.2 模块设计143.2.1非线性方程的迭代解法143.2.2 最小二乘法184 总结245 参考文献251 理论基础1.1 非线性方程的迭代解法1、 一般迭代法:首先将方程f(x)=0化为一个与它同解的方程x=f1(x),任取一个初值x0,代入f1(x),得到x1= f1(x0)再将x1代入f1(x)得到x2= f1(x1)以此类推,得到一个数列如果迭代格式产生的数列收敛,则迭代法收敛,得到的收敛值即为方程的根。2、 牛顿迭代法:用迭代法解非线性方程总可以构造 x=f(x)=xk(x)f(x)即迭代法为牛顿迭代法。3、 弦截法:用牛顿法求函数的倒数使用不方便,则可以用代替,则即为弦截法1.2最小二乘法在研究两个变量之间的关系时,可以用回归分析的方法进行分析。当确定了描述两个变量之间的回归模型后,就可以使用最小二乘法估计模型中的参数,进而建立经验方程。简单地说,最小二乘的思想就是要使得观测点和估计点的距离的平方和达到最小。里的“二乘”指的是用平方来度量观测点粤估计点的远近(在古汉语中“平方”称为“二乘”),“最小”指的是参数的估计值要保证各个观测点与估计点的距离的平方和达到最小。2 算法分析2.1 功能分析2.1.1非线性方程的迭代解法用三个函数来实现非线性方程的三种解法,三种方法包括(即程序中的三个模块):1、用一般迭代的方法解非线性方程:编写函数FYiban(double x)设计一个迭代格式x=f1(x), 然 后编写函数void Yiban()调用函数FYiban(double x)进行循环迭代,直到得出的结果与前一个结 果的差值的绝对值小于给定的值0.00001,即为计算结果2、 用牛顿法解非线性方程:编写函数FNewton(double x)计算,然后编写函数void Newton()实现,其中调用函数FNewton(double x)进行循环迭代,直到得出的结果与前一个结果的差值的绝对值小于给定的值0.00001,即为方程的根3、 用弦截法解非线性方程:编写函数FXuanjie(double q,double r)计算原方程函数的导数,然后编写函数void Xuanjie()实现其中调用函数FXuanjie(double q,double r)进行循环迭代,直到得出的结果与前一个结果的差值的绝对值小于给定的值0.00001,即为方程的根2.1.2最小二乘法已知数据对,求多项式使得为最小,这就是一个最小二乘问题。2.2 算法分析通过上面各项功能的分析、分类、综合,按照模块化程序设计的要求,得到模块结构(作为后面选单设计的主要依据2.2.1非线性方程的迭代解法1、根据一般迭代公式: ,做出流程图如下:定义函数fyiban定义并初始化变量, x; x0, e=0.00001, k=1输入初始值xx0 = xxk= fyiban(x0) k+while |x0-x|e & k1000若ke & k1000若ke & k1000若k1000真输出近似根x假提示信息2.2.2最小二乘法用线性函数为例,拟合给定数据。 算法描述: 步骤1:输入值,及。步骤2:建立法方程组。 步骤3:解法方程组。 步骤4:输出。3 程序设计3.1 选单和主窗口设计3.1.1非线性方程的迭代解法主要的设计界面和代码#include #include #include double f(double x)return 2*pow(x,3)-x-1;double FYiban(double x)return pow(x+1)/2,1.0/3);double FNewton(double x)return x-f(x)/(6*pow(x,2)-1);double FXuanjie(double q,double r)return q-f(q)*(q-r)/(f(q)-f(r);double x,x0,x1,x2,t;void Yiban()x0=1.5;t=1;cout一般线性迭代过程为:=0.00001)x1=FYiban(x0);t=x0-x1;x0=x1;printf(%.5lfn,x0);printf(一般线性迭代结果为:%.5lfnn,x0);void Newton()x0=1.5;t=1;cout用Newton迭代过程为:=0.00001)x1=FNewton(x0);t=x0-x1;x0=x1;printf(%.5lfn,x0);printf(用Newton迭代结果为:%.5lfnn,x0);void Xuanjie()x0=1.5;x1=1.4;t=1;cout用弦截法迭代过程为:=0.00001)x2=FXuanjie(x1,x0);t=x1-x2;x0=x1;x1=x2;printf(%.5lfn,x0);printf(用弦截法迭代结果为:%.5lfnn,x0);void main()cout&+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+n*tttttttt &endl;cout&t选择用一般迭代法、牛顿法、弦截法求解方程:2*x3-x-1=0t &endl;cout&tta:一般迭代法ttttt &endl; cout&ttb:牛顿法ttttt &endl;cout&ttc:弦截法ttttt &endl;cout&ttd:三种方法(以供比较)tttt &endl;cout&+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&endl;char c=getchar();switch(c)case a:Yiban();break;case b:Newton();break;case c:Xuanjie();break;case d:Yiban();Newton();Xuanjie();3.1.2最小二乘法主要的设计界面和代码#include #include#include#includevoid Print(double *a,int m,int n)/输出函数int i,j;for(i=0;im;i+)for(j=0;jn;j+)coutsetw(12)aij;coutendl;/double* jzcj(double *a,int m,int n,double *b,int p,int q) /矩阵乘积int i,j;double *c;c=new double*m; for(i=0;im;i+)ci=new doubleq;for(i=0; im; i+)for(j=0; jq;j+) cij=0; for(int x=0; xn; x+)cij=cij+aix*bxj; Print(c,m,q);return c;/double* jzdn(double *a,int m,int n) /矩阵的逆int i,j,k;double c,*b,*t;b=new double*m; /动态分配空间for(i=0;im;i+)bi=new doublem;t=new double*m; /动态分配空间for(i=0;im;i+)ti=new doublem;/矩阵求逆/合并构成增广矩阵for(i=0;im;i+) for(j=0;jm;j+) bij=aij; for(j=m;j2*n;j+) if(i+m=j) bij=1; else bij=0; cout_求逆过程_endl;for(i=0;im;i+) /输出增广矩阵 for(j=0;j2*m;j+)coutsetw(12)bij;coutendl;coutn;/初等行变化求逆for(i=0;im;i+) c=bii;for(j=i;jm*2;j+)bij/=c;for(j=i+1;jm;j+) c=bji;for(k=i;km*2;k+)bjk=bjk-c*bik;for(i=0;im;i+) for(j=0;j2*m;j+)coutsetw(12)bij;coutendl;cout=0;i-) c=bii;for(j=i-1;j=0;j-) c=bji;for(k=i;km*2;k+)bjk=bjk-c*bik;for(i=0;im;i+) for(j=0;j2*m;j+)coutsetw(12)bij;coutendl;for(i=0;im;i+) for(j=m;jm*2;j+)tij-m=bij;coutsetw(12)bij;coutendl;return t;/double* jzzz(double *a,int m,int n) /矩阵转置int i,j;double *c;c=new double*n;for(i=0;in;i+)ci=new doublem;for(j=0;jm;j+) /矩阵的转置for(int k=0;kn;k+)ckj=ajk;Print(c,n,m);return c;void main()double *a,*b,*d,*e,*f,*g,*h;int i,j,m,n,p,q;coutmn;a=new double*m;for(i=0;im;i+)ai=new doublem;cout请输入矩阵a的数据:n;for(i=0;im;i+)for(j=0;jaij; /完成了对矩阵a的初始赋值 coutpq;b=new double*p;for(i=0;ip;i+)bi=new doublep;cout请输入矩阵b的数据:n;for(i=0;ip;i+)for(j=0;jbij; /完成了对矩阵b的初始赋值cout_原始矩阵_endl;Print(a,m,n); /输出系数矩阵coutn;Print(b,p,q); /输出常数矩阵cout系数矩阵a的转置矩阵 1 n;d=jzzz(a,m,n);cout系数矩阵a的转置矩阵与系数矩阵a的乘积所得矩阵 2 n;e=jzcj(d,n,m,a,m,n);cout系数矩阵a与其转置矩阵的乘积的逆矩阵 3 n;f=jzdn(e,n,n);cout矩阵的逆n;Print(f,n,n);cout系数矩阵a的转置矩阵与常数矩阵b的乘积所得矩阵 4 n; g=jzcj(d,n,m,b,p,q);cout最小二乘解x,yn 5 ;h=jzcj(f,n,n,g,n,q);3.2 模块设计3.2.1非线性方程的迭代解法针对每一个模块给出主要的界面和代码1、 一般迭代法:double FYiban(double x)return pow(x+1)/2,1.0/3);void Yiban()x0=1.5;t=1;cout一般线性迭代过程为:=0.00001)x1=FYiban(x0);t=x0-x1;x0=x1;printf(%.5lfn,x0);printf(一般线性迭代结果为:%.5lfnn,x0); 2、 牛顿迭代法:double FNewton(double x)return x-f(x)/(6*pow(x,2)-1);void Newton()x0=1.5;t=1;cout用Newton迭代过程为:=0.00001)x1=FNewton(x0);t=x0-x1;x0=x1;printf(%.5lfn,x0);printf(用Newton迭代结果为:%.5lfnn,x0);3、 弦截法 double FXuanjie(double q,double r)return q-f(q)*(q-r)/(f(q)-f(r);void Xuanjie()x0=1.5;x1=1.4;t=1;cout用弦截法迭代过程为:=0.00001)x2=FXuanjie(x1,x0);t=x1-x2;x0=x1;x1=x2;printf(%.5lfn,x0);printf(用弦截法迭代结果为:%.5lfnn,x0);4、 主函数模块:void main()cout&+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+n*tttttttt &endl;cout&t选择用一般迭代法、牛顿法、弦截法求解方程:2*x3-x-1=0t &endl;cout&tta:一般迭代法ttttt &endl; cout&ttb:牛顿法ttttt &endl;cout&ttc:弦截法ttttt &endl;cout&ttd:三种方法(以供比较)tttt &endl;cout&+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&endl;char c=getchar();switch(c)case a:Yiban();break;case b:Newton();break;case c:Xuanjie();break;case d:Yiban();Newton();Xuanjie();针对每一个模块给出主要的界面和代码3.2.2 最小二乘法1、输入矩阵a和bcout请输入矩阵a的数据:n;for(i=0;im;i+)for(j=0;jaij; /完成了对矩阵a的初始赋值 coutpq;b=new double*p;for(i=0;ip;i+)bi=new doublep;cout请输入矩阵b的数据:n;for(i=0;ip;i+)for(j=0;jbij; /完成了对矩阵b的初始赋值cout_原始矩阵_endl;Print(a,m,n); /输出系数矩阵coutn;Print(b,p,q); /输出常数矩阵2、系数矩阵a的转置矩阵1,系数矩阵a的转置矩阵与系数矩阵a的乘积所得矩阵2: /double* jzzz(double *a,int m,int n) /矩阵转置int i,j;double *c;c=new double*n;for(i=0;in;i+)ci=new doublem;for(j=0;jm;j+) /矩阵的转置for(int k=0;kn;k+)ckj=ajk;Print(c,n,m);return c;3、系数矩阵a与其转置矩阵的乘积的逆矩阵3:double* jzdn(double *a,int m,int n) /矩阵的逆int i,j,k;double c,*b,*t;b=new double*m; /动态分配空间for(i=0;im;i+)bi=new doublem;t=new double*m; /动态分配空间for(i=0;im;i+)ti=new doublem;/矩阵求逆/合并构成增广矩阵for(i=0;im;i+) for(j=0;jm;j+) bij=aij;for(j=m;j2*n;j+) if(i+m=j) bij=1;else bij=0; cout_求逆过程_endl;or(i=0;im;i+) /输出增广矩阵 for(j=0;j2*m;j+)coutsetw(12)bij;coutendl;coutn;/初等行变化求逆for(i=0;im;i+) c=bii;for(j=i;jm*2;j+)bij/=c;for(j=i+1;jm;j+) c=bji;for(k=i;km*2;k+)bjk=bjk-c*bik;for(i=0;im;i+) for(j=0;j2*m;j+)coutsetw(12)bij;coutendl;cout=0;i-) c=bii;for(j=i-1;j=0;j-) c=bji;for(k=i;km*2;k+)bjk=bjk-c*bik;for(i=0;im;i+) for(j=0;j2*m;j+)coutsetw(12)bij;coutendl;for(i=0;im;i+) for(j=m;jm*2;j+)tij-m=bij;coutsetw(12)bij;coutendl;return t;4、系数矩阵a的转置矩阵与常数矩阵b的乘积所得矩阵4:5、最小二乘解x,y:即a0=0.842857,b0=4.571436、 主函数模块:void main()double *a,*b,*d,*e,*f,*g,*h;int i,j,m,n,p,q;coutmn;a=new double*m;for(i=0;im;i+)ai=new doublem;cout请输入矩阵a的数据:n;for(i=0;im;i+)for(j=0;jaij; /完成了对矩阵a的初始赋值 coutpq;b=new double*p;for(i=0;ip;i+)bi=new doublep;cout请输入矩阵b的数据:n;for(i=0;ip;i+)for(j=0;jbij; /完成了对矩阵b的初始赋值cout_原始矩阵_endl;Print(a,m,n); /输出系数矩阵coutn;Print(b,p,q); /输出常数矩阵cout系数矩阵a的转置矩阵 1 n;d=jzzz(a,m,n);cout系数矩阵a的转置矩阵与系数矩阵a的乘积所得矩阵 2 n;e=jzcj(d,n,m,a,m,n);cout系数矩阵a与其转置矩阵的乘积的逆矩阵 3 n;f=jzdn(e,n,n);cout矩阵的逆n;Print(f,n,n);cout系数矩阵a的转置矩阵与常数矩阵b的乘积所得矩阵 4 n; g=jzcj(d,n,m,b,p,q);cout最小二乘解x,yn 5 ;h=jzcj(f,n,n,g,n,q);4 总结系统设计的优缺点,心得、体会缺点:1该程序没有设计成可以输入的、解一般非线性方程的统一方法,只能解决固定的非线性方程的求根问题,而且没有给出当迭代格式不收敛时的处理方法2 最小二乘法的程序设计比较复杂,不宜看懂优点:1该设计思路清晰明了,程序的结构模块划分得当,读者很容易读懂并运用程序,如果要计算其他一般非线性方程的根只需要修改少部分数据即可,且设计的界面友好2 设计思路清晰,给出了必要的文字说明,可以求任意一个最小二乘法的拟合问题心得体会:通过这次课程设计,我对计算机数值方法中非线性方程求解的三种迭代方法(即一般迭代法、牛顿迭代法、弦截法)有了更加深刻的理解,掌握的更加牢固了。对最小二乘法的思路更加明了,对矩阵的各种运算也更加熟练了,同时该设计是在VC+6.0环境下对程序进行设计编写的,让我的编程能力得到了提高,我对函数的编写调用、for循环语句,switch语句、指针的运用、数组以及输出格式的控制等有关知识又巩固复习了一遍,对它们的运用更加熟练了。这次课程设计也磨练了我的耐心。5 参考文献面向对象程序设计VisualC+,刘斌、王忠,清华大学出版社计算机数值方法,施吉林,刘淑珍,陈桂芝,高等教育出版社,2011 完成时间2014年1月2日
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 其他分类 > 其它学术


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!