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 accelerationsx = 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:Ntvel = vel + acc * dt/2;pos = pos + vel * dtacc = 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体问题是我们不常见的数学模型,用于天体计算(如小行星带)可能是个有用模型,随着人类宇宙视野的开阔,这种多维度物理模型将形成主流数学模型。 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小白第一次开私服怎么吸引玩家

大家好,我是咕噜-凯撒,在现在这个网络社会很多人为了放松一下会选择打打游戏,私服也就成为了许多玩家为了寻找新鲜体验的热门选择,很多小白就发现了这个契机但是吸引玩家加入自己的服务器也就成了一个比较头疼的问题,下…

【银行测试】第三方支付测试点+支付业务流程测试分析...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、支付功能测试点…

智能优化算法应用:基于飞蛾扑火算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于飞蛾扑火算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于飞蛾扑火算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.飞蛾扑火算法4.实验参数设定5.算法结果6.…

7.25 SpringBoot项目实战【我的借阅记录】

文章目录 前言一、编写控制器二、编写服务层三、Git提交前言 至此,我们已经实现 图书借阅、收藏、评论等场景,最后来到【还书】场景,首先 还书的 入口 一般 是【我的借阅记录】,在这里可以根据产品设计,对于需要归还的书 操作【还书】,所以本文来实现【我的借阅记录】。…

14-1、IO流

14-1、IO流 lO流打开和关闭lO流打开模式lO流对象的状态 非格式化IO二进制IO读取二进制数据获取读长度写入二进制数据 读写指针 和 随机访问设置读/写指针位置获取读/写指针位置 字符串流 lO流打开和关闭 通过构造函数打开I/O流 其中filename表示文件路径,mode表示打…

数字系统设计(EDA)实验报告【出租车计价器】

一、问题描述 题目九:出租车计价器设计(平台实现)★★ 完成简易出租车计价器设计,选做停车等待计价功能。 1、基本功能: (1)起步8元/3km,此后2元/km; (2…

大数据机器学习算法项目——基于Django/协同过滤算法的房源可视化分析推荐系统的设计与实现

大数据机器学习算法项目——基于Django/协同过滤算法的房源可视化分析推荐系统的设计与实现 技术栈:大数据爬虫/机器学习学习算法/数据分析与挖掘/大数据可视化/Django框架/Mysql数据库 本项目基于 Django框架开发的房屋可视化分析推荐系统。这个系统结合了大数据…

GreatSQL登陆Arch Linux:成功的数据库安装之旅

了解Arch Linux Arch Linux是一个轻量、灵活、基于x86-64架构的Linux发行版,遵循K.I.S.S.原则。注重代码正确、优雅和极简主义,期待用户能够愿意去理解系统的操作。 1.简洁 Arch Linux将简洁定义为:避免任何不必要的添加、修改和复杂增加。…

建立个人学习观|地铁上的自习室

作者:向知 如果大家有机会来北京,可以来看看工作日早上八九点钟,15 号线从那座叫“顺义”的城市通向“望京”的地铁,你在那上面,能看到明明白白的,人们奔向梦想的模样。 一、地铁上的自习室 我在来北京之前…

DevEco Studio将编辑器整体文本改为简体中文

我们打开编辑器 随便进入一个项目 这里 我们左上角目录 选择 File下面菜单中的 Settings… 打开配置界面 然后在设置窗口左侧导航栏中 选择 Plugins 插件 然后上方导航栏中 选择 Installed 参考下图 然后 找到这个Chinese(Simplified) Chinese是什么应该不用我多说吧 我们把…

手写VUE后台管理系统10 - 封装Axios实现异常统一处理

目录 前后端交互约定安装创建Axios实例拦截器封装请求方法业务异常处理 axios 是一个易用、简洁且高效的http库 axios 中文文档:http://www.axios-js.com/zh-cn/docs/ 前后端交互约定 在本项目中,前后端交互统一使用 application/json;charsetUTF-8 的请…

《opencv实用探索·十六》opencv直方图计算calcHist函数解析

直方图理解: (对于8位灰度图像亮度/灰度为(0-255),12位灰度图像亮度/灰度为(0-4095)) 以8位图像为例,亮度分为0到255共256个数值,数值越大,代表的亮度越高。其中0代表纯黑色的最暗区域&#xff…