在月球上看地球和太阳是怎么转的?

2023-09-21 11:12:21

参数初始化

众所周知,地球围绕太阳转,月球围绕地球转。但在地球上看,月亮和太阳都绕着地球转,那么如果我们是土生土长的月球人,我们看到的是谁绕着谁转呢?

日地月就是典型的三体系统,其中太阳质量为 1.989 × 1 0 30 k g 1.989×10^{30}kg 1.989×1030kg,地球质量为 5.965 × 1 0 24 k g 5.965×10^{24}kg 5.965×1024kg,月球质量为 7.342 ✕ 1 0 22 k g 7.342✕10^{22}kg 7.342✕1022kg,万有引力常数为 G = 6.67 × 1 0 − 11 N ⋅ m 2 / k g 2 G=6.67×10^{-11}N·m2/kg^2 G=6.67×1011Nm2/kg2。地月距离为 3.8 × 1 0 8 m 3.8\times10^8m 3.8×108m;日地距离为 1.5 × 1 0 11 m 1.5\times10^{11}m 1.5×1011m;地球公转速度为 28.8 k m / s 28.8km/s 28.8km/s;月球公转速度为 1 k m / s 1km/s 1km/s,则各参数初始化为

import numpy as np
#后续代码主要更改这里的参数
m = [1.33e20,3.98e14,4.9e12]
x = np.array([0, 1.5e11, 1.5e11+3.8e8])
y = np.array([0.0, 0, 0])
u = np.array([0.0, 0, 0])
v = np.array([0,2.88e4,2.88e4+1.02e3])

运动模型

日地月的运动遵循古老而经典的万有引力

F ⃗ = G m i m j r 2 e ⃗ r \vec F=\frac{Gm_im_j}{r^2}\vec e_r F =r2Gmimje r

然后根据牛顿运动定律

m i d v ⃗ i d t = G m i m j r i j 3 r ⃗ i j , v ⃗ i = d r ⃗ i d t m_i\frac{\text d\vec v_i}{\text dt}=\frac{Gm_im_j}{r_{ij}^3}\vec r_{ij},\quad\vec v_i=\frac{\text d\vec r_i}{\text dt} midtdv i=rij3Gmimjr ij,v i=dtdr i

写为差分形式

v ⃗ i = ∑ j ≠ i G m j r i j 3 r ⃗ i j d t r ⃗ i = v ⃗ i d t \begin{aligned} \vec v_i&=\sum_{j\not=i}\frac{Gm_j}{r_{ij}^3}\vec r_{ij}\text dt\\ \vec r_i&= \vec v_i\text dt \end{aligned} v ir i=j=irij3Gmjr ijdt=v idt

将其在二维平面坐标系中拆分,令 v ⃗ = ( u , v ) \vec v=(u,v) v =(u,v),则短时间内其变化规则可写为

u i + = ∑ j ≠ i G m j ( x j − x i ) d t ( x i − x j ) 2 + ( y i − y j ) 2 3 v i + = ∑ j ≠ i G m j ( y j − y i ) d t ( x i − x j ) 2 + ( y i − y j ) 2 3 x i + = u ⃗ i d t y i + = v ⃗ i d t \begin{aligned} u_i&+=\sum_{j\not=i}\frac{Gm_j(x_j-x_i)\text dt}{\sqrt{(x_i-x_j)^2+(y_i-y_j)^2}^3}\\ v_i&+=\sum_{j\not=i}\frac{Gm_j(y_j-y_i)\text dt}{\sqrt{(x_i-x_j)^2+(y_i-y_j)^2}^3}\\ x_i&+= \vec u_i\text dt\\ y_i&+= \vec v_i\text dt \end{aligned} uivixiyi+=j=i(xixj)2+(yiyj)2 3Gmj(xjxi)dt+=j=i(xixj)2+(yiyj)2 3Gmj(yjyi)dt+=u idt+=v idt

接下来,以太阳为坐标系,做出月亮和地球的运动轨迹

from itertools import product
N = 1000
dt = 36000
ts =  np.arange(0,N*dt,dt)/3600/24
xs,ys = [],[]
for _ in ts:
    x_ij = (x-x.reshape(3,1))
    y_ij = (y-y.reshape(3,1))
    r_ij = np.sqrt(x_ij**2+y_ij**2)
    for i,j in product(range(3), range(3)):
        if i==j : continue
        u[i] += (m[j]*x_ij[i,j]*dt/r_ij[i,j]**3)
        v[i] += (m[j]*y_ij[i,j]*dt/r_ij[i,j]**3)
    x,y = x+u*dt, y+v*dt
    xs.append(x.tolist())
    ys.append(y.tolist())

xs = np.array(xs)
ys = np.array(ys)

其中,xs和ys都是 N × 3 N\times3 N×3的矩阵,其三列分别代表太阳、地球以及月球的坐标,但地月之间的距离远小于日地间的距离,为了在画图的时候可以看清,所以扩大一百倍

xS, yS = xs[:,0], ys[:,0]
xE, yE = xs[:,1], ys[:,1]
xM = xE + 100*(xs[:,2]-xE)
yM = yE + 100*(ys[:,2]-yE)

绝对坐标系

接下来就是激动人心的时刻,先画出三者在绝对空间中的运动情况

import matplotlib.pyplot as plt

def drawSystem(xS, yS, xE, yE, xM, yM, ax):
    ax.plot(xS, yS, marker='o', color='red', label='sun')
    ax.plot(xE, yE, color='blue', label='earth')
    ax.plot(xM, yM, color='cyan', ls='--', lw=1, label='moon')
    plt.legend()
    plt.grid()
    plt.tight_layout()

ax = plt.subplot()
drawSystem(xS, yS, xE, yE, xM, yM, ax)
plt.show()

在这里插入图片描述

以太阳和地球为中心

接下来分别以太阳和地球为坐标原点,绘制其变化

fig = plt.figure()
ax = fig.add_subplot(1,2,1)
drawSystem(xS-xS, yS-yS, xE-xS, yE-yS, xM-xS, yM-yS, ax)
ax = fig.add_subplot(1,2,2)
drawSystem(xS-xE, yS-yE, xE-xE, yE-yE, xM-xE, yM-yE, ax)
plt.show()

在这里插入图片描述

左边是以太阳为原点,右边是以地球为原点,所以在地球上看,月亮和太阳都是绕着我们旋转的。

以月球为坐标原点

最后,来看看月球人怎么看这个问题吧

plt.plot(xS-xM, yS-yM, color='red', label='sun')
plt.plot(xE-xM, yE-yM, color='blue', label='earth')
plt.plot(xM-xM, yM-yM, marker='o', color='cyan', label='moon')
plt.legend()
plt.grid()
plt.tight_layout()
plt.show()

在这里插入图片描述

可以看到,地球是绕着月球转的,而太阳就比较无语了,不知道在外面画什么圈圈。当然,这个图是放大之后的结果,而且月球人需要意识到月亮在自转,否则被地球潮汐锁定的月球,是看不出地球的位置变化的。

更多推荐

shell练习(grep,sed,awk,距离生日天数的计算,累加求和,文件操作和文本操作)

最近在学习shell脚本编写,把几个练习记录一下。包括grep,sed,awk,距离生日天数的计算,累加求和,文件操作和文本操作。grep相关练习找到/huiluczp下含有星号的文件与内容,主要是利用find来找到所有待查的文件作为参数给grep。echo'找到/huiluczp下含有星号的文件与内容'grep'\*

网络安全(黑客)自学

目录:一、什么是网络安全二、怎样规划网络安全三、网络安全的知识多而杂,怎么科学合理安排?1、基础阶段2、渗透阶段3、安全管理(提升)这一阶段主要针对已经从事网络安全相关工作需要提升进阶成管理层的岗位。如果你只学习参加工程师方面的岗位,这一阶段可学可不学。4、提升阶段(提升)1、Web安全相关概念(2周)2、熟悉渗透相关

vue3+element-plus权限控制实现(el-tree父子级不关联情况处理)

文章目录前言一、遇到的交互场景el-tree中check-strictly属性二、处理父级的半选中以及选中交互el-treecheck,check-change事件编辑进来,父级的半选状态处理总结前言在开发后台管理系统的时候,用户的权限控制是一个常见的需求。这里需要探讨下按钮的级别的权限控制,以及实现中使用elemen

【深度学习】树莓派Zero w深度学习模型Python推理

在机器学习开发过程中,当模型训练好后,接下来就要进行模型推理了,根据部署环境可分为三类场景:边缘计算:一般指手机,嵌入式设备,直接在数据生成的设备上进行推理,因为能避免将采集到的数据上传到云端,所以实时性非常好。端计算:介于云和边缘设备之间的计算平台,个人PC可以归为这一类。云计算:指云计算平台,具有强大的计算和存储能

Redis 持久化之 RDB 与 AOF 详解

Redis持久化我们知道Redis的数据是全部存储在内存中的,如果机器突然GG,那么数据就会全部丢失,因此需要有持久化机制来保证数据不会因为宕机而丢失。Redis为我们提供了两种持久化方案,一种是基于快照,另外一种是基于AOF日志。接下来就来了解一下这两种方案。操作系统与磁盘首先我们需要知道Redis数据库在持久化中扮

为何学linux及用处

目前企业使用的操作系统无非就是国产类的,windows和linux类。我们要提升自己的技能,需要学习这两款。我记得在大学时期,学习过windows以及linux,但当时觉得又不常用,就学的模棱两可。毕业之后,你会发现,其实这两种操作系统是很主流的。为什么学?下面就是一些工作中遇到的例子分享一下。我记得在企业中有次遇到数

Linux高性能服务器编程 学习笔记 第五章 Linux网络编程基础API

我们将从以下3方面讨论Linux网络API:1.socket地址API。socket最开始的含义是一个IP地址和端口对(ip,port),它唯一表示了使用TCP通信的一端,本书称其为socket地址。2.socket基础API。socket的主要API都定义在sys/socket.h头文件中,包括创建socket、命名

黄金代理前景如何,有得搞吗?

现货黄金代理这个职业时常都听人说过了,随着近期现货黄金走势不断出现行情,尤其是美国通胀严重,地缘政治局势频发,黄金走势不断获得支撑而走高。在这样的背景下,现货黄金代理这个职业的前景如何呢?其实对于现代人来说,进行现货黄金代理是很好的选择,近些年现货黄金投资人数不断上涨的趋势,所以现货黄金代理也是是除了比特币等加密货币品

go语言基础--面向对象杂谈

面向过程所谓的面向过程就是:强调的是步骤、过程、每一步都是自己亲自去实现的。面向对象所谓的面向对象其实就是找一个专门做这个事的人来做,不用关心具体怎么实现的。所以说,面向过程强调的是过程,步骤。而面向对象强调的是对象,也就是干事的人。在程序中,可以通过属性和方法(函数)来描述类。属性就是特征,方法(函数)就是行为。面向

ARM架构过程调用标准AAPCS(学习)

AAPCS是ARM架构的处理器规定的一些标准。参数和返回值传递,对于简单的情况,输入参数由R0-R3分别用来记录第1到4个参数。当传递的参数超过4个时,就需要借助栈来保存参数。函数的返回值通常保存在R0中,若返回值为64位,R1也用来保存返回值。函数调用中的寄存器用法。函数或子程序应该保持R4-R11、R13和R14的

Vue学习笔记总结

目录1、Vue核心1.1什么是vue?1.2什么是mvvm?​编辑1.3插值表达式{{}}2.Vue中的常用指令2.1内容渲染指令2.2条件渲染指令2.3事件绑定指令2.4属性绑定指令2.5列表渲染指令2.5.1小案例-小黑的书架2.6v-for中的key2.7双向绑定指令3.指令修饰符3.1什么是指令修饰符?3.2按

热文推荐