1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| import numpy as np import matplotlib.pyplot as plt def random_walk_steps(n_steps): """ 生成n_steps步随机行走的变量 """ X =np.random.rand(n_steps) X[X>=0.5] = 1.0 X[X<0.5] = -1.0 return X def generate_random_walk(steps,n): """ steps 存放了每一步随机行走的情况 生成 Y,注意到这里steps 和 n其实是两个独立的变量 """ Y0 = np.array([0]) Y = np.concatenate((Y0,np.cumsum(steps)/np.sqrt(n))) return Y def brownian_motion_simulate(T,dt): """ 函数把[0,T]这个时间段分成[0,dt],[dt,2dt]... 然后用正态分布对每个时间段进行模拟再求和 """ nsteps = int(np.ceil(T/dt))+1 steps = np.random.randn(nsteps)*np.sqrt(dt) steps[0] = 0. bmotion = np.cumsum(steps) return bmotion T = 80. dt = 0.001 nsteps = int(np.ceil(T/dt))+1 NPATH = 100 SAMPLES=np.zeros((NPATH,nsteps)) for ii in range(NPATH): SAMPLES[ii,:]=brownian_motion_simulate(T,dt)
plt.figure(figsize=(7,7)) TSPAN = np.arange(0,nsteps*dt,dt) plt.plot(np.tile(TSPAN,(NPATH,1)).T,SAMPLES.T,alpha=0.4) plt.xlabel('Time',fontsize=14) plt.ylabel(r'$W_t$',fontsize=14) plt.show() FirstOrderDifference=np.zeros((NPATH,nsteps)) for ii in range(NPATH): for i in range(1,nsteps): FirstOrderDifference[ii,i]= FirstOrderDifference[ii,i-1]+abs(SAMPLES[ii,i]-SAMPLES[ii,i-1]) plt.figure(figsize=(7,7)) TSPAN = np.arange(0,nsteps*dt,dt) plt.plot(np.tile(TSPAN,(NPATH,1)).T,FirstOrderDifference.T,alpha=0.4) plt.xlabel('Time',fontsize=14) plt.ylabel(r'$S^{A,1} _t$',fontsize=14) plt.show() SecondOrderDifference=np.zeros((NPATH,nsteps)) for ii in range(NPATH): for i in range(1,nsteps): SecondOrderDifference[ii,i]=SecondOrderDifference[ii,i-1]+ abs(SAMPLES[ii,i]-SAMPLES[ii,i-1])**2 plt.figure(figsize=(7,7)) TSPAN = np.arange(0,nsteps*dt,dt) plt.plot(np.tile(TSPAN,(NPATH,1)).T,SecondOrderDifference.T,alpha=0.4) plt.xlabel('Time',fontsize=14) plt.ylabel(r'$S^{W,W} _t$',fontsize=14) plt.show()
|