任何N的MATLAB中的N体模拟:

时间:2016-03-15 11:43:29

标签: matlab

我试图通过编写以下代码来绘制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,:));
%--------------------------------------------------------------

0 个答案:

没有答案
相关问题