用Python搓一个太阳系

Posted 微小冷

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用Python搓一个太阳系相关的知识,希望对你有一定的参考价值。


你们要的3D太阳系

3D太阳系+特洛伊小行星群

图片上传之后不知为何帧率降低了许多。。。

日地月三体

所谓三体,就是三个物体在重力作用下的运动。由于三点共面,所以三个质点仅在重力作用下的运动轨迹也必然无法逃离平面。

三体运动所遵循的规律就是古老而经典的万有引力

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 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} midtdv i=rij3Gmimjr ij

d r ⃗ i d t = v ⃗ i \\frac{\\text d\\vec r_i}{\\text dt}=\\vec v_i dtdr i=v 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(xi以上是关于用Python搓一个太阳系的主要内容,如果未能解决你的问题,请参考以下文章

你们要的3D太阳系

利用python绘制太阳花

python的pygame模拟太阳-地球-月亮-金星等动态示意图代码分析

260行代码,用Threejs实现一个太阳系(附源码)

怎么用Python写一个三体的气候模拟程序

✨ Python入门 ✨ 3️⃣ 画一个大太阳 ☀️,甚至还能画个蜡笔小❤️