ode非线性系统(三星系系统)的相图

计算科学 Python 非线性规划
2021-12-24 23:26:33

背景:大家好,我是一名物理自学Python编程的本科生。我试图找到H_lam对应于由 此处给出的方程控制的三重星系系统的极限环的值

代码

# Import solve_ivp, matplotlib, numpy
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt
import numpy as np

# Define function
def TGS(t, z):
    x = np.empty(3); u = np.empty(3)
    y = np.empty(3); v = np.empty(3)
    x[0]= z[8]; x[1]= z[0]; x[2]= z[4]
    y[0]= z[9]; y[1]= z[1]; y[2]= z[5]
    u[0]= z[10]; u[1]= z[2]; u[2]= z[6]
    v[0]= z[11]; v[1]= z[3]; v[2]= z[7]
    G = 6.67e-17; m= [2e+43,2e+43,2e+43]
    R = []
    for i in [0,1,2]:
        R1=[]
        for j in [0,1,2]:
            R1.append(np.sqrt((x[j]-x[i])**2+(y[j]-y[i])**2))
        R.append(R1)
    return [u[1], sum((G*m[j]*(x[j]-x[1])/((R[1][j])**3)) for j in [0,2])+(H_lam**2)*x[1],\
            u[2], sum((G*m[j]*(x[j]-x[2])/((R[2][j])**3)) for j in [0,1])+(H_lam**2)*x[2],\
            v[1], sum((G*m[j]*(y[j]-y[1])/((R[1][j])**3)) for j in [0,2])+(H_lam**2)*y[1],\
            v[2], sum((G*m[j]*(y[j]-y[2])/((R[2][j])**3)) for j in [0,1])+(H_lam**2)*y[2]]

# Set limits for evaluation
a, b = 0,1000

# Define H_lams and set the stage for solving the Diff eq
H_lams = [61]
t = np.linspace(a, b, 50000)

# Solve the Diff eq
for H_lam in H_lams:
    sol = solve_ivp(tbs, [a, b], [0.15, -0.4, 0, -90, 0, 0.8, 0, 0], t_eval=t)
    plt.plot(sol.y[0],sol.y[2], "-")

# Make a little extra room for legend
plt.xlim([-1e+10,1e+10])
plt.axis("equal")
plt.legend([f"$\H_lam={m}$" for m in H_lams])
plt.axes().set_aspect(1)

我的想法和问题: x,y 是 x 和 y 坐标,而 X 和 Y 分别是沿 x 轴和 y 轴的速度。请注意,我想以零速度将第一个星系保持在原点。在这种情况下,每个物体的质量是相等的,但我想稍后更改它们。

现在,我编写的这段代码确实给了我一个情节,但我不确定它是否真的是我正在寻找的相图。有人可以建议一种方法来验证它吗?

此外,有没有办法让这段代码更有效率?

编辑:我得到的情节是在此处输入图像描述

0个回答
没有发现任何回复~