我试图通过编写以下代码来绘制N Body问题:
预期输出是以0,0
为焦点的省略号。但我得到了直线。任何人都可以在代码中找出错误。用于模拟2个物体的数据是:
Mass 1.99E+30 3.30E+23 x Velocity 0 0 y Velocity 0.00E+00 5.90E+04 x position 0 4.60E+10 y
position
%--------------------------------------------------------------------------------------------------------
GravConst=6.67408e-11;
input='NBodyData.csv';
inputArray=csvread(input,0,1);
n=size(inputArray,2); %Number of Bodies
tIni =0; %Initial Time
tFinal =3600*24*365; %Final Time
deltaT=100; %(tFinal-tIni)/(tN-1); %Time Interval
tN=tFinal/deltaT;
X=zeros(n,tN); %Stores x coordinate at time t
Y=zeros(n,tN); %Stores y coordinate at time t
Vx=zeros(n,tN);%Stores x component of velocity
Vy=zeros(n,tN);%stores y component of velocity
mass(1:n,1)=(inputArray(1,:)') ; %'Column Vector to Store Mass of n bodies
Xini(1:n,1)=(inputArray(4,:)'); %'[0;0.3127;0.7307;1;1.4047;5.019;9.1954;18.6368;30.21;30.16];%Stores initial x coordinate
Yini(1:n,1)=(inputArray(5,:)'); %'[0;0;0;0;0;0;0;0;0;0];%Stores initial y coordinate
Vxini(1:n,1)=(inputArray(2,:)');%'Stores x component of initial velocity
Vyini(1:n,1)=(inputArray(3,:)');%'Stores y component of initial velocity
%r=zeros(n,n,tN);%Stores distance of masses
%--------------------------------------------------------
%Read Initial Position and Velocities
%--------------------------------------------------------
X(1:n,1)=Xini(1:n,1);
Y(1:n,1)=Yini(1:n,1);
Vx(1:n,1)=Vxini(1:n,1);
Vy(1:n,1)=Vyini(1:n,1);
fx=zeros(n,tN);
fy=zeros(n,tN);
%--------------------------------------------------------
%Iteration Starts
%--------------------------------------------------------
T=1
while(T<tN)
%Calculation of force
%
for i=1:n
fx(i,T)=0;
fy(i,T)=0;
for j=1:n
if i~=j
fx(i,T)= fx(i,T)+ GravConst*mass(j,1)*(X(i,T)-X(j,T))/ ( (X(i,T)-X(j,T))^2+(Y(i,T)-Y(j,T))^2 )^1.5 ;
fy(i,T)= fy(i,T)+ GravConst*mass(j,1)*(Y(i,T)-Y(j,T))/ ( (X(i,T)-X(j,T))^2+(Y(i,T)-Y(j,T))^2 )^1.5 ;
end
end
end
%----------------------------------------------------
%Calculate Velocities and Position at next time level
%----------------------------------------------------
for i=1:n
if(T==1)
X(i,T+1)=X(i,T)+deltaT*Vx(i,1)+0.5*(deltaT*deltaT)*fx(i,T);
Y(i,T+1)=X(i,T)+deltaT*Vy(i,1)+0.5*(deltaT*deltaT)*fy(i,T);
else
X(i,T+1)=2*X(i,T)-X(i,T-1)+(deltaT*deltaT)*fx(i,T);
Y(i,T+1)=2*Y(i,T)-Y(i,T-1)+(deltaT*deltaT)*fy(i,T);
end
end
T=T+1
end
%-----------------------------------------------------
X = (250/1e18)*X;
Y = (250/1e18)*Y;
close all;
figure(1)
for i=1:n
plot(X(i,:),Y(i,:));
hold on;
end
figure(2)
plot(X(2,:),Y(2,:));
%--------------------------------------------------------------