工程实现 ============= 科学技术原理 ^^^^^^^^^^^^^^ 三体问题经典的二体问题的一般化——二体问题是研究两个物体的运动方程。 来看牛顿万有引力定律: :math:`{dp \over dt}={G{M_1M_2}\over{r^2}}` 其中,p是动量,t是时间,G是重力常数,m1 和m2 是质量,r是物体之间的距离。 在大多数情况下可以假定物体质量不变。因此,来自N-1个其他物体的第i个物体上的力如下: .. math:: m_ia_i={d^2x_i\over dt^2}=\sum^{N}_{j=1 \ i\neq j}{G\frac{m_im_j(x_j-x_i)}{|| x_j - x_i||^3}} :math:`xi` 是第i个物体的位置。根据各个物体的质量和位置,可以计算加速度 :math:`a_i` : .. math:: a_i={d^2x_i\over dt^2}=G\sum^{N}_{j=1 \ i\neq j}{\frac{m_j(x_j-x_i)}{|| x_j - x_i||^3}} 将这个加速度带入标准的时间离散运动方程:[#f1]_ .. math:: v_{i,s}=a_{i,s-1}\Delta t+v_{i,s-1} x_{i,s}=a_{i,s-1}\Delta t^2+v_{i,s-1}\Delta t+x_{i,s-1} 其中v是速度,s是分段的时间,:math:`\Delta t= t_s -t_{s-1}` 是时间间隔的长度。 给定所有N个物体的初始条件 :math:`x_{i0} ` 和 :math:`v_{i0}` 以及时间间隔Δt ,这些方程将数值求解物体未来的位置、速度、加速度。现在有了数学物理原理的离散实现,理论问题解决后 以下就是工程问题的设计方案 设计方案 ^^^^^^^^^^^^^^ 为实现三体运动数值计算的数值计算和可视化,用 *numpy* 作为主要的数据结构存储质点的位置,速度,时间以及质量, 引力常数,时间微分等等信息,为实现数据的可复用性,使用 *csv(符号分割符)* 来保存信息。 可视化实现方面使用 *pyqtgraph* 和 *PyQt5* 的结合使用, *pyqtgraph* 用于3D数据的呈现, *PyQt5* 用于实现控件 以及事件的触发及处理。例如参数设置的表格由 *PyQt5* 实现,而参数的计算结果以散点运动和轨迹连线的结果由 *pyqtgraph* 表现. 创新性体现 ^^^^^^^^^^^^^^ 相比于单纯数值计算的输入输出实现,采用 *pyqtgraph* 的强大3D功能可以使三体运动更加直观,虽然用matplotlib也可以实现3D 绘图,但是其拓展性和绘制速度难以与C++底层实现的Qt以及OpenGL渲染速度相媲美。此外,对参数的设置以及结果数据的保存,打开 方式可以提高数据复用性和规范性,可以满足不同设备上的交流需求。界面设置上尽可能提供用户设置的自由度,如散点大小,颜色,轨迹, 时间微分甚至引力常数和质量,也可以调节刷新速度,使使用方式更加具有趣味性。 运行方法和操作实现 ^^^^^^^^^^^^^^^^^^^^^ 在安装PyQt5,pyqtgraph,matplotlib,numpy,csv的环境下,可在文件所在目录的命令控制行下输入 >>> python ThreeBodyProblem.py 打开图形界面,点击“参数设置”,依次填写质点信息,点击“视图”选项,在弹出的颜色选项框中选择颜色,以此应用于散点颜色以及轨迹。 以上参数设置完毕后,点击“暂停/运动”按钮,如果移动现象不明显,可以拖动speed选择条,或者用滚轮放大3D视图使得运动更加明显, 在3D视图中使用鼠标左键拖动实现旋转,按住键盘“ctrl”+鼠标左键拖动实现坐标平移。 注意:平移后再次旋转可能会导致视图混乱,此时可以点击“摄像机归位”,回复初始观察状态。 点击单选框可以切换是否显示轨迹,“ctrl+s”可以保存当前数据文件。 **请注意保存的csv文件可以用记事本或VScode编辑,如果用Excel仅适合观查数据,不要在Excel中编辑数据!否则可能导致程序无法再次读取信息。** .. [#f1] Python物理学高效计算 (安东尼·斯科普斯)