Browse Source

Special Functions: turn Amos into static class

pull/587/merge
Christoph Ruegg 8 years ago
parent
commit
dbc1a02403
  1. 18
      src/Numerics/SpecialFunctions/Airy.cs
  2. 153
      src/Numerics/SpecialFunctions/Amos/Amos.cs
  3. 80
      src/Numerics/SpecialFunctions/Amos/AmosHelper.cs
  4. 24
      src/Numerics/SpecialFunctions/Bessel.cs
  5. 6
      src/Numerics/SpecialFunctions/Hankel.cs

18
src/Numerics/SpecialFunctions/Airy.cs

@ -17,8 +17,7 @@ namespace MathNet.Numerics
/// <returns></returns>
public static Complex AiryAi(Complex z, bool expScaled = false)
{
var amos = new AmosWrapper();
return (expScaled) ? amos.ScaledCairy(z) : amos.Cairy(z);
return (expScaled) ? Amos.ScaledCairy(z) : Amos.Cairy(z);
}
/// <summary>
@ -33,8 +32,7 @@ namespace MathNet.Numerics
{
if (expScaled)
{
var amos = new AmosWrapper();
return amos.ScaledCairy(z);
return Amos.ScaledCairy(z);
}
else
{
@ -52,8 +50,7 @@ namespace MathNet.Numerics
/// <returns></returns>
public static Complex AiryAiPrime(Complex z, bool expScaled = false)
{
var amos = new AmosWrapper();
return (expScaled) ? amos.ScaledCairyPrime(z) : amos.CairyPrime(z);
return (expScaled) ? Amos.ScaledCairyPrime(z) : Amos.CairyPrime(z);
}
/// <summary>
@ -68,8 +65,7 @@ namespace MathNet.Numerics
{
if (expScaled)
{
var amos = new AmosWrapper();
return amos.ScaledCairyPrime(z);
return Amos.ScaledCairyPrime(z);
}
else
{
@ -87,8 +83,7 @@ namespace MathNet.Numerics
/// <returns></returns>
public static Complex AiryBi(Complex z, bool expScaled = false)
{
var amos = new AmosWrapper();
return (expScaled) ? amos.ScaledCbiry(z) : amos.Cbiry(z);
return (expScaled) ? Amos.ScaledCbiry(z) : Amos.Cbiry(z);
}
/// <summary>
@ -114,8 +109,7 @@ namespace MathNet.Numerics
/// <returns></returns>
public static Complex AiryBiPrime(Complex z, bool expScaled = false)
{
var amos = new AmosWrapper();
return (expScaled) ? amos.ScaledCbiryPrime(z) : amos.CbiryPrime(z);
return (expScaled) ? Amos.ScaledCbiryPrime(z) : Amos.CbiryPrime(z);
}
/// <summary>

153
src/Numerics/SpecialFunctions/Amos/AmosWrapper.cs → src/Numerics/SpecialFunctions/Amos/Amos.cs

@ -7,12 +7,12 @@ namespace MathNet.Numerics
// [1] https://github.com/scipy/scipy/blob/master/scipy/special/amos_wrappers.c
public static partial class SpecialFunctions
{
private class AmosWrapper
private static class Amos
{
#region AiryAi
// Returns Ai(z)
public Complex Cairy(Complex z)
public static Complex Cairy(Complex z)
{
int id = 0;
int kode = 1;
@ -22,13 +22,12 @@ namespace MathNet.Numerics
double air = double.NaN;
double aii = double.NaN;
var amos = new AmosHelper();
amos.zairy(z.Real, z.Imaginary, id, kode, ref air, ref aii, ref nz, ref ierr);
AmosHelper.zairy(z.Real, z.Imaginary, id, kode, ref air, ref aii, ref nz, ref ierr);
return new Complex(air, aii);
}
// Returns Exp(zta) * Ai(z) where zta = (2/3) * z * Sqrt(z)
public Complex ScaledCairy(Complex z)
public static Complex ScaledCairy(Complex z)
{
int id = 0;
int kode = 2;
@ -38,13 +37,12 @@ namespace MathNet.Numerics
double air = double.NaN;
double aii = double.NaN;
var amos = new AmosHelper();
amos.zairy(z.Real, z.Imaginary, id, kode, ref air, ref aii, ref nz, ref ierr);
AmosHelper.zairy(z.Real, z.Imaginary, id, kode, ref air, ref aii, ref nz, ref ierr);
return new Complex(air, aii);
}
// Returns Exp(zta) * Ai(z) where zta = (2/3) * z * Sqrt(z)
public double ScaledCairy(double z)
public static double ScaledCairy(double z)
{
if (z < 0)
{
@ -59,13 +57,12 @@ namespace MathNet.Numerics
double air = double.NaN;
double aii = double.NaN;
var amos = new AmosHelper();
amos.zairy(z, 0.0, id, kode, ref air, ref aii, ref nz, ref ierr);
AmosHelper.zairy(z, 0.0, id, kode, ref air, ref aii, ref nz, ref ierr);
return air;
}
// Returns d/dz Ai(z)
public Complex CairyPrime(Complex z)
public static Complex CairyPrime(Complex z)
{
int id = 1;
int kode = 1;
@ -75,13 +72,12 @@ namespace MathNet.Numerics
double air = double.NaN;
double aii = double.NaN;
var amos = new AmosHelper();
amos.zairy(z.Real, z.Imaginary, id, kode, ref air, ref aii, ref nz, ref ierr);
AmosHelper.zairy(z.Real, z.Imaginary, id, kode, ref air, ref aii, ref nz, ref ierr);
return new Complex(air, aii);
}
// Returns Exp(zta) * d/dz Ai(z) where zta = (2/3) * z * Sqrt(z)
public Complex ScaledCairyPrime(Complex z)
public static Complex ScaledCairyPrime(Complex z)
{
int id = 1;
int kode = 2;
@ -91,13 +87,12 @@ namespace MathNet.Numerics
double air = double.NaN;
double aii = double.NaN;
var amos = new AmosHelper();
amos.zairy(z.Real, z.Imaginary, id, kode, ref air, ref aii, ref nz, ref ierr);
AmosHelper.zairy(z.Real, z.Imaginary, id, kode, ref air, ref aii, ref nz, ref ierr);
return new Complex(air, aii);
}
// Returns Exp(zta) * d/dz Ai(z) where zta = (2/3) * z * Sqrt(z)
public double ScaledCairyPrime(double z)
public static double ScaledCairyPrime(double z)
{
if (z < 0)
{
@ -112,8 +107,7 @@ namespace MathNet.Numerics
double air = double.NaN;
double aii = double.NaN;
var amos = new AmosHelper();
amos.zairy(z, 0.0, id, kode, ref air, ref aii, ref nz, ref ierr);
AmosHelper.zairy(z, 0.0, id, kode, ref air, ref aii, ref nz, ref ierr);
return air;
}
@ -122,7 +116,7 @@ namespace MathNet.Numerics
#region AiryBi
// Returns Bi(z)
public Complex Cbiry(Complex z)
public static Complex Cbiry(Complex z)
{
int id = 0;
int kode = 1;
@ -132,13 +126,12 @@ namespace MathNet.Numerics
double bir = double.NaN;
double bii = double.NaN;
var amos = new AmosHelper();
amos.zbiry(z.Real, z.Imaginary, id, kode, ref bir, ref bii, ref nz, ref ierr);
AmosHelper.zbiry(z.Real, z.Imaginary, id, kode, ref bir, ref bii, ref nz, ref ierr);
return new Complex(bir, bii);
}
// Returns Exp(-axzta) * Bi(z) where zta = (2 / 3) * z * Sqrt(z) and axzta = Abs(zta.Real)
public Complex ScaledCbiry(Complex z)
public static Complex ScaledCbiry(Complex z)
{
int id = 0;
int kode = 2;
@ -148,13 +141,12 @@ namespace MathNet.Numerics
double bir = double.NaN;
double bii = double.NaN;
var amos = new AmosHelper();
amos.zbiry(z.Real, z.Imaginary, id, kode, ref bir, ref bii, ref nz, ref ierr);
AmosHelper.zbiry(z.Real, z.Imaginary, id, kode, ref bir, ref bii, ref nz, ref ierr);
return new Complex(bir, bii);
}
// Returns d/dz Bi(z)
public Complex CbiryPrime(Complex z)
public static Complex CbiryPrime(Complex z)
{
int id = 1;
int kode = 1;
@ -164,13 +156,12 @@ namespace MathNet.Numerics
double bipr = double.NaN;
double bipi = double.NaN;
var amos = new AmosHelper();
amos.zbiry(z.Real, z.Imaginary, id, kode, ref bipr, ref bipi, ref nz, ref ierr);
AmosHelper.zbiry(z.Real, z.Imaginary, id, kode, ref bipr, ref bipi, ref nz, ref ierr);
return new Complex(bipr, bipi);
}
// Returns Exp(-axzta) * d/dz Bi(z) where zta = (2 / 3) * z * Sqrt(z) and axzta = Abs(zta.Real)
public Complex ScaledCbiryPrime(Complex z)
public static Complex ScaledCbiryPrime(Complex z)
{
int id = 1;
int kode = 2;
@ -180,8 +171,7 @@ namespace MathNet.Numerics
double bipr = double.NaN;
double bipi = double.NaN;
var amos = new AmosHelper();
amos.zbiry(z.Real, z.Imaginary, id, kode, ref bipr, ref bipi, ref nz, ref ierr);
AmosHelper.zbiry(z.Real, z.Imaginary, id, kode, ref bipr, ref bipi, ref nz, ref ierr);
return new Complex(bipr, bipi);
}
@ -190,7 +180,7 @@ namespace MathNet.Numerics
#region BesselJ
// Return J(v, z)
public Complex Cbesj(double v, Complex z)
public static Complex Cbesj(double v, Complex z)
{
if (double.IsNaN(v) || double.IsNaN(z.Real) || double.IsNaN(z.Imaginary))
{
@ -216,8 +206,7 @@ namespace MathNet.Numerics
cyji[i] = double.NaN;
}
var amos = new AmosHelper();
amos.zbesj(z.Real, z.Imaginary, v, kode, n, cyjr, cyji, ref nz, ref ierr);
AmosHelper.zbesj(z.Real, z.Imaginary, v, kode, n, cyjr, cyji, ref nz, ref ierr);
Complex cyj = new Complex(cyjr[0], cyji[0]);
if (ierr == 2)
@ -244,7 +233,7 @@ namespace MathNet.Numerics
cwrki[i] = double.NaN;
}
amos.zbesy(z.Real, z.Imaginary, v, kode, n, cyyr, cyyi, ref nz, cwrkr, cwrki, ref ierr);
AmosHelper.zbesy(z.Real, z.Imaginary, v, kode, n, cyyr, cyyi, ref nz, cwrkr, cwrki, ref ierr);
Complex cyy = new Complex(cyyr[0], cyyi[0]);
cyj = RotateJY(cyj, cyy, v);
@ -254,7 +243,7 @@ namespace MathNet.Numerics
}
// Return J(v, z)
public double Cbesj(double v, double z)
public static double Cbesj(double v, double z)
{
if (z < 0 && v != (int)v)
{
@ -265,7 +254,7 @@ namespace MathNet.Numerics
}
// Return Exp(-Abs(y)) * J(v, z) where y = z.Imaginary
public Complex ScaledCbesj(double v, Complex z)
public static Complex ScaledCbesj(double v, Complex z)
{
if (double.IsNaN(v) || double.IsNaN(z.Real) || double.IsNaN(z.Imaginary))
{
@ -292,8 +281,7 @@ namespace MathNet.Numerics
cyji[i] = double.NaN;
}
var amos = new AmosHelper();
amos.zbesj(z.Real, z.Imaginary, v, kode, n, cyjr, cyji, ref nz, ref ierr);
AmosHelper.zbesj(z.Real, z.Imaginary, v, kode, n, cyjr, cyji, ref nz, ref ierr);
Complex cyj = new Complex(cyjr[0], cyji[0]);
if (sign == -1)
@ -312,7 +300,7 @@ namespace MathNet.Numerics
cworki[i] = double.NaN;
}
amos.zbesy(z.Real, z.Imaginary, v, kode, n, cyyr, cyyi, ref nz, cworkr, cworki, ref ierr);
AmosHelper.zbesy(z.Real, z.Imaginary, v, kode, n, cyyr, cyyi, ref nz, cworkr, cworki, ref ierr);
Complex cyy = new Complex(cyyr[0], cyyi[0]);
cyj = RotateJY(cyj, cyy, v);
@ -322,7 +310,7 @@ namespace MathNet.Numerics
}
// Return Exp(-Abs(y)) * J(v, z) where y = z.Imaginary
public double ScaledCbesj(double v, double z)
public static double ScaledCbesj(double v, double z)
{
if (z < 0 && v != (int)v)
{
@ -337,7 +325,7 @@ namespace MathNet.Numerics
#region BesselY
// Return Y(v, z)
public Complex Cbesy(double v, Complex z)
public static Complex Cbesy(double v, Complex z)
{
if (double.IsNaN(v) || double.IsNaN(z.Real) || double.IsNaN(z.Imaginary))
{
@ -357,7 +345,6 @@ namespace MathNet.Numerics
int ierr = 0;
Complex cyy;
var amos = new AmosHelper();
if (z.Real == 0 && z.Imaginary == 0)
{
//overflow
@ -377,7 +364,7 @@ namespace MathNet.Numerics
cworki[i] = double.NaN;
}
amos.zbesy(z.Real, z.Imaginary, v, kode, n, cyyr, cyyi, ref nz, cworkr, cworki, ref ierr);
AmosHelper.zbesy(z.Real, z.Imaginary, v, kode, n, cyyr, cyyi, ref nz, cworkr, cworki, ref ierr);
cyy = new Complex(cyyr[0], cyyi[0]);
if (ierr == 2)
@ -402,7 +389,7 @@ namespace MathNet.Numerics
cyji[i] = double.NaN;
}
amos.zbesj(z.Real, z.Imaginary, v, kode, n, cyjr, cyji, ref nz, ref ierr);
AmosHelper.zbesj(z.Real, z.Imaginary, v, kode, n, cyjr, cyji, ref nz, ref ierr);
Complex cyj = new Complex(cyjr[0], cyji[0]);
cyy = RotateJY(cyy, cyj, -v);
@ -412,7 +399,7 @@ namespace MathNet.Numerics
}
// Return Y(v, z)
public double Cbesy(double v, double x)
public static double Cbesy(double v, double x)
{
if (x < 0.0)
{
@ -424,7 +411,7 @@ namespace MathNet.Numerics
}
// Return Exp(-Abs(y)) * Y(v, z) where y = z.Imaginary
public Complex ScaledCbesy(double v, Complex z)
public static Complex ScaledCbesy(double v, Complex z)
{
if (double.IsNaN(v) || double.IsNaN(z.Real) || double.IsNaN(z.Imaginary))
{
@ -455,8 +442,7 @@ namespace MathNet.Numerics
cwrki[i] = double.NaN;
}
var amos = new AmosHelper();
amos.zbesy(z.Real, z.Imaginary, v, kode, n, cyyr, cyyi, ref nz, cwrkr, cwrki, ref ierr);
AmosHelper.zbesy(z.Real, z.Imaginary, v, kode, n, cyyr, cyyi, ref nz, cwrkr, cwrki, ref ierr);
Complex cyy = new Complex(cyyr[0], cyyi[0]);
if (ierr == 2)
@ -480,7 +466,7 @@ namespace MathNet.Numerics
cyji[i] = double.NaN;
}
amos.zbesj(z.Real, z.Imaginary, v, kode, n, cyjr, cyji, ref nz, ref ierr);
AmosHelper.zbesj(z.Real, z.Imaginary, v, kode, n, cyjr, cyji, ref nz, ref ierr);
Complex cyj = new Complex(cyjr[0], cyji[0]);
cyy = RotateJY(cyy, cyj, -v);
}
@ -489,7 +475,7 @@ namespace MathNet.Numerics
}
// Return Exp(-Abs(y)) * Y(v, z) where y = z.Imaginary
public double ScaledCbesy(double v, double x)
public static double ScaledCbesy(double v, double x)
{
if (x < 0)
{
@ -504,7 +490,7 @@ namespace MathNet.Numerics
#region BesselI
// Returns I(v, z)
public Complex Cbesi(double v, Complex z)
public static Complex Cbesi(double v, Complex z)
{
if (double.IsNaN(v) || double.IsNaN(z.Real) || double.IsNaN(z.Imaginary))
{
@ -531,8 +517,7 @@ namespace MathNet.Numerics
cyii[i] = double.NaN;
}
var amos = new AmosHelper();
amos.zbesi(z.Real, z.Imaginary, v, kode, n, cyir, cyii, ref nz, ref ierr);
AmosHelper.zbesi(z.Real, z.Imaginary, v, kode, n, cyir, cyii, ref nz, ref ierr);
Complex cyi = new Complex(cyir[0], cyii[0]);
if (ierr == 2)
@ -558,7 +543,7 @@ namespace MathNet.Numerics
{
double[] cykr = new double[n];
double[] cyki = new double[n];
amos.zbesk(z.Real, z.Imaginary, v, kode, n, cykr, cyki, ref nz, ref ierr);
AmosHelper.zbesk(z.Real, z.Imaginary, v, kode, n, cykr, cyki, ref nz, ref ierr);
Complex cyk = new Complex(cykr[0], cyki[0]);
cyi = RotateI(cyi, cyk, v);
@ -569,7 +554,7 @@ namespace MathNet.Numerics
}
// Return Exp(-Abs(x)) * I(v, z) where x = z.Real
public Complex ScaledCbesi(double v, Complex z)
public static Complex ScaledCbesi(double v, Complex z)
{
if (double.IsNaN(v) || double.IsNaN(z.Real) || double.IsNaN(z.Imaginary))
{
@ -596,8 +581,7 @@ namespace MathNet.Numerics
cyii[i] = double.NaN;
}
var amos = new AmosHelper();
amos.zbesi(z.Real, z.Imaginary, v, kode, n, cyir, cyii, ref nz, ref ierr);
AmosHelper.zbesi(z.Real, z.Imaginary, v, kode, n, cyir, cyii, ref nz, ref ierr);
Complex cyi = new Complex(cyir[0], cyii[0]);
if (sign == -1)
@ -606,7 +590,7 @@ namespace MathNet.Numerics
{
double[] cykr = new double[n];
double[] cyki = new double[n];
amos.zbesk(z.Real, z.Imaginary, v, kode, n, cykr, cyki, ref nz, ref ierr);
AmosHelper.zbesk(z.Real, z.Imaginary, v, kode, n, cykr, cyki, ref nz, ref ierr);
Complex cyk = new Complex(cykr[0], cyki[0]);
//adjust scaling to match zbesi
@ -624,7 +608,7 @@ namespace MathNet.Numerics
}
// Return Exp(-Abs(x)) * I(v, z) where x = z.Real
public double ScaledCbesi(double v, double x)
public static double ScaledCbesi(double v, double x)
{
if (v != Math.Floor(v) && x < 0)
{
@ -639,7 +623,7 @@ namespace MathNet.Numerics
#region BesselK
// Returns K(v, z)
public Complex Cbesk(double v, Complex z)
public static Complex Cbesk(double v, Complex z)
{
if (double.IsNaN(v) || double.IsNaN(z.Real) || double.IsNaN(z.Imaginary))
{
@ -664,8 +648,7 @@ namespace MathNet.Numerics
cyki[i] = double.NaN;
}
var amos = new AmosHelper();
amos.zbesk(z.Real, z.Imaginary, v, kode, n, cykr, cyki, ref nz, ref ierr);
AmosHelper.zbesk(z.Real, z.Imaginary, v, kode, n, cykr, cyki, ref nz, ref ierr);
Complex cyk = new Complex(cykr[0], cyki[0]);
if (ierr == 1)
@ -688,7 +671,7 @@ namespace MathNet.Numerics
}
// Returns K(v, z)
public double Cbesk(double v, double z)
public static double Cbesk(double v, double z)
{
if (z < 0)
{
@ -714,7 +697,7 @@ namespace MathNet.Numerics
}
// returns Exp(z) * K(v, z)
public Complex ScaledCbesk(double v, Complex z)
public static Complex ScaledCbesk(double v, Complex z)
{
if (double.IsNaN(v) || double.IsNaN(z.Real) || double.IsNaN(z.Imaginary))
{
@ -740,9 +723,7 @@ namespace MathNet.Numerics
cyki[i] = double.NaN;
}
var amos = new AmosHelper();
amos.zbesk(z.Real, z.Imaginary, v, kode, n, cykr, cyki, ref nz, ref ierr);
AmosHelper.zbesk(z.Real, z.Imaginary, v, kode, n, cykr, cyki, ref nz, ref ierr);
Complex cyk = new Complex(cykr[0], cyki[0]);
if (ierr == 2)
@ -758,7 +739,7 @@ namespace MathNet.Numerics
}
// returns Exp(z) * K(v, z)
public double ScaledCbesk(double v, double z)
public static double ScaledCbesk(double v, double z)
{
if (z < 0)
{
@ -780,7 +761,7 @@ namespace MathNet.Numerics
#region HankelH1
// Returns H1(v, z)
public Complex Cbesh1(double v, Complex z)
public static Complex Cbesh1(double v, Complex z)
{
if (double.IsNaN(v) || double.IsNaN(z.Real) || double.IsNaN(z.Imaginary))
{
@ -808,8 +789,7 @@ namespace MathNet.Numerics
sign = -1;
}
var amos = new AmosHelper();
amos.zbesh(z.Real, z.Imaginary, v, kode, m, n, cyhr, cyhi, ref nz, ref ierr);
AmosHelper.zbesh(z.Real, z.Imaginary, v, kode, m, n, cyhr, cyhi, ref nz, ref ierr);
Complex cyh = new Complex(cyhr[0], cyhi[0]);
if (sign == -1)
@ -821,7 +801,7 @@ namespace MathNet.Numerics
}
// Returns Exp(-z * j) * H1(n, z) where j = Sqrt(-1)
public Complex ScaledCbesh1(double v, Complex z)
public static Complex ScaledCbesh1(double v, Complex z)
{
if (double.IsNaN(v) || double.IsNaN(z.Real) || double.IsNaN(z.Imaginary))
{
@ -849,8 +829,7 @@ namespace MathNet.Numerics
sign = -1;
}
var amos = new AmosHelper();
amos.zbesh(z.Real, z.Imaginary, v, kode, m, n, cyhr, cyhi, ref nz, ref ierr);
AmosHelper.zbesh(z.Real, z.Imaginary, v, kode, m, n, cyhr, cyhi, ref nz, ref ierr);
Complex cyh = new Complex(cyhr[0], cyhi[0]);
if (sign == -1)
@ -866,7 +845,7 @@ namespace MathNet.Numerics
#region HankelH2
// Returns H2(v, z)
public Complex Cbesh2(double v, Complex z)
public static Complex Cbesh2(double v, Complex z)
{
if (double.IsNaN(v) || double.IsNaN(z.Real) || double.IsNaN(z.Imaginary))
{
@ -899,8 +878,7 @@ namespace MathNet.Numerics
sign = -1;
}
var amos = new AmosHelper();
amos.zbesh(z.Real, z.Imaginary, v, kode, m, n, cyhr, cyhi, ref nz, ref ierr);
AmosHelper.zbesh(z.Real, z.Imaginary, v, kode, m, n, cyhr, cyhi, ref nz, ref ierr);
Complex cyh = new Complex(cyhr[0], cyhi[0]);
if (sign == -1)
@ -911,7 +889,7 @@ namespace MathNet.Numerics
}
// Returns Exp(z * j) * H2(n, z) where j = Sqrt(-1)
public Complex ScaledCbesh2(double v, Complex z)
public static Complex ScaledCbesh2(double v, Complex z)
{
if (double.IsNaN(v) || double.IsNaN(z.Real) || double.IsNaN(z.Imaginary))
{
@ -944,8 +922,7 @@ namespace MathNet.Numerics
sign = -1;
}
var amos = new AmosHelper();
amos.zbesh(z.Real, z.Imaginary, v, kode, m, n, cyhr, cyhi, ref nz, ref ierr);
AmosHelper.zbesh(z.Real, z.Imaginary, v, kode, m, n, cyhr, cyhi, ref nz, ref ierr);
Complex cyh = new Complex(cyhr[0], cyhi[0]);
if (sign == -1)
@ -959,7 +936,7 @@ namespace MathNet.Numerics
#region utilities
private double SinPi(double x)
private static double SinPi(double x)
{
if (Math.Floor(x) == x && Math.Abs(x) < 1.0e14)
{
@ -971,7 +948,7 @@ namespace MathNet.Numerics
return Math.Sin(Math.PI * x);
}
private double CosPi(double x)
private static double CosPi(double x)
{
if (Math.Floor(x + 0.5) == x + 0.5 && Math.Abs(x) < 1.0E14)
{
@ -983,21 +960,21 @@ namespace MathNet.Numerics
return Math.Cos(Math.PI * x);
}
private Complex Rotate(Complex z, double v)
private static Complex Rotate(Complex z, double v)
{
double c = CosPi(v);
double s = SinPi(v);
return new Complex(z.Real * c - z.Imaginary * s, z.Real * s + z.Imaginary * c);
}
private Complex RotateJY(Complex j, Complex y, double v)
private static Complex RotateJY(Complex j, Complex y, double v)
{
double c = CosPi(v);
double s = SinPi(v);
return new Complex(j.Real * c - y.Real * s, j.Imaginary * c - y.Imaginary * s);
}
private bool ReflectJY(ref Complex jy, double v)
private static bool ReflectJY(ref Complex jy, double v)
{
//NB: Y_v may be huge near negative integers -- so handle exact
// integers carefully
@ -1016,7 +993,7 @@ namespace MathNet.Numerics
return true;
}
private bool ReflectI(Complex ik, double v)
private static bool ReflectI(Complex ik, double v)
{
if (v != Math.Floor(v))
{
@ -1026,7 +1003,7 @@ namespace MathNet.Numerics
return true; //I is symmetric for integer v
}
private Complex RotateI(Complex i, Complex k, double v)
private static Complex RotateI(Complex i, Complex k, double v)
{
double s = Math.Sin(v * Math.PI) * (2.0 / Math.PI);
return new Complex(i.Real + s * k.Real, i.Imaginary + s * k.Imaginary);

80
src/Numerics/SpecialFunctions/Amos/AmosHelper.cs

@ -8,12 +8,12 @@ namespace MathNet.Numerics
//
// References:
// [1] Amos package in netlib. http://www.netlib.org/amos
private class AmosHelper
private static class AmosHelper
{
#region Bessel- related functions
// The Airy function Ai(z) and derivative
public int zairy(double zr, double zi, int id, int kode, ref double air, ref double aii, ref int nz, ref int ierr)
public static int zairy(double zr, double zi, int id, int kode, ref double air, ref double aii, ref int nz, ref int ierr)
{
#region Description
@ -421,7 +421,7 @@ namespace MathNet.Numerics
}
// The Airy function Bi(z) and derivative
public int zbiry(double zr, double zi, int id, int kode, ref double bir, ref double bii, ref int nz, ref int ierr)
public static int zbiry(double zr, double zi, int id, int kode, ref double bir, ref double bii, ref int nz, ref int ierr)
{
#region Description
@ -797,7 +797,7 @@ namespace MathNet.Numerics
}
// The Bessel function of the first kind and derivative
public int zbesj(double zr, double zi, double fnu, int kode, int n, double[] cyr, double[] cyi, ref int nz, ref int ierr)
public static int zbesj(double zr, double zi, double fnu, int kode, int n, double[] cyr, double[] cyi, ref int nz, ref int ierr)
{
#region Description
@ -1068,7 +1068,7 @@ namespace MathNet.Numerics
}
// The Bessel function of the second kind and derivative
public int zbesy(double zr, double zi, double fnu, int kode, int n, double[] cyr, double[] cyi, ref int nz, double[] cwrkr, double[] cwrki, ref int ierr)
public static int zbesy(double zr, double zi, double fnu, int kode, int n, double[] cyr, double[] cyi, ref int nz, double[] cwrkr, double[] cwrki, ref int ierr)
{
#region Description
@ -1317,7 +1317,7 @@ namespace MathNet.Numerics
}
// The modified Bessel function of the first kind and derivative
public int zbesi(double zr, double zi, double fnu, int kode, int n, double[] cyr, double[] cyi, ref int nz, ref int ierr)
public static int zbesi(double zr, double zi, double fnu, int kode, int n, double[] cyr, double[] cyi, ref int nz, ref int ierr)
{
#region Description
@ -1593,7 +1593,7 @@ namespace MathNet.Numerics
}
// The modified Bessel function of the second kind and derivative
public int zbesk(double zr, double zi, double fnu, int kode, int n, double[] cyr, double[] cyi, ref int nz, ref int ierr)
public static int zbesk(double zr, double zi, double fnu, int kode, int n, double[] cyr, double[] cyi, ref int nz, ref int ierr)
{
#region Description
@ -1876,7 +1876,7 @@ namespace MathNet.Numerics
}
// The Hankel functions or Bessel functions of third kind and derivative
public int zbesh(double zr, double zi, double fnu, int kode, int m, int n, double[] cyr, double[] cyi, ref int nz, ref int ierr)
public static int zbesh(double zr, double zi, double fnu, int kode, int m, int n, double[] cyr, double[] cyi, ref int nz, ref int ierr)
{
#region Description
@ -2229,7 +2229,7 @@ namespace MathNet.Numerics
#region LnGamma functions
// The logarithm of the gamma function
public double dgamln(double z, ref int ierr)
public static double dgamln(double z, ref int ierr)
{
#region Description
@ -2385,7 +2385,7 @@ namespace MathNet.Numerics
#region Fortran utilities
private double d1mach(int i)
private static double d1mach(int i)
{
#region Description
@ -2463,7 +2463,7 @@ namespace MathNet.Numerics
return 0;
}
private int i1mach(int i)
private static int i1mach(int i)
{
#region Description
@ -2552,14 +2552,14 @@ namespace MathNet.Numerics
return 0;
}
private double dsign(double a, double b)
private static double dsign(double a, double b)
{
// Returns the absolute value of A times the sign of B
double x = (a >= 0 ? a : -a);
return (b >= 0 ? x : -x);
}
private double zabs(double zr, double zi)
private static double zabs(double zr, double zi)
{
#region Description
@ -2595,7 +2595,7 @@ namespace MathNet.Numerics
return 0.0;
}
private int zdiv(double ar, double ai, double br, double bi, ref double cr, ref double ci)
private static int zdiv(double ar, double ai, double br, double bi, ref double cr, ref double ci)
{
#region Description
@ -2621,7 +2621,7 @@ namespace MathNet.Numerics
return 0;
}
private int zexp(double ar, double ai, ref double br, ref double bi)
private static int zexp(double ar, double ai, ref double br, ref double bi)
{
#region Description
@ -2645,7 +2645,7 @@ namespace MathNet.Numerics
return 0;
}
private int zlog(double ar, double ai, ref double br, ref double bi, ref int ierr)
private static int zlog(double ar, double ai, ref double br, ref double bi, ref int ierr)
{
#region Description
@ -2697,7 +2697,7 @@ namespace MathNet.Numerics
return 0;
}
private int zmlt(double ar, double ai, double br, double bi, ref double cr, ref double ci)
private static int zmlt(double ar, double ai, double br, double bi, ref double cr, ref double ci)
{
#region Description
@ -2720,7 +2720,7 @@ namespace MathNet.Numerics
return 0;
}
private int zsqrt(double ar, double ai, ref double br, ref double bi)
private static int zsqrt(double ar, double ai, ref double br, ref double bi)
{
#region Description
@ -2782,7 +2782,7 @@ namespace MathNet.Numerics
#region Subroutines to calculate the Bessel functions
private int zacai(double zr, double zi, double fnu, int kode, int mr, int n, double[] yr, double[] yi, ref int nz, double rl, double tol, double elim, double alim)
private static int zacai(double zr, double zi, double fnu, int kode, int mr, int n, double[] yr, double[] yi, ref int nz, double rl, double tol, double elim, double alim)
{
#region Description
@ -2888,7 +2888,7 @@ namespace MathNet.Numerics
return 0;
}
private int zacon(double zr, double zi, double fnu, int kode, int mr, int n, double[] yr, double[] yi, ref int nz, double rl, double fnul, double tol, double elim, double alim)
private static int zacon(double zr, double zi, double fnu, int kode, int mr, int n, double[] yr, double[] yi, ref int nz, double rl, double fnul, double tol, double elim, double alim)
{
#region Description
@ -3105,7 +3105,7 @@ namespace MathNet.Numerics
return 0;
}
private int zasyi(double zr, double zi, double fnu, int kode, int n, double[] yr, double[] yi, ref int nz, double rl, double tol, double elim, double alim)
private static int zasyi(double zr, double zi, double fnu, int kode, int n, double[] yr, double[] yi, ref int nz, double rl, double tol, double elim, double alim)
{
#region Description
@ -3283,7 +3283,7 @@ namespace MathNet.Numerics
return 0;
}
private int zbinu(double zr, double zi, double fnu, int kode, int n, double[] cyr, double[] cyi, ref int nz, double rl, double fnul, double tol, double elim, double alim)
private static int zbinu(double zr, double zi, double fnu, int kode, int n, double[] cyr, double[] cyi, ref int nz, double rl, double fnul, double tol, double elim, double alim)
{
#region Description
@ -3398,7 +3398,7 @@ namespace MathNet.Numerics
return 0;
}
private int zbknu(double zr, double zi, double fnu, int kode, int n, double[] yr, double[] yi, ref int nz, double tol, double elim, double alim)
private static int zbknu(double zr, double zi, double fnu, int kode, int n, double[] yr, double[] yi, ref int nz, double tol, double elim, double alim)
{
#region Description
@ -3994,7 +3994,7 @@ namespace MathNet.Numerics
return 0;
}
private int zbuni(double zr, double zi, double fnu, int kode, int n, double[] yr, double[] yi, ref int nz, int nui, ref int nlast, double fnul, double tol, double elim, double alim)
private static int zbuni(double zr, double zi, double fnu, int kode, int n, double[] yr, double[] yi, ref int nz, int nui, ref int nlast, double fnul, double tol, double elim, double alim)
{
#region Description
@ -4178,7 +4178,7 @@ namespace MathNet.Numerics
return 0;
}
private int zbunk(double zr, double zi, double fnu, int kode, int mr, int n, double[] yr, double[] yi, ref int nz, double tol, double elim, double alim)
private static int zbunk(double zr, double zi, double fnu, int kode, int mr, int n, double[] yr, double[] yi, ref int nz, double tol, double elim, double alim)
{
#region Description
@ -4217,7 +4217,7 @@ namespace MathNet.Numerics
return 0;
}
private int zkscl(double zrr, double zri, double fnu, int n, double[] yr, double[] yi, ref int nz, double rzr, double rzi, double ascle, double tol, double elim)
private static int zkscl(double zrr, double zri, double fnu, int n, double[] yr, double[] yi, ref int nz, double rzr, double rzi, double ascle, double tol, double elim)
{
#region Description
@ -4355,7 +4355,7 @@ namespace MathNet.Numerics
return 0;
}
private int zmlri(double zr, double zi, double fnu, int kode, int n, double[] yr, double[] yi, ref int nz, double tol)
private static int zmlri(double zr, double zi, double fnu, int kode, int n, double[] yr, double[] yi, ref int nz, double tol)
{
#region Description
@ -4575,7 +4575,7 @@ namespace MathNet.Numerics
return 0;
}
private int zrati(double zr, double zi, double fnu, int n, double[] cyr, double[] cyi, double tol)
private static int zrati(double zr, double zi, double fnu, int n, double[] cyr, double[] cyi, double tol)
{
#region Description
@ -4719,7 +4719,7 @@ namespace MathNet.Numerics
return 0;
}
private int zs1s2(double zrr, double zri, ref double s1r, ref double s1i, ref double s2r, ref double s2i, ref int nz, double ascle, double alim, ref int iuf)
private static int zs1s2(double zrr, double zri, ref double s1r, ref double s1i, ref double s2r, ref double s2i, ref int nz, double ascle, double alim, ref int iuf)
{
#region Description
@ -4776,7 +4776,7 @@ namespace MathNet.Numerics
return 0;
}
private int zseri(double zr, double zi, double fnu, int kode, int n, double[] yr, double[] yi, ref int nz, double tol, double elim, double alim)
private static int zseri(double zr, double zi, double fnu, int kode, int n, double[] yr, double[] yi, ref int nz, double tol, double elim, double alim)
{
#region Description
@ -4982,7 +4982,7 @@ namespace MathNet.Numerics
return 0;
}
private int zshch(double zr, double zi, ref double cshr, ref double cshi, ref double cchr, ref double cchi)
private static int zshch(double zr, double zi, ref double cshr, ref double cshi, ref double cchr, ref double cchi)
{
#region Description
@ -5008,7 +5008,7 @@ namespace MathNet.Numerics
return 0;
}
private int zuchk(double yr, double yi, ref int nz, double ascle, double tol)
private static int zuchk(double yr, double yi, ref int nz, double ascle, double tol)
{
#region Description
@ -5041,7 +5041,7 @@ namespace MathNet.Numerics
return 0;
}
private int zunhj(double zr, double zi, double fnu, int ipmtr, double tol, ref double phir, ref double phii, ref double argr, ref double argi, ref double zeta1r, ref double zeta1i, ref double zeta2r, ref double zeta2i, ref double asumr, ref double asumi, ref double bsumr, ref double bsumi)
private static int zunhj(double zr, double zi, double fnu, int ipmtr, double tol, ref double phir, ref double phii, ref double argr, ref double argi, ref double zeta1r, ref double zeta1i, ref double zeta2r, ref double zeta2i, ref double asumr, ref double asumi, ref double bsumr, ref double bsumi)
{
#region Description
@ -5655,7 +5655,7 @@ namespace MathNet.Numerics
goto L120;
}
private int zuni1(double zr, double zi, double fnu, int kode, int n, double[] yr, double[] yi, ref int nz, ref int nlast, double fnul, double tol, double elim, double alim)
private static int zuni1(double zr, double zi, double fnu, int kode, int n, double[] yr, double[] yi, ref int nz, ref int nlast, double fnul, double tol, double elim, double alim)
{
#region Description
@ -5893,7 +5893,7 @@ namespace MathNet.Numerics
return 0;
}
private int zuni2(double zr, double zi, double fnu, int kode, int n, double[] yr, double[] yi, ref int nz, ref int nlast, double fnul, double tol, double elim, double alim)
private static int zuni2(double zr, double zi, double fnu, int kode, int n, double[] yr, double[] yi, ref int nz, ref int nlast, double fnul, double tol, double elim, double alim)
{
#region Description
@ -6174,7 +6174,7 @@ namespace MathNet.Numerics
return 0;
}
private int zunik(double zrr, double zri, double fnu, int ikflg, int ipmtr, double tol, ref int init, ref double phir, ref double phii, ref double zeta1r, ref double zeta1i, ref double zeta2r, ref double zeta2i, ref double sumr, ref double sumi, ref double[] cwrkr, ref double[] cwrki)
private static int zunik(double zrr, double zri, double fnu, int ikflg, int ipmtr, double tol, ref int init, ref double phir, ref double phii, ref double zeta1r, ref double zeta1i, ref double zeta2r, ref double zeta2i, ref double sumr, ref double sumi, ref double[] cwrkr, ref double[] cwrki)
{
#region Description
@ -6363,7 +6363,7 @@ namespace MathNet.Numerics
return 0;
}
private int zunk1(double zr, double zi, double fnu, int kode, int mr, int n, double[] yr, double[] yi, ref int nz, double tol, double elim, double alim)
private static int zunk1(double zr, double zi, double fnu, int kode, int mr, int n, double[] yr, double[] yi, ref int nz, double tol, double elim, double alim)
{
#region Description
@ -6836,7 +6836,7 @@ namespace MathNet.Numerics
return 0;
}
private int zunk2(double zr, double zi, double fnu, int kode, int mr, int n, double[] yr, double[] yi, ref int nz, double tol, double elim, double alim)
private static int zunk2(double zr, double zi, double fnu, int kode, int mr, int n, double[] yr, double[] yi, ref int nz, double tol, double elim, double alim)
{
#region Description
@ -7370,7 +7370,7 @@ namespace MathNet.Numerics
return 0;
}
private int zuoik(double zr, double zi, double fnu, int kode, int ikflg, int n, double[] yr, double[] yi, ref int nuf, double tol, double elim, double alim)
private static int zuoik(double zr, double zi, double fnu, int kode, int ikflg, int n, double[] yr, double[] yi, ref int nuf, double tol, double elim, double alim)
{
#region Description
@ -7570,7 +7570,7 @@ namespace MathNet.Numerics
return 0;
}
private int zwrsk(double zrr, double zri, double fnu, int kode, int n, double[] yr, double[] yi, ref int nz, double[] cwr, double[] cwi, double tol, double elim, double alim)
private static int zwrsk(double zrr, double zri, double fnu, int kode, int n, double[] yr, double[] yi, ref int nz, double[] cwr, double[] cwi, double tol, double elim, double alim)
{
#region Description

24
src/Numerics/SpecialFunctions/Bessel.cs

@ -18,8 +18,7 @@ namespace MathNet.Numerics
/// <returns></returns>
public static Complex BesselJ(double v, Complex z, bool expScaled = false)
{
var amos = new AmosWrapper();
return (expScaled) ? amos.ScaledCbesj(v, z) : amos.Cbesj(v, z);
return (expScaled) ? Amos.ScaledCbesj(v, z) : Amos.Cbesj(v, z);
}
/// <summary>
@ -33,8 +32,7 @@ namespace MathNet.Numerics
/// <returns></returns>
public static double BesselJ(double v, double z, bool expScaled = false)
{
var amos = new AmosWrapper();
return (expScaled) ? amos.ScaledCbesj(v, z) : amos.Cbesj(v, z);
return (expScaled) ? Amos.ScaledCbesj(v, z) : Amos.Cbesj(v, z);
}
/// <summary>
@ -48,8 +46,7 @@ namespace MathNet.Numerics
/// <returns></returns>
public static Complex BesselY(double v, Complex z, bool expScaled = false)
{
var amos = new AmosWrapper();
return (expScaled) ? amos.ScaledCbesy(v, z) : amos.Cbesy(v, z);
return (expScaled) ? Amos.ScaledCbesy(v, z) : Amos.Cbesy(v, z);
}
/// <summary>
@ -63,8 +60,7 @@ namespace MathNet.Numerics
/// <returns></returns>
public static double BesselY(double v, double z, bool expScaled = false)
{
var amos = new AmosWrapper();
return (expScaled) ? amos.ScaledCbesy(v, z) : amos.Cbesy(v, z);
return (expScaled) ? Amos.ScaledCbesy(v, z) : Amos.Cbesy(v, z);
}
/// <summary>
@ -78,8 +74,7 @@ namespace MathNet.Numerics
/// <returns></returns>
public static Complex BesselI(double v, Complex z, bool expScaled = false)
{
var amos = new AmosWrapper();
return (expScaled) ? amos.ScaledCbesi(v, z) : amos.Cbesi(v, z);
return (expScaled) ? Amos.ScaledCbesi(v, z) : Amos.Cbesi(v, z);
}
/// <summary>
@ -95,8 +90,7 @@ namespace MathNet.Numerics
{
if (expScaled)
{
var amos = new AmosWrapper();
return amos.ScaledCbesi(v, z);
return Amos.ScaledCbesi(v, z);
}
else
{
@ -115,8 +109,7 @@ namespace MathNet.Numerics
/// <returns></returns>
public static Complex BesselK(double v, Complex z, bool expScaled = false)
{
var amos = new AmosWrapper();
return (expScaled) ? amos.ScaledCbesk(v, z) : amos.Cbesk(v, z);
return (expScaled) ? Amos.ScaledCbesk(v, z) : Amos.Cbesk(v, z);
}
/// <summary>
@ -130,8 +123,7 @@ namespace MathNet.Numerics
/// <returns></returns>
public static double BesselK(double v, double z, bool expScaled = false)
{
var amos = new AmosWrapper();
return (expScaled) ? amos.ScaledCbesk(v, z) : amos.Cbesk(v, z);
return (expScaled) ? Amos.ScaledCbesk(v, z) : Amos.Cbesk(v, z);
}
}
}

6
src/Numerics/SpecialFunctions/Hankel.cs

@ -18,8 +18,7 @@ namespace MathNet.Numerics
/// <returns></returns>
public static Complex HankelH1(double n, Complex z, bool expScaled = false)
{
var amos = new AmosWrapper();
return (expScaled) ? amos.ScaledCbesh1(n, z) : amos.Cbesh1(n, z);
return (expScaled) ? Amos.ScaledCbesh1(n, z) : Amos.Cbesh1(n, z);
}
/// <summary>
@ -47,8 +46,7 @@ namespace MathNet.Numerics
/// <returns></returns>
public static Complex HankelH2(double n, Complex z, bool expScaled = false)
{
var amos = new AmosWrapper();
return (expScaled) ? amos.ScaledCbesh2(n, z) :amos.Cbesh2(n, z);
return (expScaled) ? Amos.ScaledCbesh2(n, z) : Amos.Cbesh2(n, z);
}
/// <summary>

Loading…
Cancel
Save