如何在微分方程相图中添加变量φ的局部放大子图?
解决微分方程解的局部放大子图绘制问题
你的问题核心是当前子图绘制的是独立生成的线性数组(np.linspace生成的phi_1和phi_2),这和微分方程的解完全无关,自然不是你要的放大效果。正确做法是从每个微分方程的解中,筛选出落在目标放大区域(phi1∈[-0.25,0.25]且phi2∈[-0.25,0.25])的点,再绘制到子图中。
修改后的完整代码
import matplotlib.pyplot as plt from scipy.integrate import odeint import numpy as np m = 0.5 g = 0 time = np.linspace(-100, 100, 2000) def system(phi, t): #differential equation function phi_1 = phi[0] phi_2 = phi[1] dphi1_dt = phi_2 H = np.sqrt((8 * np.pi / 3) * (0.5 * (phi_2**2)) + (0.5 * (phi_1**2) * m**2) + (g * (phi_1**3))) dphi2_dt = (-3 * H * phi_2) - (phi_1 * m**2) - (3 * g * phi_1**2) dphi_dt = [dphi1_dt, dphi2_dt] return dphi_dt init = [[-2, -2], [-1, -2], [0, -2], [1, -2], [2, -2], [2, 2], [1, 2], [0, 2], [-2, 2], [-1, 2], [-3, -2], [-4, -2], [3, -2], [4, -2], [-3, 2], [-4, 2], [3, 2], [4, 2]] # 移除了重复的初始条件 # 先绘制主图 for i in init: phi = odeint(system, i, time) plt.plot(phi[:, 0], phi[:, 1]) # 创建子图并绘制放大区域的解 sub_axes = plt.axes([.6, .6, .25, .25]) # 定义放大区域的范围 x_min, x_max = -0.25, 0.25 y_min, y_max = -0.25, 0.25 # 重新遍历初始条件,筛选每个解中落在放大区域的点 for i in init: phi = odeint(system, i, time) # 生成筛选掩码:只保留落在目标区域内的点 mask = (phi[:, 0] >= x_min) & (phi[:, 0] <= x_max) & (phi[:, 1] >= y_min) & (phi[:, 1] <= y_max) # 提取符合条件的点并绘制到子图 sub_axes.plot(phi[mask, 0], phi[mask, 1], c='k') # 设置坐标轴标签和刻度 plt.xlabel("$\phi$", fontsize=12) plt.ylabel("$d \phi/dt$", fontsize=12) plt.xticks(fontsize=12) plt.yticks(fontsize=12) # 给子图设置范围,确保只显示目标区域 sub_axes.set_xlim(x_min, x_max) sub_axes.set_ylim(y_min, y_max) plt.show()
关键修改说明
- 移除重复初始条件:原
init列表中有多个重复的初始值,比如[-2,-2]、[0,2],移除后不影响结果且更高效。 - 筛选放大区域的点:通过布尔掩码
mask,从每个微分方程的解phi中提取出同时满足phi1和phi2在目标区间内的点,确保子图只显示解的局部细节。 - 固定子图坐标轴范围:用
sub_axes.set_xlim和sub_axes.set_ylim锁定放大区域,避免子图自动缩放导致偏离预期。
内容的提问来源于stack exchange,提问作者Jpmg
相关产品推荐
相关产品推荐

