用Python搓一个太阳系
Posted 微小冷
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用Python搓一个太阳系相关的知识,希望对你有一定的参考价值。
你们要的3D太阳系
图片上传之后不知为何帧率降低了许多。。。
日地月三体
所谓三体,就是三个物体在重力作用下的运动。由于三点共面,所以三个质点仅在重力作用下的运动轨迹也必然无法逃离平面。
三体运动所遵循的规律就是古老而经典的万有引力
F ⃗ = G m i m j r 2 e ⃗ r \\vec F=\\frac{Gm_im_j}{r^2}\\vec e_r F=r2Gmimjer
则对于 m i m_i mi而言,
m i d v ⃗ i d t = G m i m j r i j 3 r ⃗ i j m_i\\frac{\\text d\\vec v_i}{\\text dt}=\\frac{Gm_im_j}{r_{ij}^3}\\vec r_{ij} midtdvi=rij3Gmimjrij
且
d r ⃗ i d t = v ⃗ i \\frac{\\text d\\vec r_i}{\\text dt}=\\vec v_i dtdri=vi
将其写为差分形式
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} viri=j=i∑rij3Gmjrijdt=vidt
由于我们希望观察三体运动的复杂形式,而不关系其随对应的宇宙星体,所以不必考虑单位制,将其在二维平面坐标系中拆分,令 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∑(xi−xj)2+(yi−yj)23Gmj(xj−xi)dt+=j=i∑(xi以上是关于用Python搓一个太阳系的主要内容,如果未能解决你的问题,请参考以下文章