Example #1
0
        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] + " ");
            }
            //Вывод последней строки на консоль
        }
Example #2
0
        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]);
                }
            }
        }