-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathforward.m
56 lines (43 loc) · 1.22 KB
/
forward.m
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
function [u, time, space] = forward(T, X, n, m, g, r, del, sig)
%FORWARD Forward in time, centered in space.
% Forward euler method in the time derivative, centered in the space
% derivative.
dt = T/n;
dx = X/m;
d1 = dt/dx;
d2 = dt/(dx^2);
disp(['d1: ', num2str(d1)]);
disp(['d2: ', num2str(d2)]);
if (d1 > 0.00068)
disp(['Warning: d1 > 0.0068 (', num2str(d1), ')']);
end
if (d2 > 0.0004)
disp(['Warning: d2 > 0.00046923 (', num2str(d2), ')']);
end
u = zeros(n + 1, m + 1);
time = zeros(1, n + 1);
space = zeros(1, m + 1);
for i = 2 : n + 1
time(i) = time(i - 1) + dt;
end
for j = 2 : m + 1
space(j) = space(j - 1) + dx;
end
% Value for initial time
for j = 1 : m + 1
u(1, j) = max(0, g(space(j)));
end
% Value for initial space and terminal space
for i = 1 : n + 1
u(i, 1) = max(0, g(space(1) / exp(-r * time(i)) * exp(-r * time(i))));
u(i, m + 1) = max(0, g(space(m + 1) / exp(-r * time(i)) * exp(-r * time(i))));
end
for i = 1 : n
for j = 2 : m
xj = space(j);
a = r * xj * d1 * (u(i, j + 1) - u(i, j - 1)) / 2;
b = sig^(2) * xj^(2 * del) * d2 * (u(i, j + 1) - 2 * u(i, j) + u(i, j - 1)) / 2;
u(i + 1, j) = u(i, j) + a + b;
end
end
end