正向随机微分方程的经典数值格式模拟

前言

随机微分方程的发展分支可以说到现在非常广泛了,从19世纪的布朗运动发现到上世纪40年代的伊藤积分再到正向伊藤随机微分方程解的存在唯一性定理,后又跨越到上世纪90年代的倒向随机微分方程解的存在唯一性定理发现,最后到近现在的带跳、带马尔科夫、带延迟等一系列正倒向随机微方程解的存在唯一性定理等发现,可以说体系越发广泛,这也是顺应时代发展的必然趋势。

本篇文章将数值模拟经典下的正向随机微分方程数值格式的模拟,由于不是存粹数学研究,有些假设和定理和推导会简单概括,重点是计算机编程模拟,也算是学习随机微分方程数值法的入门介绍。

一:随机微分方程(SDE)的相关性质

  • 简介

随机过程 X t X_t Xt 被称作一个扩散过程,如果它满足下面的随机微分方程:

X t = X 0 + ∫ t 0 t a ( s , X s ) d s + ∫ t 0 t b ( s , X s ) d W s , t ∈ [ t 0 , T ] , X_t=X_0+\int_{t_0}^{t}a(s,X_s)ds+\int_{t_0}^{t}b(s,X_s)dW_s,t\in[t_0,T], Xt=X0+t0ta(s,Xs)ds+t0tb(s,Xs)dWs,t[t0,T], 其中 a s = a ( s , X s ) a_s=a(s,X_s) as=a(s,Xs) b s = b ( s , X s ) b_s=b(s,X_s) bs=b(s,Xs) [ 0 , T ] × R m [0,T]\times R^m [0,T]×Rm 上的可测函数, $W_t $为概率空间 ( Ω , F , P ) (\Omega,F,P) (Ω,F,P) 上的 d − d - d维标准维纳过程。但为了此随机模型在实际中得以应用,保证上述扩散过程得以存在,我们将对此扩散过程给与一定条件,此 S D E SDE SDE的解才会存在且唯一!

  • SDE解的存在唯一性定理

T > 0 T>0 T>0 ,且对于扩散过程和漂移过程分别有

a ( . , . ) : [ 0 , T ] × R m → R m , b ( . , . ) : [ 0 , T ] × R m → R m × d a(.,.):[0,T]\times R^m\rightarrow R^m,b(.,.):[0,T]\times R^m\rightarrow R^{m\times d} a(.,.):[0,T]×RmRm,b(.,.):[0,T]×RmRm×d 为可测函数,

满足 ∣ a ( s , x ) + b ( s , x ) ∣ ≤ C ( 1 + ∣ x ∣ ) , x ∈ R m , s ∈ [ t 0 , T ] \left| a(s,x)+b(s,x) \right|\leq C(1+|x|),x\in R^m,s\in[t_0,T] a(s,x)+b(s,x)C(1+x),xRm,s[t0,T],

∣ a ( t , x ) − a ( t , y ) ∣ + ∣ b ( t , x ) − b ( t , y ) ∣ ≤ L ∣ x − y ∣ , x , y ∈ R m , s ∈ [ t 0 , T ] \left| a(t,x)-a(t,y) \right|+\left| b(t,x)-b(t,y) \right|\leq L|x-y|,x,y\in R^m,s\in[t_0,T] a(t,x)a(t,y)+b(t,x)b(t,y)Lxy,x,yRm,s[t0,T]

其中 C , L C,L C,L 为有界常数,令 Φ \Phi Φ 为独立于由 W s , s ≥ 0 W_s,s\geq0 Ws,s0 产生的 σ \sigma σ 代数 F F F ,使得

扫描二维码关注公众号,回复: 14728305 查看本文章

E [ ∣ Z 2 ∣ ] < ∞ E\left[ |Z^2| \right]<\infty E[Z2]<

则上述随机微分方程存在唯一的连续解,其中 X 0 ∈ Φ X_0\in\Phi X0Φ ,并且我们还知道

X t X_t Xt 适应于 Φ \Phi Φ W s , s ≤ t W_s,s\leq t Ws,st 产生的域流 F t Φ 且 E [ ∫ 0 T ∣ X t ∣ 2 d t ] < ∞ F_t^\Phi 且 E\left[ \int_{0}^{T}|X_t|^2dt \right]<\infty FtΦE[0TXt2dt]<

  • 结合伊藤公式的一般形式的随机算子表示

对于 m 维扩散过程和 d 维的维纳过程,且

φ ( t , X ) ∈ C 2 , 1 ( [ 0 , T ] × R m ) \varphi(t,X)\in C^{2,1}\left( [0,T]\times R^m \right) φ(t,X)C2,1([0,T]×Rm) ,定义算子

L 0 φ , L j φ 从 [ 0 , T ] × R m → R m L^0\varphi,L^j\varphi 从 [0,T]\times R^m\rightarrow R^m L0φ,Ljφ[0,T]×RmRm :

L 0 φ = ∂ φ ∂ t + ∑ k = 1 m ∂ φ ∂ x k a k + 1 2 ∑ q = 1 d ∑ l , k = 1 q ∂ 2 φ φ x k φ x l b l , q b k , q , L j φ L^0\varphi=\frac{\partial\varphi}{\partial t}+\sum_{k=1}^{m}{\frac{\partial\varphi}{\partial x_k}a_k+\frac{1}{2}\sum_{q=1}^{d}{\sum_{l,k=1}^{q}{\frac{\partial^2\varphi}{\varphi x_k\varphi x_l}b_{l,q}b_{k,q}}}},L^j\varphi L0φ=tφ+k=1mxkφak+21q=1dl,k=1qφxkφxl2φbl,qbk,q,Ljφ

= ∑ k = 1 m ∂ φ φ x k b k , j =\sum_{k=1}^{m}{\frac{\partial \varphi}{\varphi x_k}b_{k,j}} =k=1mφxkφbk,j

二:方程的数值解格式

  • 伊藤展开

使用上述随机算子后,对于含任 d d d 为维纳过程的 φ ( t , X ) ∈ C 2 , 1 ( [ 0 , T ] × R m ) \varphi(t,X)\in C^{2,1}\left( [0,T]\times R^m \right) φ(t,X)C2,1([0,T]×Rm) ,并且在时间 t n t_n tn 处展开,由伊藤公式我们有如下积分形式为:

φ ( t n + 1 , X t n + 1 ) = φ ( t n , X t n ) + ∫ t n t n + 1 L 0 φ ( s , X s ) d s + \varphi(t_{n+1},X_{t_{n+1}})=\varphi(t_{n},X_{t_n})+\int_{t_n}^{t_{n+1}}L^0\varphi(s,X_s)ds+ φ(tn+1,Xtn+1)=φ(tn,Xtn)+tntn+1L0φ(s,Xs)ds+

∑ j = 1 d ∫ t n t n + 1 L j φ ( s , X s ) d W s j \sum_{j=1}^{d}{\int_{t_n}^{t_{n+1}}L^j\varphi(s,X_s)dW_s^j} j=1dtntn+1Ljφ(s,Xs)dWsj,

为了简化模型,我们对上述的只含一维维纳过程的 \varphi(.,.) 继续使用伊藤公式可得:

φ ( t n + 1 , X t n + 1 ) = φ ( t n , X t n ) + \varphi(t_{n+1},X_{t_{n+1}})=\varphi(t_{n},X_{t_n})+ φ(tn+1,Xtn+1)=φ(tn,Xtn)+

∫ t n t n + 1 [ L 0 φ ( s , X s ) + ∫ t n s L 0 L 0 φ ( τ , X τ ) + ∫ t n s L 1 L 0 φ ( τ , X τ ) d W τ ] d s + \int_{t_n}^{t_{n+1}}\left[ L^0\varphi(s,X_{s})+\int_{t_n}^{s}L^0L^0\varphi(\tau,X_{\tau})+\int_{t_n}^{s}L^1L^0\varphi(\tau,X_{\tau})dW_\tau\right]ds + tntn+1[L0φ(s,Xs)+tnsL0L0φ(τ,Xτ)+tnsL1L0φ(τ,Xτ)dWτ]ds+

∫ t n t n + 1 [ L 1 φ ( s , X s ) + ∫ t n s L 0 L 1 φ ( τ , X τ ) d τ + ∫ t n s L 1 L 1 φ ( τ , X τ ) d W τ ] d W s \int_{t_n}^{t_{n+1}}\left[ L^1\varphi(s,X_s)+\int_{t_n}^{s}L^0L^1\varphi(\tau,X_\tau)d\tau +\int_{t_n}^{s}L^1L^1\varphi(\tau,X_\tau)dW_\tau\right]dW_s tntn+1[L1φ(s,Xs)+tnsL0L1φ(τ,Xτ)dτ+tnsL1L1φ(τ,Xτ)dWτ]dWs.

PS:只要上述 φ ( . , . ) \varphi(.,.) φ(.,.) 函数足够光滑,我们可以继续展开,可以得到更多的复杂高阶数值格式!

  • 收敛阶的定义

给定时间分割 0 = t 0 < t 1 < . . . < t N − 1 < t N = T 0=t_0<t_1<...<t_{N-1}<t_N=T 0=t0<t1<...<tN1<tN=T ,假设 Δ t = t n + 1 − t n \Delta t =t_{n+1}-t_n Δt=tn+1tn ,

Δ W n = W t n + 1 − W t n ( n = 0 , 1 , 2 , . . . , N ) \Delta W_n=W_{t_{n+1}}-W_{t_n}(n=0,1,2,...,N) ΔWn=Wtn+1Wtn(n=0,1,2,...,N),

且存在光滑函数 G ∈ C p 2 ( β + 1 ) G\in C_p^{2(\beta+1)} GCp2(β+1) 和正常数 C C C 满足不等式

∣ E [ G ( X t ) − G ( X N ) ] ∣ ≤ C ( 1 + E [ ∣ X 0 ∣ b ] ) ( Δ t ) β \left| E[G(X_t)-G(X^N)] \right|\leq C\left( 1+E[|X_0|^b] \right)(\Delta t)^\beta E[G(Xt)G(XN)]C(1+E[X0b])(Δt)β ,

其中 β , b ∈ N \beta,b\in N β,bN ,则 X N X^N XN 以阶数 β \beta β 弱收敛于 X T X_T XT. 当然有弱收敛就有强收敛,当我们不以整个轨迹误差取期望再绝对值,取而代之的是以每个点的绝对误差取期望后,就是我们的强收敛误差要求,高阶强收敛格式更加复杂,条件更加苛刻,阶数可以是0.5的倍数关系

  • 经典数值格式介绍

设初始条件 X 0 X_0 X0 已知,对于 0 ≤ n ≤ N − 1 0\leq n\leq N-1 0nN1 ,对于 m m m 维的伊藤过程的第 k k k 个分量,我们有如下格式:
1:欧拉格式(弱1.0阶,强0.5阶):

X k n + 1 = X k n + a k Δ t + b k Δ W n X^{n+1}_k=X_k^n+a_k\Delta t+b_k\Delta W_n Xkn+1=Xkn+akΔt+bkΔWn

2:米尔斯坦格式(强弱都是1.0阶):

X k n + 1 = X k n + a k Δ t + b k Δ W n + 1 2 L 1 b k ( ( Δ W n ) 2 − Δ t ) X^{n+1}_k=X_k^n+a_k\Delta t+b_k\Delta W_n+\frac{1}{2}L^1b_k\left( (\Delta W_n)^2-\Delta t \right) Xkn+1=Xkn+akΔt+bkΔWn+21L1bk((ΔWn)2Δt)

3:弱二阶格式:

X k n + 1 = X k n + a k Δ t + b k Δ W n + 1 2 L 1 b k ( ( Δ W n ) 2 − Δ t ) + ( b k + 1 2 Δ t ( L 0 b k + L 1 a k ) Δ W n ) + 1 2 L 0 a k ( Δ t ) 2 X^{n+1}_k=X_k^n+a_k\Delta t+b_k\Delta W_n+\frac{1}{2}L^1b_k\left( (\Delta W_n)^2-\Delta t \right)+\left( b_k+\frac{1}{2}\Delta t(L^0b_k+L^1a_k)\Delta W_n \right)+\frac{1}{2}L^0a_k(\Delta t)^2 Xkn+1=Xkn+akΔt+bkΔWn+21L1bk((ΔWn)2Δt)+(bk+21Δt(L0bk+L1ak)ΔWn)+21L0ak(Δt)2

三:实验模拟

我们以几何布朗运动 X t = a X t d t + b X t d W t X_t=aX_tdt+bX_tdW_t Xt=aXtdt+bXtdWt ,只要简单的对 l n ( X t ) ln(X_t) ln(Xt) 使用伊藤公式,就可得此模型真解为 X t = X 0 e x p [ ( a − 1 2 b 2 ) t + b W t ] X_t=X_0exp[ (a-\frac{1}{2}b^2)t+bW_t ] Xt=X0exp[(a21b2)t+bWt] ,所以在实验中能清楚地比较真解和数值解的误差结果,正向随机微分方程经典模型还有 O r n s t e i n − U h l e n b e c k Ornstein-Uhlenbeck OrnsteinUhlenbeck过程 X t = a ( μ − X t ) d t + b d W t X_t=a(\mu-X_t)dt+bdW_t Xt=a(μXt)dt+bdWt 等,也是存在真解的,但实验内容是跟几何布朗运动完全一致的。

import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif']=['SimHei']##中文乱码问题!
plt.rcParams['axes.unicode_minus']=False#横坐标负号显示问题!

def schemes(a,b,names):
    logtimels = []
    logerrorls = []
    CRls = []
    msg = '''
                        1:exp函数
                        2:sin函数
                        3:原函数的3次方
                        4:原函数
                '''
    print(msg)

    ##定义初始化内容
    choose = int(input('请选择g(x)函数:'))
    echoes = 100
    time_ls = [8,16,32,64,128]
    error_ls = []
    value_matx = np.zeros((echoes,len(time_ls)))

    Euler = 'y + a * dt * y + b * y * dwt_temp'
    Milstein = Euler + ' + 0.5 * b * b * y * (dwt_temp * dwt_temp - dt)'
    weak_2_order = Milstein + ' + 0.5 * a * a * y * dt * dt + 0.5 * dt * (b * a * y + a * b * y) * dwt_temp'
    schemes_ls = [Euler,Milstein,weak_2_order]

    for s,n in zip(schemes_ls,names):
        for e in range(echoes):
            for i in range(len(time_ls)):
                x0 = 1##SDE真解初始值
                y = 1##数值格式初始值
                T = 1
                N = time_ls[i]
                dt = 1 / N
                yt = []
                dwt = np.random.normal(0,1,N) * np.sqrt(dt)
                Wt = np.cumsum(dwt)

                ###真解
                WT = Wt[N - 1]
                vtemp = x0 * np.exp((a - 0.5 * b * b) * T + b * WT)
                xT = 0
                if choose == 1:
                    xT = np.exp(vtemp)
                if choose == 2:
                    xT = np.sin(vtemp)
                if choose == 3:
                    xT = np.power(vtemp,3)
                if choose == 4:
                    xT = vtemp

                ##数值格式解
                for j in range(N):
                    dwt_temp = dwt[j]
                    y = eval(s)
                    if choose == 1:
                        yt.append(np.exp(y))
                    if choose == 2:
                        yt.append(np.sin(y))
                    if choose == 3:
                        yt.append(np.power(y,3))
                    if choose == 4:
                        yt.append(y)
                error_temp = yt[N - 1] - xT ##真解与数值解末端值作差
                error_ls.append(error_temp)
            value_matx[e,:] = error_ls
            error_ls = []
        error_fin = np.abs(sum(value_matx) / echoes)##弱收敛最终求期望
        log_time = np.log(1 / np.array(time_ls))
        log_error_fin = np.log(error_fin)
        CR = np.polyfit(log_time,log_error_fin,1)##一次多项式拟合
        print('\033[1;36m{0:*^80}\033[0m'.format('计算结果'))
        print('格式%s的相对误差为:%s'%(n,np.round(error_fin,6)))
        print('格式%s的弱收敛阶为:%s'%(n,round(CR[0],6)))
        logerrorls.append(np.round(log_error_fin,6))
        logtimels.append(log_time)
        CRls.append(round(CR[0],6))
    return logtimels,logerrorls,CRls

mu = 1##漂移系数
sigm = 0.05##扩散系数
scheme_names = ['Euler', 'Milstein', 'weak_2_order']
R = schemes(mu,sigm,scheme_names)

在这里插入图片描述

图1

在这里插入图片描述

图2

在这里插入图片描述

图3
marker_ls = ['-*','-o','-^']
def make_figure():
    plt.figure(figsize=(8, 6))
    for i,j,k,l,m in zip(R[0],R[1],R[2],scheme_names,marker_ls):
        plt.plot(i,j,m,label=l)
    plt.plot(np.array([-4,-3]),np.array([-4,-3]) + 1,'--',label='slope=1')
    plt.plot(np.array([-4, -3]), 2 * np.array([-4, -3]) - 1.5,'--',label='slope=2')
    plt.xlabel('stepsize logN')
    plt.ylabel('log(|E(Y_T-X^N)|)')
    plt.legend()
    plt.show()
make_figure()

在这里插入图片描述

图4

四:总结

经典的正向随机微分方程数值格式和收敛阶的模拟大致如上,但最开始也提到过,由正向衍生出来的各种方程在如今是非常多的。与正向相对性的倒向随机微分方程也是一个大类研究方向,今后如果有机会,作者还会发布些关于倒向随机微分方程的数值模拟,感兴趣的朋友希望点赞关注加收藏啦!

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43577256/article/details/122579036