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

    function [Interval,type]=Monotonicity(varargin)
%MONOTONICITY   求函数在指定区域上的单调区间及单调性
% [INTERVAL,TYPE]=MONOTONICITY(FUN,DOMAIN)  求函数FUN在区间DOMAIN上的单调区间
% [INTERVAL,TYPE]=MONOTONICITY(FUN,DOMAIN,X0)  求函数FUN在区间DOMAIN上的单调
%                      区间,其中函数FUN一阶导数的没有定义的点(极点除外)已知
%
% 输入参数:
%     ---FUN:函数表达式
%     ---DOMAIN:指定的区间
%     ---X0:一阶导数的没有定义的点(极点除外)
% 输出参数:
%     ---INTERVAL:返回的单调区间
%     ---TYPE:各单调区间上函数的单调性
%
% See also solve, diff

warning off all
[fun,domain]=deal(varargin{1:2});
x=sym('x','real');
s=symvar(fun);
if length(s)>1
    error('函数fun必须只包含一个符号变量.')
end
if ~isequal(x,s)
    fun=subs(fun,s,x);
end
df=diff(fun);
[num,den]=numden(df);
xd=solve(den);
xd=double(xd);
x=solve(num);
x=double(x);
x=unique([xd(:);x(:)]);
if nargin==3
    x0=varargin{3};
    x=unique([x;x0(:)]);
end
N=length(x);
Interval=cell(1,N+1);
type=cell(1,N+1);
if ~isequal(domain(1),x(1))
    Interval{1}=[domain(1),x(1)];
    if isinf(domain(1))
        f1=realfunvalue(df,x(1)-0.1);
    else
        f1=realfunvalue(df,(domain(1)+x(1))/2);
    end
    type{1}=Judgment(f1,{'单调减少','单调增加'});
else
    Interval{1}=[];
    type{1}=[];
end
for k=2:N
    Interval{k}=[x(k-1),x(k)];
    f=realfunvalue(df,sum(x([k-1,k]))/2);
    type{k}=Judgment(f,{'单调减少','单调增加'});
end
if ~isequal(x(end),domain(2))
    Interval{end}=[x(end),domain(2)];
    if isinf(domain(2))
        f2=realfunvalue(df,x(N)+0.1);
    else
        f2=realfunvalue(df,(x(N)+domain(2))/2);
    end
    type{N+1}=Judgment(f2,{'单调减少','单调增加'});
else
    Interval{N+1}=[];
    type{N+1}=[];
end
web -broswer http://www.ilovematlab.cn/forum-221-1.html