iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > Python >基于Python如何实现模拟三体运动
  • 635
分享到

基于Python如何实现模拟三体运动

2023-07-05 10:07:56 635人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

本文小编为大家详细介绍“基于python如何实现模拟三体运动”,内容详细,步骤清晰,细节处理妥当,希望这篇“基于Python如何实现模拟三体运动”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。拉格朗日方程此前所做的

本文小编为大家详细介绍“基于python如何实现模拟三体运动”,内容详细,步骤清晰,细节处理妥当,希望这篇“基于Python如何实现模拟三体运动”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

拉格朗日方程

此前所做的一切三体和太阳系的动画,都是基于牛顿力学的,而且直接对微分进行差分化,从而精度非常感人,用不了几年就得撞一起去。

为了给三体人提供一个更加有价值的推导,这次通过求解拉格朗日方程的数值解来实现。

首先假设三个质点的质量分别为m1, m2,m3,坐标为x→1,x→2,x→3,质点速度可以表示为x → ˙.假设三体在二维平面上运动,则第i个质点的动能为

基于Python如何实现模拟三体运动

引力势能为

基于Python如何实现模拟三体运动

其中G为万有引力常量,rij为质点i,j之间的距离,则系统的拉格朗日量为

基于Python如何实现模拟三体运动

有了拉格朗日量,将其带入拉格朗日方程

基于Python如何实现模拟三体运动

就可以得到拉格朗日方程组。

推导方程组

对于三体系统而言,总计有3个粒子,每个粒子有x,y两个自由度,也就是说最后会得到6组方程。考虑到公式推导过程中可能会出现错误,所以下面采用sympy来进行公式推导。

首先定义符号变量

from sympy import symbolsfrom sympy.physics.mechanics import dynamicsymbolsm = symbols('m1:4')x = dynamicsymbols('x1:4')y = dynamicsymbols('y1:4')

接下来,需要构造系统的拉格朗日量L,其实质是系统的动能减去势能,对于上面构建的三体系统而言,动能和势能可分别表示为

计算每个质点的动能和势能。动能是由速度决定的,而速度是由位置对时间的导数决定的。我们可以用 sympy 的 diff 函数来求导:

from sympy import diff# 此为速度的平方v2 = [diff(x[i],t)**2 + diff(y[i])**2 for i in range(3)]T = 0for i in range(3):    T += m[i]*v2[i]/2

势能是由万有引力决定的,而万有引力是由两个质点之间的距离决定的。我们可以用 sympy 的 sqrt 函数来求距离:

from sympy import sqrt,cosG = symbols('G') # 引力常数ijs = [(0,1), (0,2),(1,2)]dij = [sqrt((x[i]-x[j])**2+(y[i]-y[j])**2) for i,j in ijs]U = 0for k in range(3):    i,j = ijs[k]    U -= G*m[i]*m[j]/dij[k]

有了动能和势能,就可以愉快地求拉格朗日量了,有了拉格朗日量,就可以列拉格朗日方程了

基于Python如何实现模拟三体运动

三个粒子的每一个坐标维度,都可以列出一组拉格朗日方程,所以总共有6个拉格朗日方程组

from sympy import solveL = T - UeqLag = lambda x : diff(L, x)-diff(diff(L, diff(x, t)), t)# 拉格朗日方程组eqs = [eqLag(xi) for xi in x+y]

记xij=xi−xj,yij=yi−yj ,则

基于Python如何实现模拟三体运动

微分方程算法

接下来就要调用Python的odeint来计算这个微分方程组的数值解,odeint的调用方法大致为odeint(func, y, t, args),其中func是一个函数,这个函数必须为func(y,t,...),且返回值为dy/dt.

为此,需要将上述方程组再行拆分,以消去其中的二次导数,以x1为例,令u1=dx1/dt ,则此方程变为方程组

基于Python如何实现模拟三体运动

由于三体系统中有3个粒子,共6个独立变量,所以要列12个方程。记

基于Python如何实现模拟三体运动

odeint输入的y的形式为

基于Python如何实现模拟三体运动

从而func的具体形式为

import numpy as npdxy = lambda x,y : np.sqrt(x**2+y**2)**(3/2)def triSys(Y, t, m, G):    jk = [(1,2),(0,2),(0,1)]    x,y = Y[:3], Y[3:6]    u,v = Y[6:9], Y[9:]    du, dv = [], []    for i in range(3):        j, k = jk[i]        xji, xki = x[j]-x[i], x[k]-x[i]        yji, yki = y[j]-y[i], y[k]-y[i]        dji, dki = dxy(xji, yji), dxy(yji, yki)        mji, mki = G*m[i]*m[j], G*m[i]*m[k]        du.append(mji*xji/dji + mki*xki/dki)        dv.append(mji*yji/dji + mki*yki/dki)    dydt = [*u, *v, *du, *dv]    return dydt

求解+画图

接下来就是见证奇迹的时刻,首先创建一个随机的起点,作为三体运动的初值,然后带入开整就完事儿了

from scipy.integrate import odeintnp.random.seed(42)y0 = np.random.rand(12)m = np.random.rand(3)t = np.linspace(0, 20, 1001)sol = odeint(triSys, y0, t, args=(m, 1))

然后绘制一下这三颗星的轨迹

import matplotlib.pyplot as pltplt.plot(sol[:,0], sol[:,3])plt.plot(sol[:,1], sol[:,4])plt.plot(sol[:,2], sol[:,5])plt.show()

基于Python如何实现模拟三体运动

光是看这个轨迹就十分惊险了有木有。

如果把其中的第一颗星作为坐标原点,那么另外两颗星的轨迹大致为

plt.plot(sol[:,1]-sol[:,0], sol[:,4]-sol[:,3])plt.plot(sol[:,2]-sol[:,0], sol[:,5]-sol[:,3])plt.scatter([0],[0], c='g', marker='*')plt.show()

结果为

基于Python如何实现模拟三体运动

动图绘制

最后,以中间这颗星为原点,绘制一下另外两颗星运动的动态过程

import matplotlib.animation as animation fig = plt.figure(figsize=(9,4))ax = fig.add_subplot(xlim=(-1.8,1.8),ylim=(-1.8,1.5))ax.grid()traces = [ax.plot([],[],'-',lw=0.5)[0] for _ in range(2)]pts = [ax.plot([],[] ,marker='*')[0] for _ in range(2)]ax.plot([0],[0], marker="*", c='r')X1 = sol[:,1]-sol[:,0]Y1 = sol[:,4]-sol[:,3]X2 = sol[:,2]-sol[:,0]Y2 = sol[:,5]-sol[:,3]def animate(n):    traces[0].set_data(X1[:n], Y1[:n])    traces[1].set_data(X2[:n], Y2[:n])    pts[0].set_data([X1[n], Y1[n]])    pts[1].set_data([X2[n], Y2[n]])    return traces + ptsani = animation.FuncAnimation(fig, animate,     range(1000), interval=10, blit=True)ani.save('tri.gif')

基于Python如何实现模拟三体运动

读到这里,这篇“基于Python如何实现模拟三体运动”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网Python频道。

--结束END--

本文标题: 基于Python如何实现模拟三体运动

本文链接: https://www.lsjlt.com/news/351273.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 基于Python如何实现模拟三体运动
    本文小编为大家详细介绍“基于Python如何实现模拟三体运动”,内容详细,步骤清晰,细节处理妥当,希望这篇“基于Python如何实现模拟三体运动”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。拉格朗日方程此前所做的...
    99+
    2023-07-05
  • 基于Python实现模拟三体运动的示例代码
    目录拉格朗日方程推导方程组微分方程算法化求解+画图动图绘制温馨提示,只想看图的画直接跳到最后一节 拉格朗日方程 此前所做的一切三体和太阳系的动画,都是基于牛顿力学的,而且直接对微分进...
    99+
    2023-03-10
    Python模拟三体运动 Python三体运动 Python三体
  • 基于matlab怎么模拟打桩机运动学
    这篇文章主要介绍“基于matlab怎么模拟打桩机运动学”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于matlab怎么模拟打桩机运动学”文章能帮助大家解决问题。1...
    99+
    2024-04-02
  • 基于jQuery如何模拟实现淘宝购物车模块
    小编给大家分享一下基于jQuery如何模拟实现淘宝购物车模块,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!这是网页版淘宝中购物车的页面注意给checkbox添加事件就是用change()给button添加事件就是用clic...
    99+
    2023-06-29
  • 如何实现基于input动态模糊查询
    这篇文章主要介绍了如何实现基于input动态模糊查询,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。最近在用jQuery实现动态模糊查询的时候...
    99+
    2024-04-02
  • 如何基于Flutter实现爱心三连动画效果
    这篇文章主要为大家展示了“如何基于Flutter实现爱心三连动画效果”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何基于Flutter实现爱心三连动画效果”这篇文章吧。前言我们开始 Flutt...
    99+
    2023-06-29
  • Qt无边框窗体如何实现模拟模态窗体抖动效果
    小编给大家分享一下Qt无边框窗体如何实现模拟模态窗体抖动效果,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! Qt无边框窗体-模拟模态窗体抖动效果 一、概述 用Qt开发windows客...
    99+
    2024-04-02
  • 基于Python实现复刻人生重开模拟器
    目录人生重开模拟器介绍代码实现打印初始界面设置初始属性设置角色性别设置角色出生点针对每一岁,生成人生经历人生重开模拟器介绍 人生重开模拟器是由VickScarlet上传至GitHub...
    99+
    2024-04-02
  • 如何基于python实现单目三维重建详解
    目录一、单目三维重建概述二、实现过程(1)相机的标定(2)图像特征提取及匹配(3)三维重建三、结论四、代码总结一、单目三维重建概述 客观世界的物体是三维的,而我们用摄像机获取的图像是...
    99+
    2024-04-02
  • html5怎么实现模拟平抛运动
    本文小编为大家详细介绍“html5怎么实现模拟平抛运动”,内容详细,步骤清晰,细节处理妥当,希望这篇“html5怎么实现模拟平抛运动”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。...
    99+
    2024-04-02
  • 基于jQuery模拟实现淘宝购物车模块
    这是网页版淘宝中购物车的页面 注意给checkbox添加事件就是用change() 给button添加事件就是用click() 1、每次点击+号,根据文本框的值乘以当前商品的价格就...
    99+
    2024-04-02
  • 基于JavaScript实现年月日三级联动
    本文实例为大家分享了JavaScript实现年月日三级联动的具体代码,供大家参考,具体内容如下 代码: <!DOCTYPE html> <html lang=...
    99+
    2024-04-02
  • 基于C#模拟实现回合制游戏
    目录前言规则简介功能介绍实现代码百度网盘链接前言 文章开始把我喜欢的这句话送个大家:这个世界上还有什么比自己写的代码运行在一亿人的电脑上更酷的事情吗,如果有那就是让这个数字再扩大十倍...
    99+
    2024-04-02
  • 基于Python如何实现自动抠图小程序
    本篇文章为大家展示了基于Python如何实现自动抠图小程序,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬...
    99+
    2023-06-26
  • 基于Flutter实现爱心三连动画效果
    目录前言Animation 简介AnimationController 简介应用 - 爱心三连总结前言 我们开始 Flutter 动画相关篇章之旅,在应用中通过动效能够给用户带来更愉...
    99+
    2024-04-02
  • 基于C#如何实现磁性吸附窗体
    这篇文章主要介绍了基于C#如何实现磁性吸附窗体的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇基于C#如何实现磁性吸附窗体文章都会有所收获,下面我们一起来看看吧。效果代码public partial&n...
    99+
    2023-07-04
  • 基于Python如何实现微信自动回复功能
    这篇文章主要介绍“基于Python如何实现微信自动回复功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于Python如何实现微信自动回复功能”文章能帮助大家解决问题。实现自动回复的功能,我们需要...
    99+
    2023-07-02
  • 基于python实现MUI区域滚动
    目录1、前言2、问题描述3、解决方案4、结语本文转自微信公众号:"算法与编程之美"   Python用HBuilder创建交流社区APP   基于Python实现...
    99+
    2024-04-02
  • 基于Python如何实现Hash算法
    本篇内容主要讲解“基于Python如何实现Hash算法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基于Python如何实现Hash算法”吧!1 前言Simhash的算法简单的来说就是,从海量文...
    99+
    2023-06-29
  • 基于Angular.js如何实现触摸滑动动画
    小编给大家分享一下基于Angular.js如何实现触摸滑动动画,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!先上图:这个主要用到...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作