Advertisement
Guest User

wnum2

a guest
Jan 24th, 2020
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.96 KB | None | 0 0
  1. %O co tu chodzi? Mamy konkretne równanie do rozwišzania i konkretnš metodę
  2. %której mamy użyć. Jest to silna analogia do labki o kwadraturach, bo
  3. %równania różniczkowe rozwišzuje się poprzez całkowanie. Te metody sš
  4. %iteracyjne tzn: Mamy dyskretnš dziedzinę czasu, zaczynamy od warunku
  5. %poczštkowego który jest dany i po kolei wyznaczamy co ma się dziać w
  6. %chwili t+h, t+2h, t+3h... t+n*h, gdzie h to nasza długoœć kroku
  7. %całkowania.
  8.  
  9.  
  10. clear all;
  11. close all;
  12. clc;
  13.  
  14.  
  15. %Mamy nasze równanie w postaci dy/dt="coœ". To "coœ" wedle oznaczeń to jest
  16. %nasze fn i tak należy je podstawić do naszych danych wzorów metod. Sam się
  17. %trochę plštałem w tych oznaczeniach.
  18.  
  19. %Otwarta metoda Eulera (dy/dt=2yt/t^2+1)
  20.  
  21. y(1)=1;%Warunek poczštkowy. Pamiętamy że Matlab indeksuje od 1
  22.  
  23. h=0.1; %Krok calkowania
  24. t=0:h:10; %Dziedzina czasu z krokiem co h
  25.  
  26. N=length(t);
  27. for i=1:N-1
  28. y(i+1)=y(i)+h*2*(y(i)*t(i))/(t(i).^2+1); %yn+1=yn+h*fn, gdzie fn to nasze dyn/dtn
  29. end
  30.  
  31. y_dok=(t.^2+1); %Nasze analityczne rozwišzanie dokładne, mamy podane, że y0=1
  32.  
  33. %Rysujemy
  34. figure
  35. plot(t,y_dok,'-g')
  36. hold on;
  37. plot(t,y,'--r')
  38. legend('dokładne','wyliczone')
  39. title('Otwarta metoda Eulera')
  40. clear all; %Czyœcimy pamięć żeby nam się nie mieszało w następnych metodach
  41.  
  42. %Zamknięta metoda Eulera
  43.  
  44. %Czym się różni zamknięta metoda od otwartej? W zamkniętej po prawej
  45. %stronie wzoru metody mamy człon z n+1. Tzn że nasze rozwišzanie dla
  46. %kolejnej chwili czasowej niejako "zależy od samego siebie". Jest to
  47. %delikatna trudnoœć tych metod, ale za to sš one chyba dokładniejsze. W
  48. %każdym razie, za fn+1 podstawianmy naszš funkcję. Zatem z równania
  49. %yn+1= yn+h*fn+1, gdzie fn+1 = 2y(n+1)t(n+1) / t(n+1)^2+1, trzeba
  50. %wyznaczyć na kartce yn+1. Przykład czegoœ takiego dla Adamsa-Multona r.2i3
  51. %dołšczyłem do niniejszych rozwišzań.
  52.  
  53. y(1)=1;%Warunek poczštkowy
  54.  
  55. h=0.1; %Krok calkowania
  56. t=0:h:10;
  57. N=length(t);
  58.  
  59. y_dok=(t.^2+1);
  60. for i=1:N-1
  61. y(i+1)=y(i)/(1-(2*h*t(i))/(t(i)^2+1)); %Wyznaczone yn+1 wstawiamy w naszš pętlę
  62. end %Nasza metoda wtedy ładnie zadziała
  63.  
  64. figure
  65. plot(t,y_dok,'-g')
  66. hold on;
  67. plot(t,y,'--r')
  68. legend('dokładne','wyliczone')
  69. title('Zamknięta metoda Eulera')
  70.  
  71. clear all;
  72.  
  73. %Runge Kutty
  74.  
  75. y(1)=1;%Warunek poczštkowy
  76.  
  77. h=0.1; %Krok calkowania
  78. t=0:h:10;
  79. N=length(t);
  80.  
  81. %Tutaj cała trudnoœć polega na nie poplštaniu się w oznaczeniach.
  82. %Fn to nasza funkcja, h/2 *(...) jest problematyczne.
  83. %Drugi człon oznacza tyle, że do naszego fn zamiast tn podstawiamy
  84. %tn+1, a zamiast yn podstawiamy yn+h*fn, gdzie fn to znowu nasza funkcja.
  85. %Lekka incepcja i można się pogubić, ale przynajmniej nie trzeba z tego
  86. %potem nic wyznaczać.
  87.  
  88. y_dok=(t.^2+1);
  89. for i=1:N-1 %Wstaw sobie tš linijkę w wolframa i zobacz co mam na myœli, bo można oczoplšsu dostać
  90. y(i+1)=y(i)+ h/2*(2*y(i)*t(i)/(t(i)^2+1)+(2*t(i+1)*(y(i)+(2*h*y(i)*t(i))/(t(i)^2+1))/(t(i+1)^2+1)));
  91. end
  92.  
  93. figure
  94. plot(t,y_dok,'-g')
  95. hold on;
  96. plot(t,y,'--r')
  97. legend('dokładne','wyliczone')
  98. title('Runge Kutty')
  99.  
  100. %Gear r.2
  101.  
  102. %Wchodzimy w metody które wymagajš więcej niż jednego poprzednika. Tzn
  103. %potrzebujemy dwóch lub więcej następujšcych po sobie punktów startowych,
  104. %żeby to zadziałało. Tzw. metody wielokrokowe
  105.  
  106. %I tutaj zaczynajš się jaja. Byłem na konsultacjach u Opalskiego i
  107. %dowiedziałem się, że dla podanych nam kroków całkowania(h=0.5,0.1,0.01,0.001)
  108. %ta metoda Geara jest niestabilna, tzn pierwiastki równanania charekterystyczngo
  109. %leżš poza obszarem stabilnoœci. I prawdopodobnie mieliœmy to zauważyć metodš
  110. %prób i błędów, że skrócenie kroku całkowania generuje coraz większy błšd.
  111.  
  112. clear all;
  113. h=1; %Krok calkowania dla którego to działa
  114. y(1)=1;%Warunek poczštkowy
  115. y(2)=y(1)*(h^2+1);%Drugi warunek poczštkowy uzależniony od długoœci naszego kroku
  116. t=0:h:10;
  117. N=length(t);
  118.  
  119. y_dok=(t.^2+1);
  120. for i=2:N-1
  121. y(i+1)= ((4/3)*y(i)-(1/3)*y(i-1))/(1-(4/3)*t(i+1)/(t(i+1)^2+1));
  122. end
  123.  
  124. figure
  125. plot(t,y_dok,'-g')
  126. hold on;
  127. plot(t,y,'--r')
  128. legend('dokładne','wyliczone')
  129. title('Gear r.2')
  130.  
  131. %Adams-Bashforth r.2, któru również jest wielokrokowy i również œrednio
  132. %działa dla zadanych nam długoœci kroków. Ewentualnie pomyliłem się w
  133. %zapisie gdzieœ
  134.  
  135. clear all;
  136. h=2; %Krok calkowania, dla którego to w sumie już nie ma sensu, ale wykres jest w miarę
  137. y(1)=1;%Warunek poczštkowy
  138. y(2)=y(1)*(h^2+1);
  139. t=0:h:10;
  140. N=length(t);
  141.  
  142. y_dok=(t.^2+1);
  143. for i=2:N-1
  144. y(i+1) = y(i) + (h*3*((2*y(i)*t(i))/(t(i).^2+1))+ (2*y(i-1)*t(i-1))/(t(i-1).^2+1))/2;
  145. end
  146.  
  147. figure
  148. plot(t,y_dok,'-g')
  149. hold on;
  150. plot(t,y,'--r')
  151. legend('dokładne','wyliczone')
  152. title('Adams-Bashforth r.2')
  153.  
  154. %Adams-Multon r.2
  155.  
  156. clear all;
  157. h=0.1;
  158. y(1)=1;
  159. t=0:h:10;
  160. N=length(t);
  161.  
  162. y_dok=(t.^2+1);
  163. for i=1:N-1 %Tutaj załšczyłem o co chodzi z tym wyznaczaniem yn+1, gdyby ktoœ miał wštpliwoœci
  164. y(i+1) =(y(i)+ (h*y(i)*t(i))/(t(i)^2+1)) / (1- h*t(i+1)/(t(i+1)^2+1));
  165. end
  166.  
  167. figure
  168. plot(t,y_dok,'-g')
  169. hold on;
  170. plot(t,y,'--r')
  171. legend('dokładne','wyliczone')
  172. title('Adams-Multon r.2')
  173.  
  174. %Adams-Multon r.3
  175. %Ta metoda mimo że jest wielokrokowa to bardzo ładnie działa dla naszego
  176. %przypadku nawet dla kroku 0.5
  177. clear all;
  178. h=0.5;
  179. y(1)=1;
  180. y(2)=y(1)*(h^2+1);
  181. t=0:h:10;
  182. N=length(t);
  183.  
  184. y_dok=(t.^2+1);
  185. for i=2:N-1
  186. y(i+1)=(y(i)+(h/12)*(((16*y(i)*t(i))/(t(i)^2+1))-((2*y(i-1)*t(i-1))/(t(i-1)^2+1))))/(1-(10*h*t(i+1))/(12*(t(i+1)^2+1)));
  187. end
  188.  
  189. figure
  190. plot(t,y_dok,'-g')
  191. hold on;
  192. plot(t,y,'--r')
  193. legend('dokładne','wyliczone')
  194. title('Adams-Multon r.3')
  195.  
  196. %Długoœć kroku całkowania(h) możemy sobie zmieniać i patrzeć co się wtedy
  197. %dzieje. Co z błędami? W zasadzie interesuje nas tylko błšd maksymalny
  198. %danej metody, czyli największy jaki jest ona w stanie popełnić. Jeżeli
  199. %nawet on jest w miarę niski, to jesteœmy szczęœliwi. Jak go policzyć?
  200. %Mamy teraz w pamięci wartoœci z ostatniej metody więc robimy
  201. max_err_am3=max(abs(y_dok-y))
  202. %I mamy nasz błšd maksymalny. Teraz możnaby caaały ten długi kod wrzucić w
  203. %czterokrotnš pętlę dla zadanych kroków całkowania, pozbierać te błędy w tablicę i
  204. %wykreœlić ich zależnoœć od długoœci kroku przy pomocy loglog(), ale to już
  205. %łatwe.
  206.  
  207.  
  208.  
  209.  
  210. %Zostało jeszcze wyznaczenie kroku całkowania, dla którego Euler otwarty
  211. %robi się niestabilny. O stabilnoœci jest w ksišżce w rozdziale 9.3.2.
  212. %Euler otwarty jest stabilny, gdy lambdy leżš wewnštrz koła jednostkowego
  213. %o œrodku (-1,j0). Nasze równanie jest w postaci y'=lambda*y.
  214. %Nasza lambda=2t/(t^2+1), a warunek stabilnoœci to |h*lambda+1|<=1
  215. %Widzimy że potęga mianownika jest wyższa niż licznika, więc wydaje mi się,
  216. %że ta metoda będzie zawsze stabilna dla tego przykładu, ale mogę się mylić.
  217.  
  218.  
  219.  
  220. %No to teraz dla przećwiczenia można się pobawić z drugim przykładem czyli
  221. %dy/dt=(4-2y)/3
  222. %ale postępowanie jest identyczne więc już nie będę tego wszystkiego
  223. %przepisywał po raz drugi :D
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement