Euler-Maruyama方法是一种用来数值求解**随机微分方程(SDE)**的离散化方法。它是欧拉方法(Euler Method)的随机扩展,适用于解决包含随机性或噪声的动态系统。
背景
随机微分方程 (SDE)
随机微分方程的一般形式为:
d
X
t
=
f
(
X
t
,
t
)
d
t
+
g
(
X
t
,
t
)
d
W
t
dX_t = f(X_t, t) \, dt + g(X_t, t) \, dW_t
dXt=f(Xt,t)dt+g(Xt,t)dWt
- X t X_t Xt: 状态变量,表示系统随时间 t t t 的状态。
- f ( X t , t ) f(X_t, t) f(Xt,t): 漂移项(drift term),表示系统的确定性演化趋势。
- g ( X t , t ) g(X_t, t) g(Xt,t): 扩散项(diffusion term),表示系统的随机性幅度。
-
d
W
t
dW_t
dWt: Wiener过程(布朗运动)的增量,满足:
d W t ∼ N ( 0 , d t ) dW_t \sim \mathcal{N}(0, dt) dWt∼N(0,dt)
这类方程常用于建模带有噪声的物理、金融或生物系统。
方法描述
欧拉方法
欧拉方法用于解一般的常微分方程(ODE):
d
X
t
d
t
=
f
(
X
t
,
t
)
\frac{dX_t}{dt} = f(X_t, t)
dtdXt=f(Xt,t)
通过时间离散化:
X
t
+
Δ
t
≈
X
t
+
f
(
X
t
,
t
)
Δ
t
X_{t+\Delta t} \approx X_t + f(X_t, t) \Delta t
Xt+Δt≈Xt+f(Xt,t)Δt
Euler-Maruyama方法
将欧拉方法扩展到随机微分方程,加入随机扰动项
g
(
X
t
,
t
)
d
W
t
g(X_t, t)\,dW_t
g(Xt,t)dWt:
X
t
+
Δ
t
≈
X
t
+
f
(
X
t
,
t
)
Δ
t
+
g
(
X
t
,
t
)
Δ
W
t
X_{t+\Delta t} \approx X_t + f(X_t, t) \Delta t + g(X_t, t) \Delta W_t
Xt+Δt≈Xt+f(Xt,t)Δt+g(Xt,t)ΔWt
- 第一项 ( X t X_t Xt): 当前状态。
- 第二项 ( f ( X t , t ) Δ t f(X_t, t) \Delta t f(Xt,t)Δt): 漂移项,表示确定性趋势的贡献。
- 第三项 ( g ( X t , t ) Δ W t g(X_t, t) \Delta W_t g(Xt,t)ΔWt): 随机项,表示噪声引起的波动。
其中:
Δ
W
t
∼
N
(
0
,
Δ
t
)
\Delta W_t \sim \mathcal{N}(0, \Delta t)
ΔWt∼N(0,Δt)
具体步骤
-
初始化状态:
设初始条件 X 0 = x 0 X_0 = x_0 X0=x0。 -
时间离散化:
将时间区间 [ 0 , T ] [0, T] [0,T] 等分为 N N N 个小步长:
Δ t = T N , t n = n Δ t , n = 0 , 1 , … , N − 1 \Delta t = \frac{T}{N}, \quad t_n = n \Delta t, \quad n=0, 1, \dots, N-1 Δt=NT,tn=nΔt,n=0,1,…,N−1 -
迭代更新:
对每个时间步:
X t n + 1 = X t n + f ( X t n , t n ) Δ t + g ( X t n , t n ) Δ t ξ n X_{t_{n+1}} = X_{t_n} + f(X_{t_n}, t_n) \Delta t + g(X_{t_n}, t_n) \sqrt{\Delta t} \xi_n Xtn+1=Xtn+f(Xtn,tn)Δt+g(Xtn,tn)Δtξn- ξ n ∼ N ( 0 , 1 ) \xi_n \sim \mathcal{N}(0, 1) ξn∼N(0,1) 是标准正态分布随机变量,用来模拟布朗运动的增量。
-
结果输出:
得到状态序列 { X t n } \{X_{t_n}\} {Xtn}。
优势与限制
优势
- 简单易用: 实现起来简单,适合初学者和小型系统。
- 灵活性: 可适配各种 SDE,尤其是具有复杂漂移或扩散项的方程。
- 低计算成本: 每一步计算量较小。
限制
- 精度有限: 由于仅使用欧拉方法的一阶展开,收敛速度较慢,误差为 O ( Δ t ) O(\Delta t) O(Δt)。
- 稳定性较差: 对于刚性系统(stiff system)可能需要更稳定的数值方法(如Milstein方法)。
示例应用
以下是使用Euler-Maruyama方法求解一个简单SDE的例子:
示例问题
d X t = − X t d t + σ d W t dX_t = -X_t \, dt + \sigma \, dW_t dXt=−Xtdt+σdWt
- 漂移项 f ( X t , t ) = − X t f(X_t, t) = -X_t f(Xt,t)=−Xt。
- 扩散项 g ( X t , t ) = σ g(X_t, t) = \sigma g(Xt,t)=σ。
代码实现
import numpy as np
import matplotlib.pyplot as plt
# 参数定义
T = 1.0 # 时间总长
N = 1000 # 时间步数
dt = T / N # 步长
sigma = 0.2 # 扩散系数
x0 = 1.0 # 初始条件
# 初始化
t = np.linspace(0, T, N)
X = np.zeros(N)
X[0] = x0
# Euler-Maruyama迭代
for i in range(1, N):
dW = np.sqrt(dt) * np.random.normal(0, 1) # Wiener增量
X[i] = X[i-1] - X[i-1] * dt + sigma * dW # 更新状态
# 绘图
plt.plot(t, X, label="Euler-Maruyama Approximation")
plt.xlabel("Time")
plt.ylabel("X_t")
plt.legend()
plt.show()
在扩散模型中的应用
Euler-Maruyama方法在扩散模型中用于模拟时间反转的随机微分方程:
d
X
t
=
[
f
(
X
t
,
t
)
]
d
t
+
g
(
t
)
d
W
t
dX_t = \big[f(X_t, t)\big] dt + g(t) dW_t
dXt=[f(Xt,t)]dt+g(t)dWt
通过离散化,可以生成数据从高噪声状态逐渐回归真实分布。这种方法广泛应用于:
- 图像生成: 如扩散模型(Diffusion Model)。
- 条件生成: 如根据给定条件生成特定样本。
通过调整漂移项和扩散系数,可适配不同的生成任务。