【问题标题】:Couple Differential Equations using Python使用 Python 的耦合微分方程
【发布时间】:2020-03-21 01:49:22
【问题描述】:

我正在尝试使用 python 求解测地线轨道方程系统。它们是耦合的常方程。我尝试了不同的方法,但它们都产生了错误的形状(在绘制 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

轨道方程

我尝试这样做的方式:

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)

【问题讨论】:

  • 您能否就变量代表什么以及它们的单位是什么添加一些解释或代码 cmets?您希望涵盖多少个时期,结果如何? // 你离题了,因为这更像是一个物理或数字问题,因此更适合 scicomp.SE、physics.SE 或 math.SE。如果对此采取行动,请避免(隐藏)交叉发布。
  • 你是如何解出第一个方程中的符号的?你确定二阶导数是连续的吗?
  • 到目前为止您尝试过什么?你知道scipy.integrate吗?
  • 用附加信息和我的代码更新了帖子!对于符号,我只取了一个平方根,因为它可以提供我需要的部分解决方案。而且我没有检查二阶导数的连续性。我怎样才能在 Python 中做到这一点?
  • 您正在混合长度单位 km、AU 和 parsec。角动量和能量的单位没有给出,也可能是混合比例的。数值结果没有理由接近某种物理预期。

标签: python physics differential-equations astronomy


【解决方案1】:

您似乎正在查看以史瓦西引力运动的物体的测地线方程的不变平面中的空间坐标。

可以使用许多不同的方法,尽可能多地保留模型的基本几何结构,例如辛几何积分器或微扰理论。正如 Lutz Lehmann 在 cmets 中指出的那样,“solve_ivp”的默认方法默认使用 Dormand-Prince (4)5 步进器,该步进器利用外推模式,即 5 阶步进,步长选择由4阶误差估计。

警告:Y 的初始条件等于 Schwarzschild 的半径,因此这些方程可能会失败或需要特殊处理(尤其是方程的时间分量,这里没有包括在内!)这可能是你必须切换到不同的坐标,这消除了均匀地平线上的奇点。此外,解可能不是周期曲线,而是准周期,因此它们可能不会很好地接近。

为了快速而肮脏的处理,但可能是一个相当准确的处理,我会区分第一个方程

(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 的初始值,即我将求解vr=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)

仔细检查方程,错误和不准确是可能的。

【讨论】:

  • 我试过这个,但它给了我一条恒定的线(用 sol.y[1] 绘制 sol.y[0])。我想知道是不是我做错了什么。
  • @MiklIvaniuk 正如我已经警告过你的那样,我认为这里的问题是r 的初始条件等于史瓦西半径,其中物理发生了巨大变化:例如r 坐标“从空间转向时间”和t 坐标“从时间转向空间”。如果您仔细检查,角度phi 似乎根本没有变化。但是第一个值sol.y[1,0] = 363620079.3597036 和最后一个值sol.y[1,-1] = 363620079.4452392 有点不同。为什么选择这个特定的初始条件?
  • solve_ivp 默认使用RK45,这是使用外推模式的 Dormand-Prince (4)5 步进器,即 5 阶步进,步长选择由阶数 4 的误差估计。这不是经典的固定步长 RK4。
  • @LutzLehmann 感谢有关 Python 数值积分器的信息!
猜你喜欢
  • 1970-01-01
  • 2021-03-28
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
  • 2022-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多