Парные дифференциальные уравнения, использующие Python - PullRequest
4 голосов
/ 21 марта 2020

Я пытаюсь решить систему геодезических орбитальных уравнений, используя python. Они связаны обычными уравнениями. Я пробовал разные подходы, но все они дали мне неправильную форму (форма должна быть некоторой функцией periodi c при построении r и phi). Есть идеи, как это сделать? Вот мои константы

G = 4.30091252525 * (pow(10, -3)) #Gravitational constant in (parsec*km^2)/(Ms*sec^2)
c = 0.0020053761 #speed of light , AU/sec
M = 170000 #mass of the central body, in solar masses
m = 10 #mass of the orbiting body, in solar masses
rs = 2 * G * M / pow(c, 2) #Schwarzschild radius
Lz= 0.000024 #Angular momemntum
h = Lz / m #Just the constant  in equation
E= 1.715488e-007 #energy

И начальные условия:

Y(0) = rs
Phi(0) = math.pi

Орбитальные уравнения

image

Как я пытался это сделать:

def rhs(t, u):
    Y, phi = u
    dY = np.sqrt((E**2 / (m**2 * c**2) - (1 - rs / Y) * (c**2 + h**2 / Y**2)))
    dphi = L / Y**2
    return [dY, dphi]

Y0 = np.array([rs,math.pi])
sol = solve_ivp(rhs, [1, 1000], Y0, method='Radau', dense_output=True)

1 Ответ

4 голосов
/ 26 марта 2020

Похоже, что вы смотрите на пространственные координаты в инвариантной плоскости уравнений геодезии c объекта, движущегося в гравитации Шварцшильда.

Можно использовать много разных методов, которые сохраняют как можно большую часть базовой геометрии c структуры модели, например, симплект c геометрии c интеграторов или теории возмущений. Тем не менее, я подозреваю, что метод default_ivp () по умолчанию - это Runge-Kutta 4-го порядка, который является довольно хорошим, прямым и простым методом.

Warnng: ваше начальное условие для Y равно радиусу Шварцшильда, поэтому эти уравнения могут не работать или требовать особой обработки (особенно временная составляющая уравнений, которую вы здесь не включили!) Возможно, вы приходится переключаться на разные координаты, которые убирают сингулярность на ровном горизонте. Более того, решения могут быть не периодическими c кривыми, а квазипериодическими c, поэтому они могут не очень хорошо закрываться.

Для быстрой и грязной обработки, но, возможно, довольно точной, я бы дифференцировал первое уравнение

(dr / dtau)^2 = (E2_mc2 - c2) + (2*GM)/r - (h^2)/(r^2) + (r_schw*h^2)/(r^3)

относительно подходящего времени tau, затем отменил бы первое производная dr / dtau по r с обеих сторон, и заканчивается уравнение со второй производной для радиуса r слева. Затем превратите это второе уравнение в производную в пару уравнений первой производной для r и скорости его изменения v, то есть

dphi / dtau = h / (r^2)
  dr / dtau = v
  dv / dtau = - GM / (r^2) + h^2 / (r^3) - 3*r_schw*(h^2) / (2*(r^4))

, и рассчитайте по исходному уравнению для r и его первой производной dr / dtau начальное значение для скорости изменения v = dr / dtau, то есть я бы решил для v уравнения с r=r0:

(v0)^2 = (E2_mc2 - c2) + (2*GM)/r0 - (h^2)/(r0^2) + (r_schw*h^2)/(r0^3)

Может быть, какой-то код python, подобный этому, может работа:

import math
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp
#from ode_helpers import state_plotter

# u = [phi, Y, V, t] or if time is excluded 
# u = [phi, Y, V]
def f(tau, u, param):
    E2_mc2, c2, GM, h, r_schw = param
    Y = u[1]
    f_phi = h / (Y**2)
    f_Y = u[2] # this is the dr / dt auxiliary equation
    f_V = - GM / (Y**2) + h**2 / (Y**3) - 3*r_schw*(h**2) / (2*(Y**4))
    #f_time = (E2_mc2 * Y) / (Y - r_schw) # this is the equation of the time coordinate
    return [f_phi, f_Y, f_V] # or [f_phi, f_Y, f_V, f_time] 

# from the initial value for r = Y0 and given energy E,  
# calculate the initial rate of change dr / dtau = V0
def ivp(Y0, param, sign):
    E2_mc2, c2, GM, h, r_schw = param
    V0 = math.sqrt((E2_mc2 - c2) + (2*GM)/Y0 - (h**2)/(Y0**2) + (r_schw*h**2)/(Y0**3))
    return sign*V0

G = 4.30091252525 * (pow(10, -3)) #Gravitational constant in (parsec*km^2)/(Ms*sec^2)
c = 0.0020053761 #speed of light , AU/sec
M = 170000 #mass of the central body, in solar masses
m = 10 #mass of the orbiting body, in solar masses
Lz= 0.000024 #Angular momemntum
h = Lz / m #Just the constant  in equation
E= 1.715488e-007 #energy

c2 = c**2
E2_mc2 = (E**2) / (c2*m**2)
GM = G*M
r_schw = 2*GM / c2

param = [E2_mc2, c2, GM, h, r_schw]
Y0 = r_schw
sign = 1 # or -1
V0 = ivp(Y0, param, sign)

tau_span = np.linspace(1, 1000, num=1000)
u0 = [math.pi, Y0, V0]

sol = solve_ivp(lambda tau, u: f(tau, u, param), [1, 1000], u0, t_eval=tau_span)

Перепроверьте уравнения, возможны ошибки и неточности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...