求解系统微分方程(太阳和木星轨迹)

2024-10-02 00:23:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图解一个微分方程组,找到太阳和木星的轨道。但我没有一个好的轨迹,只有一些点。 你能帮忙吗?(“太阳”指太阳)

enter image description here

这是我的密码

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint   
from mc_deriv import deriv

start = 0
end   = 14*365
nbpas = end/10
t = np.linspace(start,end,nbpas)
M = M_Soleil + M_Jupiter

x0    = x_Jupiter  - x_Soleil
y0    = y_Jupiter  - y_Soleil
vx0   = vx_Jupiter - vx_Soleil
vy0   = vy_Jupiter - vy_Soleil

syst_CI = [x0,y0,vx0,vy0]               
Sols=odeint(deriv,syst_CI,t,args=(M,))  

x  = Sols[:, 0]           
y  = Sols[:, 1]
vx = Sols[:, 2]
vy = Sols[:, 3]

初始化

x_Soleil    = -7.139143380212696e-03       # (UA)
y_Soleil    = -2.792019770161695e-03       # (UA)
x_Jupiter   = +3.996321311604079e+00       # (UA)
y_Jupiter   = +2.932561211517850e+00       # (UA)

vx_Soleil   = -7.139143380212696e-03       # (UA*j^-1)
vy_Soleil   = -2.792019770161695e-03       # (UA*j^-1)
vx_Jupiter  = +3.996321311604079e+00       # (UA*j^-1)
vy_Jupiter  = +2.932561211517850e+00       # (UA*j^-1)

M_Soleil    = 2e30                         # masse Soleil  (kg)
M_Jupiter   = 1.9e27                       # masse Jupiter (kg)
r_Soleil    = 696e6                        # rayon Soleil  (m)  

以及外部功能

def deriv(syst,t,M):
    G     = 6.67e-11 
    x     = syst[0]
    y     = syst[1]
    vx    = syst[2]
    vy    = syst[3]
    dxdt  = vx
    dydt  = vy
    dvxdt = -(G*M*x)/((x**2+y**2)**(3/2))
    dvydt = -(G*M*y)/((x**2+y**2)**(3/2))
    return dxdt,dydt,dvxdt,dvydt

情节

plt.figure(figsize=(7, 5))
plt.title("Trajectoires Soleil-Jupiter")
#plt.xlabel("UA)")
#plt.ylabel("UA)")
plt.plot(x,  y,  '-', color="red")
plt.show() 

Variables

enter image description here

绘图结果:enter image description here

好极了!真管用!!!!你知道吗

enter image description here


Tags: fromimportasnppltenduajupiter
1条回答
网友
1楼 · 发布于 2024-10-02 00:23:31

目前,我在您的代码中看到了以下问题,这些问题使您的观察结果无法重现(除了缺少参考值之外):

  • 在初始数据中,长度单位是天文单位,时间单位是一天。引力常数的单位是m^3 s^-1 kg^-2,所以要把它们组合成一个公式,你需要把AU转换成m,这个因子是150e+09,其中的立方体要分开。一天就是24*3600秒,必须乘以。

  • 积分的时间间隔也应该以年为单位,此时你似乎想到天,第三个单位没有适当的换算系数。[已解决,un jour=一天]

  • 从时间节点构造的划分来看,似乎您使用的是python2。然后指数3/2求值为1整数除法,可以直接在指数中使用1.5,它是二进制浮点格式的精确值。[实际上是python 3,那么第一个除法应该是显式整数]

  • 在复制初始数据时,会产生复制粘贴错误,初始位置和速度的数字相同,而实数应形成垂直向量。[没有在代码中解决,图像有正确的速度]为了寻找适合你位置的在线数据,NASA地平线系统给我提供了2011-Nov-11 04:00木星的位置和速度

    pos:  3.996662712108880E+00,  2.938301820497121E+00, -1.017177623308866E-01,
    vel: -4.560191659347578E-03,  6.440946682361135E-03,  7.529386668190383E-05
    
  • 标准化到重心框架需要应用动量守恒,木星的质量足够大,仅仅减去速度可能会得到物理上错误的结果。[未解析,初始数据应该已经是重心,不需要校正]

  • 物理常数的不同精度也会导致偏离参考位置的误差。目前最“脏”的常数是引力常数和质量,之后是年份的不确定性。您只能得到任何(正确的)计算结果的前两位数。

相关问题 更多 >

    热门问题