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

使用BifurcationKit.jl分析捕食者-猎物ODE系统Hopf分叉的问题排查

排查BifurcationKit.jl中捕食者-猎物模型Hopf分叉分析的代码问题

你的代码存在三个核心问题,导致无法正确捕捉参数a变化引发的Hopf分叉:

1. 未启用Hopf分叉检测

默认的ContinuationPar不会自动检测Hopf分叉,必须显式开启分叉检测功能,否则程序无法识别平衡点稳定性变化的临界点。

2. 初始条件未对准平衡点

你使用的初始值z0=[0.05,0.1]是系统的瞬态状态,而非平衡点。延续分析需要从平衡点出发,否则会追踪错误的解分支,无法反映种群的稳态行为。

3. 延续参数精度不足

原参数设置的步长和检测阈值不够精细,可能错过Hopf分叉点。


修正后的完整代码

using Revise, Parameters, Plots
using BifurcationKit
const BK = BifurcationKit

# 向量场(简化写法,不影响功能)
function COm(u, p)
    @unpack r,K,a,h,eps,mu = p
    x, y = u
    dx = r*x*(1.0 - x/K) - a*x*y/(1 + a*h*x)
    dy = eps*a*x*y/(1 + a*h*x) - mu*y
    [dx, dy]
end

# 模型参数
par_com = (r = 1.0, K = 10.0, a = 0.1, h = 0.5, eps = 0.5, mu = 0.2)

# 记录解的信息
recordCO(x, p) = (x = x[1], y = x[2])

# 先求解a=0.1时的平衡点(替代原瞬态初始值)
z0 = [0.05, 0.1]
prob_newton = BK.BifurcationProblem(COm, z0, par_com, (@lens _.a))
sol_newton = BK.newton(prob_newton, NewtonPar())
z0_eq = sol_newton.u  # 得到平衡点作为延续初始点

# 配置延续参数:开启Hopf检测,调整步长与检测精度
opts_br = ContinuationPar(
    p_min = 0.1, 
    p_max = 1.0, 
    ds = 0.002, 
    dsmax = 0.01,
    detect_bifurcation = 3,  # 最高级别分叉检测
    max_bif_points = 10,     # 最多捕捉10个分叉点
    nev = 2                  # 计算前2个特征值(对应二维系统)
)

# 构建分叉问题并运行延续
prob = BifurcationKit.BifurcationProblem(COm, z0_eq, par_com, (@lens _.a); record_from_solution = recordCO)
br = continuation(prob, PALC(), opts_br; plot = true, verbosity = 2, normC = norminf)

# 绘制分叉图,包含特征值信息以展示稳定性
scene = plot(br, xlims = (0.1,1.0), plotfold=false, markersize=5)

关键改动说明

  • 求解平衡点:用newton函数先找到a=0.1时的稳态平衡点,确保延续从正确的解分支开始。
  • 开启分叉检测:设置detect_bifurcation=3让程序自动检测Hopf、鞍结等分叉类型,nev=2指定计算二维系统的全部特征值,用于判断平衡点稳定性。
  • 优化参数配置:增加max_bif_points确保不会遗漏分叉点,参数设置更适配Hopf分叉的捕捉需求。

运行修正后的代码后,分叉图会清晰显示a变化时的Hopf分叉点,对应你观测到的a≈0.3时种群从稳定到振荡的行为转变。

内容的提问来源于stack exchange,提问作者r_detogni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 18:42:35