python作为一门简单易学且应用范围极广的语言有着其他语言无法比拟的优势,通过python可以实现各种各样的功能,例如我们可以利用python matplotlib的绘图库实现各种动态模拟仿真,在科学实验中有着极大的应用价值。下列是通过python实现地球公转的动态模拟图:
import numpy as np
import matplotlib as mpl
mpl.use("TkAgg")
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.animation as animmation
L1 = 10 #地球环绕轨迹的半径
v = 2*np.pi #地球运动的角速度
def updata (data): #随时间t变换设置新的地球位置的坐标,也即是随animmation.FuncAnimation函数的帧数参数变化每一帧的不同坐标位置的图片对象参数
global line
line.set_data([data[0], data[1]])
line.set_3d_properties(data[2])
return line,
def init(): #地球的起始位置
global line
ti = 0
t = t_drange[np.mod(ti, t_dlen)]
xt1 = x0 + L1 * np.cos(v * t)
yt1 = y0 + L1 * np.sin(v * t)
zt1 = z0 + 0
line, = ax.plot([xt1], [yt1], [zt1], marker='o', color='blue',markersize=8)
return line
def data_gen(): #随时间t变换的地球坐标,也即是animmation.FuncAnimation函数的帧数参数
global x0,y0,z0,t_dlen
data = []
for ti in range(1,t_dlen):
t = t_drange[ti]
xt1 = x0 + L1 * np.cos(v * t)#地球与太阳坐标关系方程
yt1 = y0 + L1 * np.sin(v * t)#地球与太阳坐标关系方程
zt1 = z0
data.append([xt1, yt1, zt1])
return data
t_range = np.arange(0, 1 + 0.005, 0.005)#设置环绕一周时间的范围以及运动间隔时间
t_drange = np.arange(0, 1, 0.005 )
t_len = len(t_range)
t_dlen = len(t_drange)
x0 = 0
y0 = 0
z0 = 0
x1 = x0 + L1 * np.cos(v * t_range)#地球坐标随时间变化的方程
y1 = y0 + L1 * np.sin(v * t_range)#地球坐标随时间变化的方程
z1 = z0 + np.zeros(t_len)
f = plt.figure(figsize=(6,6))#绘图的画布
ax = f.add_subplot(111,projection='3d')#设置3d坐标系
ax.set_aspect('equal')
ax.set_title("Sun-Earth-Moon Model")#设置图像标题
ax.plot([0], [0], [0], marker='o', color= 'red', markersize=16)#绘制太阳的各种属性
ax.plot(x1, y1, z1, 'r')#绘制地球图像
ax.set_xlim([-(L1 + 2), (L1 + 2)])#地球用动模型在坐标系中的范围
ax.set_ylim([-(L1 + 2), (L1 + 2)])#地球用动模型在坐标系中的范围
ax.set_zlim([-5, 5])#地球用动模型在坐标系中的范围
line, = ax.plot([], [], [], marker='o', color='blue',markersize=8,animated = True)#地球的形状颜色等属性
ani = animmation.FuncAnimation(f, updata, frames = data_gen(), init_func = init,interval = 20)#将上述函数对象传如animmation.FuncAnimation函数以生成连读的地球运动模型