我正在尝试对由月球绕行的行星进行简单的模拟。到目前为止,我有一个解决行星和月球轨道的2体问题。现在,我想向行星添加一个固定的旋转轴,看看它如何受到月球的影响。知道如何使用python做到这一点吗?
两体问题可以通过以下代码运行:
import pylab
import math
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
# Set Constants
G = 6.67e-11
AU = 1.5e11
daysec = 24.0*60*60
Ma =5.972e24 # Planet mass in Kg
Mb = 7.348e22 # Moon mass in Kg
gravconst = G*Ma*Mb
# Set up starting conditions
# Planet
xa = 0.0
ya = 0.0
za = 0.0
xva = 0.0
yva = 0.0
zva = 0.0
# Moon
xb = 384400000
yb = 0.0
zb = 0.0
xvb = 0.0
yvb = 1000.0
zvb = 0.0
# Time steps
t = 0.0
dt = 0.01*daysec
# Coordinate lists
xalist = []
yalist = []
xblist = []
yblist = []
zalist = []
zblist = []
# Loop
while t < 100.0*daysec:
# Compute Force
rx = xb-xa
ry = yb-ya
rz = zb-za
modr3 = (rx**2+ry**2+rz**2)**1.5
fx = -gravconst*rx/modr3
fy = -gravconst*ry/modr3
fz = -gravconst*rz/modr3
# Update quantities
# Moon
xvb += fx*dt/Mb
yvb += fy*dt/Mb
zvb += fz*dt/Mb
xb += xvb*dt
yb += yvb*dt
zb += zvb*dt
# Planet
xva += -fx*dt/Ma
yva += -fy*dt/Ma
zva += -fz*dt/Ma
xa += xva*dt
ya += yva*dt
za += zva*dt
t += dt
# Saving them in lists
xalist.append(xa)
yalist.append(ya)
zalist.append(za)
xblist.append(xb)
yblist.append(yb)
zblist.append(zb)
xalist[:] = [x / 1e6 for x in xalist]
yalist[:] = [x / 1e6 for x in yalist]
zalist[:] = [x / 1e6 for x in zalist]
xblist[:] = [x / 1e6 for x in xblist]
yblist[:] = [x / 1e6 for x in yblist]
zblist[:] = [x / 1e6 for x in zblist]
#Creating the point to represent the planet at the origin (not to scale),
plt.scatter(0,0,s=200,color='blue')
plt.annotate('Planet', xy=(-45,-50))
plt.scatter(xblist[0],0,s=100,color='grey')
plt.annotate('Mond', xy=(xblist[0]-45,-50))
# Plotting
pylab.plot(xalist, yalist, "-g")
pylab.plot(xblist, yblist, "-r")
plt.axhline(0, color='black')
plt.axvline(0, color='black')
pylab.axis("equal")
pylab.xlabel("X (Mio. Meter)")
pylab.ylabel("Y (Mio. Meter)")
pylab.show()
答案 0 :(得分:0)
不是答案,因为我不是这方面的专家,而是一些提示(以评论的形式不可读)
您要添加的内容非常复杂,因为您需要考虑以下因素:
两个物体的运动
因此,您需要具有任何移动质量(例如海洋,岩浆,旋转岩心等)的物体的“接触面高程”,以便可以每次计算真实的重心。另外,您还需要向移动的质量本身施加力(不仅受重力和旋转驱动,而且还具有共振和主要是惯性),不要忘记地球不仅在海洋周围还具有核心和岩浆,因此您需要考虑一下至少占据3个表面...
两个物体的质量分布不均匀
因此您可以计算重心以及相对于实际旋转轴的旋转的二次质量惯性
行星/月球通常是至少3个身体问题,而不仅仅是2个
因为当地的恒星也对月球轨道产生了很大的影响...
根据数字,有些效果会很小,可以丢弃,而有些效果则不会(特别是在惯性加共振的情况下)。
旋转方程类似于您已经获得的位置/速度/加速度。它叫Newton D'Alembert integration/physics,但您需要实现transform matrices来实现。
查看少量相关的质量检查:
请注意最后一个链接,以提高集成的准确性,因为它非常糟糕,并且由于dt
的大小,引力矢量会随时间而变化,因此无论#convert everything to character
events %>%
mutate_all(as.character) -> intermediate
intermediate %>%
group_by(ID, TVTProcedureStartDate, DCDate, CE_EventOccurred) %>%
summarise_at(vars(ends_with("Hospital.")), list(. = ~case_when(any(. != "0") ~ "1",
TRUE ~ "0"))) %>%
inner_join(intermediate %>%
group_by(ID) %>%
summarise(CE_EventDate = list(unique(CE_EventDate))),
by = "ID") %>%
select(ID, TVTProcedureStartDate, DCDate, CE_EventOccurred, CE_EventDate, ends_with("._.")) -> result
> result
# A tibble: 10 x 27
ID TVTProcedureSta~ DCDate CE_EventOccurred CE_EventDate Annular.Dissect~ Aortic.Dissecti~
<chr> <chr> <chr> <chr> <list> <chr> <chr>
1 ST10~ 5/20/2014 5/23/~ Yes <chr [1]> 0 0
2 ST10~ 6/17/2014 6/29/~ Yes <chr [1]> 0 0
3 ST10~ 9/9/2014 9/13/~ Yes <chr [1]> 0 0
4 ST10~ 12/16/2014 12/22~ Yes <chr [1]> 0 1
5 ST10~ 11/6/2015 11/15~ Yes <chr [3]> 0 0
6 ST10~ 9/13/2016 9/22/~ Yes <chr [3]> 0 0
7 ST10~ 12/15/2016 1/1/2~ Yes <chr [4]> 0 0
8 ST10~ 6/30/2017 7/5/2~ Yes <chr [2]> 0 0
9 ST10~ 7/6/2017 7/15/~ Yes <chr [2]> 0 0
10 ST10~ 7/18/2017 8/3/2~ Yes <chr [2]> 0 0
# ... with 20 more variables: Atrial.Fibrillation..In.Hospital._. <chr>,
的多少,轨道都会变形。对于每个集成迭代,您都会以错误的方向(仅在dt间隔开始时才是正确的)影响它。
正如您所看到的,要处理的东西很多,我看到的大多数模拟程序都不做(包括我的)……他们通过章动和进动常量来伪造它。