您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 实验一_非线性方程求根
1实验一非线性方程求根实验名称:非线性方程求根实验类型:验证性实验学时:22.1实验环境①操作系统:WindowsXP/Win7②编程环境:自定2.2实验目的①掌握二分法、牛顿迭代法等常用的非线性方程迭代算法;②了解迭代算法的设计原理及初值对收敛性的影响。2.3实验原理和方法2.3.1二分法的算法描述计算()0fx的根的二分法如下:①输入有根区间[,]ab,根的容许误差和()fx与零之间的容许误差,置二分次数0n,并计算(),()abffaffb,如果0abff,转②;否则,算法失败,结束;②当ba时,计算()/2xab,()ffx;分情况处理:若f,则停止计算,输出近似根x以及二分次数n;否则若0aff,则,bbxff;否则,,aaxff;1nn,转②③2abx;④输出近似根x以及二分次数n。2.3.2牛顿迭代法的算法描述给定初始值0x,为根的容许误差,为()fx与零之间的容许误差,N为最大迭代次数。置2迭代次数0n,进行如下计算:①如果'0()0fx或nN,则算法失败,结束;否则执行②②计算010'0()()fxxxfx,1nn;③若10xx或1()fx,则输出近似根1x及迭代次数n,程序结束;否则执行④④令01xx,转向①2.3.3牛顿迭代法的改进弦截法(割线法)改用差商11()()kkkkfxfxxx代换牛顿法中的1'()kfx,可得迭代公式111212()()()()kkkkkkkfxxxxxfxfx2,3,4,k称之为弦截法。该方法是超线性收敛的,与单点弦截法相比有所改善。不需要计算导数,但是它需要提供两个初值01,xx,而且收敛速度不如牛顿迭代算法。2.4实验内容和步骤题目求方程32()330fxxxx在1.5附近的根.(误差限为16,19ee)(1)编程实现二分法,并求解上述非线性方程的根(有根区间自己确定)。(2)设计弦截法,计算原方程的根。参考答案原方程的根为1.732051x解:(1)二分法流程图:3开始f(x)=x^3+x^2-3x-3输入精度eps,端点值a,bf(a)*f(b)0t=(a+b)/2f(t)=0NYNYNb=ta=t|b-a|eps输出(a+b)/2f(a)*f(t)0输出t结束YNY4MATLAB程序代码:function[r,i]=HalfInterval(f,a,b,eps)i=0;f1=subs(sym(f),findsym(sym(f)),a);f2=subs(sym(f),findsym(sym(f)),b);if(f1==0);r=a;endif(f2==0)r=b;endif(f1*f20)disp('调整a,b的值');return;else[r,i]=FindRoots(f,a,b,eps,i);endfunction[r,i]=FindRoots(f,a,b,eps,i)f_1=subs(sym(f),findsym(sym(f)),a);f_2=subs(sym(f),findsym(sym(f)),b);mf=subs(sym(f),findsym(sym(f)),(a+b)/2);if(f_1*mf0)t=(a+b)/2;i=i+1;[r,i]=FindRoots(f,t,b,eps,i);elseif(f_1*mf==0)r=(a+b)/2;i=i+1;elseif(abs(b-a)=eps)r=(b+a)/2;i=i+1;elses=(a+b)/2;i=i+1;[r,i]=FindRoots(f,a,s,eps,i);endend5end[r,i]=HalfInterval('x*x*x+x*x-3*x-3',1,2,1.0e-6);vpa(r,7)[r,i]=HalfInterval('x*x*x+x*x-3*x-3',1,2,1.0e-9);vpa(r,10)程序结果:(2)弦截法流程图6弦截法MATLAB程序代码:functiony=newton(a,n,x01,x02,eps)%an+1元素的一维实数组,输入参数,按升幂存放方程系数。7%n整变量,输入参数,方程阶数。%x01,xo2初始值,esp给定精度%弦截法迭代公式:x(k+1)=x(k)-(x(k)-x(k-1))*f(x(k))/[f(x(k)-f(x(k-1))]x(1)=x01;x(2)=x02;b=1;i=2;while(abs(b)eps*x(i))x(i+1)=x(i)-gfun(a,n,x(i))*(x(i)-x(i-1))/(gfun(a,n,x(i))-gfun(a,n,x(i-1)));b=x(i+1)-x(i);i=i+1;endy=x(i);ifunctiony=gfun(a,n,x)%待求根的实数代数方程的函数y=0.0;fori=1:(n+1)y=y+a(i)*x^(n+1-i);Enda=[1,1,-3,-3];n=3;x01=1.5;x02=2;eps=1.0e-6;y=newton(a,n,x01,x02,eps);vpa(y,7)a=[1,1,-3,-3];n=3;x01=1.5;x02=2;eps=1.0e-9;y=newton(a,n,x01,x02,eps);vpa(y,10)程序结果:82.5练习思考①比较二分法和牛顿法在非线性方程求根中的优缺点和收敛速度。参考:二分法简单易行,但只有线性收敛速度;牛顿法计算简单,对于单根情形具有二阶局部收敛速度,但对初值的选择比较困难,牛顿法每次迭代要计算'()fx,增加了计算量,对于重根情形仅线性收敛。②改进牛顿迭代法,使其对于重根也具有较高的收敛阶,试写出你所能想到的改进思路及其迭代格式,并简单分析收敛速度。解:(1)由上面的两道题可以看出,当收敛到相同精度的时候二分法运行了24次,而弦截法只运行了8次,并且弦截法的收敛速度还不如牛顿法,所以可以看出牛顿法的收敛速度比二分法快得多,但牛顿迭代法对初值的选择比较困难,牛顿法每次迭代要计算,增加了计算量,对于重根情形仅线性收9敛。(2)改进牛顿迭代法设x*是f的n重根,则:因为牛顿迭代法事实上是一种特殊的不动点迭代,其中:则:根的重数已知,可将f的重根转化为另一函数的单根。令,则f的重根是的单根,且)('*)()()(*)()(xgxxxmgxgxxx对)(x构造出相应的牛顿迭代格式,迭代函数为:)('')(2)]^('[)(')()(')()(xfxfxfxfxfxxxxx从而可构造出相应的迭代法格式为:)('')(2)]^('[)(')(1kkkkkkkxfxfxfxfxfxx若已知根的重数为n,可将迭代格式改为:,2,1,0)(')(1kxfxfnxxkkkk则0*)('x,所以上述格式是平方收敛的。()()()fxxxfx221(*)(*)(*)|(*)|(*)fxfxfxxfx111n)()()(xfxfx10优点:收敛速度快,稳定性好;精度高。缺点:在重根附近收敛速度会降阶;每次都要计算函数及其导数值,计算量大。
本文标题:实验一_非线性方程求根
链接地址:https://www.777doc.com/doc-4425495 .html