您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 二分法-Newton法-割线法求解
非线性方程数值求解的算法实现二分法:1.理论基础:(1)对于方程f(x)=0,如果在区间[a,b]上至少有一个根,就称[a,b]是方程的一个有根区间。例如,若f(x)连续,且f(x)*f(b)0,由介值定理可知[a,b]是一个有根区间。如果在[a.b]上方程有且只有一个根,那就把方程的根隔离出来了,这时若把有根区间不断缩小,便可逐步得到根的近似值。(2)设方程f(x)=0的一个有根区间为[a,b],且在区间[a,b]上只有一个根,满足f(x)*f(b)0。可以用区间对分的方法形成有限区间的序列,nnab。令11,,abab,对于区间,nnab,区间中点1(ab)2nnnx。检验fnx的符号,若f(a)f0nnx,则取新的有限区间11,,xnnnnaba,有根区间向左压缩。若f(a)f0nnx,则11,nnab取为,nnxb,有根区间向右压缩。(3)以上产生的有根区间的序列,nnab,满足1122[,][,][,]nnababab,其中各区间的长度等于上一个区间的一半,区间中点的序列nx就是方程的根*x的近似解序列。不难分析,对1n有11(ba)2nnnba。而nx是,nnab的中点,满足*11(ba)(ba)22nnnnxx。这保证了*limnnxx。2.代码:functiony=f(x)y=x^3-x-1;end主程序:clearallclca=input('输入下界a=');b=input('输入上界b=');eps=input('输入误差范围eps=');distance=b-a;num=0;formatlongwhile(distanceeps)x0=(a+b)/2;iff(a)*f(x0)0b=x0;elseiff(a)*f(x0)0a=x0;elsea=x0;b=x0;enddistance=distance/2;num=num+1;endx=(a+b)/2;end3.运行结果:Newton法:1.理论基础:为了求解方程组(x)0f的根*x。设已有一个近似值*kxx,如果''f存在且连续,由Taylor展开式得,,,**2()f(x*)(x)(x)(xx)(xx)2!kkkkfff,其中在kx和*x之间。因为f(x*)=0,如果,(x)0kf,可得''2''(x)()(x*x)*(x)2(x)kkkkkffxxff。如果把右端含2(x*x)k的项略去,剩下的两项就作为x*新的一个近似值,记为1kx,即1'(x)(x)kkkkfxxf。2.代码:functionNewton(x0,nums)x=x0;fori=1:numsx1=x-(x^3+4*x^2-10)/(3*x^2+8*x);x=x1;endx3.运行结果割线法:1.理论基础:(1)Newton法每步不但要计算函数值(x)kf,还要计算导数值'(x)kf。有时'(x)kf的计算比较麻烦,可以用1,kkxx点上的差商近似导数,即'11(x)f(x)(x)kkkkkffxx,Newton法迭代变换为111(x)()(x)f(x)kkkkkkkfxxxxf,0,1,2k。这就是割线法的计算公式。2.代码:functionGeXian(x0,x1,nums)x(1)=x0;x(2)=x1;fori=3:numsx(i)=x(i-1)-(x(i-1)^3+4*x(i-1)^2-10)*(x(i-1)-x(i-2))/((x(i-1)^3+4*x(i-1)^2-10)-(x(i-2)^3+4*x(i-2)^2-10));endx3.运行结果:比较:在论文中求解的例子可以看出,二分法需要14次迭代才能精确到小数点后四位有效数字。而Newton法和割线法分别需要3次和4次能达到如此的效果。很明显Newton法和割线法优于二分法。这是因为二分法是线性收敛的,而Newton法至少是二阶收敛的。割线法是超线性收敛的,而且收敛速度小于2.所以,在本例中,Newton法是优于割线法的。二分法的收敛速度虽然较慢,但它是全局收敛的,而Newton法和割线法是局部收敛的。
本文标题:二分法-Newton法-割线法求解
链接地址:https://www.777doc.com/doc-4705204 .html