python 三体 模拟_三体究竟有多可怕?用Python建模来深度了解( 三 )


#Run the ODEscipy.
=sci..(,,,args=(G,m1,m2))
变量 包含有关二体系统所有的信息,包括位置向量和速率向量 。为了创建图和动画,只需要有能延伸到两个不同变量的位置向量就可以了 。
=[:,:3]=[:,3:6]
现在是绘图!在这要用到的3D标图功能 。
# =plt.(=(15,15))
# 3D =fig.(111,="3d")
#Plot the .plot([:,0],[:,1],[:,2],color="")ax.plot([:,0],[:,1],[:,2],color="tab:red")
#Plot the finalof the .([-1,0],[-1,1],[-1,2],color="",="o",s=100,label=" A")ax.([-1,0],[-1,1],[-1,2],color="tab:red",="o",s=100,label=" B")
#Add a few more bells and .("x-",=14)ax.("y-",=14)ax.("z-",=14)ax.(" ofof stars in a two-\n",=14)ax.(loc="upper left",=14)
最终的图像清晰表明,轨道遵循可预测的模式,正如二体问题算法所期望的那样 。
显示两颗星球轨道时间演变的图像
这里有一个展示轨道一步步演变的动画 。
中展示轨道一步步演变的动画
还可以再制作一个可视化图像,它来自质心的参考框架 。上面的图像来自空间中任一平稳点,但如果观察来自质心系统的两个物体的移动,就可以看到一个更加形象的图案 。
因此,先找到每一时间步上质心的位置,然后从两个物体的位置向量上减去其向量以找到它们相对应质心的位置 。
#Findof =(m1*+m2*)/(m1+m2)
#Findof AlphaA w.r.t =-
#Findof AlphaB w.r.t =-
最后,可以使用更改变量后的绘制之前图像使用的代码,绘制以下图像 。
来自COM的显示两颗星球轨道时间演变的图像
如果坐在COM观察两个物体,就可以看到以上轨道 。从这个模拟来看它并不清晰,因为时间尺度非常小,然而即使是这些轨道也一直在轻微地旋转 。
现在就很清楚了,两个物体严格遵循预测的路线,而且可以用函数——也许是个椭圆体方程——来描绘它们在空间中如二体系统所期望的移动 。
三体模型
1.代码
现在为了把之前的代码延伸到三体系统,需要给常数增加一些东西——增加第三体的质量、位置和速率向量 。把第三恒星的质量视作和太阳的质量等同 。
#Mass of the Third =1.0 #Third Star
# of the Third =[0,1,0] #mr3=sci.array(r3,dtype="")
# of the Third =[0,-0.01,0]v3=sci.array(v3,dtype="")
需要更新代码中质心和质心速率的公式 。
# COM =(m1*r1+m2*r2+m3*r3)/(m1+m2+m3)
#of COM
v_com=(m1*v1+m2*v2+m3*v3)/(m1+m2+m3)
对一个三体系统来说,需要修改运动方程使之包括另一物体施加的额外引力 。因此,需要在RHS上,对问题中每一对物体施加力的其他物体增加一个力项 。在三体系统的情况下,一个物体会受到其余两个物体施加的力的影响并因此在RHS上出现两个力项 。数学上可表示为:
为在代码中反映这些变化,需要为求解器创建一个新函数 。
def (w,t,G,m1,m2,m3): r1=w[:3] r2=w[3:6] r3=w[6:9] v1=w[9:12] v2=w[12:15] v3=w[15:18]
r12=sci..norm(r2-r1) r13=sci..norm(r3-r1) r23=sci..norm(r3-r2)=K1*m2*(r2-r1)/r12**3+K1*m3*(r3-r1)/r13**3=K1*m1*(r1-r2)/r12**3+K1*m3*(r3-r2)/r23**3 =K1*m1*(r1-r3)/r13**3+K1*m2*(r2-r3)/r23**3 =K2*v1 =K2*v2 =K2*v3
=sci.((,))=sci.((,))=sci.((,)) =sci.((,))=sci.((,))
最后,调用函数并向其提供上述函数连同初始条件 。
#s=sci.array([r1,r2,r3,v1,v2,v3]) # s=.() # to make 1D =sci.(0,20,500) #20and 500
#Run the ODEscipy.
=sci..(,,,args=(G,m1,m2,m3))
正如二体模拟一样,需要提取所有三体的位置进行绘图 。
=[:,:3]=[:,3:6]=[:,6:9]
可以把上述章节给出的代码稍作修改后运用到最后的绘图上 。正如下图呈现的混乱,这个轨道没有预期的图案 。
显示三颗星球轨道时间演变的图像
动画会使这张混乱的图变得更容易理解 。