热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

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

如何写出三体的MATLAB程序-理论分析篇写在前面之所以写这个程序,是因为某天晚上无聊,室友正在学习MATLAB,于是提议写一个三体运动的物理模拟程序来练练手。就此,我也写一份该程
如何写出三体的MATLAB程序-理论分析篇

写在前面

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

做出来的效果图大概这样子

《如何写出三体的MATLAB程序-理论分析篇》 效果图

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

三体简介

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

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

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

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

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

运动过程分析

我们首先需要思考:

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

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

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

两个物体之间的加速度

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

《如何写出三体的MATLAB程序-理论分析篇》 正交分解示意图

首先是坐标,这个已经是分解到了《如何写出三体的MATLAB程序-理论分析篇》轴与《如何写出三体的MATLAB程序-理论分析篇》轴这个坐标系上了,毕竟我们写出来的就是两个点的坐标,如果谁还不会用坐标点绘图就可以点右上角退出界面了。

其次是速度与加速度。我们以物体自身为原点建立坐标系,速度大小为《如何写出三体的MATLAB程序-理论分析篇》,方向相对《如何写出三体的MATLAB程序-理论分析篇》轴正方向为《如何写出三体的MATLAB程序-理论分析篇》度,可以得到一个矢量如图所示。根据高中知识,就可以得到其在《如何写出三体的MATLAB程序-理论分析篇》轴与《如何写出三体的MATLAB程序-理论分析篇》轴上的分解为

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

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

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

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

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

而且,《如何写出三体的MATLAB程序-理论分析篇》轴上的加速度只会影响《如何写出三体的MATLAB程序-理论分析篇》轴上的速度,所以我们分解后,在计算时,只需要分别计算《如何写出三体的MATLAB程序-理论分析篇》轴的坐标变化即可,不需要再考虑方向,即

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

这样子,我们就将方向成功分解为《如何写出三体的MATLAB程序-理论分析篇》轴分解进行计算,大大化简了繁琐的方向变化问题。

矢量的叠加

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

实际上两个力是没有受到干扰的,所以当其分解到《如何写出三体的MATLAB程序-理论分析篇》轴后,直接将其对应轴上的加速度直接相加即可得到总的加速度,也就是

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

其中《如何写出三体的MATLAB程序-理论分析篇》就是物体1在《如何写出三体的MATLAB程序-理论分析篇》轴上的总的加速度,它由两个分加速度组成:来自物体2对物体1的力的、在《如何写出三体的MATLAB程序-理论分析篇》轴的加速度《如何写出三体的MATLAB程序-理论分析篇》和来自物体3对物体1的《如何写出三体的MATLAB程序-理论分析篇》

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

代码思路

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

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

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


推荐阅读
  • 探讨一个显示数字的故障计算器,它支持两种操作:将当前数字乘以2或减去1。本文将详细介绍如何用最少的操作次数将初始值X转换为目标值Y。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文详细介绍了 GWT 中 PopupPanel 类的 onKeyDownPreview 方法,提供了多个代码示例及应用场景,帮助开发者更好地理解和使用该方法。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 计算机网络复习:第五章 网络层控制平面
    本文探讨了网络层的控制平面,包括转发和路由选择的基本原理。转发在数据平面上实现,通过配置路由器中的转发表完成;而路由选择则在控制平面上进行,涉及路由器中路由表的配置与更新。此外,文章还介绍了ICMP协议、两种控制平面的实现方法、路由选择算法及其分类等内容。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 构建基于BERT的中文NL2SQL模型:一个简明的基准
    本文探讨了将自然语言转换为SQL语句(NL2SQL)的任务,这是人工智能领域中一项非常实用的研究方向。文章介绍了笔者在公司举办的首届中文NL2SQL挑战赛中的实践,该比赛提供了金融和通用领域的表格数据,并标注了对应的自然语言与SQL语句对,旨在训练准确的NL2SQL模型。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 本文介绍如何使用 Sortable.js 库实现元素的拖拽和位置交换功能。Sortable.js 是一个轻量级、无依赖的 JavaScript 库,支持拖拽排序、动画效果和多种插件扩展。通过简单的配置和事件处理,可以轻松实现复杂的功能。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
author-avatar
手机用户2702934194
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有