Пример #1
0
        public static double[] ALegendFnmTest(int n, double x)
        {
            double[] Pnm  = new double[n + 1];
            double[] ALFS = new double[n + 1];
            double[] BLFS = new double[n + 1];

            double s = Math.Sqrt(1.0 - x * x);

            switch (n)
            {
            case 0:
                Pnm[0] = 1.0;
                break;

            case 1:
                Pnm[0] = x;
                Pnm[1] = s;
                break;

            default:
                ALFS[0] = (3.0 * x * x - 1.0) / 2.0;
                ALFS[1] = 3.0 * s * x;
                ALFS[2] = 3.0 * (1.0 - x * x);

                if (n == 2)
                {
                    Pnm = ALFS;
                }
                else
                {
                    BLFS[0] = x;
                    BLFS[1] = s;

                    int l = 2;
                    while (l < n)
                    {
                        Pnm[0] = Legendre.LegendreF(l + 1, x);
                        int k = 1;
                        while (k <= l + 1)
                        {
                            if (k <= l - 1)
                            {
                                Pnm[k] = ((2 * l + 1) * x * ALFS[k] - (l + k) * BLFS[k]) / (l - k + 1);
                            }

                            else if (k > l - 1)
                            {
                                Pnm[k] = -((l - k + 2) * x * Pnm[k - 1] - (l + k) * ALFS[k - 1]) / s;
                            }
                            k = k + 1;
                        }
                        Array.Copy(ALFS, BLFS, ALFS.Length);
                        Array.Copy(Pnm, ALFS, Pnm.Length);
                        l = l + 1;
                    }
                }
                break;
            }
            return(Pnm);
        }
Пример #2
0
        public static double[] ALegendFnmSeri(int n, double x)
        {
            double[] Pnm  = new double[n + 1];
            double[] ALFS = new double[n + 1];
            double[] BLFS = new double[n + 1];

            double s = Math.Sqrt(1.0 - x * x);

            switch (n)
            {
            case 0:
                Pnm[0] = 1.0;
                break;

            case 1:
                Pnm[0] = x;
                Pnm[1] = s;
                break;

            case 2:
                Pnm[0] = (3.0 * x * x - 1.0) / 2.0;
                Pnm[1] = 3.0 * s * x;
                Pnm[2] = 3.0 * (1.0 - x * x);
                break;

            case 3:
                Pnm[0] = x * (5.0 * x * x - 3.0) / 2.0;
                Pnm[1] = 3.0 * (5.0 * x * x - 1.0) * s / 2.0;
                Pnm[2] = 15.0 * x * (1.0 - x * x);
                Pnm[3] = 15.0 * s * s * s;
                break;

            case 4:
                Pnm[0] = (35.0 * x * x * x * x - 30.0 * x * x + 3.0) / 8.0;
                Pnm[1] = 5.0 * (7.0 * x * x - 3.0) * x * s / 2.0;
                Pnm[2] = 15.0 * (7.0 * x * x - 1.0) * (1.0 - x * x) / 2.0;
                Pnm[3] = 105.0 * s * s * s * x;
                Pnm[4] = 105.0 * s * s * s * s;
                break;

            case 5:
                Pnm[0] = x * (63.0 * x * x * x * x - 70.0 * x * x + 15.0) / 8.0;
                Pnm[1] = 15.0 * s * (21.0 * x * x * x * x - 14.0 * x * x + 1.0) / 8.0;
                Pnm[2] = 105.0 * x * (3.0 * x * x - 1.0) * (1.0 - x * x) / 2.0;
                Pnm[3] = 105.0 * s * s * s * (9.0 * x * x - 1.0) / 2.0;
                Pnm[4] = 945.0 * s * s * s * s * x;
                Pnm[5] = 945.0 * s * s * s * s * s;
                break;

            case 6:
                Pnm[0] = (x * x * (x * x * (231.0 * x * x - 315.0) + 105.0) - 5.0) / 16.0;
                Pnm[1] = 21.0 * x * (x * x * (33.0 * x * x - 30.0) + 5.0) * s / 8.0;
                Pnm[2] = 105.0 * s * s * (x * x * (33.0 * x * x - 18.0) + 1.0) / 8.0;
                Pnm[3] = 315.0 * (11.0 * x * x - 3.0) * x * s * s * s / 2.0;
                Pnm[4] = 945.0 * s * s * s * s * (11.0 * x * x - 1.0) / 2.0;
                Pnm[5] = 10395.0 * x * s * s * s * s * s;
                Pnm[6] = 10395.0 * s * s * s * s * s * s;
                break;

            case 7:
                Pnm[0] = x * (x * x * (429.0 * Math.Pow(x, 4) - 693.0 * x * x + 315.0) - 35.0) / 16.0;
                Pnm[1] = 7.0 * s * (x * x * (429.0 * Math.Pow(x, 4) - 495.0 * x * x + 135.0) - 5.0) / 16.0;
                Pnm[2] = 63.0 * x * s * s * (x * x * (143.0 * x * x - 110.0) + 15.0) / 8.0;
                Pnm[3] = 315.0 * s * s * s * (x * x * (143.0 * x * x - 66.0) + 3.0) / 8.0;
                Pnm[4] = 3465.0 * x * s * s * s * s * (13.0 * x * x - 3.0) / 2.0;
                Pnm[5] = 10395.0 * Math.Pow(s, 5) * (13.0 * x * x - 1.0) / 2.0;
                Pnm[6] = 135135.0 * x * Math.Pow(s, 6);
                Pnm[7] = 135135.0 * Math.Pow(s, 7);
                break;

            default:
                ALFS[0] = (x * x * (x * x * (x * x * (6435.0 * x * x - 12012.0) + 6930.0) - 1260.0) + 35) / 128.0;
                ALFS[1] = 9.0 * x * s * (x * x * (x * x * (715.0 * x * x - 1001.0) + 385.0) - 35.0) / 16.0;
                ALFS[2] = 315.0 * s * s * (x * x * (x * x * (143.0 * x * x - 143.0) + 33.0) - 1.0) / 16.0;
                ALFS[3] = 3465.0 * x * s * s * s * (x * x * (39.0 * x * x - 26.0) + 3.0) / 8.0;
                ALFS[4] = 10395.0 * s * s * s * s * (65.0 * Math.Pow(x, 4) - 26.0 * x * x + 1.0) / 8.0;
                ALFS[5] = 135135.0 * x * Math.Pow(s, 5) * (5.0 * x * x - 1.0) / 2.0;
                ALFS[6] = 135135.0 * Math.Pow(s, 6) * (15.0 * x * x - 1.0) / 2.0;
                ALFS[7] = 2027025.0 * x * s * s * s * s * s * s * s;
                ALFS[8] = 2027025.0 * s * s * s * s * s * s * s * s;

                if (n == 8)
                {
                    Pnm = ALFS;
                }
                else
                {
                    BLFS[0] = x * (x * x * (429.0 * Math.Pow(x, 4) - 693.0 * x * x + 315.0) - 35.0) / 16.0;
                    BLFS[1] = 7.0 * s * (x * x * (429.0 * Math.Pow(x, 4) - 495.0 * x * x + 135.0) - 5.0) / 16.0;
                    BLFS[2] = 63.0 * x * s * s * (x * x * (143.0 * x * x - 110.0) + 15.0) / 8.0;
                    BLFS[3] = 315.0 * s * s * s * (x * x * (143.0 * x * x - 66.0) + 3.0) / 8.0;
                    BLFS[4] = 3465.0 * x * s * s * s * s * (13.0 * x * x - 3.0) / 2.0;
                    BLFS[5] = 10395.0 * Math.Pow(s, 5) * (13.0 * x * x - 1.0) / 2.0;
                    BLFS[6] = 135135.0 * x * Math.Pow(s, 6);
                    BLFS[7] = 135135.0 * Math.Pow(s, 7);

                    int l = 8;
                    while (l < n)
                    {
                        Pnm[0] = Legendre.LegendreF(l + 1, x);
                        int k = 1;
                        while (k <= l + 1)
                        {
                            if (k <= l - 1)
                            {
                                Pnm[k] = ((2 * l + 1) * x * ALFS[k] - (l + k) * BLFS[k]) / (l - k + 1);
                            }

                            else if (k > l - 1)
                            {
                                Pnm[k] = -((l - k + 2) * x * Pnm[k - 1] - (l + k) * ALFS[k - 1]) / s;
                            }
                            k = k + 1;
                        }
                        Array.Copy(ALFS, BLFS, ALFS.Length);
                        Array.Copy(Pnm, ALFS, Pnm.Length);
                        l = l + 1;
                    }
                }
                break;
            }
            return(Pnm);
        }