Phi() public static method

楕円積分の引数 u から振幅φを求める。
public static Phi ( double u, double m ) : double
u double 引数 u
m double 率 k の2乗
return double
示例#1
0
        /// <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)));
        }
示例#2
0
        /// <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);
        }