提高n体运动的准确性

时间:2015-09-01 07:15:00

标签: algorithm

我试图用牛顿运动和引力定律来解决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轴的动量。

1 个答案:

答案 0 :(得分:2)

你应该使用symplectic integrator,因为它会大致保留能量。