如何在每条微分方程曲线中间添加运动箭头?附Python代码
给微分方程轨迹添加中间运动箭头的修改方案
修改后完整代码
import numpy as np import matplotlib.pyplot as plt from scipy.integrate import odeint # 定义微分方程组参数 [a_1, a_2] = [0.6, 0.04] [b_1, b_2] = [0.7, 0.02] [f_31, f_32] = [0.35, 0.3] # 定义微分方程模型 def model(U, t): x, y = U dxdt = f_31*(1-x-y)*x - (a_1/(2-y))*(1-x-y)*x - (a_2*x*y*(1-x-y))/((2-y)*(1+y)) dydt = f_32*(1-x-y)*y - (b_1/(2-x))*(1-x-y)*y - (b_2*x*y*(1-x-y))/((2-x)*(1+x)) return [dxdt, dydt] # 绘制初始点与轨迹 for i in [0.1, 0.2, 0.3, 0.4, 0.5, 0.6]: z0 = [i, 0.7-i] plt.scatter(z0[0], z0[1], color='red') for i in [0.1, 0.2, 0.3, 0.4, 0.5, 0.6]: z0 = [i, 0.7-i] tspan = np.linspace(0, 1000, 2000) ys = odeint(model, z0, tspan) plt.plot(ys[:, 0], ys[:, 1], linewidth=2) # 添加中间位置的运动箭头 mid_idx = len(ys) // 2 # 取轨迹中点索引 x_mid, y_mid = ys[mid_idx] # 取中点后若干点的坐标,计算方向向量(避免箭头过短) x_next, y_next = ys[mid_idx + 10] dx = x_next - x_mid dy = y_next - y_mid # 绘制箭头,调整参数适配轨迹视觉效果 plt.annotate('', xy=(x_mid + dx*0.1, y_mid + dy*0.1), xytext=(x_mid, y_mid), arrowprops=dict(facecolor='black', shrink=0.05, width=1.5, headwidth=8)) # 绘图设置 plt.xlabel('$Populasi \ x_1$', fontsize=18) plt.ylabel('$Populasi \ x_2$', fontsize=18) plt.xlim([-0.1, 1]) plt.ylim([-0.1, 1]) plt.grid(True) plt.show()
关键修改说明
- 修正了原代码中
ylabel的语法错误(移除了错误占位字符) - 对每条轨迹,通过
len(ys)//2定位轨迹中点,取中点坐标作为箭头起点 - 取中点后第10个点的坐标计算方向向量,保证箭头方向准确且视觉清晰
- 使用
plt.annotate绘制箭头,可通过arrowprops灵活调整箭头颜色、粗细、头部大小等样式 - 修正了初始点标注的
label错误(原标注值与实际初始值不符)
内容的提问来源于stack exchange,提问作者shoneGrl
相关产品推荐
相关产品推荐

