function [F,E,Z] = elliptic12(u,m,tol) % ELLIPTIC12 evaluates the value of the Incomplete Elliptic Integrals % of the First, Second Kind and Jacobi's Zeta Function. % % [F,E,Z] = ELLIPTIC12(U,M,TOL) where U is a phase in radians, 0 1), error('M must be in the range 0 <= M <= 1.'); end % check whether we've been asked to evaluate the integrals for values % smaller than eps = 2.220446049250313e-16, if so we suppose it equal zero m(m tol) % Arithmetic-Geometric Mean of A, B and C i = i + 1; if i > size(a,1) a = [a; zeros(2,mumax)]; b = [b; zeros(2,mumax)]; c = [c; zeros(2,mumax)]; end a(i,:) = 0.5 * (a(i-1,:) + b(i-1,:)); b(i,:) = sqrt(a(i-1,:) .* b(i-1,:)); c(i,:) = 0.5 * (a(i-1,:) - b(i-1,:)); in = uint32( find((abs(c(i,:)) <= tol) & (abs(c(i-1,:)) > tol)) ); if ~isempty(in) [mi,ni] = size(in); n(in) = ones(mi,ni)*(i-1); end end mmax = length(I); mn = double(max(n)); phin = zeros(1,mmax); C = zeros(1,mmax); Cp = C; e = uint32(C); phin(:) = signU.*u(I); i = 0; c2 = c.^2; while i < mn % Descending Landen Transformation i = i + 1; in = uint32(find(n(K) > i)); if ~isempty(in) phin(in) = atan(b(i,K(in))./a(i,K(in)).*tan(phin(in))) + ... pi.*ceil(phin(in)/pi - 0.5) + phin(in); e(in) = 2.^(i-1) ; C(in) = C(in) + double(e(in(1)))*c2(i,K(in)); Cp(in)= Cp(in) + c(i+1,K(in)).*sin(phin(in)); end end Ff = phin ./ (a(mn,K).*double(e)*2); F(I) = Ff.*signU; % Incomplete Ell. Int. of the First Kind Z(I) = Cp.*signU; % Jacobi Zeta Function E(I) = (Cp + (1 - 1/2*C) .* Ff).*signU; % Incomplete Ell. Int. of the Second Kind end % Special cases: m == {0, 1} m0 = find(m == 0); if ~isempty(m0), F(m0) = u(m0); E(m0) = u(m0); Z(m0) = 0; end m1 = find(m == 1); um1 = abs(u(m1)); if ~isempty(m1), N = floor( (um1+pi/2)/pi ); M = find(um1 < pi/2); F(m1(M)) = log(tan(pi/4 + u(m1(M))/2)); F(m1(um1 >= pi/2)) = Inf.*sign(u(m1(um1 >= pi/2))); E(m1) = ((-1).^N .* sin(um1) + 2*N).*sign(u(m1)); Z(m1) = (-1).^N .* sin(u(m1)); end