簡體   English   中英

在 python 中使用四階龍格庫塔求解 3 個耦合非線性微分方程

[英]Solving 3 coupled nonlinear differential equations using 4th order Runge Kutta in python

我正在嘗試 plot 帶電粒子圍繞 Reissner–Nordström 黑洞(帶電黑洞)的軌道。

我有三個二階微分方程和三個一階微分方程。 由於問題的性質,每個導數都是根據適當的時間而不是時間 t。 運動方程如下。

2 一階微分方程 二階微分方程

3個二階微分方程

1 一階微分方程(應該有一個負數乘以平方根下的所有值。

我正在使用四階龍格庫塔方法來整合軌道。 我的困惑,我最有可能犯的錯誤來自這樣一個事實,即通常當你有一個二階耦合微分方程時,你會將它簡化為 2 個一階微分方程。 然而,在我的問題中,我得到了 3 個一階微分方程以及它們相應的二階微分方程。 我假設因為我得到了這些一階方程,所以我根本不需要減少二階。 這些方程是非線性的這一事實確實使事情變得更加復雜。

我確信我可以使用 Runge kutta 來解決這些問題,但是我不確定我對運動方程的實現。 當我運行代碼時,我收到一個錯誤,即負數在 F2 的平方根之下,但事實並非如此,因為 F2 應該正好等於零(無疑是 F1 引起的精度問題)。 然而,即使我在 F1、F2、F3 的平方根下取一切的絕對值...我的 angular 動量 L 和能量 E 也沒有被守恆。 我主要希望有人評論我在 Runge kutta 循環中使用微分方程的方式,並告訴我應該如何減少二階微分方程。

import matplotlib.pyplot as plt
import numpy as np
import math as math
#=============================================================================
h=1
M         = 1                  #Mass of RN blackhole
r         = 3*M                #initital radius of particle from black hole
Q         = 0                  #charge of particle
r_s       = 2*M                #Shwar radius
S         = 0                  # initial condition for RK4
V         = .5                 # Initial total velocity of particle
B         = np.pi/2            #angle of initial velocity
V_p       = V*np.cos(B)        #parallel velocity
V_t       = V*np.sin(B)        #transverse velocity
t         = 0
Theta     = 0
E         = np.sqrt(Q**2-2*r*M+r**2)/(r*np.sqrt(1-V**2))
L         = V_t*r/(np.sqrt(1-V**2))
r_dot     = V_p*np.sqrt(r**2-2*M+Q**2)/(r*np.sqrt(1-V**2))
Theta_dot = V_t/(r*np.sqrt(1-V**2))
t_dot     = E*r**2/(r**2-2*M*r+Q**2)

#=============================================================================
while(r>2*M and r<10*M):   #Runge kutta while loop
    A1 = 2*(Q**2-M*r) * r_dot*t_dot / (r**2-2*M*r+Q**2)                                           #defines T double dot fro first RK4 step
    B1 = -2*Theta_dot*r_dot / r                                                                   #defines theta double dot for first RK4 step
    C1 = (r-2*M*r+Q**2)*(Q**2-M*r)*t_dot**2 / r**5 + (M*r-Q**2)*r_dot**2 / (r**2-2*M*r+Q**2)      #defines r double dot for first RK4 step
    D1 = E*r**2/(r**2-2*M*r+Q**2)                                                                 #defines T dot for first RK4 step
    E1 = L/r**2                                                                                   #defines theta dot for first RK4 step
    F1 = math.sqrt(-(1-r_s/r+Q**2/r**2) * (1-(1-r_s/r+Q**2/r**2)*D1**2 + r**2*E1**2))              #defines r dot for first RK4 step
    
    t_dot_1     = t_dot     + (h/2) * A1
    Theta_dot_1 = Theta_dot + (h/2) * B1
    r_dot_1     = r_dot     + (h/2) * C1
    t_1         = t         + (h/2) * D1
    Theta_1     = Theta     + (h/2) * E1
    r_1         = r         + (h/2) * F1
    S_1           = S         + (h/2)
    
    A2 = 2*(Q**2-M*r_1) * r_dot_1*t_dot_1 / (r_1**2-2*M*r_1+Q**2)                                                   
    B2 = -2*Theta_dot_1*r_dot_1 / r_1                                                                               
    C2 = (r_1-2*M*r_1+Q**2)*(Q**2-M*r_1)*t_dot_1**2 / r_1**5 + (M*r_1-Q**2)*r_dot_1**2 / (r_1**2-2*M*r_1+Q**2)      
    D2 = E*r_1**2/(r_1**2-2*M*r_1+Q**2)                                                                                   
    E2 = L/r_1**2                                                                                                     
    F2 = np.sqrt(-(1-r_s/r_1+Q**2/r_1**2) * (1-(1-r_s/r_1+Q**2/r_1**2)*D2**2 + r_1**2*E2**2))                                 
    
    t_dot_2     = t_dot     + (h/2) * A2
    Theta_dot_2 = Theta_dot + (h/2) * B2
    r_dot_2     = r_dot     + (h/2) * C2
    t_2         = t         + (h/2) * D2
    Theta_2     = Theta     + (h/2) * E2
    r_2         = r         + (h/2) * F2
    S_2           = S         + (h/2)
    
    
    A3 = 2*(Q**2-M*r_2) * r_dot_2*t_dot_2 / (r_2**2-2*M*r_2+Q**2)                                                   
    B3 = -2*Theta_dot_2*r_dot_2 / r_2                                                                               
    C3 = (r_2-2*M*r_2+Q**2)*(Q**2-M*r_2)*t_dot_2**2 / r_2**5 + (M*r_2-Q**2)*r_dot_2**2 / (r_2**2-2*M*r_2+Q**2)      
    D3 = E*r_2**2/(r_2**2-2*M*r_2+Q**2)                                                                                   
    E3 = L/r_2**2                                                                                                     
    F3 = np.sqrt(-(1-r_s/r_2+Q**2/r_2**2) * (1-(1-r_s/r_2+Q**2/r_2**2)*D3**2 + r_2**2*E3**2))                                 
    
    t_dot_3     = t_dot     + (h/2) * A3
    Theta_dot_3 = Theta_dot + (h/2) * B3
    r_dot_3     = r_dot     + (h/2) * C3
    t_3         = t         + (h/2) * D3
    Theta_3     = Theta     + (h/2) * E3
    r_3         = r         + (h/2) * F3 
    S_3           = S       + (h/2)
    
    
    
    A4 = 2*(Q**2-M*r_3) * r_dot_3*t_dot_3 / (r_3**2-2*M*r_3+Q**2)                                                   
    B4 = -2*Theta_dot_3*r_dot_3 / r_3                                                                              
    C4 = (r_3-2*M*r_3+Q**2)*(Q**2-M*r_3)*t_dot_3**2 / r_3**5 + (M*r_3-Q**2)*r_dot_3**2 / (r_3**2-2*M*r_3+Q**2)      
    D4 = E*r_3**2/(r_3**2-2*M*r_3+Q**2)                                                                                   
    E4 = L/r_3**2                                                                                                     
    F4 = np.sqrt(-(1-r_s/r_3+Q**2/r_3**2) * (1-(1-r_s/r_3+Q**2/r_3**2)*D3**2 + r_3**2*E3**2))                                #defines r dot for first RK4 step
    
    t_dot     = t_dot     + (h/6.0) * (A1+(2.*A2)+(2.0*A3) + A4)
    Theta_dot = Theta_dot + (h/6.0) * (B1+(2.*B2)+(2.0*B3) + B4)
    r_dot     =  r_dot    + (h/6.0) * (C1+(2.*C2)+(2.0*C3) + C4)
    t         =  t        + (h/6.0) * (D1+(2.*D2)+(2.0*D3) + D4)
    Theta     = Theta     + (h/6.0) * (E1+(2.*E2)+(2.0*E3) + E4)
    r         =  r        + (h/6.0) * (F1+(2.*F2)+(2.0*F3) + F4)
    S          = S+h
    
    print(L,r**2*Theta_dot)
    
    
    plt.axes(projection = 'polar')
    plt.polar(Theta, r, 'g.')

取您提供的三個二階微分方程。 這些是由適當時間參數化的測地線方程。 但是,您的原始度量是旋轉不變的(即 SO(3) 不變),因此它具有一組簡單的守恆定律,以及度量的守恆(即適當時間的守恆)。 這意味着ttheta的二階微分方程可以積分一次,從而得到一組ttheta的兩個一階微分方程和一個r的二階微分方程:

dt/ds = c_0 * r**2 / (r**2 - 2*M*r + Q**2)

dtheta/ds = c_1 / r**2

d**2r/ds**2 = ( (r**2-2*M*r + Q**2)*(Q**2 - M*r)/r**5) * (dt/ds)**2 
                   + ( (M*r - Q**2) /(r**2 - 2*M*r + Q**2) ) * (dr/ds)**2

您可以在這里使用不同的方式 go,其中一種是通過將上面的前兩個方程代入軌道上評估的度量等於 1 的方程,推導r的一階微分運動方程和方程。但您也可以只是 go 直接在這里並將dt/ds方程的右側代入r的第三個方程,將系統表示為

dt/ds = c_0 * r**2 / (r**2 - 2*M*r + Q**2)

dtheta/ds = c_1 / r**2

d**2r/ds**2 = ( c_0**2*(Q**2 - M*r)/(r*(r**2-2*M*r + Q**2)))
                + ( (M*r - Q**2) /(r**2 - 2*M*r + Q**2) ) * (dr/ds)**2

並且為了避免使用平方根和復雜性(平方根也是昂貴的計算,而有理函數是簡單的更快的代數計算),定義四個一階微分方程的等效系統

dt/ds = c_0 * r**2 / (r**2 - 2*M*r + Q**2)

dtheta/ds = c_1 / r**2

dr/ds = u

du/ds = ( c_0**2*(Q**2 - M*r)/(r*(r**2-2*M*r + Q**2)))
                + ( (M*r - Q**2) /(r**2 - 2*M*r + Q**2) ) * u**2

借助t, theta, r及其導數dt/dt, dtheta/dt, dr/dt的初始條件,您可以計算第一個和第二個等式中使用的常數c_0c_1 ,然后計算u = dr/dt的初始條件u = dr/dt

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM