Advertisement
lutaco

Untitled

May 28th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.64 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <math.h>
  5.  
  6. int M, N; //размерность сетки
  7. int An;
  8. double **A;
  9. double *x;
  10. double *b;
  11. int *rep;
  12. double c = 1;
  13. double den = 1;
  14. double alph = 1;
  15. double dx = 0.3;
  16. double dy = 0.3;
  17.  
  18.  
  19. //Берет номер узла и записывает общее оравнение для него
  20. void wrtk(int id, int k) {
  21. double a = alph / c / den;
  22. // if (id == 620) {
  23. // x[k] = -1000 / c / den;
  24. // }
  25. A[k][rep[id + M]] = a / dy / dy;
  26. A[k][rep[id - M]] = a / dy / dy;
  27. A[k][rep[id + 1]] = a / dx / dx;
  28. A[k][rep[id - 1]] = a / dx / dx;
  29. A[k][rep[id]] = - (2 * a / dx / dx) - (2 * a / dy / dy);
  30. }
  31.  
  32. //Заполняет матрицу коэффициентов А и вектор b(x)
  33. void mysolver(void) { //расчет значений
  34. int i, j;
  35. int k = 0;
  36. int id;
  37. for (j = 0; j < N; j++) {
  38. for (i = 0; i < M; i++) {
  39. id = j * M + i;
  40. if (i == 20 && j == 15)
  41. printf("%d\n",id );
  42. if (j >= An && i > M - j + An) { //за скошенной границей
  43. continue;
  44. } else if (j >= An && i == M - j + An) { // скошенная граница
  45. A[k][rep[id]] = - 1;
  46. // x[k] = 0;
  47. A[k][rep[id - 1 - M]] = 1 + sqrt((dx * dx) + (dy * dy));
  48. b[id] = 10;
  49. }
  50. else if (j == 0 ) {//нижняя граница
  51. A[k][rep[id]] = 1;
  52. b[k] = 0;
  53. } else if (j == N - 1) {//Верхняя
  54. A[k][rep[id]] = 1;
  55. b[k] = 50;
  56. } else if (i == 0) {//левая
  57. A[k][rep[id]] = 1;
  58. b[k] = 100;
  59. } else if (i == M - 1) {//Правая
  60. A[k][rep[id]] = 1;
  61. b[k] = 50;
  62. } else {
  63. wrtk(id, k);
  64. }
  65. k++;
  66. }
  67. }
  68. }
  69.  
  70.  
  71. void gauss(int n) {
  72. int i, j, k, h;
  73. double a;
  74. int p[n];
  75. double gl;
  76. int pos;
  77. double *tmp;
  78. double tm;
  79. //Прямой ход метода Гаусса
  80. for ( k = 0; k < n; k++ ) {
  81. gl = abs(A[k][k]);
  82. pos = k;
  83. //выбор главного элемента
  84. for (h = k + 1; h < n; h++)
  85. if (abs(A[h][k]) > gl) {
  86. gl = abs(A[h][k]);
  87. pos = h;
  88. }
  89. p[k] = pos;
  90. tmp = A[pos];
  91. A[pos] = A[k];
  92. A[k] = tmp;
  93.  
  94. tm = b[pos];
  95. b[pos] = b[k];
  96. b[k] = tm;
  97. for ( j = k + 1; j < n; j++) {
  98.  
  99. a = - A[j][k] / A[k][k];
  100. b[j] += b[k] * a;
  101. for ( i = k ; i < n; i++ )
  102. A[j][i] += A[k][i] * a;
  103. }
  104. }
  105. //Обратный ход
  106. b[n - 1] /= A[n - 1][n - 1];
  107. for ( i = n - 2; i >= 0; i-- ) {
  108. for ( j = i + 1; j < n; j++ )
  109. b[i] -= b[j] * A[i] [j];
  110. b[i] /= A[i][i];
  111. }
  112. //запись ответа и перестановка
  113. for (i = 0; i < n; i++)
  114. x[p[i]] = b[i];
  115. x = b;
  116. }
  117.  
  118. int main(int argc, char* argv[]) {
  119. int n_time; //количество циклов
  120. int i, j, k;
  121. int nur;
  122.  
  123. M = 8/dx;
  124. N = 6/dy;
  125. An = 3/dx;
  126.  
  127. rep = (int*) malloc(sizeof(double) * N * M);
  128.  
  129. nur = 0;
  130. for (j = 0; j < N; j++)
  131. for (i = 0; i < M; i++)
  132. if (j >= An && i > M - j + An) // скошенная граница
  133. rep[j * M + i] = -1;
  134. else {
  135. rep[j * M + i] = nur;
  136. nur++;
  137. }
  138.  
  139. A = (double**) malloc(sizeof(double*) * nur);
  140. x = (double*) malloc(sizeof(double) * nur);
  141. b = (double*) malloc(sizeof(double) * nur);
  142.  
  143. for (k = 0; k < nur; k++) {
  144. A[k] = (double*) malloc(sizeof(double) * nur);
  145. }
  146.  
  147. memset(b, 0, sizeof(double) * nur ); // Инициалицируем х и А нулями
  148.  
  149. for (i = 0; i < nur; i++)
  150. memset(A[i], 0, sizeof(double) * nur);
  151.  
  152. mysolver();
  153. gauss(nur);
  154. printf("N %d M %d A %d\n",N, M, An );
  155. FILE *fd = fopen("out.txt", "w");
  156. //Печать решения
  157. for (j = 0; j < N; j++) {
  158. for (i = 0; i < M; i++) {
  159. if (j >= An && i > M - j + An) // скошенная граница
  160. continue;
  161. fprintf(fd, "%d\t%d\t%f\n", i, j, x[rep[j * M + i]]);
  162. }
  163. fprintf(fd, "\n");
  164. }
  165. fclose(fd);
  166.  
  167. FILE *fg = fopen("gra.gnu", "w");
  168. fprintf(fg, "#!/usr/bin/gnuplot -persistent\n");
  169. fprintf(fg, "set size square\n");
  170. fprintf(fg, "set output 'plot.eps'\n");
  171. fprintf(fg, "set cbrange [0:100]\n");
  172. fprintf(fg, "set xrange[0:%d]\nset yrange[0:%d]\n", M - 1, N - 1);
  173. fprintf(fg, "set palette rgbformulae 22,13,-31\n");
  174. fprintf(fg, "set pm3d map\n");
  175. fprintf(fg, "set pm3d flush begin ftriangles scansforwar interpolate 5,5\n");
  176. fprintf(fg, "splot 'out.txt' using 1:2:3 with pm3d title 'var'");
  177. fclose(fg);
  178.  
  179. // int id = 620;
  180. // printf("%f \n", x[rep[id + M]] );
  181. // printf("%f \n", x[rep[id - M]] );
  182. // printf("%f \n", x[rep[id + 1]] );
  183. // printf("%f \n", x[rep[id - 1]] );
  184. // printf("4 %f \n", x[rep[id]] );
  185. // printf("%f\n", (x[rep[id + M]] + x[rep[id - M]] + x[rep[id + 1]] + x[rep[id + 1]] - 4 * x[rep[id]]) / dx / dx);
  186.  
  187. return 0;
  188. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement