Advertisement
pashaXMorder

скx

Jun 20th, 2019
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.61 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <fstream>
  4. using namespace std;
  5. /*double Q(double x) // построение источника
  6. {
  7.  if (abs(x - 0.5) < 0.1)
  8.  return 1;
  9.  else
  10.  return 0;
  11. }*/
  12. void appr(int n, double *a, double *b, double *c, double *f)
  13. //построение аппроксимации
  14. {
  15.  for (int i = 0; i < n - 1; i++)
  16.  {
  17.  a[i] = 1.0*n*n;
  18.  b[i] = 1.0*n*n;
  19.  c[i] = - 2.0*n*n;
  20.  f[i] = 0;
  21.  }
  22.  c[0] = -1;
  23.  c[n - 1] = -3.0*n*n; //???
  24.  f[0] = - 1.0 / (n) *n*n;
  25. }
  26. void invert(int n, double *d, double *inv, double *a, double *b, double
  27. *c, double *q, double *p) // умножение обратной к ТД-матрице на вектор
  28. {
  29.  q[0] = -b[0]/c[0];
  30.  p[0] = d[0]/c[0];
  31.  for (int i = 1; i < n-1; i++) // прямой ход прогонки
  32.  {
  33.  q[i] = -b[i] / (c[i] + a[i-1] * q[i-1]);
  34.  p[i] = (d[i] - a[i-1] * p[i-1]) / (c[i] + a[i-1] * q[i-1]);
  35.  }
  36.  inv[n-1] = (d[n-1] - p[n-2] * a[n-2])/(c[n-1] + a[n-2] * q[n-2]);
  37. // обратный ход прогонки
  38.  for (int i = n-2; i > -1; i--)
  39.  inv[i] = q[i] * inv[i+1] + p[i];
  40. }
  41. int main()
  42. {
  43.  int n = 150; //число шагов сетки по х
  44.  int nt = 225000; //число шагов сетки по времени
  45.  double t1 = 2;
  46.  double t2 = 5; // заданные моменты времени
  47.  double dt = t2 / nt;
  48.  double *u_0, *u, *a, *b, *c, *f, *ut, *a_new, *b_new, *c_new, *d,
  49. *inv, *q, *p;
  50.  // трёхдиагональная матрица аппроксимации:
  51.  a = new double[n - 1];
  52.  b = new double[n - 1];
  53.  c = new double[n];
  54. // модифицированная матрица
  55.  a_new = new double[n - 1];
  56.  b_new = new double[n - 1];
  57.  c_new = new double[n];
  58.  q = new double[n]; // вспомогательные
  59.  p = new double[n]; // коэффициенты для прогонки
  60.  f = new double[n]; // функция источника + гр. условий на сетке
  61.  d = new double[n]; // вспомогательные
  62.  inv = new double[n]; // векторы
  63.  u_0 = new double[n]; //начальное распределение
  64.  ut = new double[nt];
  65.  for (int i = 0; i < n; i++)
  66.  u_0[i] = 0;
  67.  appr(n, a, b, c, f);
  68.  u = u_0; //текущее распределение по х
  69.  for (int k = 0; k < nt; k++)
  70.  {
  71.  ut[k] = (u[n / 2] + u[n / 2 - 1]) / 2; // температура в середине
  72. стержня в данный момент
  73.  for (int i = 0; i < n - 1; i++) // делаем новые матрицу и
  74. вектор, чтобы проще записывать обращение
  75.  {
  76.  d[i] = u[i] + dt*f[i]; // новый вектор
  77.  a_new[i] = -dt*a[i]/2; // новая матрица A' = E - dt/2*A,
  78.  b_new[i] = -dt*b[i]/2; // где A(a,c,b) - ТД-матрица
  79. аппроксимации
  80.  c_new[i] = 1 - dt*c[i]/2;
  81.  }
  82.  c_new[n-1] = 1 - dt*c[n-1]/2;
  83.  d[n-1] = u[n-1] + dt*f[n-1];
  84.  invert(n, d, inv, a_new, b_new, c_new, q, p); // домножаем d на
  85. обратную к A'
  86. for (int i = 0; i < n; i++)
  87. u[i] = 2*inv[i] - d[i];
  88. if (abs(k*dt - t1) < dt / 2)
  89. {
  90. ofstream u_t1_out("CrNi_t1.txt");
  91. for (int i = 0; i < n; i++)
  92. u_t1_out << (i + 0.5) / n << ' ' << u[i] << '\n';
  93. u_t1_out.close();
  94. }
  95. }
  96. ofstream u_t2_out("CrNi_t2.txt"); // распределение по стержню в момент
  97. времени t2
  98. ofstream u_x_out("CrNi_x.txt"); // распределение по времени в середине
  99. стержня
  100. for (int k = 0; k < nt; k++)
  101. u_x_out << k * dt << ' ' << ut[k] << '\n';
  102. for (int i = 0; i < n; i++)
  103. u_t2_out << (i + 0.5) / n << ' ' << u[i] << '\n';
  104. u_x_out.close();
  105. u_t2_out.close();
  106. return 0;
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement