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); }
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)); }
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 }
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); }
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); }