二分法
一、题目
1. 用二分法求方程x32x10的所有根. 要求每个根的误差小于0.001.
二、方法 二分法 三、程序
1、Jiangerfen.M的程序
function[c,yc]=jiangerfen(f,a,b,tol1,tol2) if nargin<4 tol1=1e-3;tol2=1e-3;end
%nargin<4表示若赋的值个数小于4,则tol1和tol2取默认值。 ya=feval('f',a);%令x=a代入到方程f中,ya即f(a)。 yb=feval('f',b);
if ya*yb>0,disp('(a,b)不是有根区间');return,end
max=1+round((log(b -a)-log(tol2))/log(2));%round函数是将数据取整,使数据等于其最接近的整数。 for k=1:max c=(a+b)/2; yc=feval('f',c);
if((b-a)/2 b=c;yb=yc; end end k,c=(a+b)/2,yc=feval('f',c) 2、f.M的程序 function y=f(x); y=x^3-2*x-1; 四、结果 >> format compact >> fplot('[x^3-2*x-1,0]',[-1.5,2]); >> jiangerfen('f',-1.5,-0.8); k = 8 c = -0.9996 yc = 3.9017e-004 >> jiangerfen('f',-0.8,-0.3); 1 / 5 k = 8 c = -0.6184 yc = 2.7772e-004 >> jiangerfen('f',1.3,2); k = 10 c = 1.6179 yc = -9.5348e-004 >> jiangerfen('f',2,3); (a,b)不是有根区间 方程f(x)=x^3-2*x-1的所有根为-0.9996,-0.6184 ,1.6179 。迭代次数分别为8,8,10。 五、拓展 由于二分法收敛太慢,可以先通过画图,取得一个包含根的小区间,再用二分法来求解,这样就能有效减少迭代次数。 不动点迭代法 一、题目 2. 用不动点迭代求: 2 x2sinx10的在[0,1]的一个根。 二、方法 不动点迭代法 三、程序 1、Jiangbudong.M的程序 function p=jiangbudong(g,x0,tol,max) P(1)=x0; for k=1:max P(k+1)=feval('g',P(k)); p=P(k+1); if abs(P(k+1)-P(k)) >> format compact >> fplot('[2*x^2-sin(x)-1,0]',[0,1]); >> jiangbudong('g',0.5,1e-4,50) P = 2 / 5 Columns 1 through 9 0.5000 1.4794 0.6745 1.2042 0.8028 1.0708 0.8767 1.0087 0.9151 Columns 10 through 18 0.9794 0.9343 0.9655 0.9437 0.9588 0.9483 0.9556 0.9505 0.9541 Columns 19 through 27 0.9516 0.9533 0.9521 0.9530 0.9524 0.9528 0.9525 0.9527 0.9526 Column 28 0.9526 ans = 26 ans = 0.9526 方程2x^2-sin(x)-1=0在[0,1]的根为0.9526。取的初值是0.5。 五、拓展 在不动点迭代法中,迭代过程的收敛速度依赖于迭代函数g(x)的选取。若dg(x)不等于0,则该迭代过程只可能是线性收敛。如果改动迭代函数为g(x)=sqrt((sin(x)+1)/2),则输出结果为 >> jiangbudong('g',0.5,1e-4,50) P = Columns 1 through 6 0.5000 0.8601 0.9375 0.9503 0.9523 0.9526 Column 7 0.9526 ans = 5 ans = 0.9526 迭代次数为5次,相比先前的26次,收敛速度加快了很多。因此,在选取迭代函数时,应该尽量让函数收敛的阶更高一点。 Newton迭代法 一、题目 3. 用Newton迭代法求解,准确到105: x33x10的所有根; 二、方法 Newton迭代法 三、程序 1、Jiangnewton.M的程序 function p=jiangnewton(h,dh,x0,tol1,max) p0=x0; for k=1:max p=p0-feval(h,p0)/feval(dh,p0); if abs(p-p0) p0=p; disp(p0); if k==max disp('method failed');end end k-1 2、h.M的程序 function y=h(x); y=x^3-3*x+1; 3、dh.M的程序 function y=dh(x); y=3*x^2-3; 四、结果 >> format compact >> fplot('[x^3-3*x+1,0]',[-4,4]); >> jiangnewton('h','dh',-2.1,1e-5,100) -1.9083 -1.8800 -1.8794 ans = 3 ans = -1.8794 >> jiangnewton('h','dh',0.2,1e-5,100) 0.3417 0.3473 0.3473 ans = 3 ans = 0.3473 >> jiangnewton('h','dh',1.1,1e-5,100) 2.6381 1.9979 1.6657 1.5484 1.5324 1.5321 ans = 6 ans = 1.5321 方程x^3-3x+1=0的根为 -1.8794,0.3473 ,1.5321。迭代次数分别为3,3,6。 五、拓展 由于牛顿迭代法收敛性依赖初值的选取,倘若选取的初值偏离所求根较远或者选取不恰当, 4 / 5 牛顿法可能发散,求不出根来。例如: jiangnewton('h','dh',-1,1e-5,100),则求不出根来。 >> jiangnewton('h','dh',-0.7,1e-5,100) 1.1020 2.6071 1.9804 1.6580 1.5467 1.5323 1.5321 ans = 7 ans = 1.5321 >> jiangnewton('h','dh',-0.6,1e-5,100) 0.7458 0.1279 0.3375 0.3473 0.3473 ans = 5 ans = 0.3473 >> jiangnewton('h','dh',-1.1,1e-5,100) -5.8127 -4.0035 -2.8688 -2.2232 -1.9426 -1.8822 -1.8794 ans = 7 ans = -1.8794 由上面可以看到,选取的初值相差很小,可是求出的根却不一样。 [文档可能无法思考全面,请浏览后下载,另外祝您生活愉快,工作顺利,万事如意!] 5 / 5 因篇幅问题不能全部显示,请点此查看更多更全内容