首页
/ JumpProcesses.jl教程:简单泊松过程模拟详解

JumpProcesses.jl教程:简单泊松过程模拟详解

2025-06-04 16:07:09作者:段琳惟

引言

在科学计算和系统建模中,泊松过程是一类重要的随机过程,广泛应用于物理、生物、金融等领域。本文将介绍如何使用JumpProcesses.jl库来模拟不同类型的泊松跳跃过程。JumpProcesses.jl是SciML生态系统中的一部分,专门用于模拟跳跃过程和混合跳跃-微分方程系统。

准备工作

首先需要安装必要的包并导入:

using JumpProcesses, Plots
default(; lw=2)

常速率泊松过程

基本计数过程

最简单的泊松过程是计数过程N(t),具有恒定的转移速率λ。这可以解释为一个出生过程,新个体以恒定速率λ产生。

数学表示为: N(t) = Y_b(λt),其中Y_b是单位泊松计数过程。

代码实现:

rate(u, p, t) = p.λ
affect!(integrator) = (integrator.u[1] += 1)
crj = ConstantRateJump(rate, affect!)

u₀ = [0]
p = (λ=2.0,)
tspan = (0.0, 10.0)

dprob = DiscreteProblem(u₀, tspan, p)
jprob = JumpProblem(dprob, Direct(), crj)
sol = solve(jprob, SSAStepper())
plot(sol, label="N(t)", xlabel="t", legend=:bottomright)

带死亡的出生过程

扩展模型,加入死亡过程:

deathrate(u, p, t) = p.μ * u[1]
deathaffect!(integrator) = (integrator.u[1] -= 1; integrator.u[2] += 1)
deathcrj = ConstantRateJump(deathrate, deathaffect!)

p = (λ=2.0, μ=1.5)
u₀ = [0, 0]  # (N(0), D(0))
dprob = DiscreteProblem(u₀, tspan, p)
jprob = JumpProblem(dprob, Direct(), crj, deathcrj)
sol = solve(jprob, SSAStepper())
plot(sol, labels=["N(t)" "D(t)"], xlabel="t", legend=:topleft)

变速率泊松过程

当转移速率不是常数时,需要使用VariableRateJump。例如,考虑周期性变化的出生率:

rate1(u, p, t) = p.λ * (sin(π*t/2) + 1)
affect1!(integrator) = (integrator.u[1] += 1)

# 定义速率边界
rateinterval(u, p, t) = typemax(t)
urate(u, p, t) = 2*p.λ
lrate(u, p, t) = p.λ

# 创建有界VariableRateJump
vrj1 = VariableRateJump(rate1, affect1!; lrate, urate, rateinterval)

# 定义依赖图
dep_graph = [[1], [1, 2]]

jprob = JumpProblem(dprob, Coevolve(), vrj1, deathcrj; dep_graph)
sol = solve(jprob, SSAStepper())
plot(sol, labels=["N(t)" "D(t)"], xlabel="t", legend=:topleft)

一般变速率跳跃过程

当无法确定速率边界时,需要使用一般VariableRateJump并结合ODE求解器:

using OrdinaryDiffEq

function f!(du, u, p, t)
    du .= 0
    nothing
end

vrj2 = VariableRateJump(rate1, affect1!)
deathvrj = VariableRateJump(deathrate, deathaffect!)

u₀ = [0.0, 0.0]
oprob = ODEProblem(f!, u₀, tspan, p)
jprob = JumpProblem(oprob, Direct(), vrj2, deathvrj)
sol = solve(jprob, Tsit5())
plot(sol, label=["N(t)" "D(t)"], xlabel="t", legend=:topleft)

随机跳跃分布

模拟复合泊松过程G(t),其中跳跃大小随机:

rng = JumpProcesses.DEFAULT_RNG

rate3(u, p, t) = p.λ
affect3! = integrator -> let rng=rng
    integrator.u[1] += 1
    integrator.u[2] += rand(rng, (-1, 1))
    nothing
end

crj = ConstantRateJump(rate3, affect3!)
u₀ = [0, 0]
p = (λ=1.0,)
tspan = (0.0, 100.0)
dprob = DiscreteProblem(u₀, tspan, p)
jprob = JumpProblem(dprob, Direct(), crj)
sol = solve(jprob, SSAStepper())
plot(sol, label=["N(t)" "G(t)"], xlabel="t")

总结

本文介绍了使用JumpProcesses.jl模拟各种泊松过程的方法,包括:

  1. 常速率泊松过程
  2. 变速率泊松过程
  3. 复合泊松过程

JumpProcesses.jl提供了灵活的工具来建模各种跳跃过程,可以与微分方程结合使用,适用于复杂的混合系统建模。

登录后查看全文
热门项目推荐

最新内容推荐

项目优选

收起
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
176
261
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
860
511
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
129
182
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
259
300
ShopXO开源商城ShopXO开源商城
🔥🔥🔥ShopXO企业级免费开源商城系统,可视化DIY拖拽装修、包含PC、H5、多端小程序(微信+支付宝+百度+头条&抖音+QQ+快手)、APP、多仓库、多商户、多门店、IM客服、进销存,遵循MIT开源协议发布、基于ThinkPHP8框架研发
JavaScript
93
15
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
332
1.08 K
HarmonyOS-ExamplesHarmonyOS-Examples
本仓将收集和展示仓颉鸿蒙应用示例代码,欢迎大家投稿,在仓颉鸿蒙社区展现你的妙趣设计!
Cangjie
398
371
note-gennote-gen
一款跨平台的 Markdown AI 笔记软件,致力于使用 AI 建立记录和写作的桥梁。
TSX
83
4
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.07 K
0
kernelkernel
deepin linux kernel
C
22
5