当前位置:文档之家› 数值分析大作业

数值分析大作业

数值分析报大作业
班级:铁道2班
专业:道路与铁道工程
姓名:蔡敦锦
学号:13011260
一、序言
该数值分析大作业是通过C语言程序编程在Microsoft Visual C++ 6.0编程软件上运行实现的。

本来是打算用Matlab软间来计算非线性方程的根的。

学习Matlab也差不多有一个多月了,感觉自己编程做题应该没什么问题了;但是当自己真心的去编程、运行时才发现有很多错误,花了一天时间修改、调试程序都没能得到自己满意的结果。

所以,我选择了自己比较熟悉的C程序语言来编程解决非线性的求值问题,由于本作业是为了比较几种方法求值问题的收敛速度和精度的差异,选择了一个相对常见的非线性函数来反映其差异,程序运行所得结果我个人比较满意。

编写C语言,感觉比较上手,程序出现问题也能比较熟练的解决。

最终就决定上交一份C程序语言编程的求值程序了!
二、选题
本作业的目的是为了加深对非线性方程求根方法的二分法、简单迭代法、、牛顿迭代法弦截法等的构造过程的理解;能将各种方法的算法描述正确并且能够改编为程序并在计算机上实现程序的正确合理的运行,能得到自己满意的结果,并且能调试修改程序中可能出现的问题和程序功能的增减修改。

本次程序是为了比较各种方法在求解同一非线性方程根时,在收敛情况上的差异。

为了达到上面的条件我选择自己比较熟悉的语言—C语言来编程,所选题目为计算方程f(x)=x3-2x-5=0在区间[2,3]内其最后两近似值的差的绝对值小于等于5
⨯的根的几种方法的比较。

110-
本文将二分法、牛顿法、简单迭代法、弦截法及加速收敛法这五种方法在同一个程序中以函数调用的方式来实现,比较简洁明了,所得结果能很好的比较,便于分析;发现问题和得出结论。

三、程序运行结果
四、分析及结论
由以上程序得出的结果可以看出此程序中加速收敛的收敛速度最快其次是弦截法接下来是牛顿法、简单迭代法、二分法。

下面来分析出现这种结果的理论基础。

由数值分析知识可知,加速收敛法的收敛速度、弦截法和牛顿法都是二次收敛,但是其收敛的迭代公式收敛的速度是有区别的,加速收敛的迭代公式比弦截法和牛顿法收敛的速度要快。

这也就解释了上述程序运行后在相同的初始值时加速收敛法比牛顿法快了一倍的原因。

(加速收敛只需3次迭代就得到满足精度的值,而牛顿迭代需要6次迭代)。

弦截法的收敛速度从其收敛公式上来看是没有牛顿法的收敛速度快的,但是其迭代的次数还和其选取的初始值有关,弦截法需要两个初始值,这就必然使得其迭代的次数受到这两个初始值的影响,初始值选取的大小及合理与否直接影响其迭代的次数。

由程序运行的结果可以看出,虽然弦截法收敛速度比牛顿法慢,但是由于初始值的影响其迭代次数明显比牛顿法的次数少。

简单迭代的收敛速度和其迭代方程息息相关,一般来说简单迭代的收敛速度是低于加速法、牛顿法和弦截法的。

从程序运行结果中也可以得出这个结论。

所以在进行简单迭代计算时,其迭代的函数要合理选取。

二分法是一个收敛速度比较慢的非线性函数求根法,并且其只能求得一个根,当函数有两个解时,二分法将失去其效用。

综上所述,当对计算速度有较高要求时尽量采用加速收敛法,一般建议采用牛顿法,当对计算速度无要求且只有单根时,采用二分法所得结果比较精确,其他情况视个人喜好及方便选择。

五、C程序
#include<stdio.h>
#include<math.h>
#define f(x) (pow(x,3)-2*x-5)
#define g(x) (3*x*x-2)
#define m 2.0
#define n 3.0
float dffqsg(float a,float b);//对分法求方程的根,a,b为区间,返回值为方程的根float ndddfqsg(float a);//牛顿迭代法求方程的根,a为初值,返回值为方程的根float jdddf(float a);//简单迭代法求在a附近的根
float Aitken(float a);//加速收敛法
float xianjie(float a,float b);//弦截法求根
main()
{
float x;
x=dffqsg(m,n);//调用二分法求根
printf("二分法求出的方程根是%f\n",x);
x=ndddfqsg(4.0);
printf("牛顿迭代法求出的方程根是%f\n",x);
x= jdddf(2.0) ;
printf("简单迭代法求出的方程根是%f\n",x);
x=Aitken(2.0);
printf("加速收敛法求出的方程根是%f\n",x);
x=xianjie(2.1,2.0);
printf("弦截法求出的方程根是%f\n",x);
}
float dffqsg(float a,float b)
{
float c;
do
{
c=(a+b)*0.5;
printf("%f\t%f\n",c,f(c));
if(f(c)<0)
{a=c;}
else{b=c;}
}while(fabs(f(c))>0.00001);
return c;
float ndddfqsg(float a)
{
float c,d;
c=a;
do{
d=c;
c=c-f(c)*pow(g(c),-1);
printf("%f\t%f\n",m,c);
}while(fabs(c-d)>0.00001);
return c;
}
float jdddf(float a)
{ float x,d;
x=a;
do{
d=x;
x=pow(2*x+5,1.0/3.0);
printf("%f\t%f\n",d,x);
}while(fabs(d-x)>0.00001);
return x;
}
float Aitken(float a)
{
float x1,x2,x,d;
x=a;
do
{
d=x;
x1=pow(2*x+5,1.0/3.0);
x2=pow(2*x1+5,1.0/3.0);
x=(x*x2-x1*x1)/(x-2*x1+x2);
printf("%f\t%f\n",d,x);
}while(fabs(d-x)>0.00001);
return x;
}
float xianjie(float a,float b)
float x0,x1,d,x;
x0=a;
x1=b;
do
{
d=x1-x0;
x=x1-f(x1)/(f(x1)-f(x0))*(x1-x0);
x0=x1;
x1=x;
printf("%f\t%f\n",x,d);
}while(fabs(d)>0.00001);
return x;
}。

相关主题