Advertisement
Guest User

Untitled

a guest
Oct 14th, 2019
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.00 KB | None | 0 0
  1. clear, close, clc
  2. format long
  3. g = 9.82;
  4. l = 0.5;
  5. fel = 1;
  6. %% fråga a: beräkna periodtiden T för motsvarande theta0, gör tabell.
  7. n = 10; %antal trapetser, valfritt SÄTT FIXERAT JUST NU.
  8. Ttab = []; %Variabel med alla perioder
  9. runs = 1;
  10. vinklar = [5:5:90];
  11. for theta0 = pi/36:pi/36:pi/2 % intervall för vinkeln som massan släpps från
  12. k = sin(theta0/2); %k värdet givet i uppgift
  13. f=@(alpha)1/(sqrt(1-k^2*sin(alpha)^2)); %funktionen i integralen
  14. a = 0; %lower limit
  15. b = pi/2; %upper limit
  16. %trapetsmetoden säger; hitta ett avstånd h mellan punkter för att få
  17. %regelbundna trapetser under kurvan för att kunna beräkna dess
  18. %area/integral.
  19. h = (b-a)/(n); %regelbundna steglängd mellan trapetserna
  20. s = 0.5*(f(a)+f(b)); %summan av första delen av trapetsmetoden.
  21. for i = 1:n-1
  22. s = s + f(a + i*h);
  23. end %antal trapetser varierar beroende på n som vi väljer
  24. % större n -> mer exakt svar
  25. Itheta0 = h * s; %integralen klar här.
  26. T = 4*sqrt(l/g)*Itheta0;
  27. Ttab = [Ttab T];
  28. end
  29. T1 = table(Ttab',vinklar');
  30. T1.Properties.VariableNames = {'Periodtid','Vinklar'};
  31. disp(T1)
  32. plot(Ttab(5),s)
  33. figure
  34. %% b) för små vinklar theta kan approximeringen theta = sin(theta)
  35. %som ger periodtiden Ta = 2*pi*sqrt(l/g)
  36. %relativa felet;
  37. Ta = 2*pi*sqrt(l/g);
  38. rel_fel = abs(Ttab-Ta)./Ttab;
  39. rel_fel = rel_fel';
  40. felprocent = rel_fel.*100 %här står procentuellt fel
  41. %% c) Runge-kuttas metod
  42. g = 9.82;
  43. l = 0.5;
  44. h = 0.1;
  45. t = [0:h:2]; %tiden
  46. T = t(end);
  47. vt = [0 2];
  48. theta25 = (25*pi)/180; %begynnelsevinkel 25
  49. theta50 = (50*pi)/180; % 50
  50. v25 = [0]; %begynnelse hastighet
  51. v50 = [0];
  52. fv = @(t, theta, v) -g/l * sin(theta); %dv/dt
  53. ftheta= @(t, theta, v) v; %dtheta/dt
  54. for i =1:T/h
  55. k1v25 = h*fv(t(i), theta25(i), v25(i));
  56. k1theta25 = h*ftheta(t(i), theta25(i), v25(i));
  57. k2v25 = h*fv(t(i)+h/2, theta25(i) + k1theta25/2, v25(i) + k1v25/2);
  58. k2theta = h*ftheta(t(i)+h/2, theta25(i) + k1theta25/2, v25(i) + k1v25/2);
  59. k3v25 = h*fv(t(i)+h/2, theta25(i) + k2theta/2, v25(i)+k2v25/2);
  60. k3theta = h*ftheta(t(i)+h/2, theta25(i) + k2theta/2, v25(i)+k2v25/2);
  61. k4v25 = h*fv(t(i)+h,theta25(i)+k3theta, v25(i)+k3v25);
  62. k4theta = h*ftheta(t(i)+h,theta25(i)+k3theta, v25(i)+k3v25);
  63. tot_theta =theta25(i) + (1/6)*(k1theta25 + 2*k2theta + 2*k3theta + k4theta);
  64. theta25= [theta25 tot_theta];
  65. tot_v25 = v25(i) + (1/6)*(k1v25 + 2*k2v25 + 2*k3v25 + k4v25);
  66. v25 = [v25 tot_v25];
  67.  
  68. k1v50 = h*fv(t(i), theta50(i), v50(i));
  69. k1theta50 = h*ftheta(t(i), theta50(i), v50(i));
  70. k2v50 = h*fv(t(i)+h/2, theta50(i) + k1theta50/2, v50(i) + k1v50/2);
  71. k2theta50 = h*ftheta(t(i)+h/2, theta50(i) + k1theta50/2, v50(i) + k1v50/2);
  72. k3v50 = h*fv(t(i)+h/2, theta50(i) + k2theta50/2, v50(i)+k2v50/2);
  73. k3theta50 = h*ftheta(t(i)+h/2, theta50(i) + k2theta50/2, v50(i)+k2v50/2);
  74. k4v50 = h*fv(t(i)+h,theta50(i)+k3theta50, v50(i)+k3v50);
  75. k4theta50 = h*ftheta(t(i)+h,theta50(i)+k3theta50, v50(i)+k3v50);
  76. tot_theta =theta50(i) + (1/6)*(k1theta50 + 2*k2theta50 + 2*k3theta50 + k4theta50);
  77. theta50= [theta50 tot_theta];
  78. tot_v50 = v50(i) + (1/6)*(k1v50 + 2*k2v50 + 2*k3v50 + k4v50);
  79. v50 = [v50 tot_v50];
  80.  
  81. end
  82. subplot(2,1,1);
  83. plot(t,theta25,'linewidth',2)
  84. xlabel('Tid (s)','fontsize',15)
  85. ylabel('Vinkel (rad)','fontsize',15)
  86. hold on
  87. plot(t,theta50,'linewidth',2)
  88. title('Theta(t)','fontsize',15)
  89. legend('25','50')
  90.  
  91. % periodtiden
  92.  
  93. %% ode45 --------- uppgift e
  94. subplot(2,1,2);
  95. theta25_0 = (25*pi)/180; %begynnelsevinkel 25
  96. theta50_0 = (50*pi)/180;
  97. [tt,yy] = ode45(@(tt,yy) diff(tt,yy),[0 2],[theta25_0 0] );
  98. [ttt,yyy] = ode45(@(tt,yy) diff(tt,yy),[0 2],[theta50_0 0] );
  99. plot(tt, yy(:,1),'linewidth',2)
  100. title('Ode45 Check', 'fontsize',15)
  101. xlabel('Tid (s)','fontsize',15)
  102. ylabel('Vinkel (rad)','fontsize',15)
  103. hold on
  104. plot(ttt,yyy(:,1),'linewidth',2)
  105. legend('25','50')
  106.  
  107.  
  108. %% funktion för ode45--------
  109. function dydt = diff(tt,yy)
  110. dydt= zeros(2, 1);
  111. dydt(1)=yy(2);
  112. dydt(2)=(-9.82/0.5)*sin(yy(1));
  113. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement