Advertisement
Guest User

Untitled

a guest
Jan 17th, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.03 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.IO;
  7. namespace Laba11
  8. {
  9.     class Program
  10.     {
  11.         static double aa = 1.0, eps = 1e-10;
  12.         static double xmin, xmax, tmin, tmax;
  13.         static int n, m;
  14.         static double h, t;
  15.         static double[] x1;
  16.         static double[] t1;
  17.         static void Main(string
  18.             [] args)
  19.         {
  20.             System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
  21.             Console.Write("h: ");
  22.             h = Convert.ToDouble(Console.ReadLine());
  23.             Console.Write("t max: ");
  24.             tmax = Convert.ToDouble(Console.ReadLine());
  25.             Console.Write("t: ");
  26.             t = Convert.ToDouble(Console.ReadLine());
  27.             if (t - h * h / 2.0 < eps)
  28.                 Console.Write("Stable");
  29.             else
  30.                 Console.Write("No stable");
  31.             xmin = 0.0; xmax = 1.0; tmin = 0.0;
  32.             _1();
  33.             _2();
  34.             Console.Read();
  35.         }
  36.         static void _1() //Вычисление явной схемы
  37.         {
  38.             StreamWriter wr = new StreamWriter("out1.txt");
  39.             n = Convert.ToInt32((xmax - xmin) / h);
  40.             m = Convert.ToInt32((tmax - tmin) / t);
  41.             x1 = new double[n + 1];
  42.             t1 = new double[m + 1];
  43.             double[][] u = new double[n + 1][];
  44.             for (int i = 0; i < n + 1; i++)
  45.             {
  46.                 x1[i] = h * i;
  47.                 u[i] = new double[m + 1];
  48.                 u[i][0] = fi(x1[i]); // начальное условие
  49.             }
  50.             for (int j = 0; j < m + 1; j++)
  51.                 t1[j] = t * j;
  52.             // вычисление значений искомой функции
  53.             for (int j = 1; j < m + 1; j++)
  54.             {
  55.                 u[0][j] = a1(t1[j]); // на левой границе
  56.                 for (int i = 1; i < n; i++)// центральное значение
  57.                     u[i][j] = (
  58.                         f(x1[i], t1[j - 1])
  59.                         + aa * (u[i + 1][j - 1]
  60.                             - 2.0 * u[i][j - 1]
  61.                             + u[i - 1][j - 1]) / (h * h)
  62.                         ) * t + u[i][j - 1];
  63.                 u[n][j] = a2(t1[j]); // на правой границе
  64.             }
  65.             // вывод значений
  66.             for (int i = 0; i < n + 1; i++)
  67.             {
  68.                 for (int j = 0; j < m + 1; j++)
  69.                     wr.WriteLine(x1[i] + " " + t1[j] + " " + u[i][j]);
  70.                 wr.WriteLine();
  71.             }
  72.             wr.Close();
  73.        }
  74.         static void _2() //Вычисление неявной схемы
  75.         {
  76.             StreamWriter wr = new StreamWriter("out2.txt");
  77.             n = Convert.ToInt32((xmax - xmin) / h);
  78.             m = Convert.ToInt32((tmax - tmin) / t);
  79.             x1 = new double[n + 1];
  80.             t1 = new double[m + 1];
  81.             double[] a = new double[n - 1];
  82.             double[] b = new double[n - 1];
  83.             double[] c = new double[n - 1];
  84.             double[] d = new double[n - 1];
  85.             double[] e = new double[n];
  86.             double[] v = new double[n];
  87.             double[][] u = new double[n + 1][];
  88.             for (int i = 0; i < n + 1; i++)
  89.             {
  90.                 x1[i] = h * i;
  91.                 u[i] = new double[m + 1];
  92.                 u[i][0] = fi(x1[i]); // начальное условие
  93.             }
  94.             for (int j = 0; j < m + 1; j++)
  95.                 t1[j] = t * j;
  96.             // вычисление значений искомой функции (решение системы прогонкой)
  97.             for (int j = 1; j < m + 1; j++)
  98.             {
  99.                 u[0][j] = a1(t1[j]); // на левой границе
  100.                 u[n][j] = a2(t1[j]); // на правой границе
  101.                 a[0] = 0;
  102.                 b[0] = -h * h / t - 2.0 * aa;
  103.                 c[0] = aa;
  104.                 d[0] = -u[1][j - 1] * h * h / t - f(x1[1], t1[j]) * h * h - aa * u[0][j];
  105.                 for (int i = 1; i < n - 2; i++)// Нахождение коэфицентов
  106.                 {
  107.                     a[i] = aa;
  108.                     b[i] = -h * h / t - 2.0 * aa;
  109.                     c[i] = aa;
  110.                     d[i] = -u[i + 1][j - 1] * h * h / t - f(x1[i + 1], t1[j]) * h * h;
  111.                 }
  112.                 a[n - 2] = aa;
  113.                 b[n - 2] = -h * h / t - 2.0 * aa;
  114.                 c[n - 2] = 0;
  115.                 d[n - 2] = -u[n - 1][j - 1] * h * h / t - f(x1[n - 1], t1[j]) * h * h - aa * u[n][j];
  116.                 e[0] = v[0] = 0;
  117.                 for (int i = 0; i < n - 1; i++)// Нахождение промежуточных коэфицентов
  118.                 {
  119.                     e[i + 1] = c[i] / (b[i] - a[i] * e[i]);
  120.                     v[i + 1] = (a[i] * v[i] - d[i]) / (b[i] - a[i] * e[i]);
  121.                 }
  122.                 u[n - 1][j] = v[n - 1];
  123.                 for (int i = n - 1; i > 1; i--)// Вычисление значения искомой функции
  124.                     u[i - 1][j] = e[i - 1] * u[i][j] + v[i - 1];
  125.             }
  126.             // вывод значений
  127.             for (int i = 0; i < n + 1; i++)
  128.             {
  129.                 for (int j = 0; j < m + 1; j++)
  130.                     wr.WriteLine(x1[i] + " " + t1[j] + " " + u[i][j]);
  131.                 wr.WriteLine();
  132.             }
  133.             wr.Close();
  134.         }
  135.         static double f(double x, double t) // неоднородная часть
  136.         {
  137.             return x*x;
  138.         }
  139.         static double fi(double x) // начальное условие
  140.         {
  141.             return Math.Sin(Math.PI * x) * Math.Cos(x);
  142.         }
  143.         static double a1(double t) // левая граница
  144.         {
  145.             return 0;
  146.         }
  147.         static double a2(double t) // правая граница
  148.         {
  149.             return t;
  150.         }
  151.     }
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement