Advertisement
Guest User

Untitled

a guest
Dec 17th, 2017
312
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 7.62 KB | None | 0 0
  1. % Do zadania przyjalem plyte z grupy B, czyli:
  2. %
  3. %              T_3                                   T_2
  4. %                                      ******************************
  5. %       *+----------------------------------------------------------+
  6. %       *|                                                          |
  7. %       *|                                                          |
  8. %       *|                                                          |
  9. %    T_1*|                          T_0                             |
  10. %       *|                                                          |
  11. %       *|                                                          |
  12. %       *|                                                          |
  13. %       *|                                                          |
  14. %       *+----------------------------------------------------------+
  15. %                                      ******************************
  16. %                                                    T_2
  17. %
  18. % Temperatura otoczenia to T_3, gwiazdki oznaczają miejscie przyłożenia
  19. % tempreatury.
  20. %
  21. % Pare założeń:
  22. %  - wspolczynnik przenikania pomiedzy "segmentami" plyty - Kw
  23. %  - wspolczynnik przenikania plyta->powietrze - Kz
  24. %  - wspolczynnik przenikania pomiedzy plyta a punktem grzania - Kw
  25. %
  26. %
  27. % A wiec, odrobina teorii
  28. % Rozwazmy pojedynczy segment:
  29. %
  30. %              Ti,(j-1)
  31. %            +----------+
  32. %            |          |
  33. %   T(i-1),j |   Ti,j   | T(i+1),j
  34. %            |          |
  35. %            +----------+
  36. %              Ti,(j+1)
  37. %
  38. % Dodatkowo mamy jeszcze temperature "nad" i "pod" plyta.
  39. %
  40. % W ogolnosci, mamy bardzo proste r-nie rozniczkowe wiazace ze soba
  41. % temperature oraz strumien ciepla:
  42. %
  43. %                       dC * Ti,j' = sum(q)
  44. %
  45. % gdzie q to sa przeplywy ciepla. Dla jasnych obliczen najlatwiej je
  46. % ponazywac od stron geograficznych: polnocny, poludniowy, wschodni,
  47. % zachodni oraz dolny i gorny, przyjmujac ze nazwa okresla w ktora strone
  48. % mamy przeplyw. Zaleznosc wiazaca przeplyw z temparaturami okreslamy jako
  49. %
  50. %       q = k*S*(T_docelowa - T_zrodla)
  51. %
  52. % gdzie K to jakis wspolczynnik przeplywu ciepla, a S to powierzchnia przez
  53. % ktora nastepuje wymiana ciepla.
  54. %
  55. % Tworzenie rownan: wektor zmiennych stanu
  56. % Przyjmujemy ze zmiennymi stanu sa temperatury kolejnych segmentow:
  57. % w przypadku zadania z laboratorium mamy 1250 zmiennych stanu. Trzeba je
  58. % tylko jakos sensownie ulozyc - moja propozycja wyglada tak: pierwsze N
  59. % zmiennych stanu to sa temperatury kolejnych segmentow w 1 wierszu plyty,
  60. % kolejne N zmiennych to temperatury w 2 wierszu plyty, itp. Zapis wyglada
  61. % mniej wiecej tak:
  62. %
  63. % X = [T1,1 T1,2 T1,3 ... T1,n T2,1 T2,2 T2,3 ... T2,n ... Tm,1 ... Tm,n]'
  64. %
  65. % gdzie n - liczba segmentow w 1 wierszu (czyli - liczba kolumn), a m to
  66. % liczba wierszy.
  67. %
  68. % Trzeba ustalic zaleznosc pomiedzy i,j -> indeks w wektorze zmiennych
  69. % stanu (pamietajac, ze MATLAB liczy od 1 - my tez tak bedziemy liczyc)
  70. % indeks = (i-1)*n + j
  71. % warto sobie ta zaleznosc zapisac w jakiejs funkcji - naprawde latwiej
  72. % pozniej zapisac w kodzie funkcje, niz ta zaleznosc
  73.  
  74. clear;
  75. clc;
  76.  
  77. l = 50;
  78. h = 25;
  79. dx = 1;
  80. d = dx;
  81.  
  82. T_0 = 20;
  83. T_1 = 10;
  84. T_2 = 70;
  85. T_3 = 30;
  86.  
  87. Kw = 1000;
  88. Kz = 5;
  89. C = 5e4;
  90.  
  91. Tsym = 20;
  92. dT = 1e-3;
  93.  
  94. % Dla ulatwienia sobie funkcji dla ODE: przyjmujemy uklad typu
  95. %
  96. %      X' = A*X + B*U
  97. %
  98. % Gdzie U jest wektorem temperatur stalych (czyli otoczenie i temperatury
  99. % ktore przylozylismy do plyty)
  100. global U;
  101. U = [T_1 T_2 T_3]';
  102.  
  103. % Liczymy sobie liczbe segmentow
  104. global n m;
  105. n = l / dx;
  106. m = h / dx;
  107.  
  108. % Pole powierzchni segmentu
  109. dS = dx*dx;
  110.  
  111. % Pojemnosc segmentu
  112. dC = C/(n*m);
  113.  
  114. % Musimy sobie policzyc, od ktorego segmentu zaczynamy grzac temperatura
  115. % T_2:
  116. T2_start = round(n/2);
  117.  
  118. % Generowanie macierzy A i B
  119. % Duzo prosciej jest wygenerowac od razu cala macierz A, niz najpierw
  120. % srodek plyty, a pozniej krawedzie - dlaczego, zobaczycie w petli
  121.  
  122. global A B;
  123. A = sparse(n*m, n*m);
  124. B = sparse(n*m,3);
  125.  
  126. % i - kolumna
  127. % j - wiersz
  128. for i=1:m
  129.     for j=1:n
  130.         % Dla ulatwienia: bedziemy generowac kolejne "wiersze" macierzy A
  131.         A_ = sparse(1,n*m);
  132.         B_ = sparse(1, 3);
  133.  
  134.         if i == 1
  135.             if j < T2_start
  136.                 B_(3) = B_(3) + Kz*dS/dC;
  137.                 A_(indeks(i,j)) = A_(indeks(i,j)) - Kz*dS/dC;
  138.             else
  139.                 B_(2) = B_(2) + Kw*dS/dC;
  140.                 A_(indeks(i,j)) = A_(indeks(i,j)) - Kw*dS/dC;
  141.             end
  142.         elseif ((i>5 && i<20) && (j>10 && j<40))  %TUTAJ
  143.             A_(indeks(i,j)) = 0;
  144.         elseif (i == 20 && (j>10 && j<40))
  145.             A_(indeks(i,j)) = A_(indeks(i,j)) - Kz*dS/dC;
  146.             B_(3) = B_(3) + Kz*dS/dC;  
  147.  
  148.         else
  149.             A_(indeks(i-1,j)) = A_(indeks(i-1,j)) + Kw*dS/dC;
  150.             A_(indeks(i,j)) = A_(indeks(i,j)) - Kw*dS/dC;
  151.         end
  152.        
  153.         if i == m
  154.             if j < T2_start
  155.                 B_(3) = B_(3) + Kz*dS/dC;
  156.                 A_(indeks(i,j)) = A_(indeks(i,j)) - Kz*dS/dC;
  157.             else
  158.                 B_(2) = B_(2) + Kw*dS/dC;
  159.                 A_(indeks(i,j)) = A_(indeks(i,j)) - Kw*dS/dC;
  160.             end
  161.         elseif (i == 5 && (j>10 && j<40))
  162.             A_(indeks(i,j)) = A_(indeks(i,j)) - Kz*dS/dC;
  163.         elseif ((i>5 && i<20) && (j>10 && j<40))  %TUTAJ
  164.             A_(indeks(i,j)) = 0;
  165.         else
  166.             A_(indeks(i+1,j)) = A_(indeks(i+1,j)) + Kw*dS/dC;
  167.             A_(indeks(i,j)) = A_(indeks(i,j)) - Kw*dS/dC;
  168.         end
  169.        
  170.         if j == n
  171.             B_(3) = B_(3) + Kz*dS/dC;
  172.             A_(indeks(i,j)) = A_(indeks(i,j)) + Kz*dS/dC;
  173.         elseif (j == 10 && (i>50 && i<20))  
  174.             A_(indeks(i,j)) = A_(indeks(i,j)) - Kz*dS/dC;
  175.             B_(3) = B_(3) + Kz*dS/dC;  
  176.         elseif ((i>5 && i<20) && (j>10 && j<40))  %TUTAJ
  177.             A_(indeks(i,j)) = 0;
  178.         else
  179.             A_(indeks(i,j+1)) = A_(indeks(i,j+1)) + Kw*dS/dC;
  180.             A_(indeks(i,j)) = A_(indeks(i,j)) - Kw*dS/dC;
  181.         end
  182.  
  183.         if j == 1
  184.             B_(1) = B_(1) + Kw*dS/dC;
  185.             A_(indeks(i,j)) = A_(indeks(i,j)) - Kw*dS/dC;
  186.         elseif ((i>5 && i<20) && (j>10 && j<40))  %TUTAJ
  187.             A_(indeks(i,j)) = 0;
  188.         elseif (j == 40 && (i>5 && i<20))
  189.             A_(indeks(i,j)) = A_(indeks(i,j)) - Kz*dS/dC;
  190.             B_(3) = B_(3) + Kz*dS/dC;            
  191.         else
  192.             A_(indeks(i,j-1)) = A_(indeks(i,j-1)) + Kw*dS/dC;
  193.             A_(indeks(i,j)) = A_(indeks(i,j)) - Kw*dS/dC;
  194.         end
  195.        
  196.         if ((i>5 && i<20) && (j>10 && j<40)) %TUTAJ
  197.              A_(indeks(i,j)) = 0;  
  198.         else
  199.              A_(indeks(i,j)) = A_(indeks(i,j)) - 2*Kz*dS/dC;
  200.              B_(3) = B_(3) + 2*Kz*dS/dC;
  201.         end;
  202.        
  203.         A(indeks(i,j),:) = A_;
  204.         B(indeks(i,j),:) = B_;
  205.     end
  206. end
  207.  
  208. % Yay, mamy macierze - symulujemy? no jasne!
  209.  
  210. % Jeszcze tylko warunki poczatkowe
  211. X0 = T_0*ones(n*m,1);
  212.  
  213. % Jakies parametry symulacji tez by bylo fajnie
  214. TT = [0 Tsym];
  215. opts = odeset('MaxStep', dT);
  216.  
  217. [X, T] = ode45('grzanie_plyty', TT, X0);
  218.  
  219. % Ok, no to co - tworzymy animacje ;)
  220.  
  221. % Tworzymy rysunek poczatkowy
  222. % Teraz dla odmiany przekształcamy wektor zmiennych stanu na macierz, w
  223. % ktorej odpowiednie wspolrzedne odpowiadaja odpowiedniemu fragmentowy
  224. % plyty
  225. for i = 1:m
  226.     for j = 1:n
  227.         ZZ(i,j) = T(1,indeks(i,j));
  228.     end
  229. end;
  230. h1 = mesh(ZZ);
  231. axis([0 50 0 25 0 70]);
  232. % No i nastepne
  233. pause;
  234. for k = 1:10:length(T)
  235.     for i = 1:m
  236.         for j = 1:n
  237.             ZZ(i,j) = T(k,indeks(i,j));
  238.         end
  239.     end;
  240.    
  241.     % Podmieniamy nasze temperatury
  242.     set(h1,'zdata',ZZ);
  243.     pause(0.01);
  244. end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement