gusucode.com > 高等数学问题求解源码程序 > CH10/Newtons.m
function [x,fval,iter,exitflag]=Newtons(fun,x0,eps,maxiter) %NEWTONS 牛顿法求非线性方程组的根 % X=NEWTONS(FUN,X0) 牛顿法求非线性方程组的解,初始迭代点为X0 % X=NEWTONS(FUN,X0,EPS) 牛顿法求非线性方程组的解,精度要求为EPS % X=NEWTONS(FUN,X0,EPS,MAXITER) 牛顿法求非线性方程组的解,最大迭代次数为MAXITER % [X,FVAL]=NEWTONS(...) 牛顿法求非线性方程组的解并返回解处的函数值 % [X,FVAL,ITER]=NEWTONS(...) 牛顿法求非线性方程组的解并返回迭代次数 % [X,FVAL,ITER,EXITFLAG]=NEWTONS(...) 牛顿法求非线性方程组的解并返回迭代成功标志 % % 输入参数: % ---FUN:非线性方程组的符号表达式 % ---X0:初始迭代点向量 % ---EPS:精度要求,默认值为1e-6 % ---MAXITER:最大迭代次数,默认值为1e4 % 输出参数: % ---X:非线性方程的近似解向量 % ---FVAL:解处的函数值 % ---ITER:迭代次数 % ---EXITFLAG:迭代成功标志,1表示成功,0表示失败 % % See also newton if nargin<2 error('输入参数至少需要2个.') end if nargin<3 eps=1e-6; end if nargin<4 maxiter=1e4; end if isa(fun,'inline') fun=char(fun); k=strfind(fun,'.'); fun(k)=[]; fun=sym(fun); elseif ~isa(fun,'sym') error('函数类型必须是内联函数或符号函数.') end s=symvar(fun); if length(s)>length(x0) error('函数的自由变量过多.') end x0=x0(:); J=jacobian(fun,s); k=0;err=1; exitflag=1; while err>eps k=k+1; fx0=subs(fun,num2cell(s),num2cell(x0)); J0=subs(J,num2cell(s),num2cell(x0)); x1=x0-J0\fx0; err=norm(x1-x0); x0=x1; if k>=maxiter exitflag=0; break end end x=x1; fval=fx0; iter=k; web -broswer http://www.ilovematlab.cn/forum-221-1.html