matlab&simulink仿真天体运行轨迹

您所在的位置:网站首页 matlab三维运动轨迹 matlab&simulink仿真天体运行轨迹

matlab&simulink仿真天体运行轨迹

2023-06-27 10:02| 来源: 网络整理| 查看: 265

1. 介绍

本博客来自北理工《计算机仿真与matlab》课程的大作业,有任何问题欢迎批评指正。 源代码请参见如下链接: 链接:https://pan.baidu.com/s/1hkAoi9c16_IoUYJSxX92hg 提取码:4gr6

2. 问题背景

我使用matlab和simulink建立天体系统的模型,并使用不同的数值积分方法仿真求解,模拟推演天体运动轨迹。

下文第3、4节将演示双星系统的仿真模拟,第5节将演示三体系统的仿真模拟。

3. 数学模型

行星所受的万有引力为:

F ⃗ = G M m ∣ R ⃗ − r ⃗ ∣ 2 ⋅ R ⃗ − r ⃗ ∣ R ⃗ − r ⃗ ∣ \vec{F}=\frac{GMm}{\left|\vec{R}-\vec{r}\right|^2}·\frac{\vec{R}-\vec{r}}{\left|\vec{R}-\vec{r}\right|} F =∣∣∣​R −r ∣∣∣​2GMm​⋅∣∣∣​R −r ∣∣∣​R −r ​

其中 G G G、 M M M、 m m m 分别为万有引力常量、恒星质量、行星质量, R ⃗ \vec{R} R 是恒星位置, r ⃗ \vec{r} r 是行星位置。

由牛二律建立行星运动微分方程:

d 2 r ⃗ d t 2 = G M ( R ⃗ − r ⃗ ) ∣ R ⃗ − r ⃗ ∣ 3 \frac{d^2\vec{r}}{dt^2}=\frac{GM(\vec{R}-\vec{r})}{\left|\vec{R}-\vec{r}\right|^3} dt2d2r ​=∣∣∣​R −r ∣∣∣​3GM(R −r )​

考虑到恒星的质量远大于行星的质量,假设恒星在系统中静止,即 R ⃗ \vec{R} R 为常矢量。因此上式为关于行星位置 r ⃗ \vec{r} r 的二阶微分方程,求解时将 r ⃗ \vec{r} r 分解到x、y、z轴,得到与上式等价的三个微分方程组。

4. 仿真模拟 4.1 matlab仿真

函数pre_load_twobody.m,预定义仿真参数(仿真时间间隔h),天体参数(万有引力常量G和天体质量)和初始条件(天体的初始位置和初始速度)。

function [G,h,M,m,posM,posm, vM, vm] = pre_load_twobody() % 宇宙参数 G = 6.67*10^-11; % 万有引力常量 N*m^2/kg^2 h = 0.001; % 时间元 % 天体的质量 kg M = 1.9891*1e25; m = 5.965*1e19; % 天体的初始位置 矢量,m posM = [0,0,0]; posm = [8*1e6,0,0]; % 天体的初始速度 矢量,m/s vM = [0,0,0]; vm = [-2.5e3,7.5e3,0]; end

twobody.m,使用梯形法求解微分方程并绘制天体轨迹。(其中调用的count_a函数用于计算加速度,此处略,请参见源代码)

[G,h,M,m,posM,posm, vM, vm] = pre_load_twobody(); %% 设置绘制参数和绘制对象 colordef black grid on % 绘制天体 hold on planetM = plot3(posM(1), posM(2), posM(3), 'r:.', 'markersize', 60); planetm = plot3(posm(1), posm(2), posm(3), 'g:.', 'markersize', 40); % 梯形法计算的轨迹 % 绘制天体轨迹 hm = animatedline('color', 'g', 'LineWidth', 2); legend([hm],{'梯形法'}); xlabel('X') ylabel('Y') zlabel('Z') %% 作图循环 step = 0; while true [aM, am, r12] = count_a(G,M,m,posM,posm); %预估下一时刻的位置。即由t时刻的x1、x2求x1p(t+1) posM_p = posM + vM * h; posm_p = posm + vm * h; %预估下一个时刻的速度。即由t时刻的x1、x2求x2p(t+1) vm_p = vm + am * h; %计算am_p,用于梯形法更新速度 [aM_p, am_p, ~] = count_a(G,M,m,posM_p,posm_p); % 更新下一时刻的位置。即由t时刻的x1、x2求x1(t+1) posm = posm + (vm+vm_p)*h/2; % 更新下一个时刻的速度。即由t时刻的x1、x2求x2(t+1) vm = vm + (am+am_p)*h/2; %%% 每个1000个frame绘图一下 step = step + 1; if mod(step,1000)==0 % 通过set改变点的位置 set(planetM, 'Xdata', posM(1), 'Ydata', posM(2), 'Zdata', posM(3)); set(planetm, 'Xdata', posm(1), 'Ydata', posm(2), 'Zdata', posm(3)); addpoints(hm, posm(1), posm(2), posm(3)); view(37.5,30) % 查看三维的图。因为使用hold on后matlab会默认使用二维画布。 drawnow end % 若相撞就退出循环。为避免过零问题,判断相撞的条件应为距离小于某阈值。 if r12


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3