Python绘制非线性ODE系统相图异常,请求技术支持
问题排查与修正方案
1. 代码中的语法错误
你的values数组定义末尾缺少一个右括号,会直接导致运行报错:
# 错误写法 values = np.array([[0.01,0.01], [0.01,2.01], [1.51, 0.01], [1.01,1.01]) # 修正后 values = np.array([[0.01,0.01], [0.01,2.01], [1.51, 0.01], [1.01,1.01]])
2. 相图绘制的核心问题
仅用4个定点附近的初始点,无法覆盖相平面的所有流动区域;且只模拟正向时间(t从0到15),无法展示鞍点等特殊定点的完整轨迹结构。另外,代码未给轨迹添加标签,导致图例显示为空。
3. 修正后的完整代码
以下代码包含语法修复、多区域初始点、正反时间模拟及方向场绘制,可还原预期相图:
import numpy as np from scipy.integrate import odeint import matplotlib.pyplot as plt # ODE系统定义 def f(u, t): x, y = u dxdt = x * (3 - 2*x - y) dydt = y * (2 - x - y) return np.array([dxdt, dydt]) # 扩展初始点:覆盖相平面不同区域,包含定点附近及典型流动区域 initial_points = [ [0.01, 0.01], [0.01, 2.01], [1.51, 0.01], [1.01, 1.01], [0.5, 0.5], [2, 0.5], [0.5, 1.5], [2, 1], [1, 0.5] ] # 同时模拟正向和反向时间,展示完整相图轨迹 t_forward = np.linspace(0, 15, 1000) t_backward = np.linspace(0, -15, 1000) plt.figure(figsize=(8, 6)) for i, (x0, y0) in enumerate(initial_points): # 绘制正向时间轨迹 sol_forward = odeint(f, [x0, y0], t_forward) plt.plot(sol_forward[:,0], sol_forward[:,1], color="black", alpha=0.7, label=f"轨迹{i+1}" if i==0 else "") # 绘制反向时间轨迹(展示鞍点的流出/流入方向) sol_backward = odeint(f, [x0, y0], t_backward) plt.plot(sol_backward[:,0], sol_backward[:,1], color="black", alpha=0.7) # 绘制方向场,直观展示向量场分布 x = np.linspace(0, 2, 20) y = np.linspace(0, 2.5, 20) X, Y = np.meshgrid(x, y) DX, DY = f([X, Y], 0) plt.quiver(X, Y, DX, DY, color='gray', alpha=0.5) # 标记所有定点 fixed_points = [(0,0), (0,2), (1.5,0), (1,1)] for (px, py) in fixed_points: plt.scatter(px, py, color='red', s=50, zorder=10, label='定点' if (px,py)==(0,0) else "") plt.ylabel("Sheeps") plt.xlabel("Rabbits") plt.legend(loc="upper right") plt.xlim(0, 2) plt.ylim(0, 2.5) plt.show()
4. 关键优化说明
- 补全语法错误,确保代码可正常运行
- 扩展初始点覆盖相平面主要流动区域,还原完整相图结构
- 增加反向时间模拟,展示鞍点的双向轨迹特征
- 添加方向场和定点标记,提升相图可读性与信息完整性
内容的提问来源于stack exchange,提问作者Leo_Miche
相关产品推荐
相关产品推荐

