N体问题-MATLAB 中的数值模拟

一、说明

        万有引力是宇宙普适真理,当计算两个物体的引力、质量、距离的关系是经典万有引力物理定律,然而面向复杂问题,比如出现三个以上物体的相互作用,随时间的运动力学,这种数学模型将是更高级的思维方法。本文将阐述这种事实。

图片由作者提供。

二、关于万有引力模型

        牛顿在 17 世纪发现了万有引力,极大地改变了我们对天体运动的理解。他的定律巧妙地协调了两个深刻的物理原理:伽利略和笛卡尔在地球力学中提出的惯性原理,以及写在《新天文学》中的开普勒定律。

        牛顿在计算行星的轨道量时意识到他的万有引力定律并不完全准确。牛顿发现的不可预见的后果是对太阳系稳定的信念提出了质疑:行星一成不变地运动、没有碰撞或抛射的说法不再明显。由此,天文学家和几何学家之间展开了一场长达两个世纪的竞争,天文学家的观测越来越精确,几何学家掌握着牛顿定律的地位和命运。其核心是 N 体问题。

三、关于N体问题的讨论

        接下来,我们将创建N 个粒子通过共同引力势相互作用的模拟。庞加莱和布伦斯证明了该系统的微分方程一般不能以封闭形式积分(即用初等函数而不是无穷级数)。因此,如果我们想要进行任何有意义的模拟尝试,我们必须依靠数值方法。

        系统设置如下。我们假设N 个粒子索引为i = 1, 2, …, N,质量为 m_i,位置 = [ xᵢ , yᵢ , zᵢ ],速度 = [v xᵢ , v yᵢ , v zᵢ ]。遵循牛顿万有引力定律,每个粒子都会感受到一种力

        其中G= 6.67×10^-11 m3/kg/s2 是万有引力常数。为了获得质量的加速度,我们将进行getAcceleration如下计算。

function [a] = getAcceleration(pos, mass, G, softening)
%   pos  is an N x 3 matrix of positions
%   mass is an N x 1 vector of masses
%   softening is the softening length
%   a is N x 3 matrix of accelerations

x = pos(:,1);
y = pos(:,2);
z = pos(:,3);
dx = x' - x;
dy = y' - y;
dz = z' - z;

% matrix that stores 1/r^3 for all particle pairwise particle separations
inverse = (dx.^2 + dy.^2 + dz.^2 + softening.^2).^(-3/2);

ax = G * (dx .* inverse) * mass;
ay = G * (dy .* inverse) * mass;
az = G * (dz .* inverse) * mass;

% pack together the acceleration components
a = [ax ay az];
end

        添加软化项是为了防止两个粒子彼此非常接近,在这种情况下,万有引力定律的加速度会达到无穷大。

        上面的代码是矢量化的。尽管在矩阵中存储中间计算需要大量内存,但它对于解释型语言非常有用;这有时会导致数十倍的加速。

        为了验证我们的代码,我们依靠能量守恒——我们知道这个量在时间演化中应该是恒定的。

        第一项是动能,定义为动量的平方除以质量的两倍。第二项是重力势能。我们的代码计算这些量并跟踪总能量,确保我们的近似值得到验证。

function [Ek, Ep] = getEnergy(pos, vel, mass, G)

% Kinetic Energy:
KE = 0.5 * sum(sum(mass.* vel.^2));

% Potential Energy:
% positions r = [x,y,z] for all particles
x = pos(:,1);
y = pos(:,2);
z = pos(:,3);

% matrix that stores all pairwise particle separations: r_j - r_i
dx = x' - x;
dy = y' - y;
dz = z' - z;

% matrix that stores r for all particle pairwise particle separations 
r = sqrt(dx.^2 + dy.^2 + dz.^2);

% sum over upper triangle, to count each interaction only once
PE = G *  sum(sum(triu(-(mass*mass')./r,1)));
end

        为了指定系统的初始条件,我们将从高斯分布中随机选择值。您可以使用 MATLAB 中的函数进行设置randn

        对于数值积分,我们使用蛙跳方案,该方案采用踢-漂移-踢形式。

        演变是使用 for 循环在代码中执行的。

for i = 1:Nt
    vel = vel + acc * dt/2;
    pos = pos + vel * dt
    acc = getAcceleration(pos, mass, G, softening);
    vel = vel + acc * dt/2;
    t = t + dt;
end

        将加速度计算分离到步骤的开始和结束意味着如果时间分辨率增加两倍 (Δt →Δt/2),则只需要一次额外的(计算成本较高的)加速度计算。

        当应用于力学问题时,跨越式积分有两个主要优势。首先是蛙跳法的时间可逆性。可以向前积分n步,然后反转积分方向,向后积分n步,以达到相同的起始位置。第二个优点是它的辛性质,有时允许动力系统的(稍微修改的)能量守恒(仅适用于某些简单系统)。这在计算轨道动力学时特别有用,因为许多其他积分方案(例如龙格-库塔方法)不保存能量并允许系统随时间大幅漂移。

        最后,我们使用另一个for循环,for i = 1:ceil(end_t/dt)运行蛙跳积分器并保存绘制轨迹的能量和位置。下面是我们的模拟结果。

        N 体模拟 N = 10,dt = 0.01,软化 = 0.1。

在此处查找 GitHub 存储库。感谢您的阅读,祝您有美好的一天!

四、结论

        N体问题是我们不常见的数学模型,用于天体计算(如小行星带)可能是个有用模型,随着人类宇宙视野的开阔,这种多维度物理模型将形成主流数学模型。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/237293.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

jsp文件引用的css修改后刷新不生效问题

问题 在对 JavaWeb 项目修改的过程中,发现修改了 jsp 文件引入的 css 文件的代码后页面的样式没有更新的问题。 原因 导致这个问题的原因可能是因为浏览器缓存的问题。 解决方法 下面介绍两种解决方法,供大家参考: 1、给 link 标签的 c…

软件测试(接口测试业务场景测试)

软件测试 手动测试 测试用例8大要素 编号用例名称(标题)模块优先级预制条件测试数据操作步骤预期结果 接口测试(模拟http请求) 接口用例设计 防止漏测方便分配工具,评估工作量和时间接口测试测试点 功能 单接口业…

css的Grid布局

1.简单布局 .grid { display: grid; grid-template-columns: 1fr 2fr 1fr; 布局样式 column-gap: 24px; 列间距 row-gap: 24px; 行间距 } 2.排列布局 center垂直方向居中对其 end靠下对齐 3.水平方向对齐 center居中 end靠右对齐 space-between两段对齐 4.对…

使用BeautifulSoup 4和Pillow合并网页图片到一个PDF:一种高效的方式来处理网页图像

背景 ​ 网页上的培训材料,内容全是PPT页面图片。直接通过浏览器打印,会存在只打印第一页,并且把浏览器上无效信息也打印出来情况。但目标是希望将页面图片全部打印为pdf形式。 实现方案 利用网页“另存为”,将页面内所有图片资…

Windows安全基础——Windows WMI详解

Windows安全基础——WMI篇 1. WMI简介 WMI(Windows Management Instrumentation, Windows管理规范)是Windows 2000/XP管理系统的核心,属于管理数据和操作的基础模块。设计WMI的初衷是达到一种通用性,通过WMI操作系统、应用程序等…

构建智能外卖跑腿小程序:技术实践与代码示例

在快节奏的现代生活中,外卖跑腿服务已成为人们日常生活中不可或缺的一部分。为了提供更智能、高效的外卖跑腿体验,本文将深入探讨构建一款智能外卖跑腿小程序所需的关键技术,并提供相应的代码示例。 1. 地理位置服务的整合 外卖跑腿小程序…

nodejs微信小程序+python+PHP个性化服装搭配系统APP-计算机毕业设计推荐 android

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…

Ubuntu22.04安装和卸载软件的命令行

一、安装 sudo apt install xxx 二、卸载 sudo apt remove xxx 三、卸载依赖包(可选) 第二步软件卸载之后,有一些依赖包没有被卸载。可以使用sudo apt autoremove xxx来卸载。如果不卸载应该也没什么影响

【开源】基于Vue和SpringBoot的高校学院网站

项目编号: S 020 ,文末获取源码。 \color{red}{项目编号:S020,文末获取源码。} 项目编号:S020,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学院院系模块2.2 竞赛报名模块2.3 教…

Python爬取酷我音乐

🎈 博主:一只程序猿子 🎈 博客主页:一只程序猿子 博客主页 🎈 个人介绍:爱好(bushi)编程! 🎈 创作不易:喜欢的话麻烦您点个👍和⭐! 🎈…

Python-docx 深入word源码 自定义字符间距

代码和实现效果 from docx import Document from docx.oxml import OxmlElement from docx.oxml.ns import qn from docx.shared import Pt# 调整pt设置字间距 def SetParagraphCharSpaceByPt(run, pt1):通过修改word源码方式, 添加w:spacing标签直接通过调整pt来设置字符间距…

【Maven教程】(十二):版本管理 ——版本号定义约定及相关概念,自动化版本发布与创建分支,GPG签名 ~

Maven 版本管理 1️⃣ 版本管理的概念2️⃣ Maven 的版本号定义约定3️⃣ 主干、标签与分支4️⃣ 自动化版本发布5️⃣ 自动化创建分支6️⃣ GPG签名6.1 GPG 及其基本使用6.2 Maven GPG Plugin 🌾 总结 一个健康的项目通常有一个长期、合理的版本演变过程。例如JUn…

Nginx访问FTP服务器文件的时效性/安全校验

背景 FTP文件服务器在我们日常开发中经常使用,在项目中我们经常把FTP文件下载到内存中,然后转为base64给前端进行展示。如果excel中也需要导出图片,数据量大的情况下会直接返回一个后端的开放接口地址,然后在项目中对接口的参数进…

Golang 使用 Template 引擎构建漂亮的邮件内容并且完成邮件发送

背景 邮件是常见的触达用户的途径,本文详细介绍基于 golang 的模版引擎构建漂亮的邮件内容,并且发送给模板用户。 思路 go 内置了 html/template 模块,类似 ejs 模块引擎。利用 template 能力可以将变量动态的注入到HTML字符串中&#xff…

迅为RK3568开发板使用OpenCV处理图像(颜色转换)

1 颜色转换 本小节代码在配套资料“iTOP-3568 开发板\03_【iTOP-RK3568 开发板】指南教程 \04_OpenCV 开发配套资料\05”目录下,如下图所示: cv2.cvtColor()函数功能: 将一幅图像从一个色彩空间转换到另一个色彩空间。 函数原型&#xff…

5G CPE可代替宽带,解决断网问题

最近某运营商就玩起了套餐,断用户的网。 老百姓对宽带半知不解,网络断了没法上网,很着急。因为相信运营商,维修人员怎么说,老百姓就怎么办呗,直到最后才发现自己上当,但钱都给了。 截至2023年9月…

Django讲课笔记02:Django环境搭建

文章目录 一、学习目标二、相关概念(一)Python(二)Django 三、环境搭建(一)安装Python1. 从官方网站下载最新版本的Python2. 运行安装程序并按照安装向导进行操作3. 勾选添加到路径复选框4. 完成安装过程5.…

公共模块无法实例化Elasticsearch的interface类

public interface EsLogDao extends ElasticsearchRepository<EsLog, String> {}Data NoArgsConstructor Document(indexName "my_log") public class EsLog implements Serializable {Idprivate String id; } 出现的错误 解决方案&#xff0c;在公共模块增加…

centos7安全防护_CPU占用率超过百分之300_centos7.4中毒CPU百分之百_清理毒源---Linux工作笔记068

执行top命令的时候看到有个进程: sshd占用cpu百分之300多...而且就算是kill -9 杀掉进程以后,进程又会自动启动 ll /proc/7298 我们执行这个命令,可以看到有个/var/tmp/sshd的文件 我们进入cd /var/tmp 然后我们执行 rm -rf sshd删除这个文件,然后我们再去top可以看到 cpu就…

多线程(初阶九:线程池)

目录 一、线程池的由来 二、线程池的简单介绍 1、ThreadPoolExecutor类 &#xff08;1&#xff09;核心线程数和最大线程数&#xff1a; &#xff08;2&#xff09;保持存活时间和存活时间的单位 &#xff08;3&#xff09;放任务的队列 &#xff08;4&#xff09;线程工…