public static void Solve(fi1 fi, int T, int n_x, int n_t, double tau, double h, double k) { double[,] matrix = new double[n_t + 1, n_x + 1]; //Вычисление значений нулевой строки сетки for (int i = 0; i <= n_x; i++) { matrix[0, i] = fi(i * tau); } //Вычисление значений нулевой строки сетки //Вычисление строк 1 - T НАЧАЛО for (int t = 1; t <= n_t; t++) { double[] alpha = new double[n_x + 1]; double[] beta = new double[n_x + 1]; double a = -k / 2; double b = 1; double c = k / 2; //Решаем систему (19) НАЧАЛО alpha[1] = -c / b; //beta[1] = fi(0) / b;!!! beta[1] = matrix[t - 1, 0] / b; //Прямая прогонка, вычисление прогоночных коэффициентов альфа и бета НАЧАЛО for (int j = 2; j <= n_x; j++) { alpha[j] = (-c) / (a * alpha[j - 1] + b); beta[j] = (matrix[t - 1, j] - a * beta[j - 1]) / (a * alpha[j - 1] + b); } //Прямая прогонка, вычисление прогоночных коэффициентов альфа и бета КОНЕЦ //Обратная прогонка, вычисление w НАЧАЛО double[] w = new double[n_x + 1]; w[n_x] = 0; for (int j = n_x - 1; j >= 1; j--) { w[j] = alpha[j + 1] * w[j + 1] + beta[j + 1]; } w[0] = 0; //Обратная прогонка, вычисление w КОНЕЦ //Решаем систему (19) КОНЕЦ //решаем систему (20) НАЧАЛО alpha[1] = -c / b; //beta[1] = fi(0) / b;!!! beta[1] = matrix[t - 1, 0] / b; //Прямая прогонка, вычисление прогоночных коэффициентов альфа и бета НАЧАЛО for (int j = 2; j <= n_x; j++) { alpha[j] = (-c) / (a * alpha[j - 1] + b); beta[j] = (-a * beta[j - 1]) / (a * alpha[j - 1] + b); } //Прямая прогонка, вычисление прогоночных коэффициентов альфа и бета КОНЕЦ double[] z = new double[n_x + 1]; z[n_x] = 1; //обратная прогонка, вычисление z НАЧАЛО for (int j = n_x - 1; j >= 1; j--) { z[j] = alpha[j + 1] * z[j + 1] + beta[j + 1]; } z[0] = 1; //обратная прогонка, вычисление z КОНЕЦ //решаем систему (20) КОНЕЦ //Решаем систему (18) НАЧАЛО //matrix[t, 0] = (fi(0) - a * w[n_x - 1] - c * w[1]) / (b + a * z[n_x - 1] + c * z[1]);!!! matrix[t, 0] = (matrix[t - 1, 0] - a * w[n_x - 1] - c * w[1]) / (b + a * z[n_x - 1] + c * z[1]); for (int i = 1; i <= n_x; i++) { matrix[t, i] = w[i] + matrix[t, 0] * z[i]; } //Решаем систему (18) КОНЕЦ } //Вычисление строк 1 - T НАЧАЛО //Запись в файл всей матрицы using (System.IO.StreamWriter file = new System.IO.StreamWriter("output.txt")) { for (int i = 0; i < n_t; i++) { for (int j = 0; j < n_x; j++) { file.Write(matrix[i, j].ToString() + " "); } file.WriteLine(); file.WriteLine(); } } //Запись в файл всей матрицы using (System.IO.StreamWriter file = new System.IO.StreamWriter("output.txt")) { //for (int i = 0; i < n_t; i++) //{ // for (int j = 0; j < n_x; j++) // { // file.Write(matrix[i, j].ToString() + " "); // } // file.WriteLine(); // file.WriteLine(); //} for (int i = 0; i < n_x + 1; i++) { file.WriteLine(matrix[n_t - 1, i]); } } //Вывод последней строки на консоль for (int i = 0; i < n_x; i++) { //Console.Write(matrix[n_t - 1, i] + " "); } //Вывод последней строки на консоль }
public static void Solve2(fi1 fi, int n_x, int n_t, double tau, double h, double k, string filename, double my_t ) { double [] gamma1 = new double[n_x + 1]; //Вычисление значений нулевой строки сетки for (int i = 0; i <= n_x; i++) { gamma1 [i] = fi(i * h); } //Вычисление значений нулевой строки сетки //Вычисление строк 1 - T НАЧАЛО for (int t = 1; t <= n_t && my_t != 0; t++) { double coef = k / 2; double [] alpha1 = new double[n_x + 1]; double [] beta1 = new double[n_x + 1]; alpha1 [0] = beta1 [0] = 0; for (Int32 i = 1; i < n_x; i++) { alpha1 [i] = (coef) / (coef * alpha1 [i - 1] + 1); beta1 [i] = (-coef * beta1 [i - 1]) / (1 + coef * alpha1 [i - 1]); gamma1 [i] = (gamma1 [i] - coef * gamma1 [i - 1]) / (1 + coef * alpha1 [i - 1]); // } double [] w = new double[n_x + 1]; double[] z = new double[n_x + 1]; w [n_x] = w [0] = 0; z [n_x] = z [0] = 1; for (int i = n_x - 1; i > 0; i--) { z [i] = alpha1 [i] * z [i + 1] + beta1 [i]; w [i] = alpha1 [i] * w [i + 1] + gamma1 [i]; } coef = (gamma1 [0] - coef * w [n_x - 1] + coef * w [1]) / (1 + coef * z [n_x - 1] - coef * z [1]); // for (int i = 0; i < n_x + 1; i++) { gamma1 [i] = w [i] + coef * z [i]; } if (my_t == t * tau) { break; } } using (System.IO.StreamWriter file = new System.IO.StreamWriter(filename)) { for (int i = 0; i <= n_x; i++) { file.WriteLine(gamma1 [i]); } } }