Advertisement
Briotar

Untitled

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