N-body simulation python

#python #simulation #numerical-methods #orbital-mechanics #verlet-integration

#python #Симуляция #численные методы #орбитальная механика #verlet-интеграция

Вопрос:

Я пытаюсь закодировать код моделирования N-body на python, и мне успешно удалось создать систему с участием Солнца, Земли и Юпитера, как показано ниже, используя метод аппроксимации чехарды.
Система Солнца, Земли, Юпитера

Однако, когда я пытаюсь расширить один и тот же код для N тел одинаковой массы с нулевой скоростью, я не получаю ожидаемого результата формирования системы. Вместо этого создается следующее, где тела распределяются после первоначального притяжения друг к другу. введите описание изображения здесь

Этот же шаблон реплицируется независимо от количества используемых начальных частиц.

введите описание изображения здесь

Это второе изображение — просто увеличенная версия первого, показывающая, что они изначально притягиваются друг к другу.

Заставляя меня поверить, что ошибка должна заключаться в моих начальных условиях:

 N = 3
mass = 1e30
R = 1e10
V = np.zeros([N,3])
M = np.full([N],mass)
P = np.random.uniform(-R, R, (N,3))
epsilon = 0.1 * R
 

вычисление ускорения:

 def calc_acceleration(position, mass, softening):
    
    G = 6.67 * 10**(-11)
    
    N = position.shape[0] # N = number of rows in particle_positions array
    acceleration = np.zeros([N,3])
    
    #print(N)
    for i in range(N):
        #print(i)
        for j in range(N):
            if i != j:
                #print("j", j)
                dx = position[i,0] - position[j,0]
                dy = position[i,1] - position[j,1]
                dz = position[i,2] - position[j,2]
                
                #print(dx,dy,dz)
                
                inv_r3 = ((dx**2   dy**2   dz**2   softening**2)**(-1.5))
                
                acceleration[i,0]  = - G * mass[j] * dx * inv_r3
                acceleration[i,1]  = - G * mass[j] * dy * inv_r3
                acceleration[i,2]  = - G * mass[j] * dz * inv_r3

    return(acceleration)
 

функции скачкообразной лягушки:

 def calc_next_v_half(position, mass, velocity, softening, dt):
    half_velocity = np.zeros_like(velocity)
    half_velocity = velocity   calc_acceleration(position, mass, softening) * dt/2
    return(half_velocity)
       

def calc_next_position(position, mass, velocity, dt):
    next_position = np.zeros_like(position)
    
    next_position = position   velocity * dt
    
    return(next_position)
 

фактическая функция программы:

 def programe(position, mass, velocity, softening, time, dt):
    
    no_of_time_steps = (round(time/dt))

    all_positions = np.full((no_of_time_steps, len(mass), 3), 0.0)
    all_velocities = []
    
    kinetic_energy = []
    potential_energy = []
    total_energy = []
        
        
    for i in range(no_of_time_steps):
        all_positions[i] = position
        all_velocities.append(velocity)

        'leap frog'
        velocity = calc_next_v_half(position, mass, velocity, softening, dt)    
        position = calc_next_position(position, mass, velocity, dt)    
        velocity = calc_next_v_half(position, mass, velocity, softening, dt)
        

    return(all_positions, all_velocities, kinetic_energy, potential_energy, total_energy)
 

Комментарии:

1. Это похоже на числовой артефакт, они ускоряются друг к другу, тогда числа становятся действительно огромными из-за зависимости r ^ 2, что приводит к его удалению из системы. Я думаю, что если вы установите некоторый порог близости, который могут иметь тела, это поможет и потенциально предотвратит его взрыв.

Ответ №1:

Проблема в том, что симплектические методы обладают своими особыми свойствами только до тех пор, пока системы остаются вдали от каких-либо особенностей. Для гравитационной системы это имеет место, если она иерархична, как в солнечной системе с солнцем, планетами и лунами, где все орбиты имеют низкие эксцентриситеты.

Однако, если вы рассматриваете «звездное скопление» с объектами примерно одинаковой массы, вы не получаете эллипсов Кеплера, и вероятность очень близких столкновений становится довольно высокой. Тем более, что ваше начальное условие нулевой скорости приводит к первоначальному свободному падению всех звезд к общему центру тяжести, что также можно увидеть на вашем детальном изображении.

Из-за потенциальной энергии, падающей в сингулярность, кинетическая энергия увеличивается с уменьшением расстояния, поэтому близкие столкновения равны высокой скорости. При постоянном размере шага, как в методе leapfrog-Verlet, частота дискретизации становится слишком малой, чтобы представить кривую, полностью захватить переход. Экономия энергии грубо нарушается, и высокая скорость сохраняется за пределами близкого контакта, что приводит к нефизическому взрыву системы.