一、 非线性方程的二分法
例:求方程x^3-3x-1=0在[1,2]内的根,使精度达到两位有效数字。
function x= nabisect(fname,a,b,e)
%UNTITLED4 此处显示有关此函数的摘要
% 此处显示详细说明
if nargin<4,e=1e-4;end
fa=feval(fname,a);fb=feval(fname,b);
if fa*fb>0,error('函数在两端点值必须异号');end
x=(a+b)/2
while (b-a)>(2*e),
fx=feval(fname,x);
if fa*fx<0,b=x;fb=fx;else a=x,fa=fx;end
x=(a+b)/2
end
>> fun=inline('x^3-3*x-1');
>> x=nabisect(fun,1,2,0.05)
x =
1.5000
a =
1.5000
x =
1.7500
a =
1.7500
x =
1.8750
a =
1.8750
x =
1.9375
x =
1.9063
x =
1.9063
二、Newton迭代法
例:取x0=1.5,用牛顿迭代法求解x^3-x-1=0,使计算结果有四位有效数字。
function x=nanewton(fname,dfname,x0,e,N)
if nargin<5,N=500;end
if nargin<4,e=1e-4;end
x=x0;x0=x+2*e;k=0;
while abs(x0-x)>e&k<N,
k=k+1;
x0=x;x=x0-feval(fname,x0)/feval(dfname,x0);
disp(x)
end
if k==N,warning('已达迭代次数上线');end
fun=inline('x^3-x-1');dfun=inline('3*x^2-1');
>> nanewton(fun,dfun,1.5,0.5e-3)
1.3478
1.3252
1.3247
ans =
1.3247