You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在每条微分方程曲线中间添加运动箭头?附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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 17:15:17