【Python】有三颗恒星的三体人很难不产生超能力

2023-10-29 23:30

本文主要是介绍【Python】有三颗恒星的三体人很难不产生超能力,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

三体问题

经同学提出,我才意识到,原来三体人有三颗恒星……也就意味着可能三体星人连个稳定的恒星轨道都没有,悲惨指数直线上升。

但就拉格朗日方程而言,却并不困难。设 m i , i ∈ { 0 , 1 , 2 , 3 } m_i, i\in\{0,1,2,3\} mi,i{0,1,2,3}表示四颗星体,则对任意星体 i i i而言,其动能为

T i = 1 2 m i ( x ˙ 2 + y ˙ 2 ) T_i=\frac1 2m_i(\dot x^2+\dot y^2) Ti=21mi(x˙2+y˙2)

势能为

V i = − ∑ j ≠ i G m i m j ( x i − x j ) 2 + ( y i − y j ) 2 V_i=-\sum_{j\not=i}\frac{Gm_im_j}{\sqrt{(x_i-x_j)^2+(y_i-y_j)^2}} Vi=j=i(xixj)2+(yiyj)2 Gmimj

拉格朗日量为 L = T − V L=T-V L=TV,根据拉格朗日方程

d d t ∂ L ∂ r ˙ − ∂ L ∂ r = 0 , r = x i , y i \frac{\text d}{\text dt}\frac{\partial L}{\partial\dot r}-\frac{\partial L}{\partial r}=0,r=x_i,y_i dtdr˙LrL=0r=xi,yi

x ¨ i = − ∑ i ≠ j G m j ( x i − x j ) ( x i − x j ) 2 + ( y i − y j ) 2 3 y ¨ i = − ∑ i ≠ j G m j ( y i − y j ) ( x i − x j ) 2 + ( y i − y j ) 2 3 \ddot x_i=-\sum_{i\not =j}\frac{Gm_j(x_i-x_j)}{\sqrt{(x_i-x_j)^2+(y_i-y_j)^2}^3}\\ \ddot y_i=-\sum_{i\not =j}\frac{Gm_j(y_i-y_j)}{\sqrt{(x_i-x_j)^2+(y_i-y_j)^2}^3} x¨i=i=j(xixj)2+(yiyj)2 3Gmj(xixj)y¨i=i=j(xixj)2+(yiyj)2 3Gmj(yiyj)

则令state以如下顺序编排, s = x 0 , x ˙ 0 , y 0 , y ˙ 0 , x 1 , x ˙ 1 … s=x_0,\dot x_0, y_0, \dot y_0, x_1,\dot x_1\dots s=x0,x˙0,y0,y˙0,x1,x˙1,则 s 4 i = x i , s 4 i + 1 = x ˙ i , s 4 i + 2 = y i , s 4 i + 3 = y ˙ i s_{4i}=x_i, s_{4i+1}=\dot x_i, s_{4i+2}=y_i, s_{4i+3}=\dot y_i s4i=xi,s4i+1=x˙i,s4i+2=yi,s4i+3=y˙i

则列出微分方程如下

def derivs(state, t):N = int(len(state)/4)dydx = np.zeros_like(state)for i in range(N*2):dydx[i*2] = state[i*2+1]for i in range(N):dydx[i*4+1] = 0dydx[i*4+3] = 0for j in range(N):if i==j:continuedx = state[i*4]-state[j*4]dy = state[i*4+2]-state[j*4+2]L = np.sqrt(dx**2+dy**2)**3dydx[i*4+1] -= G * m[j] * dx / Ldydx[i*4+3] -= G * m[j] * dy / Lreturn dydx

由于三体运动过于放荡不羁,故而随机生成的三体几乎很快就分道扬镳了,所以接下来选择适当位置和重量的三颗恒星。且令万有引力常数以年为时间单位

G = 4.98 × 1 0 − 10 k m 3 d − 2 k g − 1 G=4.98\times10^{-10} km^3d^{-2}kg^{-1} G=4.98×1010km3d2kg1

令恒星质量在 1 0 30 k g 10^{30}kg 1030kg的量级,空间距离在 1 0 11 k m 10^{11}km 1011km量级。行星质量在 1 0 25 10^{25} 1025量级。由于质量相差过大,所以假定行星质量为0也是可以的。

为了让恒星三体尽量稳定,在生成质量和初始坐标之后,令其初速度约等于稳定三体运动的速度。

首先,星体质量为 m i m_i mi,坐标为 ( X i , Y i ) (X_i,Y_i) (Xi,Yi),则其重心坐标为

x g = ∑ i m i X i ∑ m i , y g = ∑ i m i Y i ∑ m i x_g = \frac{\sum_im_iX_i}{\sum m_i},y_g = \frac{\sum_im_iY_i}{\sum m_i} xg=miimiXiyg=miimiYi

如将坐标系移动到 ( x g , y g ) (x_g,y_g) (xg,yg),则新坐标系下 x i = X i − x g , y i = Y i − x g x_i=X_i-x_g, y_i=Y_i-x_g xi=Xixg,yi=Yixg

则对 m i m_i mi而言,其运动的半径与加速度分别为为

r i = x i 2 + y i 2 x ¨ i = ∑ j ≠ i G m j ( x j − x i ) ( x i − x j ) 2 + ( y i − y j ) 2 3 y ¨ i = ∑ j ≠ i G m j ( y j − y i ) ( x i − x j ) 2 + ( y i − y j ) 2 3 ω i = x ¨ i 2 + y ¨ i 2 r i \begin{aligned} r_i&=\sqrt{x_i^2+y_i^2}\\ \ddot x_i&=\sum_{j\not=i}\frac{Gm_j(x_j-x_i)}{\sqrt{(x_i-x_j)^2+(y_i-y_j)^2}^3}\\ \ddot y_i&=\sum_{j\not=i}\frac{Gm_j(y_j-y_i)}{\sqrt{(x_i-x_j)^2+(y_i-y_j)^2}^3}\\ \omega_i&=\sqrt{\frac{\sqrt{\ddot x_i^2+\ddot y_i^2}}{r_i}} \end{aligned} rix¨iy¨iωi=xi2+yi2 =j=i(xixj)2+(yiyj)2 3Gmj(xjxi)=j=i(xixj)2+(yiyj)2 3Gmj(yjyi)=rix¨i2+y¨i2

如果 ω i \omega_i ωi不相等,那么每个星体的角速度不同,则运行之后会马上打破现有的局面,从而进入不稳定的状态。

则其初始角度和速度为

cos ⁡ θ = x i r i sin ⁡ θ = y i r i u = x ˙ = − ω i r i sin ⁡ θ = − ω i y i v = y ˙ = ω i r i cos ⁡ θ = ω i x i \begin{aligned} \cos\theta&=\frac{x_i}{r_i}\\ \sin\theta&=\frac{y_i}{r_i}\\ u=\dot x&=-\omega_ir_i\sin\theta&=&-\omega_iy_i\\ v=\dot y&=\omega_ir_i\cos\theta&=&\omega_ix_i \end{aligned} cosθsinθu=x˙v=y˙=rixi=riyi=ωirisinθ=ωiricosθ==ωiyiωixi

得到下图,其中轨迹比较细的那个是行星……

在这里插入图片描述

则其初始化方法为

# 用于初始化星体的质量和位置
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
from scipy import integratenp.random.seed(42)
G = 4.98e-10
m = np.random.rand(4)*10e30
m[0] /= 1e5     #行星质量
x0 = np.random.rand(4)*1e9
x0[0] *= 2      #让行星尽量离他们三颗恒星远一点
y0 = np.random.rand(4)*1e9
y0[0] *= 2
M = np.sum(m)       #总质量
# 计算质心,并以质心为原点
x0 -= np.sum(m*x0)/M
y0 -= np.sum(m*y0)/M
r = np.sqrt(x0**2+y0**2)
a = np.zeros(4)
b = np.zeros(4)
for i in range(4):for j in range(4):if i==j : continuedx = x0[i]-x0[j]dy = y0[i]-y0[j]L = np.sqrt(dx**2+dy**2)**3gm = G * m[j]a[i] += gm * dx / Lb[i] += gm * dy / Lom = np.sqrt(np.sqrt(a**2+b**2)/r)
u0 = -om*y0
v0 = om*x0

绘图代码为

state = np.zeros(16)
for i in range(4):state[4*i] = x0[i]state[4*i+1] = u0[i]state[4*i+2] = y0[i]state[4*i+3] = v0[i]dt = 50
t = np.arange(0, 125000, dt)
# 微分方程组数值解
orbit = integrate.odeint(derivs, state, t)plt.show()
xMax = np.max(orbit)
fig = plt.figure(figsize=(10,10))
ax = fig.add_subplot(xlim=(-xMax,xMax),ylim=(-xMax,xMax))
ax.grid()lws = [0.5,2,2,2]
traces = [ax.plot([],[],'-', lw=lws[i])[0] for i in range(len(m))]
pts = [ax.plot([],[], marker='o')[0] for _ in range(len(m))]
time_template = 'time = %.1f d'
time_text = ax.text(0.05, 0.9, '', transform=ax.transAxes)def animate(i):for n in range(4):traces[n].set_data(orbit[:i,4*n],orbit[:i,4*n+2])pts[n].set_data(orbit[i,4*n],orbit[i,4*n+2])time_text.set_text(time_template % (i*dt))return traces+pts+[time_text]ani = animation.FuncAnimation(fig, animate, range(len(t)),   interval=10, blit=True)
ani.save("tri_5.gif")
plt.show()

接下来还是体验一下行星视角,首先看一下在行星上观察到的恒星们的轨迹

在这里插入图片描述

如果看动图可能压迫感会更强一些,这些恒星简直对行星视若无物。

在这里插入图片描述

其绘图代码无变化,只需让orbit中的行星位置归零,

for i in range(4):orbit[:,4*i] -= orbit[:,0]orbit[:,4*i+2] -= orbit[:,2]

由于恒星辐射的功率密度以三次方的形式进行衰减,若假定行星接收到的功率是三颗恒星的叠加,那么就可以画出三体行星所接收的功率变化

在这里插入图片描述

由于取了以10为底的对数,所以其峰值功率是最小值的 1 0 7 10^7 107倍,所以这是什么概念呢?

假设在短时间内,功率是均匀的,也就是说单位时间内所爆发出的能量基本是不变的。一个汉堡的热量大概为2000kJ,那么其 1 0 4 10^4 104倍就是 2 × 1 0 7 k J 2\times10^7kJ 2×107kJ,相当于10发战斧导弹。

故而对于三体人而言,严冬之日的一个汉堡包,约等于盛夏之时的十发战斧导弹。所以三体人要是没个超能力什么的,基本上是活不下去的。

P = 0
for i in range(1,4):L = np.sqrt(orbit[:,4*i]**2+orbit[:,4*i+2]**2)P += 1/L**3# 为了看上去更清晰,对功率做对数
plt.plot(t,np.log10(P))

这篇关于【Python】有三颗恒星的三体人很难不产生超能力的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/304085

相关文章

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

MCU7.keil中build产生的hex文件解读

1.hex文件大致解读 闲来无事,查看了MCU6.用keil新建项目的hex文件 用FlexHex打开 给我的第一印象是:经过软件的解释之后,发现这些数据排列地十分整齐 :02000F0080FE71:03000000020003F8:0C000300787FE4F6D8FD75810702000F3D:00000001FF 把解释后的数据当作十六进制来观察 1.每一行数据

nudepy,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

HTML提交表单给python

python 代码 from flask import Flask, request, render_template, redirect, url_forapp = Flask(__name__)@app.route('/')def form():# 渲染表单页面return render_template('./index.html')@app.route('/submit_form',

Python QT实现A-star寻路算法

目录 1、界面使用方法 2、注意事项 3、补充说明 用Qt5搭建一个图形化测试寻路算法的测试环境。 1、界面使用方法 设定起点: 鼠标左键双击,设定红色的起点。左键双击设定起点,用红色标记。 设定终点: 鼠标右键双击,设定蓝色的终点。右键双击设定终点,用蓝色标记。 设置障碍点: 鼠标左键或者右键按着不放,拖动可以设置黑色的障碍点。按住左键或右键并拖动,设置一系列黑色障碍点

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目