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

    function [x,fx,iter,X]=bisect(fun,a,b,eps,varargin)
%BISECT   二分法求方程的根
% X=BISECT(FUN,A,B)
% X=BISECT(FUN,A,B,EPS)
% X=BISECT(FUN,A,B,EPS,P1,P2,...)
% [X,FX]=BISECT(...)
% [X,FX,ITER]=BISECT(...)
% [X,FX,ITER,XS]=BISECT(...)
%
% 输入参数:
%     ---FUN:方程的函数描述,可以为匿名函数、内联函数或M文件形式
%     ---A,B:区间端点
%     ---EPS:精度设定
%     ---P1,P2,...:方程的附加参数
% 输出参数:
%     ---X:返回的方程的根
%     ---FX:方程根对应的函数值
%     ---ITER:迭代次数
%     ---XS:迭代根序列
%
% See also fzero, RootInterval

if nargin<3
    error('输入参数至少需要3个!')
end
if nargin<4 || isempty(eps)
    eps=1e-6;
end
fa=feval(fun,a,varargin{:});
fb=feval(fun,b,varargin{:});
% fa=fun(a,varargin{:});fb=fun(b,varargin{:});
k=1;
if fa*fb>0  % 不满足二分法使用条件
    warning(['区间[',num2str(a),',',num2str(b),']内可能没有根']);
elseif fa==0  % 区间左端点为根
    x=a; fx=fa;
elseif fb==0  % 区间右端点为根
    x=b; fx=fb;
else
    while abs(b-a)>eps;  % 控制二分法结束条件
        x=(a+b)/2;  % 二分区间端点
        fx=feval(fun,x,varargin{:}); % 计算中点的函数值
        if fa*fx>0;  % 条件
            a=x;   % 端点更新
            fa=fx;  % 端点函数值更新
        elseif fb*fx>0;  % 条件
            b=x;  % 端点更新
            fb=fx;  % 端点函数值更新
        else
            break
        end
        X(k)=x;
        k=k+1;
    end
end
iter=k;
web -broswer http://www.ilovematlab.cn/forum-221-1.html