如何写出三体的MATLAB程序-理论分析篇

本文深入探讨了三体问题的物理模拟,采用经典力学原理,详细解析了三体运动中坐标、速度与加速度的变化规律,介绍了矢量分解与叠加的计算方法,为MATLAB程序实现提供理论基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何写出三体的MATLAB程序-理论分析篇

写在前面

之所以写这个程序,是因为某天晚上无聊,室友正在学习MATLAB,于是提议写一个三体运动的物理模拟程序来练练手。就此,我也写一份该程序来为室友做一个参考标准,希望可以帮助室友进步的更快。

做出来的大概效果就如下图所示

效果图

本系列所有代码均在我的Github中存有备份,可下载后直接运行,点击Github: HanpuLiang/Three-Body-by-MATLAB即可进入。

三体简介

三体一般指的就是三个物体受到相互之间的引力作用的影响而运动。一般来说,因为其运动方程太过于复杂,所以并没有解析解,并且因为对初值的敏感性,略微变化一点初始条件就会对未来长远的结果产生巨大的影响。

在没有解析解的情况下,只能通过数值解的方法对微分方程组求解。所以数值解的误差也受计算步长的影响,计算步长越小越精确,但是因为数据一定会有精度,并不能真正的无穷小,所以实际上在时间足够长以后依旧会产生很大的误差。

综合很多原因,才会有了大刘《三体》的剧情,不然凭借三体人那么厉害的科技水平还怎么还是选择来搞地球。

不过说到底,解不开这样的问题还是目前人类的数学水平不行,或许以后就有办法了呢?

但是我们这里并不用分析力学的方法求解,因为手头没有演草纸,推方程有点麻烦,所以直接用经典力学的方法去模拟整个运动,这样子相信有点物理基础的大家也是可以看懂的。

运动过程分析

我们首先需要思考:

  • 三个小球到底是怎么运动的?引力作用。
  • 小球运动,哪些量在变化?位置改变导致引力大小改变,引力导致加速度改变,加速度导致速度改变,速度导致位置改变。

也就是说,我们只需要集中在三个物理量上面就好:坐标,速度(大小与方向),加速度(大小与方向)。这就是我们所需要,随着时间变化的,计算的所有数据。

接下来就要开始引进物理公式了。

两个物体之间的加速度

首先,两个物体之间的万有引力可以通过公式

F = G m 1 m 2 r 2 F=G\dfrac{m_1m_2}{r^2} F=Gr2m1m2

来计算,其中 m 1 m_1 m1是物体1的质量, m 2 m_2 m2是物体2的质量, G G G是引力系数(模拟中为方便可以设为1), r r r为物体1与物体2之间的直线距离。

根据力与加速度的公式 F = m a F=ma F=ma就可以得到,在 t t t时刻,物体之间相对距离为 r ( t − 1 ) r(t-1) r(t1)时(用上一次时间的距离算),加速度为

物体1的加速度:  a 1 ( t ) = G m 2 r ( t − 1 ) 2 \text{物体1的加速度: }\quad a_1(t)=G\dfrac{m_2}{r(t-1)^2} 物体1的加速度a1(t)=Gr(t1)2m2

物体2的加速度:  a 2 ( t ) = G m 1 r ( t − 1 ) 2 \text{物体2的加速度: }\quad a_2(t)=G\dfrac{m_1}{r(t-1)^2} 物体2的加速度a2(t)=Gr(t1)2m1

两个物体之间的速度

在单位时间 Δ t \Delta t Δt内,两个小球之间的速度变化量 Δ v \Delta v Δv Δ v = a Δ t \Delta v=a\Delta t Δv=aΔt,所以可以得到 t t t时刻的速度为

物体1的速度:  v 1 ( t ) = v 1 ( t − 1 ) + a 1 ( t ) Δ t \text{物体1的速度: }\quad v_1(t)=v_1(t-1) + a_1(t)\Delta t 物体1的速度v1(t)=v1(t1)+a1(t)Δt

物体2的速度:  v 2 ( t ) = v 2 ( t − 1 ) + a 2 ( t ) Δ t \text{物体2的速度: }\quad v_2(t)=v_2(t-1) + a_2(t)\Delta t 物体2的速度v2(t)=v2(t1)+a2(t)Δt

两个小球的位置

令两个小球的坐标分别为 ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_1, y_1), (x_2, y_2) (x1,y1),(x2,y2),则相对距离为

r = ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 r = \sqrt{(x_1-x_2)^2+(y_1-y_2)^2} r=(x1x2)2+(y1y2)2

同理,在 t t t时刻,受到速度由 v ( t − 1 ) v(t-1) v(t1)变化到 v ( t ) v(t) v(t)的影响,可以简单的得到此时刻的距离为

r ( t ) = r ( t − 1 ) + Δ r r(t) = r(t-1) + \Delta r r(t)=r(t1)+Δr

其中

Δ r = 1 2 ( v ( t − 1 ) + v ( t ) ) Δ t . \Delta r = \dfrac12(v(t-1) + v(t))\Delta t. Δr=21(v(t1)+v(t))Δt.

矢量的正交分解

众所周知,位置、速度、加速度均为矢量,即存在方向和大小这两种属性,也就是说我们需要考虑矢量方向不一致时的情况。

将矢量正交分解为 x x x轴与 y y y轴是最简单方便的做法。

正交分解示意图

首先是坐标,这个已经是分解到了 x x x轴与 y y y轴这个坐标系上了,毕竟我们写出来的就是两个点的坐标,如果谁还不会用坐标点绘图就可以点右上角退出界面了。

其次是速度与加速度。我们以物体自身为原点建立坐标系,速度大小为 v v v,方向相对 x x x轴正方向为 θ \theta θ度,可以得到一个矢量如图所示。根据高中知识,就可以得到其在 x x x轴与 y y y轴上的分解为

v x ( t ) = v ( t ) cos ⁡ θ v_x(t) = v(t)\cos\theta vx(t)=v(t)cosθ

v y ( t ) = v ( t ) sin ⁡ θ , v_y(t) = v(t)\sin\theta, vy(t)=v(t)sinθ,

同样的,加速度也可以这样子分解,得到

a x ( t ) = a ( t ) cos ⁡ θ a_x(t) = a(t)\cos\theta ax(t)=a(t)cosθ

a y ( t ) = a ( t ) sin ⁡ θ . a_y(t) = a(t)\sin\theta. ay(t)=a(t)sinθ.

而且, x x x轴上的加速度只会影响 x x x轴上的速度,所以我们分解后,在计算时,只需要分别计算 x y xy xy轴的坐标变化即可,不需要再考虑方向,即

v x ( t ) = v x ( t − 1 ) + a x ( t ) Δ t . v_x(t) = v_x(t-1) + a_x(t)\Delta t. vx(t)=vx(t1)+ax(t)Δt.

这样子,我们就将方向成功分解为 x y xy xy轴分解进行计算,大大化简了繁琐的方向变化问题。

矢量的叠加

但是这只是两个物体之间的相互作用,如果是三个物体的话,其中一个物体就要受到两个力的作用。

实际上两个力是没有受到干扰的,所以当其分解到 x y xy xy轴后,直接将其对应轴上的加速度直接相加即可得到总的加速度,也就是

a 1 x ( t ) = a 12 x ( t ) + a 13 x ( t ) , a_{1x}(t) = a_{12x}(t) + a_{13x}(t), a1x(t)=a12x(t)+a13x(t),

其中 a 1 x a_{1x} a1x就是物体1在 x x x轴上的总的加速度,它由两个分加速度组成:来自物体2对物体1的力的、在 x x x轴的加速度 a 12 x a_{12x} a12x和来自物体3对物体1的 x 13 x x_{13x} x13x

其他同理,这样子就可以完美解决所有问题了。

代码思路

根据上面的公式分析,加速度、速度、距离之间如何变化已经很清楚了,三个物体之间的各个物理量的正交分解也很明确了,已经可以转化为了代码可以实现的情况,下面我们就需要将公式化成代码。

不过因为这一篇博客已经比较长了,所以将本篇作为理论分析篇,下一篇博客中我们再进行详细解释代码。

如果这一篇我讲的比较不错的话,还希望可以点个赞、加个收藏、来个关注噢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值