Simulating gravity, forces seem to be miscalculated (need help)
이전 댓글 표시
I am trying to simulate how 5-15 different bodies affect eachother in terms of gravity.
This is my first time coding, so needless to say I need some help.
The problem is that the forces acting on the bodies seem to be miscalculated or at least are acting in the wrong direction, for instance all forces are positive in the x-axis. Some of the bodies seem to "run away" when another gets close.
Here is my code so far (sorry if it is a mess).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%GRAVITATION %%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear;
clc;
n=randi([5,15]); %n is the amount of bodies
XYM=rand(3,n)*(1000-10); %A matrix with x- and y-coordinates and mass of each body. (Each column is a
body)
t=0;
v0X=zeros(1,n);
v0Y=zeros(1,n);
G=6.673e-11;
while n>1
sz=XYM(3,:);
c=gradient(XYM(3,:));
scatter(XYM(1,:),XYM(2,:),sz,c,'filled')
whitebg('k')
pause(.02)
%Distances are calculated, also in x and y
m=n;
dist=zeros(m,n);
for i1=1:m
for j1=1:n
dist(j1, i1) = sqrt((XYM(1,i1) - XYM(1, j1)) ^ 2 + ...
(XYM(2,i1) - XYM(2,j1)) ^ 2);
end
end
distX=zeros(m,n);
for i2=1:m
for j2=1:n
distX(j2, i2) = XYM(1, i2) - XYM(1,j2);
end
end
distY=zeros(m,n);
for i3=1:m
for j3=1:n
distY(j3, i3) = XYM(2, i3) - XYM(2,j3);
end
end
%The forces are calculated and summed
F=zeros(m,n);
for i4=1:m
for j4=1:n
F(j4,i4)=(G*XYM(3,i4)*XYM(3,j4))/(dist(i4,j4).^2);
end
end
F(~isfinite(F))=0;
k=distY./distX;
k(isnan(k))=0;
angle=atan(k);
FX=F.*cos(angle);
FY=F.*sin(angle);
FX=sum(FX);
FY=sum(FY);
%Force (FX,FY) -> acceleration (aX,aY) -> velocity (v0X,v0Y) -> distance
travelled (sX,sY)
aX=FX./XYM(3,:);
aY=FY./XYM(3,:);
v0X=v0X+aX*t
v0Y=v0Y+aY*t;
sX=v0X*t+(aX.*t^2)/2;
sY=v0Y*t+(aY.*t^2)/2;
XYM(1,:)=XYM(1,:)+sX;
XYM(2,:)=XYM(2,:)+sY;
%Bodies put together when less or equal to 10 units away from eachother
d=dist<=10;
d=d-eye(m,n);
c=sum(sum(d));
if c>0
[r,c]=find(d);
a=r(1,1);
b=r(2,1);
v0X(:,a)=(XYM(3,a).*v0X(:,a)+XYM(3,b).*v0X(:,b))/(XYM(3,a)+XYM(3,b));
v0Y(:,a)=(XYM(3,a).*v0Y(:,a)+XYM(3,b).*v0Y(:,b))/(XYM(3,a)+XYM(3,b));
v0X(:,b)=[];
v0Y(:,b)=[];
XYM(3,a)=XYM(3,a)+XYM(3,b);
XYM(:,b)=[];
n=n-1;
m=n;
end
t=t+60;
end
What are the flaws of the code, if any? Am I even on the right track?
댓글 수: 3
Guillaume
2018년 10월 19일
I also don't really have time to go through the code and try to understand it (it needs a lot more comments, each variable should say what its purpose is). You can certainly simplify your code and probably get rid of all the loops. For example, to calculate dist you can use pdist2 or simply:
%no need to preallocate dist, just calculate it all in one go with:
dist = hypot(XYM(1, :) - XYM(1, :)', XYM(2, :) - XYM(2, :)');
Viktor Bodin
2018년 10월 19일
Viktor Bodin
2018년 10월 19일
편집: Viktor Bodin
2018년 10월 19일
답변 (1개)
James Tursa
2018년 10월 19일
I don't have the time to step through your code, but I don't see where you set the sign of F as an attracting force. Maybe all you need to do is flip the sign of F just before you start calculating the accelerations:
F = -F;
카테고리
도움말 센터 및 File Exchange에서 Aerospace Applications에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!