当前位置:文档之家› matlab 二分法汇总

matlab 二分法汇总

二分法的matlab主程序function [k,x,wuca,yx]=erfen(a,b,abtol)a(1)=a; b(1)=b;ya=fun(a(1)); yb=fun(b(1)); %程序中调用的fun.m 为函数if ya* yb>0,disp('注意:ya*yb>0,请重新调整区间端点a和b.'), return endmax1=-1+ceil((log(b-a)- log(abtol))/ log(2)); % ceil是上取整for k=1: max1+1a;ya=fun(a); b;yb=fun(b); x=(a+b)/2;yx=fun(x); wuca=abs(b-a)/2; k=k-1;[k,a,b,x,wuca,ya,yb,yx]if yx==0a=x; b=x;elseif yb*yx>0b=x;yb=yx;elsea=x; ya=yx;endif b-a< abtol , return, endendk=max1; x; wuca; yx=fun(x);区间二分法:与对分查找法相同1 区间二分法求出的仅仅是方程的一个单根,如果方程有重根或者多个根时,在做区间二分法时就会出现分叉,这样方程有几个根,就会产生几个实数序列,每一个实数序列的极限便是方程的一个根2 通常用区间二分法为一些迭代法提供靠近x^*的初始选代值;3 区间二分法的缺点是不能求方程的复数根。

format longa=5;b=6;x1=a;x2=b;f1=4*cos(x1)+4*sin(x1)+0.5*x1-2; f2=4*cos(x2)+4*sin(x2)+0.5*x2-2;step=0.000001;ii=0;while abs(x1-x2)>stepii=ii+1;x3=(x1+x2)/2;f3=4*cos(x3)+4*sin(x3)+0.5*x3-2;if f3~=0if f1*f3<0x2=x3;elsex1=x3;endendendx3f=[4*cos(x3)+4*sin(x3)+0.5*x3] disp(['迭代次数:',num2str(ii),'次'])牛顿迭代法求解:在方程f(x)=0有实数根的情况下,若能够将方程等价地转化成x=g(x)的形式,然后取一个初始值x0代入x=g(x)的右端,算得x1=g(x0),再计算x2=g(x1),这样依次类推x(k+1)=g(x(k))可以得到一个序列xk,通常称g(x)为迭代函数,序列xk为由迭代函数产生得迭代序列,x0为迭代初始值。

同一个方程,不同等价形式的转换产生的迭代法可能收敛,也有可能发散.关于迭代法的敛散性判定有下面的定理(也称李普希兹(Lipschitz定理):如果迭代函数g(x)在区间[a,b]上连续,且满足以下条件,1 对于任意的x=[a,b],有g(x)=[a,b]2 在区间内(a,b)内,函数g(x)满足Lipschitz条件,即存在常数L>0,使得对于任意的x,y=(a,b),都有|g(x)-g(y)|=<L|x-y|,如果有L<1,则迭代格式xk+1=g(xk),k=0,1,2,..对于任意的迭代初始值x0=[a,b]均是收敛的这里与x和y无关的正常数L称为Lipschitz常数。

一种较为特殊得迭代法为牛顿(Newton)迭代法xk+1=xk-f(xk)/f'(xk)相应迭代函数为g(x)=x-f(x)/f'(x)Newton迭代法的几何意义:它的第k+1次迭代值就是曲线y=f(x)在点(xk,f(xk))处切线y-f(xk)=f'(xk)(x=xk)与轴的交点的横坐标,%解方程:f=4*(cos(x1)+sin(x1)+0.5*x1-2)=0x0=9.6;x1=x0-(4*(cos(x0)+sin(x0))+0.5*x0-2)/(4*(cos(x0)-sin(x0))+0.5);while abs(x1-x0)>0.000001x0=x1;x1=x1-(4*(cos(x0)+sin(x0))+0.5*x0-2)/(4*(cos(x0)-sin(x0))+0.5);endf=4*(cos(x1)+sin(x1)+0.5*x1-2)弦截法:单点弦截法:连接两个端点与作弦(a,f(a)) 与(b,f(b))作弦,此弦与轴交点的横坐标设为x1. 如果f(x1)=0,则x1即为所求根,否则选取(x1,f(x1))点和点(a,f(a))(该点的选取要满足条件f(a)与f''(x)同号,并改记为(x0,f(x0))。

再做弦此弦与轴交点的横坐标设为x2,依次类推,其迭代格式即为xk+1=xk-f(xk)*(xk-x0)/(f(xk)-f(x0)双点弦截法:无固定点xk+1=xk-f(xk)*(xk-xk-1)/(f(xk)-f(xk-1)format longnx=[];nx(1)=5;nx(2)=nx(1)-(2^nx(1)-nx(1)^2-1)/(2^nx(1)*log(2)-2*nx(1));k=1;while abs(nx(k+1)-nx(k))>=10^(-6)k=k+1;nx(k+1)=nx(k)-(2^nx(k)-nx(k)^2-1)/(2^nx(k)*log(2)-2*nx(k));endnk=k+1; disp(['牛顿迭代法迭代次数:',num2str(nk),blanks(4),'方程的解:',num2str(nx(nk))])dx=[];dx(1)=5; dx(2)=dx(1)-(2^dx(1)-dx(1)^2-1)/((2^3-3^2-1)-(2^5-5^2-1))*(3-5);k=1;while abs(dx(k+1)-dx(k))>=10^(-6)k=k+1;dx(k+1)=dx(k)-(2^dx(k)-dx(k)^2-1)/((2^dx(k)-dx(k)^2-1)-(2^5-5^2-1))*( dx(k)-5); enddisp(['单点迭代法迭代次数:',num2str(k),blanks(4),'方程的解:',num2str(dx(k))]) sx=[];sx(1)=5;sx(2)=3;k=1;while abs(sx(k+1)-sx(k))>=0.000001k=k+1;sx(k+1)=sx(k)-((2^sx(k)-sx(k)^2-1)/((2^sx(k)-sx(k)^2-1)-(2^sx(k-1)-sx(k-1)^2-1)) )*(sx(k)-sx(k-1));endsk=k+1;disp(['双点迭代法迭代次数:',num2str(sk),blanks(4),'方程的解:',num2str(sx(sk))])x=3:0.05:5;y=2.^x-x.^2-1;yn=zeros(1,nk);yd=zeros(1,sk);subplot(1,2,1)plot(x,y,sx,yd,'*')title('双点弦截法')gtext('y=2^x-x^2-1')subplot(1,2,2)plot(x,y,nx,yn,'*')title('牛顿迭代法')gtext('y=2^x-x^2-1')二分法function approx_root=bisect (a,b,tol)fa =bifun(a);fb =bifun(b);while(abs(b-a)> tol)c=(a+b)/2;approx_root=c;fc=bifun(c);[a,c,b;fa,fc,fb]if ( sign(fb) * sign(fc)<=0)a=c;fa=fc;elseb=c;fb=fc;endend%----------------------------------function f=bifun(x)f=x^3-sin(x);%输入你的方程f(x)=0 a b为区间a=4.0,b=4.6牛顿法x0=4.6 n为迭代上限,tol为精度function y=newton1(x0,n,tol)x(1)=x0;b=1;i=1;A(i)=x(i);B(i)=b;C(i)=1while(abs(b)>eps*x(i))x(i+1)=x(i)-fun1(x(i))/dfun1(x(i));b=x(i+1)-x(i);i=i+1;A(i)=x(i);B(i)=b;C(i)=feval(@fun1,x(i));if(i>n)error('n is full');endendy=x(i)[A' C' B']function y=fun1(x)y=x^2-sin(x);function f=dfun1(x)syms xf=double(diff('fun1',x))solve('(-1*x^3*cos(40*x)-sin(40*x))*(2*sinh(40*x)+1*x^3*(cos(40*x)-cosh(40*x)))+(1* x^3*sin(40*x)+1*x^3*sinh(40*x)-cos(40*x)-cosh(40*x))*1*x^3*(sinh(40*x)-sin(4 0*x))+(1*x^3*cosh(40*x)-sinh(40*x))*(2*sin(40*x)+1*x^3*(cos(40*x)-cosh(40*x) ))=0')syms xf=inline((-1*x^3*cos(40*x)-sin(40*x))*(2*sinh(40*x)+1*x^3*(cos(40*x)-cosh(40* x)))+(1*x^3*sin(40*x)+1*x^3*sinh(40*x)-cos(40*x)-cosh(40*x))*1*x^3*(sinh(40* x)-sin(40*x))+(1*x^3*cosh(40*x)-sinh(40*x))*(2*sin(40*x)+1*x^3*(cos(40*x)-co sh(40*x))),'x')x0=2[x,fv]=fsolve(f,x0,optimset('TolFun',1e-16))f=@(x)(-1*x.^3*cos(40*x)-sin(40*x))*(2*sinh(40*x)+1*x.^3*(cos(40*x)-cosh(40*x)))+(1 *x.^3*sin(40*x)+1*x.^3*sinh(40*x)-cos(40*x)-cosh(40*x))*1*x.^3*(sinh(40*x)-si n(40*x))+(1*x.^3*cosh(40*x)-sinh(40*x))*(2*sin(40*x)+1*x.^3*(cos(40*x)-cosh( 40*x)));x=fsolve(f,[-10:1:10])f=@(x)(-1*x^3*cos(40*x)-sin(40*x))*(2*sinh(40*x)+1*x^3*(cos(40*x)-cosh(40*x)))+(1*x^3*sin(40*x)+1 *x^3*sinh(40*x)-cos(40*x)-cosh(40*x))*1*x^3*(sinh(40*x)-sin(40*x))+(1*x^3*cosh(40*x)-sinh(4 0*x))*(2*sin(40*x)+1*x^3*(cos(40*x)-cosh(40*x)));x=fsolve(f,[0:1:10])。

相关主题