Advertisement
Guest User

Untitled

a guest
Dec 10th, 2019
318
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.42 KB | None | 0 0
  1. clear vars;
  2. colormap(parula(5));
  3.  
  4. a = 0.04;
  5. h_x = 0.6;
  6. h_t = 0.1;
  7. w = 0.85;
  8.  
  9. len = 50;
  10. p = a / (h_t^2);
  11. q = 1 / (h_x^2);
  12.  
  13. y_g = 10;
  14. x_g = 10;
  15.  
  16. g = @(x) sin(w*x);
  17. idx = @(y, x) (y-1)*len + x;
  18. [X,Y] = meshgrid(0: h_x: (len-1)*h_x);
  19.  
  20. f_prev = zeros(len*len, 1);
  21. f_curr = zeros(len*len, 1);
  22.  
  23. % Calculate A matrix
  24. A = zeros(len*len, len*len);
  25.  
  26. border_indexes = [];
  27.  
  28. for i = 1:len
  29. for j = 1:len
  30. if all(i > 1 & i < len & j > 1 & j < len)
  31. c = idx(i, j);
  32. n = idx(i+1, j);
  33. e = idx(i, j+1);
  34. s = idx(i-1, j);
  35. w = idx(i, j-1);
  36.  
  37. A(c, c) = p + 4*q;
  38. A(c, n) = -q;
  39. A(c, e) = -q;
  40. A(c, s) = -q;
  41. A(c, w) = -q;
  42. else
  43. c = idx(i, j);
  44. border_indexes = [border_indexes c];
  45. A(c, c) = 1;
  46. end
  47. end
  48. end
  49.  
  50. % Point G
  51. idx_g = idx(y_g, x_g);
  52. A(idx_g, :) = zeros(len*len, 1);
  53. A(idx_g, idx_g) = 1;
  54.  
  55. % Main loop
  56. for i = 1:360
  57. b = p * (2*f_curr - f_prev);
  58. b(idx_g) = g((i+1)*h_t);
  59. for j = 1:length(border_indexes)
  60. b(border_indexes(j)) = 0;
  61. end
  62. f_next = gmres(A, b, 1, 0.01);
  63.  
  64. mesh(X, Y, reshape(f_next, [len, len]));
  65. caxis([-1 1]);
  66. axis([0 (len-1)*h_x 0 (len-1)*h_x -1 1]);
  67. view(90,0);
  68.  
  69. pause(0.05);
  70.  
  71. f_prev = f_curr;
  72. f_curr = f_next;
  73.  
  74. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement