这一篇专栏文章由我的博客文章缩减而成(b站投稿不支持Markdown,没办法加公式和代码块,这个让人很头疼啊,只能放纯文字了)。如果我写了个这个么程序却不给大家分享我的写作思路,我的内心其实是很纠结的。
所以如果想看完全版的可以移步本篇文章末尾,有知乎、简书与CSDN的博客链接。
写在前面
之所以写这个程序,是因为某天晚上无聊,室友正在学习MATLAB,于是提议写一个三体运动的物理模拟程序来练练手。就此,我也写一份该程序来为室友做一个参考标准,希望可以帮助室友进步的更快。
做出来的大概效果就如下图所示
效果图
本系列所有代码均在我的Github中存有备份,链接见文章末尾。
三体简介
三体一般指的就是三个物体受到相互之间的引力作用的影响而运动。一般来说,因为其运动方程太过于复杂,所以并没有解析解,并且因为对初值的敏感性,略微变化一点初始条件就会对未来长远的结果产生巨大的影响。
在没有解析解的情况下,只能通过数值解的方法对微分方程组求解。所以数值解的误差也受计算步长的影响,计算步长越小越精确,但是因为数据一定会有精度,并不能真正的无穷小,所以实际上在时间足够长以后依旧会产生很大的误差。
综合很多原因,才会有了大刘《三体》的剧情,不然凭借三体人那么厉害的科技水平还怎么还是选择来搞地球。
不过说到底,解不开这样的问题还是目前人类的数学水平不行,或许以后就有办法了呢?
但是我们这里并不用分析力学的方法求解,因为手头没有演草纸,推方程有点麻烦,所以直接用经典力学的方法去模拟整个运动,这样子相信有点物理基础的大家也是可以看懂的。
运动过程分析
我们首先需要思考:
- 三个小球到底是怎么运动的?引力作用。
- 小球运动,哪些量在变化?位置改变导致引力大小改变,引力导致加速度改变,加速度导致速度改变,速度导致位置改变。
也就是说,我们只需要集中在三个物理量上面就好:坐标,速度(大小与方向),加速度(大小与方向)。这就是我们所需要,随着时间变化的,计算的所有数据。
具体的公式推导,可以见文章末尾的博客。
构建框架
基本变量
我们首先要确定,物体本身具有哪些物理量?
质量、加速度、速度、坐标。
其中加速度和坐标为矢量,当在计算过程当中可以将其正交分解为x与y轴的标量。
其余的量我们还可以设置一下,诸如:物体运动的时间长度、我们计算所需要的时间间隔、万有引力常数等。
对于我们要做出的图像大小也需要设置一下,比如说x轴范围,y轴范围等。
程序流程
初始化
首先需要初始化,确定三个物体在初始状态的情况:初始坐标、初始速度(大小与方向)。所以一共需要三个量:坐标、速度大小、速度相对x轴角度。
物体的加速度可以直接由万有引力公式计算出来,为了计算方便,需要将其正交分解与叠加。
随着时间演变
物体开始运动了,但是因为我们无法给出一段连续的时间,只能计算在极小的时间间隔dt之后物体所在的位置。
所以在t->t+dt时间,首先计算出当前位置的加速度,然后根据这个加速度算出当前的速度,再根据这个速度算出经历过dt$时间后的位移变化量,再将这个位移变化量叠加到t的位置上。
这样子就完成了一个循环。
作图
之前按道理,我们应该将每一个时间点的值放在一个矩阵内,这样子我们就可以得到随之间变化的所有物理量。
这样子我们就可以直接做出随着时间变化的各个物理量的图,如t-v和t-a以及t-theta等。
如果我们想要做出小球的运动图,那就需要t时刻及其之前(做出尾迹)的数据进行作图。
我们可以做出这样的图,可以看出其运动规律还是很有趣的。
时间与速度
时间与角度
最后总结
以上就是大概的一个流程,当然关于公式推导部分以及代码部分因为b站问题我没有放上来。如果有好学的小伙伴的话,欢迎去我的博客看完整版,知乎、简书、CSDN三个博客内容完全一样,Github则存放了本篇文章的程序的所有代码。
希望我的这篇文章可以帮助到大家,让大家了解到如何运用我们学过的物理知识去分析我们想要分析的问题,这就是我分享我的知识的目的。
也许我有当老师的潜质吧哈哈
如果帮助到大家了的话,欢迎点赞评论加收藏素质三连噢,你的好评就是我的动力呦。
知乎:https://zhuanlan.zhihu.com/p/58620930
简书:https://www.jianshu.com/p/d1a56bf54a6c
CSDN:https://blog.csdn.net/Hanpu_Liang/article/details/88322072
Github:https://github.com/HanpuLiang/Three-Body-by-MATLAB