Code for randomly generated interest rates:
ClearAll["Global`*"]
Δt = .0001;
μ = 0;
γ = .005;
t = .0833;
rndm := RandomVariate[NormalDistribution[0, Δt^.5], 834];
Prepend[Accumulate[rndm] γ + μ Δt + .0158, .0158];
k = 100;
SeedRandom[1]
rate = Table[Prepend[Accumulate[rndm] γ + μ dt + .0158, .0158], k];
Code for BTCS method (transition matrix)
btcs[k_, n_] =
SparseArray[
{{m_, m_} -> 1 - 2*λ*Indexed[s, m]^2 - Indexed[rate, {k, n}]*dt,
{m_, l_} /; l - m == 1 ->
λ*Indexed[s, m]^2 + μ*Indexed[rate, {k, n}]*Indexed[s, m],
{m_, l_} /; m - l == 1 ->
λ*Indexed[s, m]^2 - μ*Indexed[rate, {k, n}]*Indexed[s, m]},
{101, 101}];
Code for Crank-Nicolson (transition matricies)
(*V^(n+1) time step to V^(n+1) time step*)
cn1[k2_, n_] =
SparseArray[
{{m_, m_} ->
1/2 + 1/2*((σ^2 Indexed[s, i]^2)/(Δ*Indexed[s, i]^2)*Δt) + 1/2*Indexed[rate, {k2, n}]*dt,
{m_, l_} /; l - m == 1 ->
-(1/4)*((σ^2 Indexed[s, i]^2)/(Δ*Indexed[s, i]^2)*Δt) - 1/2*Indexed[rate, {k2, n}]*(Indexed[s, i]/(2*Δ*Indexed[s, i]^2 Δt)),
{m_, l_} /; m - l == 1 ->
-(1/4)*((σ^2 Indexed[s, i]^2)/(Δ*Indexed[s, i]^2)*Δt) + 1/2*Indexed[rate, {k2, n}]*(Indexed[s, i]/(2*Δ*Indexed[s, i]^2 Δt))},
{101, 101}]
(*from V^(n+(1/2)) time step to V^n*)
cn2[k_, n_] =
SparseArray[
{{m_, m_} ->
3/2 + 1/2*((σ^2 Indexed[s, i]^2)/(Δ*Indexed[s, i]^2)*Δt) + 1/2*Indexed[rate, {k2, n}]*dt,
{m_, l_} /; l - m == 1 ->
-(1/4)*((σ^2 Indexed[s, i]^2)/(Δ*Indexed[s, i]^2)*Δt) - 1/2*Indexed[rate, {k2, n}]*(Indexed[s, i]/(2*Δ*Indexed[s, i]^2 Δt)),
{m_, l_} /; m - l == 1 ->
-(1/4)*((σ^2 Indexed[s, i]^2)/(Δ*Indexed[s, i]^2)*Δt) + 1/2*Indexed[rate, {k2, n}]*(Indexed[s, i]/(2*Δ*Indexed[s, i]^2 Δt))},
{101, 101}]
How should I approach calculating the ratio ||Vn||/||Vn+1|| using the first sequence interest rates randomly generated above? And how can can I implement the code to calculate the option using FTCS (forward Euler), BTCS (backward Euler), and Crank-Nicolson using the transition matrices above?
Here is code I used before to solve a different PDE using Crank-Nicolson:
s = 0.5;
h = 0.1;
k = 0.005;
r = k/(h^2);
a = 0;
b1 = 1;
m = (b1 - a)/h;
n = s/k;
For[i = 0,i <= m,i++,
x[i] = a + i*h;
u[x[i], 0] = x[i]*(1 - x[i])];
For[j=0,j<=n,j++,
t[j]=j*k;
u[0,t[j]]=0;
u[1,t[j]]=0];
A =
{{2 + 2*r, -r, 0, 0, 0, 0, 0, 0, 0},
{-r, 2 + 2*r, -r, 0, 0, 0 ,0, 0, 0},
{0, -r, 2 + 2*r, -r, 0, 0, 0, 0, 0},
{0, 0, -r, 2 + 2*r, -r, 0, 0, 0, 0},
{0, 0, 0, -r, 2 + 2*r, -r, 0, 0, 0},
{0, 0 ,0, 0, -r, 2 + 2*r, -r, 0, 0},
{0, 0, 0, 0, 0, -r, 2 + 2*r, -r, 0},
{0, 0, 0, 0, 0, 0, -r, 2 + 2*r, -r},
{0, 0, 0, 0, 0, 0, 0, -r, 2 + 2*r}};
u[0] = Table[u[x[i], 0],{i, 1, m - 1}];
For[j = 0,j < n, j++,
b[1, j] = r*u[0, t[j]] + (2 - 2*r)*u[j][[1]] + r*u[j][[2]] + r*u[0, t[j + 1]];
For[i = 2, i <= m - 2, i++,
b[i, j] = r*u[j][[i - 1]]+ (2 - 2*r)*u[j][[i]] + r*u[j][[i + 1]]];
b[9, j] =
r*u[j][[m - 2]] + (2 - 2*r)*u [j][[m -1]] + r*u[1, t[j]] + r*u[1, t[j + 1]];
b[j] = Table[b[l, j], {l, 1, m - 1}];
u[j + 1] = Inverse[A].Transpose[{b[j]}];
u[j + 1] = Transpose[u[j + 1]][[1]];
Print[u[j + 1]];
Print[".............................."]];
Can this be modified to include a sparse array? Any help will be greatly appreciated.
Comments
Post a Comment