-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlellipf.m
53 lines (49 loc) · 1.46 KB
/
lellipf.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
%
% lellipf(phi, k, errtol)
%
% Inputs:
%
% phi Input angle vector size 1 or 1xN.
% k Input parameter vector size 1 or 1xN.
% errtol Error tolerance for Carlson's algorithms.
%
% Matlab function to compute Legendre's (incomplete) elliptic integral
% F(phi, k). Uses a vectorized implementation of Carlson's Duplication Algorithms
% for symmetric elliptic integrals as found in "Computing Elliptic
% Integrals by Duplication," by B. C. Carlson, Numer. Math. 33, 1-16 (1979)
% and also found in ACM TOMS Algorithm 577. Section 4 in the paper cited
% here describes how to convert between the symmetric elliptic integrals
% and Legendre's elliptic integrals.
%
% Returns NaN's for any argument values outside input range.
%
function f = lellipf(phi, k, errtol)
% Argument checking for vectorization:
lphi = length(phi);
lk = length(k);
errflag = logical(0);
if (lphi ~= lk)
if (lphi==1)
phivec = phi * ones(1,lk);
kvec = k;
elseif (lk==1)
kvec = k * ones(1,lphi);
phivec = phi;
else
disp('Incompatible input vector dimensions in lellipf!');
errflag = logical(1);
end
else
phivec = phi;
kvec = k;
end
if ~errflag
snphi = sin(phivec);
csphi = cos(phivec);
csphi2 = csphi .* csphi;
onesvec = ones(1,length(phivec));
y = onesvec - kvec.*kvec .* snphi.*snphi;
f = snphi .* rf(csphi2, y, onesvec, errtol);
else
f = NaN;
end