您的位置:首页 > 编程语言 > MATLAB

(matlab系列)非线性方程求根

2012-09-23 22:27 330 查看
非线性方程在5次以上的时候没有求根公式(根据高等代数的阿贝尔群的概念得知),所以直接求解比较麻烦,需要借助解析几何的工具,结合图形采用特殊的方法求解------逼近法。主要有二分法、迭代法(包括牛顿迭代和割线法)。

逼近法的本质就是先给一个估计值(近似值)作为方程解,然后对这个估计值一步一步地修正,使得它越来越像真实值;而这种修补的方法必须具有普遍性,可以重复性地使用,这样才能给计算机以循环指令,让计算机按照规定的方法重复性地对近似解进行修补。

二分逼近的估计方式是取区间的中值,然后对这个中值一次一次的修补,而修补的方式是踢出区间的另一半,使得区间变小,再用新区间的中值作为方程的近似解。

迭代逼近的估计方式通常是先利用二分法求解出一个较为粗略的近似值,而重点在于修补的方式:构造一个递推公式 ,通过递推公式得到一个近似值数列,这个数列的极限为真值,也称收敛于真实值。另外,这个数列并不总是收敛于真实值,即迭代并不总是有效,需要判断迭代的有效性。常见的有效迭代法是牛顿法和割线法,这两种方法都有着极为直观的几何意义。

二分法(bisection method)

%find root using bisection mehtod
eps = 0.5e-3;
a = 0;
b = 1;
n = 0;
while(1)
if( fun1(a)*fun1(b)>0 )
break;
else
%bisection method to get root
c = (a+b)/2;
length = b-a;   %the length of section
fprintf('n=%d  c=%f   f(c)=%f length(%d)=%f \n',n,c,fun1(c),n,length);

%break when we get it
if( fun1(c)==0 || length*0.5<= eps)
break;
end

%update the value of a and b
n = n+1;
if(fun1(c)>0)
a = c;
else
b = c;
end
end

end


牛顿法(Newton method)

%Newton method
eps = 5e-6;
delta = 1e-6;
N = 100;
k = 0;
x0 = 1.0;
fprintf('x=%f   k=%d   f(x)=%f\n',x0,k,fun2(x0));
while(1)
x1 = x0-fun2(x0)/fun2_d(x0);
k = k+1;
fprintf('x=%f   k=%d   f(x)=%f\n',x1,k,fun2(x1));

%Newton method failed
if(k>N || abs(x1)<eps)
disp('Newton method failed!');
break;
end

%condition
if( abs(x1-x0)<eps || abs(fun2(x1))<delta )
disp('Newton method succeeded!');
break;
end

%update
x0 = x1;
end


割线法(Secant method)

%Scant method
eps = 5e-6;
delta = 1e-6;
N = 100;
k = 0;
x0 = 1.0;
x1 = 2.0;
while(1)
x2 = x1-fun2(x1)*(x1-x0)/(fun2(x1)-fun2(x0));
fprintf('k=%d  x=%f  f(x)=%f\n',k,x2,fun2(x2));

if(abs(x2-x1)<eps || abs(fun2(x2))<delta )
fprintf('Scant method succeeded!\n');
break;
end
%update
k = k+1;
x0 = x1;
x1 = x2;
end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: