数值分析——二分法和牛顿法

合集下载

数值分析综合实验报告

数值分析综合实验报告

一、实验目的通过本次综合实验,掌握数值分析中常用的插值方法、方程求根方法以及数值积分方法,了解这些方法在实际问题中的应用,提高数值计算能力。

二、实验内容1. 插值方法(1)拉格朗日插值法:利用已知数据点构造多项式,以逼近未知函数。

(2)牛顿插值法:在拉格朗日插值法的基础上,通过增加基函数,提高逼近精度。

2. 方程求根方法(1)二分法:适用于函数在区间内有正负值的情况,通过不断缩小区间来逼近根。

(2)Newton法:利用函数的导数信息,通过迭代逼近根。

(3)不动点迭代法:将方程转化为不动点问题,通过迭代逼近根。

3. 数值积分方法(1)矩形法:将积分区间等分,近似计算函数值的和。

(2)梯形法:将积分区间分成若干等分,用梯形面积近似计算积分。

(3)辛普森法:在梯形法的基础上,将每个小区间再等分,提高逼近精度。

三、实验步骤1. 拉格朗日插值法(1)输入已知数据点,构造拉格朗日插值多项式。

(2)计算插值多项式在未知点的函数值。

2. 牛顿插值法(1)输入已知数据点,构造牛顿插值多项式。

(2)计算插值多项式在未知点的函数值。

3. 方程求根方法(1)输入方程和初始值。

(2)选择求解方法(二分法、Newton法、不动点迭代法)。

(3)迭代计算,直到满足精度要求。

4. 数值积分方法(1)输入被积函数和积分区间。

(2)选择积分方法(矩形法、梯形法、辛普森法)。

(3)计算积分值。

四、实验结果与分析1. 插值方法(1)拉格朗日插值法:通过构造多项式,可以较好地逼近已知数据点。

(2)牛顿插值法:在拉格朗日插值法的基础上,增加了基函数,提高了逼近精度。

2. 方程求根方法(1)二分法:适用于函数在区间内有正负值的情况,计算简单,但收敛速度较慢。

(2)Newton法:利用函数的导数信息,收敛速度较快,但可能存在数值不稳定问题。

(3)不动点迭代法:将方程转化为不动点问题,收敛速度较快,但可能存在初始值选择不当的问题。

3. 数值积分方法(1)矩形法:计算简单,但精度较低。

数值分析实验报告62338

数值分析实验报告62338

数值分析实验报告(第二章)实验题目:分别用二分法、牛顿迭代法、割线法、史蒂芬森迭代法求方程的根,观察不同初始值下的收敛性,并给出结论。

问题分析:题目有以下几点要求:1.不同的迭代法计算根,并比较收敛性。

2.选定不同的初始值,比较收敛性.实验原理:各个迭代法简述二分法:取有根区间的重点,确定新的有根区间的区间长度仅为区间长度的一版。

对压缩了的有根区间重复以上过程,又得到新的有根区间,其区间长度为的一半,如此反复,……,可得一系列有根区间,区间收敛到一个点即为根。

牛顿迭代法:不动点迭代法的一种特例,具有局部二次收敛的特性。

迭代格式为割线法:是牛顿法的改进,具有超线性收敛的特性,收敛阶为1。

618. 迭代格式为史蒂芬森迭代法:采用不动点迭代进行预估校正。

至少是平方收敛的。

迭代格式为这里可采用牛顿迭代法的迭代函数。

实验内容:1.写出该问题的函数代码如下:function py= f(x)syms k;y=(k^2+1)*(k—1)^5;yy=diff(y,k);py(1)=subs(y,k,x);py(2)=subs(yy,k,x);end2.分别写出各个迭代法的迭代函数代码如下:二分法:function y=dichotomie(a,b,e)i=2;m(1)=a;while abs(a-b)〉et=(a+b)/2;s1=f(a);s2=f(b);s3=f(t);if s1(1)*s3(1)<=0b=t;elsea=t;endm(i)=t;i=i+1;endy=[t,i+1,m];end牛顿迭代法:function y=NewtonIterative(x,e)i=2;en=2*e;m(1)=x;while abs(en)〉=es=f(x);t=x—s(1)/s(2);en=t—x;x=t;m(i)=t;i=i+1;endy=[x,i+1,m];end牛顿割线法:function y=Secant(x1,x2,e)i=3;m(1)=x1,m(2)=x2;while abs(x2—x1)〉=es1=f(x1);s2=f(x2);t=x2—(x2—x1)*s2(1)/(s2(1)—s1(1));x1=x2;x2=t;m(i)=t;i=i+1;endy=[x2,i+1,m];end史蒂芬森迭代法:Function p=StephensonIterative(x,e)i=2;m(2)=x;en=2*e;while abs(en)〉=ey=fai(x);z=fai(y);t=x—(y-x)^2/(z—2*y+x); en=t-x;x=t;m(i)=t;i=i+1;endp=[x,i+1,m];end3.因为经常被使用,故可以写一个函数。

数值分析课程实验报告-二分法和牛顿迭代法

数值分析课程实验报告-二分法和牛顿迭代法
《数值分析》课程实验报告
用二分法和牛顿迭代法求方程的根
算法名称用二分法和牛顿迭代法求方程的根
学科专业机械工程
作者姓名xxxxxx
作者学号xxxBiblioteka xx作者班级xxxxxxxx
xx大学
二〇一五年十二月
《数值分析》课程实验报告
实验名称
用二分法和牛顿迭代法求方程的根
成绩
一、问题背景
在科学研究与工程计算中,常遇到方程(组)求根问题。若干个世纪以来,工程师和数学家花了大量时用于探索求解方程(组),研究各种各样的方程求解方法。对于方程f(x)=0,当f(x)为线性函数时,称f(x)=0为线性方程;当f(x)为非线性函数时,称式f(x)=0为非线性方程。对于线性方程(组)的求解,理论与数值求法的成果丰富;对于非线性方程的求解,由于f(x)的多样性,尚无一般的解析解法。当f(x)为非线性函数时,若f(x)=0无解析解,但如果对任意的精度要求,设计迭代方程,数值计算出方程的近似解,则可以认为求根的计算问题已经解决,至少能够满足实际要求。
fx=subs(ff,x,xk);
fa=subs(ff,x,a);
k=k+1;
iffx==0
y(k)=xk;
break;
elseiffa*fx<0
b=xk;
else
a=xk;
end
y(k)=xk;
end
plot(y,'.-');
gridon
(2)牛顿迭代法程序:
functionx=newton(xx,n)
对二分法和牛顿迭代法的观察和分析我们可以知道,二分法的优点是方法比较简单,编程比较容易,只是二分法只能用于求方程的近似根,不能用于求方程的复根,且收敛速度慢。而牛顿迭代法的收敛速度明显大于二分法的速度。

数值分析实验报告——方程求根

数值分析实验报告——方程求根

《数值分析》实验报告实验一方程求根一、实验目的:掌握二分法、Newton法、不动点迭代法、弦截法求方程的根的各种计算方法、并实施程序调试和运行,学习应用这些算法于实际问题。

二、实验内容:二分法、Newton法、不动点迭代法、弦截法求方程的根、程序的调试和运行,给出实例的计算结果。

观察初值对收敛性的影响。

三、实验步骤:①、二分法:定义:对于区间[a,b]上连续不断且f(a)·f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值的方法叫二分法。

实现方法:首先我们设一方程400*(x^4)-300*(x^3)+200*(x^2)-10*x-1=0,并求其在区间[0.1,1]上的根,误差限为e=10^-4。

PS:本方法应用的软件为matlab。

disp('二分法')a=0.1;b=1;tol=0.0001;n0=100;fa=400*(a.^4)-300*(a.^3)+200*(a.^2)-10*a-1;for i=1:n0 p=(a+b)/2;fp=400*(p.^4)-300*(p.^3)+200*(p.^2)-10*p-1;if fp==0||(abs((b-a)/2)<tol)disp('用二分法求得方程的根p=')disp(p)disp('二分迭代次数为:')disp(i)break;end;if fa*fp>0 a=p;else b=p;end;end;if i==n0&&~(fp==0||(abs((b-a)/2)<tol)) disp(n0) disp('次二分迭代后没有求出方程的根')end;程序调试:运行结果:用二分法求得方程的根p=0.1108二分迭代次数为:14②Newton法定义:取定初值x0,找到函数对应的点,然后通过该点作函数切线,交x轴,得到新的横坐标值,然后找函数对应的点,做切线,得到新的横坐标值,重复上述步骤,多次迭代,直到收敛到需要的精度。

二分法、牛顿迭代法、普通迭代法

二分法、牛顿迭代法、普通迭代法

数值球根试验报告《数值计算方法》专业班级软件08-1姓名熊文成学号08083117时间2010年10月24日星期天一、 实验目的熟悉二分法以及牛顿迭代法求方程近似根的数值方法,掌握各种迭代方法,自己扩张研究迭代法的效率与收敛性和初始值的关系。

二、 实验内容1.已知0104)(23=-+=x x x f 在[]21,上有一个实根*x ,14)2(5)1(=-=f f ,,用二分法和牛顿迭代法求该实根,要求精度满足条件:321*1021-+⨯≤-k x x 。

2.条件允许的话,扩展研究各种迭代法的效率,以及迭代的效率和收敛性与初始值的关系,并通过比较采用两点加速的方法与普通的方法的效率体验加速迭代的优点。

总而言之,本实验中的用到的求根方法有①二分法,②牛顿迭代法,③迭代函数为213)10(21)(x x -=ϕ的迭代方法,以及④对函数213)10(21)(x x -=ϕ采用两点加速迭代的方法。

三、 主函数流程程序是按顺序运行的,流程图如下图所示:四、源程序#include <stdio.h>#include <conio.h>#include <math.h>//根据x的值计算函数值//函数f(x)=x*x*x+4*x*x-10double func(double x){double value;value=x*x*x+4*x*x-10;return value;}//根据参数x的值计算函数f(x)的导数值double divFunc(double x){return 3*x*x+8*x;}//二分法计算方程f(x)=0在[1,2]上的跟//二份迭代结束条件由参数precision精度给出void biSectionMethod(double precision){int k=0; //均分次数double x1=1.0,x2=2.0; //区间[1.0,2.0]double midx; //二分之后的值printf("\n\t k 有根区间k+1 f(x(k+1)) ");do{printf("\n\t%3d",k);printf(" [%.3f,%.3f]",x1,x2);midx=(x1+x2)/2;printf(" %f",midx);printf(" %.6f",func(midx));if (func(midx)<0)x1=midx;else x2=midx;k++;if (k%3==0) //每次输出4个等用户审查getch();} while (x2-x1>=precision); //区间的长度超过5e-3就一直迭代printf("\n\t二分法分区间的次数:%d,所求的根是:%lf",k-1,x2);}//牛顿迭代法//根据初值值x0,在区间[1.0,2.0]上迭代求根//迭代次数由参数precision精度决定void NewTonMethod(double x0,double precision){int k=0; //迭代次数double x1,x2=x0;printf("\n\t k x(k) f(x(k)) |x(k+1)-x(k)|");do{printf("\n\t%2d",k);printf(" %.6f",x2);printf(" %.6f",func(x2));x1=x2;x2=x2-func(x1)/divFunc(x1);if (x2-x1>0)printf(" %.6f",x2-x1); //输出两次迭代的差值else printf(" %.6f",x1-x2);k++;if (k%3==0) //每次输出4个等用户审查getch();} while (x2-x1>precision||x1-x2>precision);printf("\n\t牛顿迭代初值:%lf,次数:%d,所求的根是:%lf",x0,k-1,x2); }//迭代函数g(x)=(sqrt(10-x*x*x))/2;double funcTwo(double x){return (sqrt(10-x*x*x))/2;}//普通迭代函数void ordinaMethod(double x0,double precision){int k=0; //迭代次数double x1,x2=x0;printf("\n\t k x(k) f(x(k)) |x(k+1)-x(k)|");do{printf("\n\t%2d",k);printf(" %.6f",x2);printf(" %.6f",func(x2));x1=x2;x2=funcTwo(x1);if (x2-x1>0)printf(" %.6f",x2-x1); //输出两次迭代的差值else printf(" %.6f",x1-x2);k++;if (k%3==0) //每次输出4个等用户审查getch();} while (x2-x1>precision||x1-x2>precision);printf("\n\t普通迭代初值:%lf,次数:%d,所求的根是:%lf",x0,k-1,x2); }//使用两个跌代值的组合加速跌代//对迭代函数f(x)=(sqrt(10-x*x*x))/2的加速void twoValue(double x0,double precision){int k=0; //迭代次数double x1,x2=x0;printf("\n\t k x(k) f(x(k)) |x(k+1)-x(k)|");do{printf("\n\t%2d",k);printf(" %.6f",x2);printf(" %.6f",func(x2));x1=x2;x2=(funcTwo(x1)+x1)/2;if (x2-x1>0)printf(" %.6f",x2-x1); //输出两次迭代的差值else printf(" %.6f",x1-x2);k++;if (k%3==0) //每次输出4个等用户审查getch();} while (x2-x1>precision||x1-x2>precision);printf("\n\t两点加速迭代初值:%lf,次数:%d,根:%lf",x0,k,x2);}void main(){double orgin=1.5; //初始值double precision=5e-6; //精度char sel=0; //操作符while(1){printf("\n\t选择:");printf("\n\t1.二分法\n\t2.迭代法\n\t");sel=getch();printf("\n\n\t注:程序停止处按任意键继续");if (sel=='1'){printf("\n\n\t ************二分法求解过程***********");biSectionMethod(precision); //测试函数}else{printf("\n\t输入迭代的初值:");scanf("%lf",&orgin);//if (orgin>2.0||orgin<1.0) //限制迭代初值范围,根据情况决定//orgin=1.5; //如果输入非法,则按1.5计算printf("\n\n\t ************牛顿迭代法求解过程************");NewTonMethod(orgin,precision);printf("\n\t任何键继续:");getch();printf("\n\n\t *******普通迭代g(x)=(sqrt(10-x*x*x))/2*****");ordinaMethod(orgin,precision);printf("\n\t任何键继续:");getch();printf("\n\n\t ************两个值组合加速迭代x=(g(x)+x)/2***********");twoValue(orgin,precision);}printf("\n\t任何键继续:");getch();}}五、运行结果1、选择求根方法2、 选择二分法下面给出二分法的结果:3、 选择迭代法查看结果:首先显示的是牛顿迭代法的结果:然后是普通迭代法函数是:213)10(21)(x x -=ϕ,结果如下:接着可以看到的是用两点加速法对函数213)10(21)(x x -=ϕ的加速:下面采用不同的初值查看普通迭代函数的收敛性与效率: 各个结果如下:上图对应的是收敛性:收敛的。

二分法、牛顿法、割线法、简易牛顿法

二分法、牛顿法、割线法、简易牛顿法

二分法、牛顿法、割线法、简易牛顿法二分法是一种简单而常用的求解方程近似解的方法。

其基本思想是将函数的定义域分为两个部分,并通过比较函数在这两个部分的取值来确定方程的解在哪一部分。

然后,再将该部分继续二分,直到找到近似解为止。

牛顿法是一种迭代求解方程根的方法。

它基于函数的局部线性逼近,通过不断更新当前的近似解,直到满足精度要求为止。

牛顿法的核心思想是利用函数的导数来不断修正当前的近似解,使得每次迭代都能更接近方程的根。

割线法是一种类似于牛顿法的迭代求解方程根的方法。

它也是基于函数的局部线性逼近,但不需要计算函数的导数。

割线法通过连接两个近似解的割线来估计方程的根,并利用割线与坐标轴的交点作为下一个近似解,不断迭代直到满足精度要求。

简易牛顿法是对牛顿法的一个简化版本。

在简易牛顿法中,不需要每次迭代都计算函数的导数,而是利用两个近似解的函数值来估计导数。

这样可以减少计算量,并在一定程度上提高计算效率。

二分法、牛顿法、割线法和简易牛顿法都是常用的求解方程近似解的方法,它们各自有着不同的特点和适用范围。

在实际应用中,我们可以根据具体的问题选择合适的方法来求解方程的近似解。

二分法适用于函数在定义域上单调且连续的情况,它的收敛速度较慢但稳定可靠。

牛顿法适用于函数在定义域上具有充分光滑的情况,它的收敛速度较快但对初值敏感。

割线法适用于函数在定义域上具有充分光滑的情况,它的收敛速度介于二分法和牛顿法之间。

简易牛顿法是对牛顿法的简化,适用于函数在定义域上具有充分光滑的情况,它的收敛速度介于割线法和牛顿法之间。

无论是二分法、牛顿法、割线法还是简易牛顿法,它们的求解过程都可以表示为迭代的形式。

通过不断更新当前的近似解,直到满足精度要求为止。

在每一次迭代中,我们都可以利用函数的信息来修正当前的近似解,使其更接近方程的根。

这种迭代的过程可以通过循环结构来实现,其中迭代的终止条件可以是近似解的精度达到要求或者迭代次数达到一定的限制。

数值分析原理实验报告

数值分析原理实验报告

一、实验目的通过本次实验,掌握数值分析的基本原理和方法,了解数值分析在科学和工程领域的应用,培养动手能力和分析问题的能力。

二、实验内容1. 二分法求方程根(1)原理:二分法是一种在实数域上寻找函数零点的算法。

对于连续函数f(x),如果在区间[a, b]上f(a)f(b)<0,则存在一个根在区间(a, b)内。

二分法的基本思想是将区间[a, b]不断二分,缩小根所在的区间,直到满足精度要求。

(2)实验步骤:① 输入函数f(x)和精度要求;② 初始化区间[a, b]和中间点c=a+(b-a)/2;③ 判断f(c)与f(a)的符号,若符号相同,则将区间缩小为[a, c],否则缩小为[c,b];④ 重复步骤②和③,直到满足精度要求;⑤ 输出根的近似值。

2. 牛顿法求方程根(1)原理:牛顿法是一种在实数域上寻找函数零点的算法。

对于可导函数f(x),如果在点x0附近,f(x0)f'(x0)≠0,则存在一个根在点x0附近。

牛顿法的基本思想是通过泰勒展开近似函数,然后求解近似方程的根。

(2)实验步骤:① 输入函数f(x)和精度要求;② 初始化迭代次数n=0,近似根x0;③ 计算导数f'(x0);④ 求解近似方程x1=x0-f(x0)/f'(x0);⑤ 判断|x1-x0|是否满足精度要求,若满足,则停止迭代;否则,将x0更新为x1,n=n+1,返回步骤③。

3. 雅可比迭代法解线性方程组(1)原理:雅可比迭代法是一种解线性方程组的迭代算法。

对于线性方程组Ax=b,雅可比迭代法的基本思想是利用矩阵A的对角线元素将方程组分解为多个一元线性方程,然后逐个求解。

(2)实验步骤:① 输入系数矩阵A和常数向量b;② 初始化迭代次数n=0,近似解向量x0;③ 计算对角线元素d1, d2, ..., dn;④ 更新近似解向量x1=x0-A/d1, x2=x0-A/d2, ..., xn=x0-A/dn;⑤ 判断|x1-x0|是否满足精度要求,若满足,则停止迭代;否则,将x0更新为x1, x2, ..., xn,n=n+1,返回步骤③。

二分法,牛顿法,梯形法原理及流程图

二分法,牛顿法,梯形法原理及流程图

1:二分法流程图:二分法基本思路:一般地,对于函数f(x),如果存在实数c,当x=c 时,若f(c)=0,那么把x=c 叫做函数f(x)的零点。

解方程即要求f(x)的所有零点。

假定f(x)在区间(x ,y )上连续先找到a 、b 属于区间(x ,y ),使f(a),f(b)异号,说明在区间(a,b)内一定有零点,然后求f[(a+b)/2],现在假设f(a)<0,f(b)>0,a<b① 如果f[(a+b)/2]=0,该点就是零点,如果f[(a+b)/2]<0,则在区间((a+b)/2,b)内有零点,(a+b)/2>=a ,从①开始继续使用② 中点函数值判断。

如果f[(a+b)/2]>0,则在区间(a,(a+b)/2)内有零点,(a+b)/2<=b ,从①开始继续使用 中点函数值判断。

这样就可以不断接近零点。

通过每次把f(x)的零点所在小区间收缩一半的方法,使区间的两个端点逐步迫近函数的零点,以求得零点的近似值,这种方法叫做二分法。

从以上可以看出,每次运算后,区间长度减少一半,是线形收敛。

另外,二分法不能计算复根和重根。

二分法步骤:用二分法求方程()0f x =的根*x 的近似值k x 的步骤① 若对于a b <有()()0f a f b <,则在(,)a b 内()0f x =至少有一个根。

② 取,a b 的中点12a b x +=计算1()f x ③ 若1()0f x =则1x 是()0f x =的根,停止计算,运行后输出结果*1x x =若1()()0f a f x <则在1(,)a x 内()0f x =至少有一个根。

取111,a a b x ==;若1()()0f a f x >,则取111,a x b b ==;④ 若12k k b a ε-≤(ε为预先给定的要求精度)退出计算,运行后输出结果*2k ka b x +≈,反之,返回步骤1,重复步骤1,2,3二分法Mtalab 程序syms x;fun=input('(输入函数形式)fx=');a=input('(输入二分法下限)a=');b=input('(输入二分法上限)b=');d=input('输入误差限d=')%二分法求根%f=inline(x^2-4*x+4);%修改需要求解的inline函数的函数体f=inline(fun);%修改需要求解的inline函数的函数体e=b-a; k=0 ;while e>dc=(a+b)/2;if f(a)*f(c)<0b=c;elseif f(a)*f(c)>0a=c;elsea=c;b=cende=e/2; k=k+1;endx=(a+b)/2;x%x为答案k%k为次数2,牛顿法及流程图:方程f(x)=0的根就是曲线y=f(x)与x轴交点的横坐标x*,当初始近似值x0选取后,过( x0,f(x0))作切线,其切线方程为:y- f(x0)=f′(x0)(x-x0)它与x轴交点的横坐标为x一般地,设是x*的第n次近似值,过( x,f(x))作y=f(x)的切线,其切线与x轴交点的横坐标为:x = - 即用切线与x轴交点的横坐标近似代曲线与x轴交点的横坐标,如图牛顿法正因为有此明显的几何意义,所以也叫切线法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

二分法和牛顿法的比较
二分法的基本思想是对有根区间[a,b]逐次分半,首先计算区间[a,b]的中间点x0,然后分析可能出现的三种情况:如果f(x0)f(a)<0,则f(x)在区间[a,x0]内有零点;如果f(x0)f(b)<0,则f(x)在区间[x0,b]内有零点;如果f(x0)=0,则x0是f(x)在区间[a,b]内所求零点。

但是二分法的缺点是收敛速度慢且不能求复根。

牛顿迭代法的基本思想是将方程f(x)=0中函数f(x)线性化,以线性方程的解逼近非线性方程的解其迭代函数为)
(')
()(x f x f x x -=ϕ。

牛顿迭代法的缺点是可能发生被零除错误,且可能出现死循环。

用二分法和牛顿法分别计算多项式02432
3
=-+-x x x 的解。

该多项式的解为1、1+i 和1-i ,使用二分法计算时,区间为(-1,2),使用牛顿法计算时取初始值为0。

误差都为0.0001。

编程如下
二分法(erfen.m):
syms x ;
fun=x^3-3*x^2+4*x-2; a=-1; b=2;
d=0.0001; f=inline(fun); e=b-a; k=0;
while e>d c=(a+b)/2; if f(a)*f(c)<0 b=c; elseif f(a)*f(c)>0
a=c; else
a=c;b=c; end e=e/2; k=k+1; end k x=(a+b)/2
牛顿法(newton.m):
function [k,x,wuca] = newton() k=1; x0=0; tol=0.0001; yx1=fun(x0); yx2=fun1(x0); x1=x0-yx1/yx2; while abs(x1-x0)>tol x0=x1; yx1=fun(x0); yx2=fun1(x0); k=k+1; x1=x1-yx1/yx2; end k x=x1
wuca=abs(x1-x0)/2 end
function y1=fun(x) y1=x^3-3*x^2+4*x-2; end
function y2=fun1(x)
y2=3*x^2-6*x+4; end 分析结果得知,在相同的误差精度下,二分法需要计算15次,而牛顿法只需计算5次,得知牛顿法比二分法优越。

相关文档
最新文档