正向随机微分方程的经典数值格式模拟
正向隨機微分方程的經典數值格式模擬
- 前言
- 一:隨機微分方程(SDE)的相關性質
- 二:方程的數值解格式
- 三:實驗模擬
- 四:總結
前言
隨機微分方程的發展分支可以說到現在非常廣泛了,從19世紀的布朗運動發現到上世紀40年代的伊藤積分再到正向伊藤隨機微分方程解的存在唯一性定理,后又跨越到上世紀90年代的倒向隨機微分方程解的存在唯一性定理發現,最后到近現在的帶跳、帶馬爾科夫、帶延遲等一系列正倒向隨機微方程解的存在唯一性定理等發現,可以說體系越發廣泛,這也是順應時代發展的必然趨勢。
本篇文章將數值模擬經典下的正向隨機微分方程數值格式的模擬,由于不是存粹數學研究,有些假設和定理和推導會簡單概括,重點是計算機編程模擬,也算是學習隨機微分方程數值法的入門介紹。
一:隨機微分方程(SDE)的相關性質
- 簡介
隨機過程 XtX_tXt? 被稱作一個擴散過程,如果它滿足下面的隨機微分方程:
Xt=X0+∫t0ta(s,Xs)ds+∫t0tb(s,Xs)dWs,t∈[t0,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?+∫t0?t?a(s,Xs?)ds+∫t0?t?b(s,Xs?)dWs?,t∈[t0?,T], 其中 as=a(s,Xs)a_s=a(s,X_s)as?=a(s,Xs?) 和 bs=b(s,Xs)b_s=b(s,X_s)bs?=b(s,Xs?) 為 [0,T]×Rm[0,T]\times R^m[0,T]×Rm 上的可測函數, $W_t $為概率空間 (Ω,F,P)(\Omega,F,P)(Ω,F,P) 上的 d?d -d?維標準維納過程。但為了此隨機模型在實際中得以應用,保證上述擴散過程得以存在,我們將對此擴散過程給與一定條件,此SDESDESDE的解才會存在且唯一!
- SDE解的存在唯一性定理
令 T>0T>0T>0 ,且對于擴散過程和漂移過程分別有
a(.,.):[0,T]×Rm→Rm,b(.,.):[0,T]×Rm→Rm×da(.,.):[0,T]\times R^m\rightarrow R^m,b(.,.):[0,T]\times R^m\rightarrow R^{m\times d}a(.,.):[0,T]×Rm→Rm,b(.,.):[0,T]×Rm→Rm×d 為可測函數,
滿足 ∣a(s,x)+b(s,x)∣≤C(1+∣x∣),x∈Rm,s∈[t0,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∣),x∈Rm,s∈[t0?,T],
∣a(t,x)?a(t,y)∣+∣b(t,x)?b(t,y)∣≤L∣x?y∣,x,y∈Rm,s∈[t0,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)∣≤L∣x?y∣,x,y∈Rm,s∈[t0?,T]
其中 C,LC,LC,L 為有界常數,令 Φ\PhiΦ 為獨立于由 Ws,s≥0W_s,s\geq0Ws?,s≥0 產生的 σ\sigmaσ 代數 FFF ,使得
E[∣Z2∣]<∞E\left[ |Z^2| \right]<\inftyE[∣Z2∣]<∞。
則上述隨機微分方程存在唯一的連續解,其中 X0∈ΦX_0\in\PhiX0?∈Φ ,并且我們還知道
XtX_tXt? 適應于 Φ\PhiΦ 和 Ws,s≤tW_s,s\leq tWs?,s≤t 產生的域流 FtΦ且E[∫0T∣Xt∣2dt]<∞F_t^\Phi 且 E\left[ \int_{0}^{T}|X_t|^2dt \right]<\inftyFtΦ?且E[∫0T?∣Xt?∣2dt]<∞。
- 結合伊藤公式的一般形式的隨機算子表示
對于 m 維擴散過程和 d 維的維納過程,且
φ(t,X)∈C2,1([0,T]×Rm)\varphi(t,X)\in C^{2,1}\left( [0,T]\times R^m \right)φ(t,X)∈C2,1([0,T]×Rm) ,定義算子
L0φ,Ljφ從[0,T]×Rm→RmL^0\varphi,L^j\varphi 從 [0,T]\times R^m\rightarrow R^mL0φ,Ljφ從[0,T]×Rm→Rm :
L0φ=?φ?t+∑k=1m?φ?xkak+12∑q=1d∑l,k=1q?2φφxkφxlbl,qbk,q,Ljφ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}^ze8trgl8bvbq{\sum_{l,k=1}^{q}{\frac{\partial^2\varphi}{\varphi x_k\varphi x_l}b_{l,q}b_{k,q}}}},L^j\varphiL0φ=?t?φ?+∑k=1m??xk??φ?ak?+21?∑q=1d?∑l,k=1q?φxk?φxl??2φ?bl,q?bk,q?,Ljφ
=∑k=1m?φφxkbk,j=\sum_{k=1}^{m}{\frac{\partial \varphi}{\varphi x_k}b_{k,j}}=∑k=1m?φxk??φ?bk,j?。
二:方程的數值解格式
- 伊藤展開
使用上述隨機算子后,對于含任ddd 為維納過程的 φ(t,X)∈C2,1([0,T]×Rm)\varphi(t,X)\in C^{2,1}\left( [0,T]\times R^m \right)φ(t,X)∈C2,1([0,T]×Rm) ,并且在時間 tnt_ntn? 處展開,由伊藤公式我們有如下積分形式為:
φ(tn+1,Xtn+1)=φ(tn,Xtn)+∫tntn+1L0φ(s,Xs)ds+\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??)+∫tn?tn+1??L0φ(s,Xs?)ds+
∑j=1d∫tntn+1Ljφ(s,Xs)dWsj\sum_{j=1}^ze8trgl8bvbq{\int_{t_n}^{t_{n+1}}L^j\varphi(s,X_s)dW_s^j}∑j=1d?∫tn?tn+1??Ljφ(s,Xs?)dWsj?,
為了簡化模型,我們對上述的只含一維維納過程的 \varphi(.,.) 繼續使用伊藤公式可得:
φ(tn+1,Xtn+1)=φ(tn,Xtn)+\varphi(t_{n+1},X_{t_{n+1}})=\varphi(t_{n},X_{t_n})+φ(tn+1?,Xtn+1??)=φ(tn?,Xtn??)+
∫tntn+1[L0φ(s,Xs)+∫tnsL0L0φ(τ,Xτ)+∫tnsL1L0φ(τ,Xτ)dWτ]ds+\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 +∫tn?tn+1??[L0φ(s,Xs?)+∫tn?s?L0L0φ(τ,Xτ?)+∫tn?s?L1L0φ(τ,Xτ?)dWτ?]ds+
∫tntn+1[L1φ(s,Xs)+∫tnsL0L1φ(τ,Xτ)dτ+∫tnsL1L1φ(τ,Xτ)dWτ]dWs\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∫tn?tn+1??[L1φ(s,Xs?)+∫tn?s?L0L1φ(τ,Xτ?)dτ+∫tn?s?L1L1φ(τ,Xτ?)dWτ?]dWs?.
PS:只要上述 φ(.,.)\varphi(.,.)φ(.,.) 函數足夠光滑,我們可以繼續展開,可以得到更多的復雜高階數值格式!
- 收斂階的定義
給定時間分割 0=t0<t1<...<tN?1<tN=T0=t_0<t_1<...<t_{N-1}<t_N=T0=t0?<t1?<...<tN?1?<tN?=T ,假設 Δt=tn+1?tn\Delta t =t_{n+1}-t_nΔt=tn+1??tn? ,
ΔWn=Wtn+1?Wtn(n=0,1,2,...,N)\Delta W_n=W_{t_{n+1}}-W_{t_n}(n=0,1,2,...,N)ΔWn?=Wtn+1???Wtn??(n=0,1,2,...,N),
且存在光滑函數 G∈Cp2(β+1)G\in C_p^{2(\beta+1)}G∈Cp2(β+1)? 和正常數 CCC 滿足不等式
∣E[G(Xt)?G(XN)]∣≤C(1+E[∣X0∣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[∣X0?∣b])(Δt)β ,
其中 β,b∈N\beta,b\in Nβ,b∈N ,則 XNX^NXN 以階數 β\betaβ 弱收斂于 XTX_TXT?. 當然有弱收斂就有強收斂,當我們不以整個軌跡誤差取期望再絕對值,取而代之的是以每個點的絕對誤差取期望后,就是我們的強收斂誤差要求,高階強收斂格式更加復雜,條件更加苛刻,階數可以是0.5的倍數關系。
- 經典數值格式介紹
設初始條件 X0X_0X0? 已知,對于 0≤n≤N?10\leq n\leq N-10≤n≤N?1 ,對于 mmm 維的伊藤過程的第 kkk 個分量,我們有如下格式:
1:歐拉格式(弱1.0階,強0.5階):
Xkn+1=Xkn+akΔt+bkΔWnX^{n+1}_k=X_k^n+a_k\Delta t+b_k\Delta W_nXkn+1?=Xkn?+ak?Δt+bk?ΔWn?
2:米爾斯坦格式(強弱都是1.0階):
Xkn+1=Xkn+akΔt+bkΔWn+12L1bk((ΔWn)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?+21?L1bk?((ΔWn?)2?Δt)
3:弱二階格式:
Xkn+1=Xkn+akΔt+bkΔWn+12L1bk((ΔWn)2?Δt)+(bk+12Δt(L0bk+L1ak)ΔWn)+12L0ak(Δt)2X^{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)^2Xkn+1?=Xkn?+ak?Δt+bk?ΔWn?+21?L1bk?((ΔWn?)2?Δt)+(bk?+21?Δt(L0bk?+L1ak?)ΔWn?)+21?L0ak?(Δt)2
三:實驗模擬
我們以幾何布朗運動 Xt=aXtdt+bXtdWtX_t=aX_tdt+bX_tdW_tXt?=aXt?dt+bXt?dWt? ,只要簡單的對 ln(Xt)ln(X_t)ln(Xt?) 使用伊藤公式,就可得此模型真解為Xt=X0exp[(a?12b2)t+bWt]X_t=X_0exp[ (a-\frac{1}{2}b^2)t+bW_t ]Xt?=X0?exp[(a?21?b2)t+bWt?] ,所以在實驗中能清楚地比較真解和數值解的誤差結果,正向隨機微分方程經典模型還有Ornstein?UhlenbeckOrnstein-UhlenbeckOrnstein?Uhlenbeck過程 Xt=a(μ?Xt)dt+bdWtX_t=a(\mu-X_t)dt+bdW_tXt?=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 = 100time_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 = 1N = time_ls[i]dt = 1 / Nyt = []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 = 0if 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_lserror_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,CRlsmu = 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四:總結
經典的正向隨機微分方程數值格式和收斂階的模擬大致如上,但最開始也提到過,由正向衍生出來的各種方程在如今是非常多的。與正向相對性的倒向隨機微分方程也是一個大類研究方向,今后如果有機會,作者還會發布些關于倒向隨機微分方程的數值模擬,感興趣的朋友希望點贊關注加收藏啦!
總結
以上是生活随笔為你收集整理的正向随机微分方程的经典数值格式模拟的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Visual SVN Server
- 下一篇: Oracle索引的建立及优缺点