我试图用牛顿运动和引力定律来解决n体问题,以获得速度分布。
我尝试使用RK4然后使用蛙跳算法,同时软化潜力,但我无法获得足够准确的结果,因为如果两个物体靠得太近,那么就会越来越近能量变得很大,所以它不再被保存,使得分裂变得毫无用处。
似乎唯一有用的技巧是缩短时间步长。然而,这带来了巨大的运行时价格。
我正在寻找改进代码的方法,以便保留能量并使程序运行时更合理。 相关部分是:(请注意:所有质量相等,G设置为1,我需要将大时间间隔与最大时间步长相结合,以获得良好的结果。代码中的变量e是潜在的柔软剂,并且设置0.005)
如果您对时间步长/ e /其他常数的良好值有建议,我们将非常感激。
for i=1:(length(t)-1)
for a1=1:n
for a2=1:n
if a1~=a2
r(a1,a2)=sqrt((qstar(a1,i)-qstar(a2,i))^2+(qstar(a1+n,i)-qstar(a2+n,i))^2+(qstar(a1+2*n,i)-qstar(a2+2*n,i))^2); %Distances
b(a1,a2)=1/(r(a1,a2)+e)^3; %Force component
PE(1,i)=PE(1,i)+1/r(a1,a2); %Potential Energy
A2(a1,a1)=A2(a1,a1)-b(a1,a2); %Forming the ODE Matrix
A2(a1,a2)=b(a1,a2);
A3(a1,a1+n)=A3(a1,a1+n)-b(a1,a2);
A3(a1,a2+n)=b(a1,a2);
A4(a1,a1+2*n)=A4(a1,a1+2*n)-b(a1,a2);
A4(a1,a2+2*n)=b(a1,a2);
end
end
V(a1,i)=sqrt((qstar(a1+3*n,i))^2+(qstar(a1+4*n,i))^2+(qstar(a1+5*n,i))^2); %velocity
end
PE(1,i)=0.5*PE(1,i);
A=vertcat(A1,A2,A3,A4);
if i==1 %RK4
k1 = A*qstar(:,i); % Approx for y gives approx for deriv
y1 = qstar(:,i)+k1*h/2; % Intermediate value (using k1)
k2 = A*y1; % Approx deriv at intermediate value.
y2 = qstar(:,i)+k2*h/2; % Intermediate value (using k2)
k3 = A*y2; % Another approx deriv at intermediate value.
y3 = qstar(:,i)+k3*h; % Endpoint value (using k3)
k4 = A*y3; % Approx deriv at endpoint value.
qstar(:,i+1) = qstar(:,i) + (k1+2*k2+2*k3+k4)*h/6; % Approx soln
else %leapfrog
acce = A*qstar; % Approx for accelaration
qstar(:,i+1) = qstar(:,i-1) + 2*h*acce(:,i); % Approx soln
end
A2=zeros(n,6*n);
A3=zeros(n,6*n);
A4=zeros(n,6*n);
end
我形成了一个矩阵,当乘以qstar时,它将给出运动定律。 qstar存储位置和速度,它是这样的:
X1,X2,...,XN,Y1,...,YN,Z 1,...,锌,PX1,...,PXN,PY1,...,PYN,PZ1,... PZN
只有垂直。 x1表示身体编号1的x轴上的位置,而py4表示身体4沿y轴的动量。