随机微分方程简介

随机微分方程(Stochastic Differential Equations, SDE),是一种未知量是随机过程的微分方程,由于随机过程处处不连续,所以传统的微积分无法工作,需要用伊藤积分。Julia的sciML提供了SDE求解器。

现有几何布朗运动

d u = f ( u , p , t ) d t + g ( u , p , t ) d W \mathrm du=f(u,p,t)\mathrm dt + g(u,p,t)\mathrm dW du=f(u,p,t)dt+g(u,p,t)dW

其中, f , g f,g f,g分别叫做漂移项和扩散项,当 f ( u , p , t ) = α u , g ( u , p , t ) = β u f(u,p,t)=\alpha u, g(u,p,t)=\beta u f(u,p,t)=αu,g(u,p,t)=βu时,其随机积分结果为

u ( t , W t ) = u 0 exp ⁡ [ ( α − β 2 2 ) t + β W t ] u(t,W_t)=u_0\exp\left[\left(\alpha-\frac{\beta^2}{2}\right)t+\beta W_t\right] u(t,Wt)=u0exp[(α2β2)t+βWt]

在确定随机数种子后,其解析和数值图像为

在这里插入图片描述

图中,红色虚线为上面给出的解析解,蓝色实线为【StochasticDiffEq】的数值求解结果,二者完全重合。

数值求解

sciML几乎对所有类型的偏微分方程问题都提供了相同的处理方法,在对几何布朗运动进行数值求解时,只需带入SDEProblem并solve即可,求解方案如下

import StochasticDiffEq as SDE
using Random

α = 1.0      # 漂移系数
β = 1.0      # 扩散系数  
u0 = 0.5     # 初始值
tspan = (0.0, 1.0)
dt = 1/2^10  # 时间步长

f(u, p, t) = α * u           # 漂移项
g(u, p, t) = β * u           # 扩散项

Random.seed!(42)  # 确保可重复性
prob = SDE.SDEProblem(f, g, u0, tspan)
sol = SDE.solve(prob, SDE.EM(), dt=dt, save_noise=true)  # ⚠️ save_noise=true

上述代码中,指定随机数种子的目的,是确保可复现。而求解SDE的关键步骤,只有两行代码,其中

  • 【SDE.SDEProblem】用于构建SDE问题,其输入为漂移项函数、扩散项函数、初始值以及数值坐标范围
  • 【SDE.solve】用于求解SDE问题,其输入分别是SDE问题、求解方法以及数值坐标间隔
  • 【SDE.EM()】是Euler-Maruyama 方法,相当于在常微分方程的Euler方法上,新增了对随机过程的采样。

最终得到的sol即为求解结果,其中sol.t和sol.u分别是时间点和状态值,这与普通的微分方程区别不大。不同之处在于,还有一项sol.W用于存储噪声插值对象。有了sol.W,即可根据上文的解析解,绘制 u ( t , W t ) = u 0 exp ⁡ [ ( α − β 2 2 ) t + β W t ] u(t,W_t)=u_0\exp\left[\left(\alpha-\frac{\beta^2}{2}\right)t+\beta W_t\right] u(t,Wt)=u0exp[(α2β2)t+βWt]的图像。

解析对比和绘图

解析解和绘图对比代码如下,执行完此代码,即可得到上面那张图。

using GLMakie

t_vals = sol.t
W_vals = [sol.W(t)[1] for t in t_vals]  

# 解析公式: u(t) = u₀·exp[(α-β²/2)·t + β·Wₜ]
u_analytic = @. u0 * exp((α - β^2/2) * t_vals + β * W_vals)

# ===== 绘制对比 =====
fig = Figure(size=(900, 500))
ax = Axis(fig[1,1], 
          xlabel="t", ylabel="u(t)", 
          title="Geometric Brownian Motion: Numeric vs Analytic")

lines!(ax, t_vals, sol.u, 
       label="Numerical (Euler-Maruyama)", color=:steelblue, linewidth=1.5)
lines!(ax, t_vals, u_analytic, 
       label="Analytic Solution", color=:red, linestyle=:dash, linewidth=2)

axislegend(ax, position=:rb)
fig

小结

本文介绍了随机微分方程(SDE)的数值求解方法及其解析解对比。以几何布朗运动为例,展示了Julia的sciML工具包中SDE求解器的使用方法。文章首先给出SDE的一般形式,重点说明漂移项和扩散项的作用。通过设置随机数种子确保结果可重复,使用Euler-Maruyama方法进行数值求解,并与解析解进行对比。结果表明数值解与解析解完全吻合,验证了求解方法的有效性。最后通过GLMakie绘制了数值解与解析解的对比图,直观展示了求解精度。该文为SDE的数值实现提供了简明实用的参考范例。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐