1课题一迭代格式的比较一、问题提出设方程f(x)=x-3x–1=0有三个实根x*1=1.8793,x*2=0.34727,x*3=-1.53209现采用下面六种不同计算格式,求f(x)=0的根x*1或x*21.213xxx2.313xx3.313xx4.312xx5.xx136.1133123xxxxx二、要求1、编制一个程序进行运算,最后打印出每种迭代格式的敛散情况;2、用事后误差估计kkxx1来控制迭代次数,并且打印出迭代的次数;3、初始值的选取对迭代收敛有何影响;4、分析迭代收敛和发散的原因。三、目的和意义1、通过实验进一步了解方程求根的算法;2、认识选择计算格式的重要性;3、掌握迭代算法和精度控制;4、明确迭代收敛性与初值选取的关系。21.六种不同计算格式运行程序及运算结果1.1运行程序(1)213xxxfunctioniteration_1x0=input('输入初始值x0=');k=input('输入迭代次数k=');x(1)=x0;i=1;whilei=kx(i+1)=fun(x(i))i=i+1;xk=x(i);endfunctiony=fun(x)y=(3*x+1)/x^2;(2)313xxfunctioniteration_2x0=input('输入初始值x0=');k=input('输入迭代次数k=');x(1)=x0;i=1;whilei=kx(i+1)=fun(x(i))i=i+1;xk=x(i);endfunctiony=fun(x)y=(x^3-1)/3;(3)313xxfunctioniteration_3x0=input('输入初始值x0=');k=input('输入迭代次数k=');x(1)=x0;i=1;whilei=kx(i+1)=fun(x(i))i=i+1;3xk=x(i);endfunctiony=fun(x)y=(3*x+1)^(1/3);(4)312xxfunctioniteration_4x0=input('输入初始值x0=');k=input('输入迭代次数k=');x(1)=x0;i=1;whilei=kx(i+1)=fun(x(i))i=i+1;xk=x(i);endfunctiony=fun(x)y=1/(x^2-3);(5)xx13functioniteration_5x0=input('输入初始值x0=');k=input('输入迭代次数k=');x(1)=x0;i=1;whilei=kx(i+1)=fun(x(i))i=i+1;xk=x(i);endfunctiony=fun(x)y=(3+1/x)^(1/2);(6)1133123xxxxxfunctioniteration_6x0=input('输入初始值x0=');k=input('输入迭代次数k=');x(1)=x0;i=1;4whilei=kx(i+1)=fun(x(i))i=i+1;xk=x(i);endfunctiony=fun(x)y=x-(1/3)*((x^3-3*x-1)/(x^2-1));1.2运行结果在matlab的commandwindow中调用写好的m文件,运行方式如下iteration输入初始值x0=输入迭代次数k=(1)iteration_1输入初始值x0=1输入迭代次数k=5计算格式(1)最终运行结果如下:x=1.00004.00000.81255.20710.61307.5549由此知,计算格式(1)发散。(2)iteration_2输入初始值x0=1输入迭代次数k=5计算格式(2)最终运行结果如下:x=1.00000-0.3333-0.3457-0.3471-0.3473由此知,计算格式(2)收敛。(3)iteration_3输入初始值x0=1输入迭代次数k=8计算格式(2)最终运行结果如下:x=1.00001.58741.79281.85451.87231.87741.87881.87921.8793由此知,计算格式(3)收敛。(4)iteration_4输入初始值x0=1输入迭代次数k=5计算格式(2)最终运行结果如下:x=1.0000-0.5000-0.3636-0.3487-0.3474-0.34735由此知,计算格式(4)收敛。(5)iteration_5输入初始值x0=1输入迭代次数k=8计算格式(5)最终运行结果如下:x=1.00002.00001.87081.88001.87931.87941.87941.87941.8794由此知,计算格式(5)收敛。(6)iteration_6输入初始值x0=2输入迭代次数k=5计算格式(6)最终运行结果如下:x=2.00001.88891.87951.87941.87941.87942.matlab事后误差估计控制迭代次数,程序如下(①注:此程序只能够在迭代式收敛的情况下有意义;②如果要采用不同的计算格式,只要将matlab程序的子函数中的迭代式修改即可。)function[k,control,xk]=iteration%k为输出的迭代次数%control为控制条件,使循环结束%xk为迭代方程的一个根%此函数只能够在迭代式收敛的情况下有意义N=input('输入最大迭代次数N=');x(1)=input('输入初始值x0=');m=input('输入控制误差m=');fori=1:Nx(i+1)=fun(x(i))control=abs(x(i+1)-x(i));[(i-1)controlx(i)]if(controlm)k=i;xk=x(i);breakendi=i+1;endfunctiony=fun(x)y=(3*x+1)^(1/3);将程序存为m文件,并且进行调用,有如下运行方式(程序以计算格式(3)为例)[kcontrolxk]=iteration6输入最大迭代次数N=30输入初始值x0=1输入控制误差m=0.0000005运行输出结果为:x=1.00001.58741.79281.85451.87231.87741.87881.87921.87931.87941.87941.87941.87941.8794k=13control=2.0924e-007xk=1.8794有输出结果可以看出,方程的一个根为1.8794,迭代了13次,并且最后一次的偏差为2.0924e-007。3.初始值的选取对迭代收敛有何影响?如果函数在C[a,b]满足不动点的两个条件,那么对于任意的x0∈[a,b],得到的迭代序列{xk}收敛到函数的不动点。在此情况下,初始值的选取对迭代收敛没有任何影响,只是影响迭代收敛的速度和到达误差的精度要求的次数。4.分析迭代收敛和发散的原因。f(x)=0改写成等价的形式x=(x),迭代法是一种逐次逼近法,其基本思想是将隐式方程=(x)归结为一组显式的计算公式,就是说迭代工程实质上是一个逐步显化的过程。当迭代下去不能趋于某个极值,这种现象成为发散。如图所示,图1为收敛的情况,图2为发散的情况。图1图2