Схема интеграции - накопление ошибок итерации - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь написать ie некоторый код для симуляции системы из n-тел гравитационно связанных объектов. Я использую схему численного интегрирования Эйлера-Кромера. Когда алгоритм запускается, я знаю, что ожидается колебание скорости (кинетическая c энергия) относительно среднего значения, , однако, когда я выполняю код, я получаю net тенденцию к снижению скорости со временем , Как это можно исправить. Есть ли у кого-то опыт с такой проблемой?

Я считаю, что моя реализация верна, и у меня сложилось впечатление, что я пренебрегаю пренебрежимым эффектом в том, как python обрабатывает числа во время итераций (около 1 миллиона итераций).

График зависимости скорости от времени находится под кодом. Любые предложения относительно того, почему происходит это отклонение, приветствуются. Вот мой код:

import scipy  as sp
import numpy as np
import math
from scipy import constants
import matplotlib.pyplot as plt

G = sp.constants.G
m_mars = 6.4185*(10**23)
m_phobos = 1.06*(10**16)
init_r_phobos = 9.3773*(10**6)
init_v_phobos = math.sqrt((G*m_mars)/init_r_phobos)
delta_t = 0.0005
r1 = []
r2 = []
v = []
r_phobos = np.array([init_r_phobos,0])
v_phobos = np.array([0,init_v_phobos])
t = np.arange(0,500,delta_t)
#----------------------------------------------------------------------------
for delta_t in t:                      ##The problem is here##
    r_norm = np.linalg.norm(r_phobos)

    a_phobos = -(G*m_mars*r_phobos/(r_norm**3))

    v_phobos = v_phobos + (a_phobos*delta_t)
#----------------------------------------------------------------------------    
    r_phobos = r_phobos + (v_phobos*delta_t)
    r1.append(r_phobos[0])
    r2.append(r_phobos[1])

    v.append(np.linalg.norm(v_phobos))

f, ax = plt.subplots()
points = ax.scatter(t,v)   

Скорость в зависимости от графика времени: где большое число итераций и небольшой интервал времени делают колебания похожими на одну толстую линию. enter image description here Здесь более длительное отклонение:

enter image description here

...