www.gusucode.com > 高等数学问题求解源码程序 > CH07/newton.m

    function [x,fx,iter,X]=newton(fun,x0,eps,maxiter)
%NEWTON   牛顿法求方程的根
% X=NEWTON(FUN,X0)  牛顿法求方程在初始点X0处的根
% X=NEWTON(FUN,X0,EPS)  牛顿法求方程在初始点X0处的精度为EPS的根
% X=NEWTON(FUN,X0,EPS,MAXITER)  牛顿法求方程的根并设定最大迭代次数
% [X,FX]=NEWTON(...)  牛顿法求根,并返回根处的函数值
% [X,FX,ITER]=NEWTON(...)  牛顿法求根并返回根处的函数值以及迭代次数
% [X,FX,ITER,XS]=NEWTON(...)  牛顿法求根并返回根处的函数值、迭代次数以及迭代根序列
%
% 输入参数:
%     ---FUN:方程的函数描述,可以为匿名函数、内联函数或M文件形式
%     ---X0:初始迭代点
%     ---EPS:精度设定
%     ---MAXITER:最大迭代次数
% 输出参数:
%     ---X:返回的方程的根
%     ---FX:方程根对应的函数值
%     ---ITER:迭代次数
%     ---XS:迭代根序列
%
% See also fzero, RootInterval, bisect

if nargin<2
    error('输入参数至少需要2个!')
end
if nargin<3 || isempty(eps)
    eps=1e-6;
end
if nargin<4 || isempty(maxiter)
    maxiter=1e4;
end
s=symvar(fun);
if length(s)>1
    error('函数fun必须只包含一个符号变量.')
end
df=diff(fun,s);
k=0;err=1;
while abs(err)>eps
    k=k+1;
    fx0=subs(fun,s,x0);
    dfx0=subs(df,s,x0);
    if dfx0==0
        error('f(x)在x0处的导数为0,停止计算')
    end
    x1=x0-fx0/dfx0;
    err=x1-x0;
    x0=x1;
    X(k)=x1;
end
if k>=maxiter
    error('迭代次数超限,迭代失败!')
end
x=x1;fx=subs(fun,x);iter=k;X=X';
web -broswer http://www.ilovematlab.cn/forum-221-1.html