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


约翰·科洛西莫在智利的帕洛马天文台捕捉到的半人马座α星双星系统
2. 无量纲化
在解方程式之前,需要先对方程式进行无量纲化 。这意味着什么?把方程式中(如位置、速率、质量等)所有具有维数(如分别为m, m/s, kg)的量转换成大小接近单位的无因次量 。这样做的原因是:
· 在微分方程中,不同项有不同的数量级(从0.1到103?) 。如此巨大的差异可能导致数值算法收敛变得缓慢 。
· 如果所有项的大小都十分接近单位,从计算方面上讲所有运算价格都将比数值大小不平衡时低廉 。
· 将会得到一个有关大小的参考点 。例如,如果给一个4×103? kg的量,可能无法衡量在宇宙尺度上它是大是小 。然而,如果说是太阳质量的2倍,就很容易把握这个量的意义 。
将每个量除以一个固定的参考量以对方程式进行无量纲化 。例如,用质量项除以太阳的质量,半人马座α星系统中两星间距离的位置(或距离)项,半人马座α星轨道周期的时间项,以及地球绕日公转的相对速率 。
当把每一项除以参考量的时候,也需要将其相乘以免改变方程式 。所有这些量和G在一起就能变成一个常数,比如方程式1中的K?和方程式2中的 K? 。因此,无量纲化的方程式即如下所示:
项上的横杠表示该项是无因次的 。因此这就是要用在模拟中的最终方程式 。
3. 代码
从为模拟输入所要求的模块开始 。
# scipy
scipy as sci
#andfor 3D. as.
接下来,定义无量纲化方程式中用到的常数和参考量,以及净常数K?和 K? 。
#=6.-11 #N-m2/kg2
# =1.989e+30 #kg #mass of the =5.326e+12 #m #stars in Alpha =30000 #m/s #of earththe =79.91*365*24*3600*0.51 #s #of Alpha
#Net =G*t_nd*m_nd/(r_nd**2*v_nd)K2=v_nd*t_nd/r_nd
现在要定义一些参数,需要模拟两颗恒星的质量、初始位置和初速度 。需要注意的是这些参数是无因次的,所以定义半人马座α星A的质量为1.1(意味着其质量为参考量太阳质量的1.1倍) 。任意定义速率,则没有物体能够逃脱彼此的引力 。
# =1.1 #AlphaAm2=0.907 #AlphaB
#=[-0.5,0,0] #mr2=[0.5,0,0] #m
# posto =sci.array(r1,dtype="")r2=sci.array(r2,dtype="")
#Findof =(m1*r1+m2*r2)/(m1+m2)
#=[0.01,0.01,0] #m/sv2=[-0.05,0,-0.1] #m/s
#to =sci.array(v1,dtype="")v2=sci.array(v2,dtype="")
#Findof =(m1*v1+m2*v2)/(m1+m2)
现在已经定义了大多数主要的模拟要求的量 。可以为解方程组在scipy中准备 求解器了 。
为了解常微分方程,需要有方程式(肯定的!),一组初始条件以及解方程所需的时间跨度 。求解器也要求具备这三样基本要素 。方程式通过函数的形式被定义 。函数以其顺序接受包含所有因变量(此处为位置和速率)的数组和包含所有因变量(此处为时间)的数组,函数返回数组中所有微分的值 。
#Atheof(w,t,G,m1,m2): r1=w[:3] r2=w[3:6] v1=w[6:9] v2=w[9:12]
r=sci..norm(r2-r1) #or norm of
=K1*m2*(r2-r1)/r**3 =K1*m1*(r1-r2)/r**3 =K2*v1 =K2*v2
=sci.((,))=sci.((,,))
从这段代码中也许很容易区分出微分方程 。那其他零碎的东西是什么?记得吗?现在在解三维方程,所以每一位置和速率向量都会有3个分量 。考虑一下之前章节给出的双矢量微分方程,它们需要解向量的所有3个分量 。因此,需要为一个物体解6标量的微分方程 。同理,两个物体就要解12标量的微分方程 。所以要制作一个大小为12,含两个物体的质量和速率的数组w 。
在函数的最后,连结或加入所有不同的导数并返回大小为12的 。
最难的部分已经做完了!剩下的就是把函数,初始条件和和时间跨度输入到函数中去 。
#s=sci.array([r1,r2,v1,v2]) # array of=.() # array to make it =sci.(0,8,500) #8and 500