Class Bessel
- java.lang.Object
-
- gov.nih.mipav.model.algorithms.Bessel
-
public class Bessel extends java.lang.Object
This module computes Bessel functions of complex arguments and a nonnegative order. This work is the port of FORTRAN code written by Donald E. Amos at the Sandia National Laboratories. This is an installation of his Algorithm 644, Collected Algorithms form ACM. The original FORTRAN code was downloaded from http://www.netlib.org/toms/644. The decision to port this code was prompted by the fact that the MATLAB links to this Amos FORTRAN package. For doublechecking this code 2 possibilities exist: 1.) The 6 self tests included in the package - zqcbh, zqcbi, zqcbj, zqcbk, zqcby, and zqcai. The code has passed all 6 self tests. 2.) Bessel function tables for real arguments as given in Handbook of Mathematical Functions with Formulas, Graphs, and Mathematical Tables Edited by Milton Abramowitz and Irene A. Stegun. Some values for Bessel functions of complex arguments can be found in Computation of Special Functions by Shanjie Zhang and Jianming Jin, copyright 1966 by John Wiley & Sons, Inc. The I and K Bessel functions obtained in this code were found to match the values in these 2 sources. Note that the Zhang and Jin book also contains code for Bessel functions of complex arguments.
REFERENCES:
- Abramowitz, M. and Stegun, I. A., Handbook of Mathematical Functions, NBS Applied Math Series 55, U.S. Dept. of Commerce, Washington, D.C., 1955
- Amos, D. E., Algorithm 644, A Portable Package For Bessel Functions of a Complex Argument and Nonnegative Order, ACM Transactions on Mathematical Software, Vol. 12, No. 3, September 1986, Pages 265-273
- Amos, D. E., Remark on Algorithm 644, ACM Transactions on Mathematical Software, Vol. 16, No. 4, December 1990, Page 404
- 4. Amos, D. E., Remark on Algorithm 644 (Improvements in Algorithm 644), ACM Transactions on Mathematical Software, Vol. 21, No. 4, December 1995, Pages 388-393.
- 5. Cody, W. J., Algorithm 665, MACHAR: A Subroutine to Dynamically Determine Machine Parameters, ACM Transactions on Mathematical Software, Vol. 14, No. 4, December 1988, Pages 303-311
From the ACM website:
ACM Software License Agreement All software, both binary and source published by the Association for Computing Machinery (hereafter, Software) is copyrighted by the Association (hereafter, ACM) and ownership of all right, title and interest in and to the Software remains with ACM. By using or copying the Software, User agrees to abide by the terms of this Agreement. Noncommercial Use The ACM grants to you (hereafter, User) a royalty-free, nonexclusive right to execute, copy, modify and distribute both the binary and source code solely for academic, research and other similar noncommercial uses, subject to the following conditions: 1. User acknowledges that the Software is still in the development stage and that it is being supplied "as is," without any support services from ACM. Neither ACM nor the author makes any representations or warranties, express or implied, including, without limitation, any representations or warranties of the merchantability or fitness for any particular purpose, or that the application of the software, will not infringe on any patents or other proprietary rights of others. 2. ACM shall not be held liable for direct, indirect, incidental or consequential damages arising from any claim by User or any third party with respect to uses allowed under this Agreement, or from any use of the Software. 3. User agrees to fully indemnify and hold harmless ACM and/or the author(s) of the original work from and against any and all claims, demands, suits, losses, damages, costs and expenses arising out of the User's use of the Software, including, without limitation, arising out of the User's modification of the Software. 4. User may modify the Software and distribute that modified work to third parties provided that: (a) if posted separately, it clearly acknowledges that it contains material copyrighted by ACM (b) no charge is associated with such copies, (c) User agrees to notify ACM and the Author(s) of the distribution, and (d) User clearly notifies secondary users that such modified work is not the original Software. 5. User agrees that ACM, the authors of the original work and others may enjoy a royalty-free, non-exclusive license to use, copy, modify and redistribute these modifications to the Software made by the User and distributed to third parties as a derivative work under this agreement. 6. This agreement will terminate immediately upon User's breach of, or non-compliance with, any of its terms. User may be held liable for any copyright infringement or the infringement of any other proprietary rights in the Software that is caused or facilitated by the User's failure to abide by the terms of this agreement. 7. This agreement will be construed and enforced in accordance with the law of the state of New York applicable to contracts performed entirely within the State. The parties irrevocably consent to the exclusive jurisdiction of the state or federal courts located in the City of New York for all disputes concerning this agreement. Commercial Use Any User wishing to make a commercial use of the Software must contact ACM at permissions@acm.org to arrange an appropriate license. Commercial use includes (1) integrating or incorporating all or part of the source code into a product for sale or license by, or on behalf of, User to third parties, or (2) distribution of the binary or source code to third parties for use with a commercial product sold or licensed by, or on behalf of, User. Revised 6/98
-
-
Field Summary
Fields Modifier and Type Field Description static int
AIRY_AI
Airy function Ai.static int
AIRY_BI
Airy function Bi.private double
alim
DOCUMENT ME!static int
BESSEL_H
Bessel functions of the third kind, Hankel functions.static int
BESSEL_I
modified Bessel function of the first kind.static int
BESSEL_J
Bessel function of the first kind.static int
BESSEL_K
modified Bessel function of the second kind.static int
BESSEL_Y
Bessel function of the second kind.private int
BesselType
DOCUMENT ME!private double[]
cyi
DOCUMENT ME!private double[]
cyr
DOCUMENT ME!private int
derivativeOrder
order of derivative, 0 or 1.private boolean
doTest
DOCUMENT ME!private int
doubleDigits
I1MACH(14) = 53.private double
elim
DOCUMENT ME!private int
emax
I1MACH(16) = 1024 The largest exponent for double precision.private int
emin
I1MACH(15) = -1021; The smallest exponent for double precision.private double
epsilon
D1MACH(4).private int[]
errorFlag
errorFlag = 0, normal return - computation completed errorFlag = 1, input error - no computation errorFlag = 2, overflow - no computation, Real(z) large on UNSCALED_FUNCTION errorFlag = 3, ABS(Z) or initialOrder + sequenceNumber - 1 large, computation but losses of significance by arguemnt reduction produce less than half of machine accuracy errorFlag = 4, ABS(Z) or initialOrder + sequenceNumber - 1 too large, No computation because of complete losses of significance by argument reduction errorFlag = 5, Error, no computation, argument termination condition not met Length of array passed in must be 1.private double
fnul
DOCUMENT ME!private int
HankelKind
real and imaginary outputs Length of arrays passed in must be sequenceNumber Kind of Kankel function = 1 or 2.private double
initialOrder
order of initial function.private int[]
nz
Number of components set to zero due to underflow nz[0] = 0, normal return nz[0] > 0, Last nz components of cy set to zero due to underflow, cy[j] = 0.0 + i*0.0 for j = sequenceNumber - nz, ..., sequenceNumber-1 Length of array passed in must be 1.private boolean
overflowTest
DOCUMENT ME!private double
r1m5
D1MACH(5) = log10(2).private double
rl
DOCUMENT ME!static int
SCALED_FUNCTION
multiplied by exp(-abs(Real(z))).private int
scalingOption
UNSCALED_FUNCTION returns cy[j-1] = besselFunction(initialOrder+j-1,z), j = 1,...private int
sequenceNumber
number of members of the sequence.private double
tiny
2**-1022 = D1MACH(1).private double
tol
DOCUMENT ME!static int
UNSCALED_FUNCTION
DOCUMENT ME!private double
zi
DOCUMENT ME!private double
zr
zr and zi are the real and imaginary parts of the complex argument.
-
Constructor Summary
Constructors Constructor Description Bessel(int BesselType, boolean overflowTest)
Creates a new Bessel object.Bessel(int BesselType, double zr, double zi, double initialOrder, int scalingOption, int sequenceNumber, double[] cyr, double[] cyi, int[] nz, int[] errorFlag)
This construtor used for I, J, K, and Y Bessel functions.Bessel(int BesselType, double zr, double zi, double initialOrder, int scalingOption, int HankelKind, int sequenceNumber, double[] cyr, double[] cyi, int[] nz, int[] errorFlag)
This constructor used for H functions of kind 1 and 2.Bessel(int BesselType, double zr, double zi, int derivativeOrder, int scalingOption, double[] cyr, double[] cyi, int[] nz, int[] errorFlag)
This constructor is used for Ai and Bi Airy functions.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description private double
dgamln(double z, int[] ierr)
DGAMLN COMPUTES THE NATURAL LOG OF THE GAMMA FUNCTION FOR Z.GT.0.void
finalize()
Cleanup memory.void
run()
DOCUMENT ME!private void
runTest()
DOCUMENT ME!private double
zabs(double zr, double zi)
zabs computes the absolute value or magnitude of a double precision complex variable zr + j*zi.private void
zacai(double zr, double zi, double fnu, int kode, int mr, int n, double[] yr, double[] yi, int[] nz)
ZACAI APPLIES THE ANALYTIC CONTINUATION FORMULA.private void
zacon(double zr, double zi, double fnu, int kode, int mr, int n, double[] yr, double[] yi, int[] nz)
ZACON APPLIES THE ANALYTIC CONTINUATION FORMULA.private void
zairy(double zr, double zi, int id, int kode, double[] air, double[] aii, int[] nz, int[] ierr)
ON KODE=1, ZAIRY COMPUTES THE COMPLEX AIRY FUNCTION AI(Z) OR ITS DERIVATIVE DAI(Z)/DZ ON ID=0 OR ID=1 RESPECTIVELY.private void
zasyi(double zr, double zi, double fnu, int kode, int n, double[] yr, double[] yi, int[] nz)
ZASYI COMPUTES THE I BESSEL FUNCTION FOR REAL(Z).GE.0.0 BY MEANS OF THE ASYMPTOTIC EXPANSION FOR LARGE CABS(Z) IN THE REGION CABS(Z).GT.MAX(RL,fnu*fnu/2).private void
zbesh(double zr, double zi, double fnu, int kode, int m, int n, double[] cyr, double[] cyi, int[] nz, int[] ierr)
DOCUMENT ME!private void
zbesi(double zr, double zi, double fnu, int kode, int n, double[] cyr, double[] cyi, int[] nz, int[] ierr)
DOCUMENT ME!private void
zbesj(double zr, double zi, double fnu, int kode, int n, double[] cyr, double[] cyi, int[] nz, int[] ierr)
DOCUMENT ME!private void
zbesk(double zr, double zi, double fnu, int kode, int n, double[] cyr, double[] cyi, int[] nz, int[] ierr)
DOCUMENT ME!private void
zbesy(double zr, double zi, double fnu, int kode, int n, double[] cyr, double[] cyi, int[] nz, double[] cwrkr, double[] cwrki, int[] ierr)
DOCUMENT ME!private void
zbesyh(double zr, double zi, double fnu, int kode, int n, double[] cyr, double[] cyi, int[] nz, double[] cwrkr, double[] cwrki, int[] ierr)
An older version of zbesy used by the ZQCBY quick check routine.private void
zbinu(double zr, double zi, double fnu, int kode, int n, double[] cyr, double[] cyi, int[] nz)
zbinu calculates the I function in the right half z plane.private void
zbiry(double zr, double zi, int id, int kode, double[] bir, double[] bii, int[] ierr)
DOCUMENT ME!private void
zbknu(double zr, double zi, double fnu, int kode, int n, double[] yr, double[] yi, int[] nz)
zbknu computes the k Bessel function in the right half z plane.private void
zbuni(double zr, double zi, double fnu, int kode, int n, double[] yr, double[] yi, int[] nz, int nui, int[] nlast, double fnul)
ZBUNI COMPUTES THE I BESSEL FUNCTION FOR LARGE CABS(Z).GT.private void
zbunk(double zr, double zi, double fnu, int kode, int mr, int n, double[] yr, double[] yi, int[] nz)
ZBUNK COMPUTES THE K BESSEL FUNCTION FOR FNU.GT.FNUL.private void
zdiv(double ar, double ai, double br, double bi, double[] cr, double[] ci)
complex divide c = a/b.private void
zexp(double ar, double ai, double[] br, double[] bi)
complex exponential function b = exp(a).private void
zkscl(double zrr, double zri, double fnu, int n, double[] yr, double[] yi, int[] nz, double rzr, double rzi, double ascle)
Set K functions to zero on underflow, continue recurrence on scaled functions until two members come on scale, then return with min(zn[0]+2,n) values scaled by 1/tol.private void
zlog(double ar, double ai, double[] br, double[] bi, int[] ierr)
complex logarithm b = clog(a).private void
zmlri(double zr, double zi, double fnu, int kode, int n, double[] yr, double[] yi, int[] nz)
zmlri computes the I Bessel function for the Real(z) >= 0.0 by the Miller Algorithm normalized by a Neumann series.private void
zmlt(double ar, double ai, double br, double bi, double[] cr, double[] ci)
complex multiply c = a * b.private void
zqcai(int mqc)
DOCUMENT ME!private void
zqcbh(int mqc)
DOCUMENT ME!private void
zqcbi(int mqc)
DOCUMENT ME!private void
zqcbj(int mqc)
DOCUMENT ME!private void
zqcbk(int mqc)
DOCUMENT ME!private void
zqcby(int mqc)
DOCUMENT ME!private void
zrati(double zr, double zi, double fnu, int n, double[] cyr, double[] cyi)
ZRATI COMPUTES RATIOS OF I BESSEL FUNCTIONS BY BACKWARD RECURRENCE.private void
zs1s2(double zrr, double zri, double[] s1r, double[] s1i, double[] s2r, double[] s2i, int[] nz, double ascle, int[] iuf)
ZS1S2 TESTS FOR A POSSIBLE UNDERFLOW RESULTING FROM THE ADDITION OF THE I AND K FUNCTIONS IN THE ANALYTIC CON- TINUATION FORMULA WHERE S1=K FUNCTION AND S2=I FUNCTION.private void
zseri(double zr, double zi, double fnu, int kode, int n, double[] yr, double[] yi, int[] nz)
ZSERI COMPUTES THE I BESSEL FUNCTION FOR REAL(Z).GE.0.0 BY MEANS OF THE POWER SERIES FOR LARGE CABS(Z) IN THE REGION CABS(Z).LE.2*SQRT(fnu+1).private void
zshch(double zr, double zi, double[] cshr, double[] cshi, double[] cchr, double[] cchi)
zshch computes the complex hyperbolic functions csh = sinh(x+i*y) and cch = cosh(x+i*y).private void
zsqrt(double ar, double ai, double[] br, double[] bi)
complex square root b = csqrt(a).private void
zuchk(double yr, double yi, int[] nz, double ascle)
Y ENTERS AS A SCALED QUANTITY WHOSE MAGNITUDE IS GREATER THAN EXP(-ALIM)=ASCLE=1.0E+3*D1MACH(1)/TOL.private void
zunhj(double zr, double zi, double fnu, int ipmtr, double[] phir, double[] phii, double[] argr, double[] argi, double[] zeta1r, double[] zeta1i, double[] zeta2r, double[] zeta2i, double[] asumr, double[] asumi, double[] bsumr, double[] bsumi)
REFERENCES HANDBOOK OF MATHEMATICAL FUNCTIONS BY M.private void
zuni1(double zr, double zi, double fnu, int kode, int n, double[] yr, double[] yi, int[] nz, int[] nlast, double fnul)
ZUNI1 COMPUTES I(FNU,Z) BY MEANS OF THE UNIFORM ASYMPTOTIC EXPANSION FOR I(FNU,Z) IN -PI/3.LE.ARG Z.LE.PI/3.private void
zuni2(double zr, double zi, double fnu, int kode, int n, double[] yr, double[] yi, int[] nz, int[] nlast, double fnul)
ZUNI2 COMPUTES I(FNU,Z) IN THE RIGHT HALF PLANE BY MEANS OF UNIFORM ASYMPTOTIC EXPANSION FOR J(FNU,ZN) WHERE ZN IS Z*I OR -Z*I AND ZN IS IN THE RIGHT HALF PLANE ALSO.private void
zunik(double zrr, double zri, double fnu, int ikflg, int ipmtr, int[] init, double[] phir, double[] phii, double[] zeta1r, double[] zeta1i, double[] zeta2r, double[] zeta2i, double[] sumr, double[] sumi, double[] cwrkr, double[] cwrki)
ZUNIK COMPUTES PARAMETERS FOR THE UNIFORM ASYMPTOTIC EXPANSIONS OF THE I AND K FUNCTIONS ON IKFLG= 1 OR 2 RESPECTIVELY BY.private void
zunk1(double zr, double zi, double fnu, int kode, int mr, int n, double[] yr, double[] yi, int[] nz)
ZUNK1 COMPUTES K(FNU,Z) AND ITS ANALYTIC CONTINUATION FROM THE RIGHT HALF PLANE TO THE LEFT HALF PLANE BY MEANS OF THE UNIFORM ASYMPTOTIC EXPANSION.private void
zunk2(double zr, double zi, double fnu, int kode, int mr, int n, double[] yr, double[] yi, int[] nz)
ZUNK2 COMPUTES K(FNU,Z) AND ITS ANALYTIC CONTINUATION FROM THE RIGHT HALF PLANE TO THE LEFT HALF PLANE BY MEANS OF THE UNIFORM ASYMPTOTIC EXPANSIONS FOR H(KIND,FNU,ZN) AND J(FNU,ZN) WHERE ZN IS IN THE RIGHT HALF PLANE, KIND=(3-MR)/2, MR=+1 OR -1.private void
zuoik(double zr, double zi, double fnu, int kode, int ikflg, int n, double[] yr, double[] yi, int[] nuf)
ZUOIK COMPUTES THE LEADING TERMS OF THE UNIFORM ASYMPTOTIC EXPANSIONS FOR THE I AND K FUNCTIONS AND COMPARES THEM (IN LOGARITHMIC FORM) TO ALIM AND ELIM FOR OVER AND UNDERFLOW WHERE ALIM.LT.ELIM.private void
zwrsk(double zrr, double zri, double fnu, int kode, int n, double[] yr, double[] yi, int[] nz, double[] cwr, double[] cwi)
zwrsk computes the I Bessel function for Real(z) >- 0.0 by normalizing the I function ratios from zrati by the Wronskian.
-
-
-
Field Detail
-
BESSEL_H
public static final int BESSEL_H
Bessel functions of the third kind, Hankel functions.- See Also:
- Constant Field Values
-
BESSEL_I
public static final int BESSEL_I
modified Bessel function of the first kind.- See Also:
- Constant Field Values
-
BESSEL_J
public static final int BESSEL_J
Bessel function of the first kind.- See Also:
- Constant Field Values
-
BESSEL_K
public static final int BESSEL_K
modified Bessel function of the second kind.- See Also:
- Constant Field Values
-
BESSEL_Y
public static final int BESSEL_Y
Bessel function of the second kind.- See Also:
- Constant Field Values
-
AIRY_AI
public static final int AIRY_AI
Airy function Ai.- See Also:
- Constant Field Values
-
AIRY_BI
public static final int AIRY_BI
Airy function Bi.- See Also:
- Constant Field Values
-
UNSCALED_FUNCTION
public static final int UNSCALED_FUNCTION
DOCUMENT ME!- See Also:
- Constant Field Values
-
SCALED_FUNCTION
public static final int SCALED_FUNCTION
multiplied by exp(-abs(Real(z))).- See Also:
- Constant Field Values
-
alim
private double alim
DOCUMENT ME!
-
BesselType
private final int BesselType
DOCUMENT ME!
-
cyi
private double[] cyi
DOCUMENT ME!
-
cyr
private double[] cyr
DOCUMENT ME!
-
derivativeOrder
private int derivativeOrder
order of derivative, 0 or 1.
-
doTest
private boolean doTest
DOCUMENT ME!
-
doubleDigits
private int doubleDigits
I1MACH(14) = 53.
-
elim
private double elim
DOCUMENT ME!
-
emax
private int emax
I1MACH(16) = 1024 The largest exponent for double precision.
-
emin
private int emin
I1MACH(15) = -1021; The smallest exponent for double precision.
-
epsilon
private double epsilon
D1MACH(4).
-
errorFlag
private int[] errorFlag
errorFlag = 0, normal return - computation completed errorFlag = 1, input error - no computation errorFlag = 2, overflow - no computation, Real(z) large on UNSCALED_FUNCTION errorFlag = 3, ABS(Z) or initialOrder + sequenceNumber - 1 large, computation but losses of significance by arguemnt reduction produce less than half of machine accuracy errorFlag = 4, ABS(Z) or initialOrder + sequenceNumber - 1 too large, No computation because of complete losses of significance by argument reduction errorFlag = 5, Error, no computation, argument termination condition not met Length of array passed in must be 1.
-
fnul
private double fnul
DOCUMENT ME!
-
HankelKind
private int HankelKind
real and imaginary outputs Length of arrays passed in must be sequenceNumber Kind of Kankel function = 1 or 2.
-
initialOrder
private double initialOrder
order of initial function.
-
nz
private int[] nz
Number of components set to zero due to underflow nz[0] = 0, normal return nz[0] > 0, Last nz components of cy set to zero due to underflow, cy[j] = 0.0 + i*0.0 for j = sequenceNumber - nz, ..., sequenceNumber-1 Length of array passed in must be 1.
-
overflowTest
private boolean overflowTest
DOCUMENT ME!
-
r1m5
private double r1m5
D1MACH(5) = log10(2).
-
rl
private double rl
DOCUMENT ME!
-
scalingOption
private int scalingOption
UNSCALED_FUNCTION returns cy[j-1] = besselFunction(initialOrder+j-1,z), j = 1,...,sequenceNumber SCALED_FUNCTION returns cy[j-1] = besselFunction(initialOrder+j-1,z)*exp(-abs(Real(z))), j = 1,...,sequenceNumber.
-
sequenceNumber
private int sequenceNumber
number of members of the sequence.
-
tiny
private double tiny
2**-1022 = D1MACH(1).
-
tol
private double tol
DOCUMENT ME!
-
zi
private double zi
DOCUMENT ME!
-
zr
private double zr
zr and zi are the real and imaginary parts of the complex argument.
-
-
Constructor Detail
-
Bessel
public Bessel(int BesselType, boolean overflowTest)
Creates a new Bessel object.- Parameters:
BesselType
- DOCUMENT ME!overflowTest
- DOCUMENT ME!
-
Bessel
public Bessel(int BesselType, double zr, double zi, int derivativeOrder, int scalingOption, double[] cyr, double[] cyi, int[] nz, int[] errorFlag)
This constructor is used for Ai and Bi Airy functions.- Parameters:
BesselType
- intzr
- doublezi
- doublederivativeOrder
- intscalingOption
- intcyr
- double[]cyi
- double[]nz
- int[]errorFlag
- int[]
-
Bessel
public Bessel(int BesselType, double zr, double zi, double initialOrder, int scalingOption, int sequenceNumber, double[] cyr, double[] cyi, int[] nz, int[] errorFlag)
This construtor used for I, J, K, and Y Bessel functions.- Parameters:
BesselType
- intzr
- doublezi
- doubleinitialOrder
- doublescalingOption
- intsequenceNumber
- intcyr
- double[]cyi
- double[]nz
- int[]errorFlag
- int[]
-
Bessel
public Bessel(int BesselType, double zr, double zi, double initialOrder, int scalingOption, int HankelKind, int sequenceNumber, double[] cyr, double[] cyi, int[] nz, int[] errorFlag)
This constructor used for H functions of kind 1 and 2.- Parameters:
BesselType
- intzr
- doublezi
- doubleinitialOrder
- doublescalingOption
- intHankelKind
- intsequenceNumber
- intcyr
- double[]cyi
- double[]nz
- int[]errorFlag
- int[]
-
-
Method Detail
-
finalize
public void finalize() throws java.lang.Throwable
Cleanup memory.- Overrides:
finalize
in classjava.lang.Object
- Throws:
java.lang.Throwable
- DOCUMENT ME!
-
run
public void run()
DOCUMENT ME!
-
dgamln
private double dgamln(double z, int[] ierr)
DGAMLN COMPUTES THE NATURAL LOG OF THE GAMMA FUNCTION FOR Z.GT.0. THE ASYMPTOTIC EXPANSION IS USED TO GENERATE VALUES GREATER THAN ZMIN WHICH ARE ADJUSTED BY THE RECURSION G(Z+1)=Z*G(Z) FOR Z.LE.ZMIN. THE FUNCTION WAS MADE AS PORTABLE AS POSSIBLE BY COMPUTIMG ZMIN FROM THE NUMBER OF BASE 10 DIGITS IN A WORD, RLN=AMAX1(-ALOG10(R1MACH(4)),0.5E-18) LIMITED TO 18 DIGITS OF (RELATIVE) ACCURACY.SINCE INTEGER ARGUMENTS ARE COMMON, A TABLE LOOK UP ON 100 VALUES IS USED FOR SPEED OF EXECUTION.
- Parameters:
z
- double, z > 0.0ierr
- int[] error flag IERR=0, NORMAL RETURN, COMPUTATION COMPLETED IERR=1, Z.LE.0.0D0, NO COMPUTATION- Returns:
- double NATURAL LOG OF THE GAMMA FUNCTION AT Z.NE.0.0D0
-
runTest
private void runTest()
DOCUMENT ME!
-
zabs
private double zabs(double zr, double zi)
zabs computes the absolute value or magnitude of a double precision complex variable zr + j*zi.- Parameters:
zr
- doublezi
- double- Returns:
- double
-
zacai
private void zacai(double zr, double zi, double fnu, int kode, int mr, int n, double[] yr, double[] yi, int[] nz)
ZACAI APPLIES THE ANALYTIC CONTINUATION FORMULA.K(FNU,ZN*EXP(MP))=K(FNU,ZN)*EXP(-MP*FNU) - MP*I(FNU,ZN) MP=PI*MR*CMPLX(0.0,1.0)
TO CONTINUE THE K FUNCTION FROM THE RIGHT HALF TO THE LEFT HALF Z PLANE FOR USE WITH ZAIRY WHERE FNU=1/3 OR 2/3 AND N=1. ZACAI IS THE SAME AS ZACON WITH THE PARTS FOR LARGER ORDERS AND RECURRENCE REMOVED. A RECURSIVE CALL TO ZACON CAN RESULT IF ZACON IS CALLED FROM ZAIRY.
- Parameters:
zr
- doublezi
- doublefnu
- doublekode
- intmr
- intn
- intyr
- double[]yi
- double[]nz
- int[]
-
zacon
private void zacon(double zr, double zi, double fnu, int kode, int mr, int n, double[] yr, double[] yi, int[] nz)
ZACON APPLIES THE ANALYTIC CONTINUATION FORMULA.K(FNU,ZN*EXP(MP))=K(FNU,ZN)*EXP(-MP*FNU) - MP*I(FNU,ZN) MP=PI*MR*CMPLX(0.0,1.0)
TO CONTINUE THE K FUNCTION FROM THE RIGHT HALF TO THE LEFT HALF Z PLANE
- Parameters:
zr
- doublezi
- doublefnu
- doublekode
- intmr
- intn
- intyr
- double[]yi
- double[]nz
- int[]
-
zairy
private void zairy(double zr, double zi, int id, int kode, double[] air, double[] aii, int[] nz, int[] ierr)
ON KODE=1, ZAIRY COMPUTES THE COMPLEX AIRY FUNCTION AI(Z) OR ITS DERIVATIVE DAI(Z)/DZ ON ID=0 OR ID=1 RESPECTIVELY. ON KODE=2, A SCALING OPTION CEXP(ZTA)*AI(Z) OR CEXP(ZTA)* DAI(Z)/DZ IS PROVIDED TO REMOVE THE EXPONENTIAL DECAY IN -PI/3.LT.ARG(Z).LT.PI/3 AND THE EXPONENTIAL GROWTH IN PI/3.LT.ABS(ARG(Z)).LT.PI WHERE ZTA=(2/3)*Z*CSQRT(Z).WHILE THE AIRY FUNCTIONS AI(Z) AND DAI(Z)/DZ ARE ANALYTIC IN THE WHOLE Z PLANE, THE CORRESPONDING SCALED FUNCTIONS DEFINED FOR KODE=2 HAVE A CUT ALONG THE NEGATIVE REAL AXIS. DEFINTIONS AND NOTATION ARE FOUND IN THE NBS HANDBOOK OF C MATHEMATICAL FUNCTIONS (REF. 1). C C INPUT ZR,ZI ARE DOUBLE PRECISION C ZR,ZI - Z=CMPLX(ZR,ZI) C ID - ORDER OF DERIVATIVE, ID=0 OR ID=1 C KODE - A PARAMETER TO INDICATE THE SCALING OPTION C KODE= 1 RETURNS C AI=AI(Z) ON ID=0 OR C AI=DAI(Z)/DZ ON ID=1 C = 2 RETURNS C AI=CEXP(ZTA)*AI(Z) ON ID=0 OR C AI=CEXP(ZTA)*DAI(Z)/DZ ON ID=1 WHERE C ZTA=(2/3)*Z*CSQRT(Z) C C OUTPUT AIR,AII ARE DOUBLE PRECISION C AIR,AII- COMPLEX ANSWER DEPENDING ON THE CHOICES FOR ID AND C KODE C NZ - UNDERFLOW INDICATOR C NZ= 0 , NORMAL RETURN C NZ= 1 , AI=CMPLX(0.0D0,0.0D0) DUE TO UNDERFLOW IN C -PI/3.LT.ARG(Z).LT.PI/3 ON KODE=1 C IERR - ERROR FLAG C IERR=0, NORMAL RETURN - COMPUTATION COMPLETED C IERR=1, INPUT ERROR - NO COMPUTATION C IERR=2, OVERFLOW - NO COMPUTATION, REAL(ZTA) C TOO LARGE ON KODE=1 C IERR=3, CABS(Z) LARGE - COMPUTATION COMPLETED C LOSSES OF SIGNIFCANCE BY ARGUMENT REDUCTION C PRODUCE LESS THAN HALF OF MACHINE ACCURACY C IERR=4, CABS(Z) TOO LARGE - NO COMPUTATION C COMPLETE LOSS OF ACCURACY BY ARGUMENT C REDUCTION C IERR=5, ERROR - NO COMPUTATION, C ALGORITHM TERMINATION CONDITION NOT MET C C***LONG DESCRIPTION C C AI AND DAI ARE COMPUTED FOR CABS(Z).GT.1.0 FROM THE K BESSEL C FUNCTIONS BY C C AI(Z)=C*SQRT(Z)*K(1/3,ZTA) , DAI(Z)=-C*Z*K(2/3,ZTA) C C=1.0/(PI*SQRT(3.0)) C ZTA=(2/3)*Z**(3/2) C C WITH THE POWER SERIES FOR CABS(Z).LE.1.0. C C IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE- C MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z IS LARGE, LOSSES C OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR. CONSEQUENTLY, IF C THE MAGNITUDE OF ZETA=(2/3)*Z**1.5 EXCEEDS U1=SQRT(0.5/UR), C THEN LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR C FLAG IERR=3 IS TRIGGERED WHERE UR=DMAX1(D1MACH(4),1.0D-18) IS C DOUBLE PRECISION UNIT ROUNDOFF LIMITED TO 18 DIGITS PRECISION. C ALSO, IF THE MAGNITUDE OF ZETA IS LARGER THAN U2=0.5/UR, THEN C ALL SIGNIFICANCE IS LOST AND IERR=4. IN ORDER TO USE THE INT C FUNCTION, ZETA MUST BE FURTHER RESTRICTED NOT TO EXCEED THE C LARGEST INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF ZETA C MUST BE RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2, C AND U3 ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE C PRECISION ARITHMETIC AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE C PRECISION ARITHMETIC RESPECTIVELY. THIS MAKES U2 AND U3 LIMIT- C ING IN THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT THE MAG- C NITUDE OF Z CANNOT EXCEED 3.1E+4 IN SINGLE AND 2.1E+6 IN C DOUBLE PRECISION ARITHMETIC. THIS ALSO MEANS THAT ONE CAN C EXPECT TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES, C NO DIGITS IN SINGLE PRECISION AND ONLY 7 DIGITS IN DOUBLE C PRECISION ARITHMETIC. SIMILAR CONSIDERATIONS HOLD FOR OTHER C MACHINES. C C THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX C BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT C ROUNDOFF,1.0E-18) IS THE NOMINAL PRECISION AND 10**S REPRE- C SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE C ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))), C ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF C CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY C HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN C ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY C SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER C THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K, C 0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS C THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER C COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY C BECAUSE, IN COMPLEX ARITHMETIC WITH PRECISION P, THE SMALLER C COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE C MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES, C THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P, C OR -PI/2+P. C C***REFERENCES HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ C AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF C COMMERCE, 1955. C C COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT C AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983 C C A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX C ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85- C 1018, MAY, 1985 C C A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX C ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, ACM C TRANS. MATH. SOFTWARE, VOL. 12, NO. 3, SEPTEMBER 1986, C PP 265-273.
- Parameters:
zr
- doublezi
- doubleid
- intkode
- intair
- double[]aii
- double[]nz
- int[]ierr
- int[]
-
zasyi
private void zasyi(double zr, double zi, double fnu, int kode, int n, double[] yr, double[] yi, int[] nz)
ZASYI COMPUTES THE I BESSEL FUNCTION FOR REAL(Z).GE.0.0 BY MEANS OF THE ASYMPTOTIC EXPANSION FOR LARGE CABS(Z) IN THE REGION CABS(Z).GT.MAX(RL,fnu*fnu/2). NZ=0 IS A NORMAL RETURN. NZ.LT.0 INDICATES AN OVERFLOW ON kode=UNSCALED_FUNCTION.- Parameters:
zr
- doublezi
- doublefnu
- doublekode
- intn
- intyr
- double[]yi
- double[]nz
- int[]
-
zbesh
private void zbesh(double zr, double zi, double fnu, int kode, int m, int n, double[] cyr, double[] cyi, int[] nz, int[] ierr)
DOCUMENT ME!- Parameters:
zr
- doublezi
- doublefnu
- doublekode
- intm
- intn
- intcyr
- double[]cyi
- double[]nz
- int[]ierr
- int[]
-
zbesi
private void zbesi(double zr, double zi, double fnu, int kode, int n, double[] cyr, double[] cyi, int[] nz, int[] ierr)
DOCUMENT ME!- Parameters:
zr
- doublezi
- doublefnu
- doublekode
- intn
- intcyr
- double[]cyi
- double[]nz
- int[]ierr
- int[]
-
zbesj
private void zbesj(double zr, double zi, double fnu, int kode, int n, double[] cyr, double[] cyi, int[] nz, int[] ierr)
DOCUMENT ME!- Parameters:
zr
- doublezi
- doublefnu
- doublekode
- intn
- intcyr
- double[]cyi
- double[]nz
- int[]ierr
- int[]
-
zbesk
private void zbesk(double zr, double zi, double fnu, int kode, int n, double[] cyr, double[] cyi, int[] nz, int[] ierr)
DOCUMENT ME!- Parameters:
zr
- doublezi
- doublefnu
- doublekode
- intn
- intcyr
- double[]cyi
- double[]nz
- int[]ierr
- int[]
-
zbesy
private void zbesy(double zr, double zi, double fnu, int kode, int n, double[] cyr, double[] cyi, int[] nz, double[] cwrkr, double[] cwrki, int[] ierr)
DOCUMENT ME!- Parameters:
zr
- doublezi
- doublefnu
- doublekode
- intn
- intcyr
- double[]cyi
- double[]nz
- int[]cwrkr
- double[]cwrki
- double[]ierr
- int[]
-
zbesyh
private void zbesyh(double zr, double zi, double fnu, int kode, int n, double[] cyr, double[] cyi, int[] nz, double[] cwrkr, double[] cwrki, int[] ierr)
An older version of zbesy used by the ZQCBY quick check routine.- Parameters:
zr
- doublezi
- doublefnu
- doublekode
- intn
- intcyr
- double[]cyi
- double[]nz
- int[]cwrkr
- double[]cwrki
- double[]ierr
- int[]
-
zbinu
private void zbinu(double zr, double zi, double fnu, int kode, int n, double[] cyr, double[] cyi, int[] nz)
zbinu calculates the I function in the right half z plane.- Parameters:
zr
- doublezi
- doublefnu
- doublekode
- intn
- intcyr
- double[]cyi
- double[]nz
- int[]
-
zbiry
private void zbiry(double zr, double zi, int id, int kode, double[] bir, double[] bii, int[] ierr)
DOCUMENT ME!- Parameters:
zr
- doublezi
- doubleid
- intkode
- intbir
- double[]bii
- double[]ierr
- int[]
-
zbknu
private void zbknu(double zr, double zi, double fnu, int kode, int n, double[] yr, double[] yi, int[] nz)
zbknu computes the k Bessel function in the right half z plane.- Parameters:
zr
- doublezi
- doublefnu
- doublekode
- intn
- intyr
- double[]yi
- double[]nz
- int[]
-
zbuni
private void zbuni(double zr, double zi, double fnu, int kode, int n, double[] yr, double[] yi, int[] nz, int nui, int[] nlast, double fnul)
ZBUNI COMPUTES THE I BESSEL FUNCTION FOR LARGE CABS(Z).GT. FNUL AND fnu+N-1.LT.FNUL. THE ORDER IS INCREASED FROM fnu+N-1 GREATER THAN FNUL BY ADDING NUI AND COMPUTING ACCORDING TO THE UNIFORM ASYMPTOTIC EXPANSION FOR I(fnu,Z) ON IFORM=1 AND THE EXPANSION FOR J(fnu,Z) ON IFORM=2- Parameters:
zr
- doublezi
- doublefnu
- doublekode
- intn
- intyr
- double[]yi
- double[]nz
- int[]nui
- intnlast
- int[]fnul
- double
-
zbunk
private void zbunk(double zr, double zi, double fnu, int kode, int mr, int n, double[] yr, double[] yi, int[] nz)
ZBUNK COMPUTES THE K BESSEL FUNCTION FOR FNU.GT.FNUL. ACCORDING TO THE UNIFORM ASYMPTOTIC EXPANSION FOR K(FNU,Z) IN ZUNK1 AND THE EXPANSION FOR H(2,FNU,Z) IN ZUNK2- Parameters:
zr
- doublezi
- doublefnu
- doublekode
- intmr
- intn
- intyr
- double[]yi
- double[]nz
- int[]
-
zdiv
private void zdiv(double ar, double ai, double br, double bi, double[] cr, double[] ci)
complex divide c = a/b.- Parameters:
ar
- doubleai
- doublebr
- doublebi
- doublecr
- double[]ci
- double[]
-
zexp
private void zexp(double ar, double ai, double[] br, double[] bi)
complex exponential function b = exp(a).- Parameters:
ar
- doubleai
- doublebr
- double[]bi
- double[]
-
zkscl
private void zkscl(double zrr, double zri, double fnu, int n, double[] yr, double[] yi, int[] nz, double rzr, double rzi, double ascle)
Set K functions to zero on underflow, continue recurrence on scaled functions until two members come on scale, then return with min(zn[0]+2,n) values scaled by 1/tol.- Parameters:
zrr
- doublezri
- doublefnu
- doublen
- intyr
- double[]yi
- double[]nz
- int[]rzr
- doublerzi
- doubleascle
- double
-
zlog
private void zlog(double ar, double ai, double[] br, double[] bi, int[] ierr)
complex logarithm b = clog(a).- Parameters:
ar
- doubleai
- doublebr
- double[]bi
- double[]ierr
- int[] ierr = 0, normal return ierr = 1, z = cmplx(0.0, 0.0)
-
zmlri
private void zmlri(double zr, double zi, double fnu, int kode, int n, double[] yr, double[] yi, int[] nz)
zmlri computes the I Bessel function for the Real(z) >= 0.0 by the Miller Algorithm normalized by a Neumann series.- Parameters:
zr
- doublezi
- doublefnu
- doublekode
- intn
- intyr
- double[]yi
- double[]nz
- int[]
-
zmlt
private void zmlt(double ar, double ai, double br, double bi, double[] cr, double[] ci)
complex multiply c = a * b.- Parameters:
ar
- doubleai
- doublebr
- doublebi
- doublecr
- double[]ci
- double[]
-
zqcai
private void zqcai(int mqc)
DOCUMENT ME!- Parameters:
mqc
- int Default is mqc = 1 does not check underflow limits and overflow limits. mqc != 1 checks underflow and overflow limits
-
zqcbh
private void zqcbh(int mqc)
DOCUMENT ME!- Parameters:
mqc
- int Default is mqc = 1 does not check underflow limits and overflow limits. mqc != 1 checks underflow and overflow limits
-
zqcbi
private void zqcbi(int mqc)
DOCUMENT ME!- Parameters:
mqc
- int Default is mqc = 1 does not check underflow limits and overflow limits. mqc != 1 checks underflow and overflow limits
-
zqcbj
private void zqcbj(int mqc)
DOCUMENT ME!- Parameters:
mqc
- int Default is mqc = 1 does not check underflow limits and overflow limits. mqc != 1 checks underflow and overflow limits
-
zqcbk
private void zqcbk(int mqc)
DOCUMENT ME!- Parameters:
mqc
- int Default is mqc = 1 does not check underflow limits and overflow limits. mqc != 1 checks underflow and overflow limits
-
zqcby
private void zqcby(int mqc)
DOCUMENT ME!- Parameters:
mqc
- int Default is mqc = 1 does not check underflow limits and overflow limits. mqc != 1 checks underflow and overflow limits
-
zrati
private void zrati(double zr, double zi, double fnu, int n, double[] cyr, double[] cyi)
ZRATI COMPUTES RATIOS OF I BESSEL FUNCTIONS BY BACKWARD RECURRENCE. THE STARTING INDEX IS DETERMINED BY FORWARD RECURRENCE AS DESCRIBED IN J. RES. OF NAT. BUR. OF STANDARDS-B, MATHEMATICAL SCIENCES, VOL 77B, P111-114, SEPTEMBER, 1973, BESSEL FUNCTIONS I AND J OF COMPLEX ARGUMENT AND INTEGER ORDER, BY D. J. SOOKNE.- Parameters:
zr
- doublezi
- doublefnu
- doublen
- intcyr
- double[]cyi
- double[]
-
zs1s2
private void zs1s2(double zrr, double zri, double[] s1r, double[] s1i, double[] s2r, double[] s2i, int[] nz, double ascle, int[] iuf)
ZS1S2 TESTS FOR A POSSIBLE UNDERFLOW RESULTING FROM THE ADDITION OF THE I AND K FUNCTIONS IN THE ANALYTIC CON- TINUATION FORMULA WHERE S1=K FUNCTION AND S2=I FUNCTION. ON KODE=1 THE I AND K FUNCTIONS ARE DIFFERENT ORDERS OF MAGNITUDE, BUT FOR KODE=2 THEY CAN BE OF THE SAME ORDER OF MAGNITUDE AND THE MAXIMUM MUST BE AT LEAST ONE PRECISION ABOVE THE UNDERFLOW LIMIT.- Parameters:
zrr
- doublezri
- doubles1r
- double[]s1i
- double[]s2r
- double[]s2i
- double[]nz
- int[]ascle
- doubleiuf
- int[]
-
zseri
private void zseri(double zr, double zi, double fnu, int kode, int n, double[] yr, double[] yi, int[] nz)
ZSERI COMPUTES THE I BESSEL FUNCTION FOR REAL(Z).GE.0.0 BY MEANS OF THE POWER SERIES FOR LARGE CABS(Z) IN THE REGION CABS(Z).LE.2*SQRT(fnu+1). NZ=0 IS A NORMAL RETURN. NZ.GT.0 MEANS THAT THE LAST NZ COMPONENTS WERE SET TO ZERO DUE TO UNDERFLOW. NZ.LT.0 MEANS UNDERFLOW OCCURRED, BUT THE CONDITION CABS(Z).LE.2*SQRT(fnu+1) WAS VIOLATED AND THE COMPUTATION MUST BE COMPLETED IN ANOTHER ROUTINE WITH N=N-ABS(NZ).- Parameters:
zr
- doublezi
- doublefnu
- doublekode
- intn
- intyr
- double[]yi
- double[]nz
- int[]
-
zshch
private void zshch(double zr, double zi, double[] cshr, double[] cshi, double[] cchr, double[] cchi)
zshch computes the complex hyperbolic functions csh = sinh(x+i*y) and cch = cosh(x+i*y).- Parameters:
zr
- doublezi
- doublecshr
- double[]cshi
- double[]cchr
- double[]cchi
- double[]
-
zsqrt
private void zsqrt(double ar, double ai, double[] br, double[] bi)
complex square root b = csqrt(a).- Parameters:
ar
- doubleai
- doublebr
- double[]bi
- double[]
-
zuchk
private void zuchk(double yr, double yi, int[] nz, double ascle)
Y ENTERS AS A SCALED QUANTITY WHOSE MAGNITUDE IS GREATER THAN EXP(-ALIM)=ASCLE=1.0E+3*D1MACH(1)/TOL. THE TEST IS MADE TO SEE IF THE MAGNITUDE OF THE REAL OR IMAGINARY PART WOULD UNDERFLOW WHEN Y IS SCALED (BY TOL) TO ITS PROPER VALUE. Y IS ACCEPTED IF THE UNDERFLOW IS AT LEAST ONE PRECISION BELOW THE MAGNITUDE OF THE LARGEST COMPONENT; OTHERWISE THE PHASE ANGLE DOES NOT HAVE ABSOLUTE ACCURACY AND AN UNDERFLOW IS ASSUMED.- Parameters:
yr
- doubleyi
- doublenz
- int[]ascle
- double
-
zunhj
private void zunhj(double zr, double zi, double fnu, int ipmtr, double[] phir, double[] phii, double[] argr, double[] argi, double[] zeta1r, double[] zeta1i, double[] zeta2r, double[] zeta2i, double[] asumr, double[] asumi, double[] bsumr, double[] bsumi)
REFERENCES HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ AND I.A. STEGUN, AMS55, NATIONAL BUREAU OF STANDARDS, 1965, CHAPTER 9.ASYMPTOTICS AND SPECIAL FUNCTIONS BY F.W.J. OLVER, ACADEMIC PRESS, N.Y., 1974, PAGE 420
ABSTRACT ZUNHJ COMPUTES PARAMETERS FOR BESSEL FUNCTIONS C(FNU,Z) = J(FNU,Z), Y(FNU,Z) OR H(I,FNU,Z) I=1,2 FOR LARGE ORDERS FNU BY MEANS OF THE UNIFORM ASYMPTOTIC EXPANSION
C(FNU,Z)=C1*PHI*( ASUM*AIRY(ARG) + C2*BSUM*DAIRY(ARG) )
FOR PROPER CHOICES OF C1, C2, AIRY AND DAIRY WHERE AIRY IS AN AIRY FUNCTION AND DAIRY IS ITS DERIVATIVE.
(2/3)*FNU*ZETA**1.5 = ZETA1-ZETA2,
ZETA1=0.5*FNU*CLOG((1+W)/(1-W)), ZETA2=FNU*W FOR SCALING PURPOSES IN AIRY FUNCTIONS FROM CAIRY OR CBIRY.
MCONJ=SIGN OF AIMAG(Z), BUT IS AMBIGUOUS WHEN Z IS REAL AND MUST BE SPECIFIED. IPMTR=0 RETURNS ALL PARAMETERS. IPMTR=1 COMPUTES ALL EXCEPT ASUM AND BSUM.
- Parameters:
zr
- doublezi
- doublefnu
- doubleipmtr
- intphir
- double[]phii
- double[]argr
- double[]argi
- double[]zeta1r
- double[]zeta1i
- double[]zeta2r
- double[]zeta2i
- double[]asumr
- double[]asumi
- double[]bsumr
- double[]bsumi
- double[]
-
zuni1
private void zuni1(double zr, double zi, double fnu, int kode, int n, double[] yr, double[] yi, int[] nz, int[] nlast, double fnul)
ZUNI1 COMPUTES I(FNU,Z) BY MEANS OF THE UNIFORM ASYMPTOTIC EXPANSION FOR I(FNU,Z) IN -PI/3.LE.ARG Z.LE.PI/3.NUL IS THE SMALLEST ORDER PERMITTED FOR THE ASYMPTOTIC EXPANSION. NLAST=0 MEANS ALL OF THE Y VALUES WERE SET. NLAST.NE.0 IS THE NUMBER LEFT TO BE COMPUTED BY ANOTHER FORMULA FOR ORDERS FNU TO FNU+NLAST-1 BECAUSE FNU+NLAST-1.LT.FNUL. Y(I)=CZERO FOR I=NLAST+1,N
- Parameters:
zr
- doublezi
- doublefnu
- doublekode
- intn
- intyr
- double[]yi
- double[]nz
- int[]nlast
- int[]fnul
- double
-
zuni2
private void zuni2(double zr, double zi, double fnu, int kode, int n, double[] yr, double[] yi, int[] nz, int[] nlast, double fnul)
ZUNI2 COMPUTES I(FNU,Z) IN THE RIGHT HALF PLANE BY MEANS OF UNIFORM ASYMPTOTIC EXPANSION FOR J(FNU,ZN) WHERE ZN IS Z*I OR -Z*I AND ZN IS IN THE RIGHT HALF PLANE ALSO.FNUL IS THE SMALLEST ORDER PERMITTED FOR THE ASYMPTOTIC EXPANSION. NLAST=0 MEANS ALL OF THE Y VALUES WERE SET. NLAST.NE.0 IS THE NUMBER LEFT TO BE COMPUTED BY ANOTHER FORMULA FOR ORDERS FNU TO FNU+NLAST-1 BECAUSE FNU+NLAST-1.LT.FNUL. Y(I)=CZERO FOR I=NLAST+1,N
- Parameters:
zr
- doublezi
- doublefnu
- doublekode
- intn
- intyr
- double[]yi
- double[]nz
- int[]nlast
- int[]fnul
- double
-
zunik
private void zunik(double zrr, double zri, double fnu, int ikflg, int ipmtr, int[] init, double[] phir, double[] phii, double[] zeta1r, double[] zeta1i, double[] zeta2r, double[] zeta2i, double[] sumr, double[] sumi, double[] cwrkr, double[] cwrki)
ZUNIK COMPUTES PARAMETERS FOR THE UNIFORM ASYMPTOTIC EXPANSIONS OF THE I AND K FUNCTIONS ON IKFLG= 1 OR 2 RESPECTIVELY BY.W(fnu,ZR) = PHI*EXP(ZETA)*SUM
WHERE ZETA=-ZETA1 + ZETA2 OR ZETA1 - ZETA2
THE FIRST CALL MUST HAVE INIT=0. SUBSEQUENT CALLS WITH THE SAME ZR AND FNU WILL RETURN THE I OR K FUNCTION ON IKFLG= 1 OR 2 WITH NO CHANGE IN INIT. CWRK IS A COMPLEX WORK ARRAY. IPMTR=0 COMPUTES ALL PARAMETERS. IPMTR=1 COMPUTES PHI, ZETA1,ZETA2.
- Parameters:
zrr
- doublezri
- doublefnu
- doubleikflg
- intipmtr
- intinit
- intphir
- double[]phii
- double[]zeta1r
- double[]zeta1i
- double[]zeta2r
- double[]zeta2i
- double[]sumr
- double[]sumi
- double[]cwrkr
- double[]cwrki
- double[]
-
zunk1
private void zunk1(double zr, double zi, double fnu, int kode, int mr, int n, double[] yr, double[] yi, int[] nz)
ZUNK1 COMPUTES K(FNU,Z) AND ITS ANALYTIC CONTINUATION FROM THE RIGHT HALF PLANE TO THE LEFT HALF PLANE BY MEANS OF THE UNIFORM ASYMPTOTIC EXPANSION. MR INDICATES THE DIRECTION OF ROTATION FOR ANALYTIC CONTINUATION. NZ=-1 MEANS AN OVERFLOW WILL OCCUR- Parameters:
zr
- doublezi
- doublefnu
- doublekode
- intmr
- intn
- intyr
- double[]yi
- double[]nz
- int[]
-
zunk2
private void zunk2(double zr, double zi, double fnu, int kode, int mr, int n, double[] yr, double[] yi, int[] nz)
ZUNK2 COMPUTES K(FNU,Z) AND ITS ANALYTIC CONTINUATION FROM THE RIGHT HALF PLANE TO THE LEFT HALF PLANE BY MEANS OF THE UNIFORM ASYMPTOTIC EXPANSIONS FOR H(KIND,FNU,ZN) AND J(FNU,ZN) WHERE ZN IS IN THE RIGHT HALF PLANE, KIND=(3-MR)/2, MR=+1 OR -1. HERE ZN=ZR*I OR -ZR*I WHERE ZR=Z IF Z IS IN THE RIGHT HALF PLANE OR ZR=-Z IF Z IS IN THE LEFT HALF PLANE. MR INDIC- ATES THE DIRECTION OF ROTATION FOR ANALYTIC CONTINUATION. NZ=-1 MEANS AN OVERFLOW WILL OCCUR- Parameters:
zr
- doublezi
- doublefnu
- doublekode
- intmr
- intn
- intyr
- double[]yi
- double[]nz
- int[]
-
zuoik
private void zuoik(double zr, double zi, double fnu, int kode, int ikflg, int n, double[] yr, double[] yi, int[] nuf)
ZUOIK COMPUTES THE LEADING TERMS OF THE UNIFORM ASYMPTOTIC EXPANSIONS FOR THE I AND K FUNCTIONS AND COMPARES THEM (IN LOGARITHMIC FORM) TO ALIM AND ELIM FOR OVER AND UNDERFLOW WHERE ALIM.LT.ELIM. IF THE MAGNITUDE, BASED ON THE LEADING EXPONENTIAL, IS LESS THAN ALIM OR GREATER THAN -ALIM, THEN THE RESULT IS ON SCALE. IF NOT, THEN A REFINED TEST USING OTHER MULTIPLIERS (IN LOGARITHMIC FORM) IS MADE BASED ON ELIM. HERE EXP(-ELIM)=SMALLEST MACHINE NUMBER*1.0E+3 AND EXP(-ALIM)= EXP(-ELIM)/TOLIKFLG=1 MEANS THE I SEQUENCE IS TESTED =2 MEANS THE K SEQUENCE IS TESTED NUF = 0 MEANS THE LAST MEMBER OF THE SEQUENCE IS ON SCALE =-1 MEANS AN OVERFLOW WOULD OCCUR IKFLG=1 AND NUF.GT.0 MEANS THE LAST NUF Y VALUES WERE SET TO ZERO THE FIRST N-NUF VALUES MUST BE SET BY ANOTHER ROUTINE IKFLG=2 AND NUF.EQ.N MEANS ALL Y VALUES WERE SET TO ZERO IKFLG=2 AND 0.LT.NUF.LT.N NOT CONSIDERED. Y MUST BE SET BY ANOTHER ROUTINE
- Parameters:
zr
- doublezi
- doublefnu
- doublekode
- intikflg
- intn
- intyr
- double[]yi
- double[]nuf
- int[]
-
zwrsk
private void zwrsk(double zrr, double zri, double fnu, int kode, int n, double[] yr, double[] yi, int[] nz, double[] cwr, double[] cwi)
zwrsk computes the I Bessel function for Real(z) >- 0.0 by normalizing the I function ratios from zrati by the Wronskian.- Parameters:
zrr
- doublezri
- doublefnu
- doublekode
- intn
- intyr
- double[]yi
- double[]nz
- int[]cwr
- double[]cwi
- double[]
-
-