www.gusucode.com > elfun18工具箱matlab源码程序 > elfun18/elfun18v1_3/elfun18v1_2/elfun18/mijam.m

    function result = mijam( x, m)
%MIJAM inverse of the Jacobi amplitude function AM.
%
%       invam(x,m) = F(sin(x),m)
%
%   Result:
%       mijam(x,m) -- real scalar or NaN if either argument is invalid 
%           or convergenece failed.
%
%   Arguments:
%       x    -- real scalar 
%       m    -- real scalar, parameter (m = k^2)
%
%   Functions called:
%       melK, melF, umodpi
%
%   Matlab functions called:
%       abs, isnan, isinf, sin
%

    result = mpelF(x,m);
    return
    
    % check input
    
    if isnan(x) || isinf(x) || isnan(m) || isinf(m)
        result = NaN;
        return
    end
    
    % Special cases
    
    if m == 0
        result = x;
        return
    end
    
    if m == 1
        result = igd(x);
        return
    end
    
    % General case
    
    if m > 1
       % if abs(x) > pi/2
       %     result = NaN;
       %     return
       % end
       % result = mijsd(sqrt(m)*tan(x),1/m)/sqrt(m);
       % return
        
        % Reciprocal-modulus transformation ([1], 22.17)
        k = sqrt(m);
        if abs(k*sin(x)) > 1 || abs(x) > pi/2
            result = NaN;
            return
        end
        % based on [1] 22.16.12        
        result = melF(k*sin(x),1/m)/k;
        return
    end    
    
    s = sign(x);
    [a, x] = umodpi(x);
    
    if x == 0 
        result = s*a*melK(m);
        return
    end
    
    if  a ~= 0
        a = a*melK(m);
    end
  
    result = s*(a + melF( sin(x), m));
    
    %pi2 = pi/2;
    %K   = melK(m);
    %n   = floor(x/pi2);
    %r   = x - n*pi2;
    %if mod(n,2) == 0
    %    result = n*K + melF( sin(r), m);
    %else
    %    result = (n + 1)*K - melF( sin(pi2 - r), m);
    %end

end