Exemplo n.º 1
0
        /*  Inversion formula:
         *                                                   [n/2]   n-2r
         *                n                  1     n           -  log    (z)
         *  Li (-z) + (-1)  Li (-1/z)  =  - --- log (z)  +  2  >  ----------- Li  (-1)
         *    n               n              n!                -   (n - 2r)!    2r
         *                                                    r=1
         */
        static ScalarValue PolylogInversion(int n, ScalarValue z)
        {
            int         j;
            int         nh = n / 2;
            ScalarValue p  = ScalarValue.Zero;
            ScalarValue q  = ScalarValue.Zero;
            ScalarValue w  = (-z).Log();
            ScalarValue s  = ScalarValue.Zero;
            ScalarValue m1 = new ScalarValue(-1.0);

            for (var r = 1; r <= nh; r++)
            {
                j = 2 * r;
                p = PolylogZetaNegative(j);
                j = n - j;

                if (j == 0)
                {
                    s += p;
                    break;
                }

                q  = w.Pow(new ScalarValue(j)) * (p.Re / Helpers.Factorial(j));
                s += q;
            }

            s = 2.0 * s;
            q = Polylog(n, 1.0 / z);

            if ((n & 1) == 1)
            {
                q = -q;
            }

            return(s - q - w.Pow(new ScalarValue(n)) / Helpers.Factorial(n));
        }
Exemplo n.º 2
0
        /// <summary>
        /// Calculates a single Newton fractal value.
        /// </summary>
        /// <param name="x">The x value.</param>
        /// <param name="y">The y value.</param>
        /// <returns>The result (color value 0..1).</returns>
        public override double Run(double x, double y)
        {
            var iter = 0;
            var maxiter = MaxIterations;

            ScalarValue zn = new ScalarValue(x, y);
            ScalarValue pz = ScalarValue.One;
            ScalarValue pzd = ScalarValue.Zero;

            if(x != 0 || y != 0)
            {
                while ((iter < maxiter) && pz.AbsSquare() > 1e-8)
                {
                    pz = zn.Pow(new ScalarValue(3)) - 1.0;
                    pzd = 3.0 * zn.Square();
                    zn = zn - pz / pzd;
                    iter++;
                }
            }

            return Math.Max((double)(maxiter - iter * Colors) / (double)maxiter, 0.0);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Calculates a single Newton fractal value.
        /// </summary>
        /// <param name="x">The x value.</param>
        /// <param name="y">The y value.</param>
        /// <returns>The result (color value 0..1).</returns>
        public override double Run(double x, double y)
        {
            var iter    = 0;
            var maxiter = MaxIterations;

            ScalarValue zn  = new ScalarValue(x, y);
            ScalarValue pz  = ScalarValue.One;
            ScalarValue pzd = ScalarValue.Zero;

            if (x != 0 || y != 0)
            {
                while ((iter < maxiter) && pz.AbsSquare() > 1e-8)
                {
                    pz  = zn.Pow(new ScalarValue(3)) - 1.0;
                    pzd = 3.0 * zn.Square();
                    zn  = zn - pz / pzd;
                    iter++;
                }
            }

            return(Math.Max((double)(maxiter - iter * Colors) / (double)maxiter, 0.0));
        }
Exemplo n.º 4
0
        public static ScalarValue HurwitzZeta(ScalarValue s, ScalarValue q)
        {
            if (s.Re <= 1.0)
                throw new YAMPArgumentRangeException("s", 1.0);

            if (q.Re <= 0.0)
                throw new YAMPArgumentRangeException("q", 0.0);

            var max_bits = 54.0;
            var ln_term0 = -s * q.Log();
            var qabs = q.Abs();
            var sabs = s.Abs();
            var ss = s;

            if ((sabs > max_bits && qabs < 1.0) || (sabs > 0.5 * max_bits && qabs < 0.25))
            {
                return q.Pow(-ss);
            }
            else if (sabs > 0.5 * max_bits && qabs < 1.0)
            {
                var p1 = q.Pow(-ss);
                var p2 = (q / (1.0 + q)).Pow(ss);
                var p3 = (q / (2.0 + q)).Pow(ss);
                return p1 * (1.0 + p2 + p3);
            }

            /* Euler-Maclaurin summation formula
             * [Moshier, p. 400, with several typo corrections]
             */
            const int jmax = 12;
            const int kmax = 10;

            var pmax = (kmax + q).Pow(-ss);
            var scp = s;
            var pcp = pmax / (kmax + q);
            var ans = pmax * ((kmax + q) / (s - 1.0) + 0.5);

            for (var k = 0; k < kmax; k++)
            {
                ans += (k + q).Pow(-ss);
            }

            for (var j = 0; j <= jmax; j++)
            {
                var delta = COEFFICIENTS[j + 1] * scp * pcp;
                ans += delta;

                if ((delta / ans).Abs() < 0.5 * Double.Epsilon)
                {
                    break;
                }

                scp *= (s + 2 * j + 1) * (s + 2 * j + 2);
                pcp /= (kmax + q) * (kmax + q);
            }

            return ans;
        }
Exemplo n.º 5
0
        public static ScalarValue HurwitzZeta(ScalarValue s, ScalarValue q)
        {
            if (s.Re <= 1.0)
            {
                throw new YAMPArgumentRangeException("s", 1.0);
            }

            if (q.Re <= 0.0)
            {
                throw new YAMPArgumentRangeException("q", 0.0);
            }

            var max_bits = 54.0;
            var ln_term0 = -s *q.Log();

            var qabs = q.Abs();
            var sabs = s.Abs();
            var ss   = s;

            if ((sabs > max_bits && qabs < 1.0) || (sabs > 0.5 * max_bits && qabs < 0.25))
            {
                return(q.Pow(-ss));
            }
            else if (sabs > 0.5 * max_bits && qabs < 1.0)
            {
                var p1 = q.Pow(-ss);
                var p2 = (q / (1.0 + q)).Pow(ss);
                var p3 = (q / (2.0 + q)).Pow(ss);
                return(p1 * (1.0 + p2 + p3));
            }

            /* Euler-Maclaurin summation formula
             * [Moshier, p. 400, with several typo corrections]
             */
            const int jmax = 12;
            const int kmax = 10;

            var pmax = (kmax + q).Pow(-ss);
            var scp  = s;
            var pcp  = pmax / (kmax + q);
            var ans  = pmax * ((kmax + q) / (s - 1.0) + 0.5);

            for (var k = 0; k < kmax; k++)
            {
                ans += (k + q).Pow(-ss);
            }

            for (var j = 0; j <= jmax; j++)
            {
                var delta = COEFFICIENTS[j + 1] * scp * pcp;
                ans += delta;

                if ((delta / ans).Abs() < 0.5 * Double.Epsilon)
                {
                    break;
                }

                scp *= (s + 2 * j + 1) * (s + 2 * j + 2);
                pcp /= (kmax + q) * (kmax + q);
            }

            return(ans);
        }
Exemplo n.º 6
0
        static ScalarValue Zernike(int n, int m, ScalarValue rho)
        {
            if (n < 0)
                throw new YAMPArgumentRangeException("n");

            if ((m < 0) || (m > n))
                throw new YAMPArgumentRangeException("m", "n >= m >= 0");

            // n and m have the same parity
            if ((n - m) % 2 != 0)
            {
                return ScalarValue.Zero;
            }

            // R00
            if (n == 0)
            {
                return ScalarValue.One;
            }

            var absrho = rho.Abs();

            if ((absrho < 0.0) || (absrho > 1.0))
                throw new YAMPNotConvergedException("zernike");

            // R^{m}_m
            var r2 = rho.Pow(new ScalarValue(m));

            if (n == m)
            {
                return r2;
            }

            // R^{m+1}_{m+1}
            var k = m;
            var r1 = r2 * rho;

            while (true)
            {
                k += 2;

                // *
                //  \
                //   * recurrence involving two lesser m's
                //  /
                // *
                // 2n R^{m+1}_{n-1} = (n+m) R^{m}_{n-2} + (n-m) R^{m}_{n}

                var r0 = ((2 * k) * rho * r1 - (k + m) * r2) / (k - m);

                if (k == n)
                {
                    return r0;
                }

                //   *
                //  /
                // * recurrence involving two greater m's
                //  \
                //   *
                //

                var rp = (2 * (k + 1) * rho * r0 - (k - m) * r1) / (k + m + 2);

                r2 = r0;
                r1 = rp;
            }
        }
Exemplo n.º 7
0
        static ScalarValue Zernike(int n, int m, ScalarValue rho)
        {
            if (n < 0)
            {
                throw new YAMPArgumentRangeException("n");
            }

            if ((m < 0) || (m > n))
            {
                throw new YAMPArgumentRangeException("m", "n >= m >= 0");
            }

            // n and m have the same parity
            if ((n - m) % 2 != 0)
            {
                return(ScalarValue.Zero);
            }

            // R00
            if (n == 0)
            {
                return(ScalarValue.One);
            }

            var absrho = rho.Abs();

            if ((absrho < 0.0) || (absrho > 1.0))
            {
                throw new YAMPNotConvergedException("zernike");
            }

            // R^{m}_m
            var r2 = rho.Pow(new ScalarValue(m));

            if (n == m)
            {
                return(r2);
            }

            // R^{m+1}_{m+1}
            var k  = m;
            var r1 = r2 * rho;

            while (true)
            {
                k += 2;

                // *
                //  \
                //   * recurrence involving two lesser m's
                //  /
                // *
                // 2n R^{m+1}_{n-1} = (n+m) R^{m}_{n-2} + (n-m) R^{m}_{n}

                var r0 = ((2 * k) * rho * r1 - (k + m) * r2) / (k - m);

                if (k == n)
                {
                    return(r0);
                }

                //   *
                //  /
                // * recurrence involving two greater m's
                //  \
                //   *
                //

                var rp = (2 * (k + 1) * rho * r0 - (k - m) * r1) / (k + m + 2);

                r2 = r0;
                r1 = rp;
            }
        }