a.) Euler Scheme
N <- 1000 # number of end - points of the grid including T
T <- 1 # length of the interval [0 ,T] in time units
dt <- T/N # time increment
r = 0.10
g = 0.30
X = 1
t <- seq (0,T,length = N+1)
for (k in 2:( N +1)) {
dW = rnorm (N, 0, 1) * sqrt ( dt )
X[k] = X[k-1] + r*X[k-1]*dt + g*X[k-1]*dW
}
plot (t, X, type ="l", main =" Euler Scheme ")
b.) Heun Scheme
N <- 1000 # number of end - points of the grid including T
T <- 1 # length of the interval [0 ,T] in time units
dt <- T/N # time increment
r = 0.10
g = 0.30
XH = 1 #numeric(N+1)
t <- seq (0,T,length = N+1)
for (k in 2:( N +1)) {
dW = rnorm (N, 0, 1) * sqrt ( dt )
Xstar = XH[k-1] + r*XH[k-1]*dt + g*XH[k-1]*dW
XH[k] = XH[k-1] + (1/2)*r*(Xstar+XH[k-1])*dt + (1/2)*g*(Xstar+XH[k-1])*dW
}
plot (t, XH, type ="l", main ="Heun Scheme ")
c.) Runge-Kutta Scheme
N <- 1000 # number of end - points of the grid including T
T <- 1 # length of the interval [0 ,T] in time units
dt <- T/N # time increment
r = 0.10
g = 0.30
XR = 1
t <- seq (0,T,length = N+1)
for (k in 2:( N +1)) {
dW = rnorm (N, 0, 1) * sqrt ( dt )
i0 = XR[k-1]
y0 = XR[k-1]+0.5*r*i0*dt+0.5*g*i0*dW
i1 = y0
y1 = XR[k-1]+0.5*r*i1*dt+0.5*g*i1*dW
i2 = y1
y2 = XR[k-1]+r*i2*dt+g*i2*dW
i3 = y2
XR[k] = XR[k-1]+r*((i0+2*i1+2*i2+i3)/6)*dt+g*((i0+2*i1+2*i2+i3)/6)*dW
}
plot (t, XR, type ="l", main =" Runge-Kutta Scheme ")
d.) Combined Schemes
#plot for euler scheme
plot (t, X, type ="l", col="green", main =" Combined Schemes ")
#second plot for heun
lines(t, XH, col="red")
#third plot for runge-kutta
lines(t, XR, col="blue")
#to add legends
legend("topright",legend=c("Euler","Huen","Runge-Kutta"),col=c("green","red","blue"),lty=c(1,2,3), cex=0.8)
References: R for Data Science: Import, Tidy, Transform, Visualize, and Model Data by Hadley Wickham & Garrett Grolemund