Advertisement
Briotar

trud

May 15th, 2021
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.14 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <vector>
  4. using namespace std;
  5. int nc = 25;
  6. int width = 8, height = 6, r = 3; // Параметры сетки
  7. double h = 0.25; // Шаг
  8. double *gauss(double **matr, double *y, int n)
  9. {
  10.  double d, s;
  11.  double *x = new double [n], *b = new double [n];
  12.  double **a = new double *[n];
  13.  for (int i = 0; i < n; i++)
  14.  a[i] = new double [n];
  15.  for (int i = 0; i < n; i++)
  16.  for (int j = 0; j < n; j++)
  17.  a[i][j] = matr[i][j];
  18.  for (int i = 0; i < n; i++)
  19.  b[i] = y[i];
  20.  
  21.  for (int k = 1; k < n; k++) //прямой ход
  22.  for (int j = k + 1; j < n; j++)
  23.  {
  24.  d = a[j][k] / a[k][k];
  25.  for (int i = k; i < n; i++)
  26.  a[j][i] = a[j][i] - d * a[k][i];
  27.  b[j] = b[j] - d * b[k];
  28.  }
  29.  
  30.  for (int k = n - 1; k >= 1; k--) // обратный ход
  31.  {
  32.  d = 0;
  33.  for (int j = k + 1; j < n; j++)
  34.  {
  35.  s = a[k][j] * x[j];
  36.  d = d + s;
  37.  }
  38.  x[k] = (b[k] - d) / a[k][k];
  39.  }
  40.  delete b;
  41.  for (int i = 0; i < n; i++)
  42.  delete [] a[i];
  43.  delete [] a;
  44.  return x;
  45. }
  46. 6int main() {
  47.  int ht_h = height / h + 1, wh_h = width / h + 1, r_h = r / h +
  48. 1;
  49.  int n = wh_h * ht_h; // количество уравнений
  50.  int i_0 = r_h, j_0 = wh_h - 1 - r_h;
  51.  double *y = new double [n], *x = new double [n];
  52.  double **a = new double *[n];
  53.  for (int i = 0; i < n; i++) a[i] = new double [n];
  54.  FILE *gp = popen("gnuplot -persist", "w");
  55.  if (gp == NULL)
  56.  {
  57.  printf("Ошибка открытия трубы gnuplot\n");
  58.  return 3;
  59.  }
  60.  
  61.  // ГУ
  62.  for (int i = 0; i < ht_h; i++)
  63.  for (int j = 0; j < wh_h; j++)
  64.  {
  65.  int y_coor = i_0 - i;
  66.  int x_coor = j - j_0;
  67.  
  68.  if (j == 0 && i == ht_h/2) { //гу 2 рода
  69.  a[i * wh_h + j][i * wh_h + j] = 1 / h;
  70.  a[i * wh_h + j][i * wh_h + j + 1] = -1 /
  71. h;
  72.  y[i * wh_h + j] = 100;
  73.  }
  74.  
  75.  else if (j == 0) // левая
  76.  {
  77.  a[i * wh_h + j][i * wh_h + j] = 1;
  78.  y[i * wh_h + j] = 0;
  79.  } else if (i == ht_h - 1) //нижняя
  80.  {
  81.  a[i * wh_h + j][i * wh_h + j] = -1 / h - 1;
  82.  a[i * wh_h + j][(i - 1) * wh_h + j] = 1 / h;
  83.  y[i * wh_h + j] = 0;
  84.  
  85.  }
  86.  else if ( i < i_0 && j > j_0 && //обработка границ
  87. неправильной формы
  88.  ((pow(y_coor + 1, 2) + pow(x_coor, 2) >= pow(r_h, 2)
  89. ||
  90.  pow(y_coor, 2) + pow(x_coor + 1, 2) >= pow(r_h, 2))
  91. &&
  92.  pow(y_coor, 2) + pow(x_coor, 2) < pow(r_h, 2)))
  93.  {
  94.  double l, m;
  95.  if ((l = (sqrt(r_h * r_h - pow(x_coor, 2)) -
  96. y_coor)) > 1) l = 1;
  97. 7 if ((m = (sqrt(r_h * r_h - pow(y_coor, 2)) -
  98. x_coor)) > 1) m = 1;
  99.  
  100.  a[i * wh_h + j][i * wh_h + j] = -1 /(m * h * h) -
  101. 1 / (1 * h * h) - 1;
  102.  a[i * wh_h + j][i * wh_h + j + 1] = 1 / (m * (m +
  103. 1) * h * h);
  104.  a[i * wh_h + j][i * wh_h + j - 1] = 1 / ((m + 1)
  105. * h * h);
  106.  a[i * wh_h + j][(i + 1) * wh_h + j] = 1 / ((l +
  107. 1) * h * h);
  108.  a[i * wh_h + j][(i - 1) * wh_h + j] = 1 / (l *(l
  109. + 1) * h * h);
  110.  }
  111.  else if (i < i_0 && j > j_0 && //округлая
  112.  ((pow(y_coor - 1, 2) + pow(x_coor, 2) < pow(r_h,
  113. 2) ||
  114.  pow(y_coor, 2) + pow(x_coor - 1, 2) < pow(r_h,
  115. 2)) &&
  116.  pow(y_coor, 2) + pow(x_coor, 2) >= pow(r_h, 2)))
  117.  {
  118.  a[i * wh_h + j][i * wh_h + j] = 1;
  119.  y[i * wh_h + j] = 200;
  120.  }
  121.  else if (i < i_0 && j > j_0 && //пустая часть
  122.  (pow(y_coor - 1, 2) + pow(x_coor, 2) >=
  123. pow(r_h, 2) &&
  124.  pow(y_coor, 2) + pow(x_coor - 1, 2) >=
  125. pow(r_h, 2) &&
  126.  pow(y_coor, 2) + pow(x_coor, 2) > pow(r,
  127. 2)))
  128.  {
  129.  a[i * wh_h + j][i * wh_h + j] = 1;
  130.  y[i * wh_h + j] = 0;
  131.  }
  132.  else if (j == wh_h - 1) //правая
  133.  {
  134.  a[i * wh_h + j][i * wh_h + j] = 1;
  135.  y[i * wh_h + j] = 200;
  136.  }
  137.  
  138.  else if (i == 0) // верхняя
  139.  {
  140.  a[i * wh_h + j][i * wh_h + j] = 1;
  141.  y[i * wh_h + j] = 200;
  142.  }
  143.  else //остальные узлы
  144.  {
  145.  a[i * wh_h + j][i * wh_h + j] = -2 / (h * h) - 2 /
  146. (h * h) - 1;
  147.  a[i * wh_h + j][i * wh_h + j + 1] = 1 / (h * h);
  148.  a[i * wh_h + j][i * wh_h + j - 1] = 1 / (h * h);
  149. 8 a[i * wh_h + j][(i + 1) * wh_h + j] = 1 / (h * h);
  150.  a[i * wh_h + j][(i - 1) * wh_h + j] = 1 / (h * h);
  151.  }
  152.  }
  153.  
  154.  for (int k = 1; k <= nc; k++)
  155.  {
  156.  for (int i = 0; i < ht_h; i++)
  157.  for (int j = 0; j < wh_h; j++)
  158.  {
  159.  int y_coor = i_0 - i;
  160.  int x_coor = j - j_0;
  161.  
  162.  if (j > 0 && i > 0 && j < wh_h - 1 && i < ht_h - 1
  163. &&
  164.  (i >= i_0 || j <= j_0))
  165.  y[i * wh_h + j] = -x[i * wh_h + j];
  166.  else if (i < i_0 && j > j_0 &&
  167.  pow(y_coor, 2) + pow(x_coor, 2) <
  168. pow(r_h, 2))
  169.  y[i * wh_h + j] = -x[i * wh_h + j];
  170.  }
  171.  x = gauss(a, y, n);
  172.  }
  173.  
  174.  // Вывод
  175.  for (int i = 0; i < ht_h; i++)
  176.  {
  177.  for (int j = 0; j < wh_h; j++)
  178.  cout << x[i * wh_h + j] << " ";
  179.  cout << endl;
  180.  }
  181.  fprintf(gp, "set pm3d map\n»);
  182. fprintf(gp, "set autoscale fix\n");
  183. fprintf(gp, "set cbtics 25\n");
  184. fprintf(gp, "set xlabel \"%d\" textcolor lt 6\n", width);
  185.  fprintf(gp, "set label \"%d\" at graph -0.11, graph 0.47
  186. textcolor lt 6\n", height);
  187.  fprintf(gp, "set label \"%d\" at graph 0.9, graph 1.07
  188. textcolor lt 6\n", r);
  189.  fprintf(gp, "splot '-' matrix\n");
  190.  for (int i = ht_h - 1; i >= 0; i--)
  191.  {
  192.  for (int j = 0; j < wh_h; j++)
  193.  {
  194.  fprintf(gp, "%lf ", x[i * wh_h + j]);
  195.  }
  196.  fprintf(gp, "\n");
  197.  }
  198.  fprintf(gp, "e\n");
  199.  fclose(gp);
  200.  return 0;
  201. 9}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement