Algorithm 提高n体运动的精度

Algorithm 提高n体运动的精度,algorithm,Algorithm,我试图用牛顿运动定律和万有引力来解决n体问题,以得到速度分布 我尝试过使用RK4,然后是蛙跳算法,同时软化了势,但我无法得到足够精确的结果,因为如果两个物体靠得太近,那么数字就会上升,能量会变成一个巨大的数字,因此它不再被保留,这使得分布没有用 唯一有效的方法是缩短时间步长。然而,这需要付出巨大的运行时代价 我正在寻找改进我的代码的方法,这样可以节省能源,并且程序运行时也会合理。 相关部分是:(请注意:所有质量都是相等的,G设置为1,我需要将大时间间隔与最大时间步长进行整合,以获得良好的结果。代

我试图用牛顿运动定律和万有引力来解决n体问题,以得到速度分布

我尝试过使用RK4,然后是蛙跳算法,同时软化了势,但我无法得到足够精确的结果,因为如果两个物体靠得太近,那么数字就会上升,能量会变成一个巨大的数字,因此它不再被保留,这使得分布没有用

唯一有效的方法是缩短时间步长。然而,这需要付出巨大的运行时代价

我正在寻找改进我的代码的方法,这样可以节省能源,并且程序运行时也会合理。 相关部分是:(请注意:所有质量都是相等的,G设置为1,我需要将大时间间隔与最大时间步长进行整合,以获得良好的结果。代码中的变量e是潜在的软化剂,设置为0.005)

如果您对timestep/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,z1,…,zn,px1,…,pxn,py1,…,pyn,pz1,…,pzn


只有垂直的。x1表示体号1在x轴上的位置,py4表示体号4沿y轴的动量。

您应该使用a,因为它将大致保持能量。

我不太明白您的问题是什么。我正在寻找一种方法来改进代码运行时,无论是通过使用另一种算法还是一些小的调整,你都可以帮助我使用这段代码。你熟悉自适应步长RK方法吗?你可能会很幸运。是的,我在蛙跳之前尝试过RK4的自适应步长,但没有成功。@Talco你需要扩展到“没有成功”。步长的估计误差范围是否始终在合理范围内?如果不是,为什么不呢?据我所知,蛙跳是一种神韵,所以它应该能保存能量。