《2022年数值分析课程设计分析方案 .pdf》由会员分享,可在线阅读,更多相关《2022年数值分析课程设计分析方案 .pdf(25页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1 / 25 郑州轻工业学院数 值 分 析课 程 设 计 报 告题目:1.非线性方程求解 8.最小二乘法姓名:杨君芳院系):数学与信息科学学院专业班级:信科 11-01 学号:541110010148 指导教师:汪远征时间:2018年 12月 30日至 2018年 1 月 4 日精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,共 25 页2 / 25 摘 要本文的内容主要属于数值代数问题的迭代解法和差值问题。在VC+6.0 环境下对非线性方程求根的三种迭代解法即一般迭代法,牛顿迭代法和弦截法)的算法实现,将抽象问题转化为计算机编程的一般解法
2、思想,实现运用计算机解非线性方程的根。同时完成了运用最小二乘法的思想解决实际问题的简单设计,本文也对该程序设计的难点、解决技巧、每种方法的理论基础、程序的算法分析、功能分析、模块设计以及算法的优点、缺点和主要参考文献等进行了详细的作答。,精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 2 页,共 25 页3 / 25 目 录数值分析1课程设计报告1摘要 2目录 31 理论基础 41.1 非线性方程的迭代解法41.2 最小二乘法42 算法分析52.1 功能分析52.1.1 非线性方程的迭代解法52.2 算法分析53 程序设计83.1 选单和主窗口设计
3、83.1.1 非线性方程的迭代解法83.1.2 最小二乘法103.2 模块设计143.2.1 非线性方程的迭代解法143.2.2 最小二乘法184 总结245 参考文献25精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 3 页,共 25 页4 / 25 1 理论基础1.1 非线性方程的迭代解法1、 一般迭代法:首先将方程fx)=0 化为一个与它同解的方程x=f1x ),任取一个初值x0,代入 f1x ),得到x1=f1x0 )再将x1 代入f1x )得到x2=f1x1 )以此类推,得到一个数列)(11kkxfx如果迭代格式产生的数列收敛,则迭代法收
4、敛,得到的收敛值即为方程的根。2、 牛 顿 迭 代 法 : 用 迭 代 法 解 非 线 性 方 程 总 可 以 构 造x=fx ) =x kx ) fx ) 即 迭 代 法)()(1kkkkxfxfxx为牛顿迭代法。3、 弦截法:用牛顿法求函数的倒数使用不方便,则可以用)()()(1kkkxfxfxf代替)(kxf,则)()()()(111kkkkkkkxxxfxfxfxx即为弦截法1.2 最小二乘法在研究两个变量之间的关系时,可以用回归分析的方法进行分析。当确定了描述两个变量之间的回归模型后,就可以使用最小二乘法估计模型中的参数,进而建立经验方程。简单地说,最小二乘的思想就是要使得观测点和估
5、计点的距离的平方和达到最小。里的“二乘”指的是用平方来度量观测点粤估计点的远近在古汉语中“平方”称为“二乘”),“最小”指的是参数的估计值要保证各个观测点与估计点的距离的平方和达到最小。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 4 页,共 25 页5 / 25 2算法分析2.1 功能分析2.1.1非线性方程的迭代解法用三个函数来实现非线性方程的三种解法,三种方法包括设计一个迭代格式x=f1调用函数FYiban(double x进行循环迭代,直到得出的结果与前一个结果的差值的绝对值小于给定的值0.00001,即为计算结果2、 用牛顿法解非线性方
6、程:编写函数FNewton(double x 计算)()(kkxfxf,然后编写函数void Newton( 实现)()(1kkkkxfxfxx,其中调用函数FNewton(double x进行循环迭代,直到得出的结果与前一个结果的差值的绝对值小于给定的值0.00001,即为方程的根3、 用弦截法解非线性方程:编写函数FXuanjie(double q,double r计算原方程函数的导数,然后编写函数void Xuanjie( 实现)()()()(111kkkkkkkxxxfxfxfxx其中调用函数FXuanjie(double q,double r进行循环迭代,直到得出的结果与前一个结果的
7、差值的绝对值小于给定的值0.00001,即为方程的根2.1.2 最小二乘法已知数据对,1,2,jjxyjn,求多项式0( )()miiip xa xmn使得20110(,)nminijjjia aaa xy为最小,这就是一个最小二乘问题。2.2 算法分析通过上面各项功能的分析、分类、综合,按照模块化程序设计的要求,得到模块结构 k+ while |x0-x|e & k1000 若 k/dfun(x0 k+ while |x0-x|e & k1000 若 k k+ while |x0-x|e & k1000 若 k1000 真输出近似根 x 假提示信息2.2.2最小二乘法用线性函数( )p xa
8、bx为例,拟合给定数据,1,2,iix yim。算法描述:步骤 1:输入m值,及,1,2,iix yim。步骤 2:建立法方程组TA AXAY。步骤 3:解法方程组。步骤 4:输出( )p xabx。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 7 页,共 25 页8 / 25 3程序设计3.1 选单和主窗口设计3.1.1非线性方程的迭代解法主要的设计界面和代码#include #include #include double f(double x return 2*pow(x,3-x-1 。 double FYiban(double x ret
9、urn 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 。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 8 页,共 25 页9 / 25 prin
10、tf(%.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。 pr
11、intf( 用弦截法迭代结果为:%.5lfnn,x0 。 void main( cout&+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+n*tttttttt &endl。cout&t选 择 用 一 般 迭 代 法 、 牛 顿 法 、 弦 截 法 求 解 方 程 : 2*x3-x-1=0t &endl 。cout&tta: 一般迭代法 ttttt &endl。cout&ttb:牛顿法 ttttt &endl。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 9 页,
12、共 25 页10 / 25 cout&ttc:弦截法 ttttt &endl。cout&ttd:三种方法 以供比较) tttt &endl。cout&+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&。switch(c case a: Yiban(。break。case b: Newton( 。break。case c: Xuanjie( 。break。case d: Yiban(。Newton( 。Xuanjie( 。 3.1.2最小二乘法主要的设计界面和代码#include #include #inclu
13、de #include void Print(double *a,int m,int n/输出函数 int i,j 。for(i=0 。i for(j=0 。j coutaij。 cout /矩阵乘积 int i,j 。double *c 。c=new double*m 。 for(i=0 。i ci=new doubleq 。for(i=0 。 i for(j=0 。 j cij=0 。for(int x=0 。 x cij=cij+aix*bxj。 Print(c,m,q 。return c。 / double* jzdn(double *a,int m,int n /矩阵的逆 int i
14、,j,k 。double c,*b,*t 。b=new double*m 。 /动态分配空间for(i=0 。i bi=new doublem 。t=new double*m 。 /动态分配空间for(i=0 。i ti=new doublem 。/矩阵求逆/合并构成增广矩阵for(i=0 。i for(j=0 。j bij=aij。 for(j=m 。 j 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 11 页,共 25 页12 / 25 if(i+m=j bij=1 。 else bij=0 。 cout_求逆过程_endl 。for(i=0
15、 。i / 输出增广矩阵 for(j=0 。j coutbij。coutendl。 coutn 。/ 初等行变化求逆for(i=0 。i c=bii 。for(j=i 。j bij/=c 。for(j=i+1 。j c=bji 。for(k=i 。k bjk=bjk-c*bik。 for(i=0 。i for(j=0 。j coutbij。coutendl。 cout=0 。i- c=bii 。for(j=i-1 。j=0。j- c=bji 。for(k=i 。k bjk=bjk-c*bik。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 12 页
16、,共 25 页13 / 25 for(i=0 。i for(j=0 。j coutbij。coutendl。 for(i=0 。i for(j=m 。j tij-m=bij。coutbij。cout /矩阵转置 int i,j 。double *c 。c=new double*n 。for(i=0 。i ci=new doublem 。for(j=0 。j / 矩阵的转置 for(int k=0 。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
17、=new double*m 。for(i=0 。i 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 13 页,共 25 页14 / 25 ai=new doublem 。cout请输入矩阵a的数据 :n。for(i=0 。i for(j=0 。j cinaij 。 / 完成了对矩阵a的初始赋值coutpq 。b=new double*p 。for(i=0 。i bi=new doublep 。cout请输入矩阵b 的数据 :n。for(i=0 。i for(j=0 。j cinbij 。 / 完成了对矩阵b 的初始赋值cout_ 原始矩阵 _ 。
18、/输出系数矩阵cout 。 / 输出常数矩阵cout。cout 。cout 。cout 。cout 。cout 。 3.2 模块设计3.2.1非线性方程的迭代解法针对每一个模块给出主要的界面和代码1、 一般迭代法 :精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 14 页,共 25 页15 / 25 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 。pr
19、intf(%.5lfn,x0。 printf( 一般线性迭代结果为:%.5lfnn,x0 。 2、 牛顿迭代法:double FNewton(double x return x-f(x/(6*pow(x,2-1。 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 15 页,共 25 页16 / 25 void Newton( x0=1.5。t=1。cout用 Newton 迭代过程为:=0.00001 x1=FNewton(x0 。t=x0-x1 。x0=x1 。printf(%.5lfn,x0。 printf( 用 Newton 迭代结果为: %.
20、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&+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
21、+-+-+-+-+-+-+-+-+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&+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&。switch(c case a:
22、 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 17 页,共 25 页18 / 25 Yiban(。break。case b: Newton( 。break。case c: Xuanjie( 。break。case d: Yiban(。Newton( 。Xuanjie( 。 针对每一个模块给出主要的界面和代码3.2.2 最小二乘法1、输入矩阵a 和 b cout请输入矩阵a的数据 :n。for(i=0 。i for(j=0 。j cinaij 。 / 完成了对矩阵a的初始赋值coutpq 。b=new double*p 。for(i=0 。i b
23、i=new doublep 。cout请输入矩阵b 的数据 :n。for(i=0 。i for(j=0 。j cinbij 。 / 完成了对矩阵b 的初始赋值cout_ 原始矩阵 _ 。 /输出系数矩阵精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 18 页,共 25 页19 / 25 cout 。 / 输出常数矩阵2、系数矩阵a 的转置矩阵1,系数矩阵a 的转置矩阵与系数矩阵a的乘积所得矩阵2:/ double* jzzz(double *a,int m,int n /矩阵转置 int i,j 。double *c 。c=new double*n
24、 。for(i=0 。i ci=new doublem 。for(j=0 。j / 矩阵的转置 for(int k=0 。k ckj=ajk。 Print(c,n,m 。return c。 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 19 页,共 25 页20 / 25 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 。i bi=new double
25、m 。t=new double*m 。 /动态分配空间for(i=0 。i ti=new doublem 。/矩阵求逆/合并构成增广矩阵for(i=0 。i for(j=0 。j bij=aij。 for(j=m 。j if(i+m=j bij=1 。else bij=0 。 cout_求逆过程_endl 。or(i=0 。i / 输出增广矩阵 for(j=0 。j coutbij。coutendl。 coutn 。/ 初等行变化求逆for(i=0 。i c=bii 。for(j=i 。j bij/=c 。for(j=i+1 。j 精选学习资料 - - - - - - - - - 名师归纳总结
26、 - - - - - - -第 20 页,共 25 页21 / 25 c=bji 。for(k=i 。k bjk=bjk-c*bik。 for(i=0 。i for(j=0 。j coutbij。coutendl。 cout=0 。i- c=bii 。for(j=i-1 。j=0。j- c=bji 。for(k=i 。k bjk=bjk-c*bik。 for(i=0 。i for(j=0 。j coutbij。coutendl。 for(i=0 。i for(j=m 。j tij-m=bij。coutbij。cout double *a,*b,*d,*e,*f,*g,*h。int i,j,m,
27、n,p,q 。coutmn 。a=new double*m 。for(i=0 。i ai=new doublem 。cout请输入矩阵a的数据 :n。for(i=0 。i 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 22 页,共 25 页23 / 25 for(j=0 。j cinaij 。 / 完成了对矩阵a的初始赋值coutpq 。b=new double*p 。for(i=0 。i bi=new doublep 。cout请输入矩阵b 的数据 :n。for(i=0 。i for(j=0 。j cinbij 。 / 完成了对矩阵b 的初始赋
28、值cout_ 原始矩阵 _ 。 /输出系数矩阵cout 。 / 输出常数矩阵cout。cout 。cout 。cout 。cout 。cout 。 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 23 页,共 25 页24 / 25 4总结系统设计的优缺点,心得、体会缺点: 1 该程序没有设计成可以输入的、解一般非线性方程的统一方法,只能解决固定的非线性方程的求根问题,而且没有给出当迭代格式不收敛时的处理方法2 最小二乘法的程序设计比较复杂,不宜看懂优点: 1 该设计思路清晰明了,程序的结构模块划分得当,读者很容易读懂并运用程序,如果要计算其他一般
29、非线性方程的根只需要修改少部分数据即可,且设计的界面友好2 设计思路清晰,给出了必要的文字说明,可以求任意一个最小二乘法的拟合问题心得体会:通过这次课程设计,我对计算机数值方法中非线性方程求解的三种迭代方法即一般迭代法、牛顿迭代法、弦截法)有了更加深刻的理解,掌握的更加牢固了。对最小二乘法的思路更加明了,对矩阵的各种运算也更加熟练了,同时该设计是在VC+6.0环境下对程序进行设计编写的,让我的编程能力得到了提高,我对函数的编写调用、for 循环语句, switch 语句、指针的运用、数组以及输出格式的控制等有关知识又巩固复习了一遍,对它们的运用更加熟练了。这次课程设计也磨练了我的耐心。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 24 页,共 25 页25 / 25 5 参考文献面向对象程序设计Visual C+,刘斌、王忠,清华大学出版社计算机数值方法,施吉林,刘淑珍,陈桂芝,高等教育出版社,2018 完成时间2018年 1 月 2 日精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 25 页,共 25 页
限制150内