public static Phi ( double u, double m ) : double | ||
u | double | 引数 u |
m | double | 率 k の2乗 |
return | double |
/// <summary> /// Jacobi の楕円関数 cn u を求める。 /// </summary> /// <param name="u">引数 u</param> /// <param name="m">率 k の2乗</param> /// <returns>cn(u, k)</returns> public static double Cn(double u, double m) { if (m < 0.0 || m > 1.0) { return(double.NaN); } return(Math.Cos(Elliptic.Phi(u, m))); }
/// <summary> /// Jacobi の楕円関数(引数 u と率 k から振幅φおよび sn, cn, dn)を求める。 /// </summary> /// <param name="u">引数 u</param> /// <param name="m">率 k の2乗</param> /// <param name="phi">振幅φ</param> /// <param name="sn">sn(u, k)</param> /// <param name="cn">cn(u, k)</param> /// <param name="dn">dn(u, k)</param> public static void Jacobi(double u, double m, out double phi, out double sn, out double cn, out double dn) { if (m < 0.0 || m > 1.0) { phi = double.NaN; sn = double.NaN; cn = double.NaN; dn = double.NaN; return; } if (m < EPSILON) { double t = Math.Sin(u); double b = Math.Cos(u); double ai = 0.25 * m * (u - t * b); phi = u - ai; sn = t - ai * b; cn = b + ai * t; dn = 1.0 - 0.5 * m * t * t; return; } if (m >= 1 - EPSILON) { double ai = 0.25 * (1.0 - m); double b = Math.Cosh(u); double t = Math.Tanh(u); double binv = 1.0 / b; double twon = b * Math.Sinh(u); phi = 2.0 * Math.Atan(Math.Exp(u)) - Constant.PI2 + ai * (twon - u) / b; sn = t + ai * (twon - u) / (b * b); ai *= t * phi; cn = binv - ai * (twon - u); dn = binv + ai * (twon + u); return; } phi = Elliptic.Phi(u, m); Elliptic.Jacobi(phi, m, out sn, out cn, out dn); }