Advertisement
Guest User

Untitled

a guest
Oct 20th, 2018
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.26 KB | None | 0 0
  1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2. %%%%%%%%%%%%%%%%%%%% GRAVITATION %%%%%%%%%%%%%%%%%%%%
  3. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4.  
  5. clear;
  6. clc;
  7. %n=randi([10,15]);
  8. n=3;%n är antalet kroppar, 10-15st
  9. XYM=rand(3,n)*(1000-10); %En matris med x- och y-koordninater
  10. %och massa för varje kropp.
  11. %(varje kolumn är en kropp)
  12.  
  13. t=0; %tid, vilket används för
  14. %beräkningar, är i början 0
  15.  
  16. v0X=zeros(1,n); %Begynnelsehastigheter=0
  17. v0Y=zeros(1,n);
  18.  
  19. G=6.673e-11; %Gravitationskonstanten
  20.  
  21.  
  22.  
  23. while n>1
  24.  
  25.  
  26. %Kropparna plottas
  27. sz=XYM(3,:);
  28. scatter(XYM(1,:),XYM(2,:),sz,XYM(3,:),'filled')
  29. axis([-250 1250 -250 1250])
  30. whitebg('k')
  31. title(['Gravitationssimulering, antal kroppar: ',num2str(n),'st']);
  32. xlabel('x','FontSize',14);
  33. ylabel('y','FontSize',14);
  34. colormap(jet(size(XYM,1)));
  35. grid on
  36.  
  37. pause(.02)
  38.  
  39.  
  40. %%Avstånden beräknas mellan kropparna, även i x och y
  41.  
  42.  
  43.  
  44. %dist är absolutavstånden mellan kropparna
  45. dist = hypot(XYM(1, :) - XYM(1, :)', XYM(2, :) - XYM(2, :)');
  46.  
  47.  
  48. %distX är avstånden i x
  49. m=n;
  50. distX=zeros(m,n);
  51. for i2=1:m
  52. for j2=1:n
  53.  
  54. distX(j2, i2) = XYM(1, i2) - XYM(1,j2);
  55.  
  56. end
  57. end
  58.  
  59.  
  60.  
  61. %distY är avstånden i y
  62. distY=zeros(m,n);
  63. for i3=1:m
  64. for j3=1:n
  65.  
  66. distY(j3, i3) = XYM(2, i3) - XYM(2,j3);
  67.  
  68. end
  69. end
  70.  
  71.  
  72. %Krafterna beräknas med formeln F=G*M1*M2/dist^2. Krafterna i x och y
  73. %ska även beräknas, vilket är varför distX och distY behövs
  74. F=zeros(m,n);
  75. for i4=1:m
  76. for j4=1:n
  77.  
  78. F(j4,i4)=(G*XYM(3,i4)*XYM(3,j4))/(dist(i4,j4).^2);
  79.  
  80. end
  81. end
  82.  
  83. F(~isfinite(F))=0;
  84. F=-F;
  85.  
  86.  
  87. %k är en variabel vars syfte är att göra beräkningar enklare
  88.  
  89. %Vinkeln mellan linjen från en kropp till en annan och x-axeln
  90. %beräknas, för alla kroppar
  91. k=zeros(m,n);
  92. vinkel=zeros(m,n);
  93. for i5=1:m
  94. for j5=1:m
  95.  
  96. if distX(i5,j5)<0 && distY(i5,j5)<0
  97.  
  98. k(i5,j5)=distY(i5,j5)./distX(i5,j5);
  99. vinkel(i5,j5)=atand(k(i5,j5));
  100. vinkel(i5,j5)=vinkel(i5,j5)+180;
  101.  
  102. elseif distX(i5,j5)<0 && distY(i5,j5)>0
  103.  
  104. k(i5,j5)=distY(i5,j5)./distX(i5,j5);
  105. vinkel(i5,j5)=atand(k(i5,j5));
  106. vinkel(i5,j5)=abs(vinkel(i5,j5))+90;
  107.  
  108. elseif distX(i5,j5)==0 && distY(i5,j5)==0
  109.  
  110. vinkel(i5,j5)=0;
  111.  
  112. else
  113.  
  114. k(i5,j5)=distY(i5,j5)./distX(i5,j5);
  115. vinkel(i5,j5)=atan(k(i5,j5));
  116.  
  117. end
  118.  
  119.  
  120. end
  121. end
  122.  
  123.  
  124. %Krafterna i varje axel beräknas
  125. FX=F.*cosd(vinkel);
  126. FY=F.*sind(vinkel);
  127. FX=sum(FX);
  128. FY=sum(FY);
  129.  
  130.  
  131.  
  132. %Acceleration i x och y beräknas, för varje kropp
  133. aX=FX./XYM(3,:);
  134. aY=FY./XYM(3,:);
  135.  
  136. %Hastigheter i x och y beräknas från accelerationen
  137. v0X=v0X+aX*t;
  138. v0Y=v0Y+aY*t;
  139.  
  140. %Avstånden som varje kropp färdas efter t tid beräknas från hastigheten
  141. %och accelerationen
  142. sX=v0X*t+(aX.*t^2)/2;
  143. sY=v0Y*t+(aY.*t^2)/2;
  144.  
  145. %Avstånden som varje kropp färdas läggs till på deras nuvarande
  146. %position
  147. XYM(1,:)=XYM(1,:)+sX;
  148. XYM(2,:)=XYM(2,:)+sY;
  149.  
  150.  
  151. %Vi begränsar x- och y-koordinaterna till mellan -1000 och 2000
  152. for i6=1:m
  153.  
  154. if XYM(1,i6)>1250
  155.  
  156. v0X(1,i6)=0;
  157. XYM(1,i6)=1250;
  158.  
  159. elseif XYM(1,i6)<-250
  160.  
  161. v0X(1,i6)=0;
  162. XYM(1,i6)=-250;
  163.  
  164. elseif XYM(2,i6)>1250
  165.  
  166. v0Y(1,i6)=0;
  167. XYM(2,i6)=1250;
  168.  
  169. elseif XYM(2,i6)<-250
  170.  
  171. v0X(1,i6)=0;
  172. XYM(2,i6)=-250;
  173.  
  174. else
  175.  
  176. end
  177.  
  178. end
  179.  
  180.  
  181.  
  182. %%Kropparna kommer adderas om de är like med eller mindre än 10
  183. %%längdenheter ifrån varandra
  184.  
  185. %d är en matris som ger ettor om två kroppar är nära varandra
  186. d=dist<=10;
  187. d=d-eye(m,n);
  188.  
  189. %c summerar d
  190. c=sum(sum(d));
  191.  
  192. %om c>0 så är två kroppar nära varandra och måste adderas
  193. if c>0
  194.  
  195. %r används för att hitta vilka kroppar som är nära varandra i
  196. %XYM-matrisen genom att hitta var ettorna finns i matrisen d
  197. [r,c]=find(d);
  198. %a är den första kroppen i kollisionen
  199. a=r(1,1);
  200. %b är den andra kroppen i kollisionen
  201. b=r(2,1);
  202.  
  203. %De nya hastigheterna efter kollisionen beräknas och ersätter
  204. %hastigheten för kropp a
  205. v0X(:,a)=(XYM(3,a).*v0X(:,a)+XYM(3,b).*v0X(:,b))/(XYM(3,a)+XYM(3,b));
  206. v0Y(:,a)=(XYM(3,a).*v0Y(:,a)+XYM(3,b).*v0Y(:,b))/(XYM(3,a)+XYM(3,b));
  207.  
  208. %Hastigheterna för kroppen b tas bort
  209. v0X(:,b)=[];
  210. v0Y(:,b)=[];
  211.  
  212. %Massorna av a och b adderas och ersätter massan för a
  213. XYM(3,a)=XYM(3,a)+XYM(3,b);
  214. %Kropp b tas bort
  215. XYM(:,b)=[];
  216.  
  217. %n, vilket är antalet kroppar, reduceras
  218. n=n-1;
  219. %m används för loopar och måste vara lika med n
  220. m=n;
  221.  
  222. end
  223.  
  224. %Det går 60 sekunder för varje while-loop
  225. t=t+60;
  226.  
  227. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement