static double[] Lap_Tien(double[,] Saiphan, double Y)
        {
            int    n        = Saiphan.GetLength(0);
            double Giaithua = 1;
            int    k        = 0;

            double[] Pn = new double[n];

            for (int i = 2; i < n; i++)
            {
                Giaithua *= i;
            }

            for (int i = n - 1; i >= 0; i--)
            {
                if (i == 0)
                {
                    Pn[n - 1] += (Y - Saiphan[0, 0]) / Saiphan[0, 1];
                }

                if (i == 1)
                {
                    continue;
                }

                if (i > 1)
                {
                    double[] Xi = new double[i];

                    for (int j = 0; j < i; j++)
                    {
                        Xi[j] = j;
                    }

                    double[] Horner = HornerPn.Nhandathuc(Xi);


                    for (int j = 0; j < Horner.Length; j++)
                    {
                        Horner[j]  = -Horner[j];
                        Horner[j] *= Saiphan[0, i] / (Saiphan[0, 1] * Giaithua);
                        Pn[j + k] += Horner[j];
                    }
                    Giaithua /= i;
                    k++;
                }
            }

            for (int i = 0; i < n; i++)
            {
                if (Pn[i] < 0.0000001)
                {
                    Pn[i] = Math.Round(Pn[i], 6);
                }
            }

            return(Pn);
        }
示例#2
0
 static void Main(string[] args)
 {
     // Nội suy trung tâm nên phải lấy cả 2 phía và lấy số lẻ mới chạy được
     // Nội suy tại X = 1.7489 nên phải tính giá trị tại 1.7489-1.75/0.01 = -0.11
     // Dùng Bessel khi t nằm trong khoảng 0.25 đến 0.75
     // Dùng Bessel tốt nhất khi t = 0.5
     double[] X = { 1.72, 1.73, 1.74, 1.75, 1.76, 1.77, 1.78 };
     double[] Y = { 5.5845, 5.6406, 5.6973, 5.7546, 5.81244, 5.87085, 5.92986 };
     double[,] A = Saiphan(Y);
     ExportData.ExportData2D(A);
     double[] B = DaThucBessel(A);
     ExportData.ExportData1D(B);
     Console.WriteLine(HornerPn.Giatridathuc(B, -0.11));
 }
 static void Main(string[] args)
 {
     // Nội suy trung tâm nên phải lấy cả 2 phía và lấy số lẻ mới chạy được
     // Nội suy tại X = 1.7489 nên phải tính giá trị tại 1.7489-1.75/0.01 = -0.11
     // Dùng Stirling khi t nằm trong khoảng -0.5 đến 0.5
     // Dùng Stirling tốt nhất khi t nằm trong khoảng -0.25 đến 0.25
     double[] X = { 75, 76, 77, 78, 79, 80, 81, 82, 83, 84 };
     double[] Y = { 2.76806, 2.83267, 2.90256, 2.97857, 3.06173, 3.15339, 3.25530 };
     double[,] A = SaiPhan(Y);
     ExportData.ExportData2D(A);
     double[] B = DaThucStirling(A);
     ExportData.ExportData1D(B);
     Console.WriteLine(HornerPn.Giatridathuc(B, 0.5));
 }
示例#4
0
 static void Main()
 {
     // Nội suy trung tâm nên phải lấy cả 2 phía và lấy số lẻ mới chạy được
     // Nội suy tại X = 1.7489 nên phải tính giá trị tại 1.7489-1.75/0.01 = -0.11
     // Dùng Gauss tiến khi t nằm trong khoảng 0 đến 0.5
     // Dùng Gauss lui khi t nằm trong khoảng -0.5 đến 0
     // Dùng Gauss tốt nhất khi gần 0, nếu dương thì tiến, nếu âm thì lùi
     double[] X = { 1.72, 1.73, 1.74, 1.75, 1.76, 1.77, 1.78 };
     double[] Y = { 5.5845, 5.6406, 5.6973, 5.7546, 5.81244, 5.87085, 5.92986 };
     double[,] A = Saiphan(Y);
     double[] B = Gauss_Tien_1(A);
     double[] C = Gauss_Lui_2(A);
     ExportData.ExportData2D(A);
     ExportData.ExportData1D(C);
     Console.WriteLine(HornerPn.Giatridathuc(B, -0.11));
     Console.WriteLine(HornerPn.Giatridathuc(C, -0.11));
 }
        static void Iteration(double[] DaThucLap, int SoLanLap, double X0, double h)
        {
            double t0 = DaThucLap[DaThucLap.Length - 1];
            double t1;

            Console.WriteLine("t0 = " + t0);

            for (int i = 1; i <= SoLanLap; i++)
            {
                t1 = HornerPn.Giatridathuc(DaThucLap, t0);
                Console.WriteLine("t{0} = {1}", i, t1);
                t0 = t1;
                if (i == SoLanLap)
                {
                    Console.WriteLine("X = " + (t1 * h + X0));
                }
            }

            // t = (X - X0) / h
            // Trong ví dụ lặp tiến X0 = 0.3 va h = 0.1
            // Trong ví dụ lặp lùi X0 = 1.38 va h = 0.01
            // Trong ví dụ lặp trung tâm X0 = 4.2 va h = 0.01
        }
示例#6
0
        static double[] DaThucBessel(double[,] Saiphan)
        {
            int    n = Saiphan.GetLength(0);
            int    k = 0;
            int    mid = (n - 1) / 2;
            int    a = 0, b = n - 1;
            double Giaithua = 1;

            double[]      Pn   = new double[n];
            List <double> Heso = new List <double>();

            for (int i = 2; i < n; i++)
            {
                Giaithua *= i;
            }

            for (double i = -mid + 1; i <= mid - 1; i++)
            {
                Heso.Add(i);
            }

            for (int i = n - 1; i >= 0; i--)
            {
                if (i == 0)
                {
                    Pn[n - 1] += Saiphan[mid, mid];
                }

                if (i == 1)
                {
                    Pn[n - 2] += (Saiphan[mid, mid + 1] + Saiphan[mid - 1, mid]) / 2;
                }

                if (i == 2)
                {
                    Pn[n - 3] += Saiphan[mid - 1, mid + 1] / 2;
                }

                if (i > 2)
                {
                    if (i % 2 == 0)
                    {
                        Heso.Add(0);

                        double[] Xi     = Heso.ToArray();
                        double[] Horner = HornerPn.Nhandathuc(Xi);
                        for (int j = 0; j < Horner.Length; j++)
                        {
                            Horner[j] *= Saiphan[a, b] / Giaithua;
                            Pn[j + k] += Horner[j];
                        }
                        Heso.RemoveAt(Heso.Count - 1);
                    }

                    if (i % 2 != 0)
                    {
                        double[] Xi     = Heso.ToArray();
                        double[] Horner = HornerPn.Nhandathuc(Xi);
                        a++;
                        b--;
                        for (int j = 0; j < Horner.Length; j++)
                        {
                            Horner[j] *= (Saiphan[a, b + 1] + Saiphan[a - 1, b]) / (2 * Giaithua);
                            Pn[j + k] += Horner[j];
                        }
                        Heso.RemoveAt(0);
                        Heso.RemoveAt(Heso.Count - 1);
                    }
                    Giaithua /= i;
                    k++;
                }
            }

            return(Pn);
        }
示例#7
0
        public static double [] Gauss_Tien_1(double [,] Saiphan)
        {
            int    n = Saiphan.GetLength(0);
            int    k = 0;
            int    mid = (n - 1) / 2;
            int    a = 0, b = n;
            double Giaithua = 1;

            double[]      Pn   = new double[n];
            List <double> Heso = new List <double>();

            for (int i = 2; i < n; i++)
            {
                Giaithua *= i;
            }

            for (double i = -mid; i <= mid; i++)
            {
                Heso.Add(i);
            }

            for (int i = n - 1; i >= 0; i--)
            {
                if (i == 0)
                {
                    Pn[n - 1] += Saiphan[mid, mid];
                }

                if (i == 1)
                {
                    Pn[n - 2] += Saiphan[mid, mid + 1];
                }

                if (i > 1)
                {
                    double[] Xi = new double[i];

                    if (i % 2 == 0)
                    {
                        b--;
                        Heso.RemoveAt(0);
                    }

                    if (i % 2 != 0)
                    {
                        a++;
                        Heso.RemoveAt(i);
                    }

                    for (int j = 0; j < i; j++)
                    {
                        Xi[j] = Heso[j];
                    }

                    double[] Horner = HornerPn.Nhandathuc(Xi);

                    for (int j = 0; j < Horner.Length; j++)
                    {
                        Horner[j] *= (Saiphan[a, b] / Giaithua);
                        Pn[j + k] += Horner[j];
                    }

                    Giaithua /= i;
                    k++;
                }
            }

            return(Pn);
        }