
P1: JYS
c04 JWBK378-Fletcher May 23, 2009 4:21 Printer: Yet to come
34 Financial Modelling in Python
widths h
i
and each b is a linear combination of the y
i
. More specifically
b
0
= d
lef t
b
i
=
6
h
i
+h
i+1
y
i+1
− y
i
h
i+1
−
y
i
− y
i−1
h
i
b
n
= d
right
(4.8)
where d
left
and d
right
are constants dependent only on the choice of the value of the derivatives
at the endpoints of the curve.
3
Implementation of this scheme in Python requires a little more
effort than the earlier cases:
class cubic spline(interpolation base):
def
init (self, abscissae, ordinates, a 0 = 0.5, d 0=0, b n=0.5,
d
n=0):
interpolation
base. init (self, abscissae, ordinates)
xs, ys, N = self.abscissae, self.ordinates, self.N
b=[d
0]+(N - 1)*[0]
A
sub, A dia, A sup = N*[0], [2.0] + (N - 1)*[0], [a 0] +
(N - 1)*[0]
for i in range(1, N - 1):
H, h = xs[i + 1]- xs[i], xs[i] - xs[i - 1]
b[i] = (6./(h + H))*(((ys[i + 1] - ys[i])/H) -
((ys[i] - ys[i - 1])/h))
a
i = H/(h + H)
b
i=1.0-ai
A
dia[i], A sup[i], A sub[i] = 2., a i, b i
A
sub[N - 1], A dia[N - 1], b[N - 1] = b n, 2.0, d n
self.C = linear
algebra.solve tridiagonal system(N, A sub, A dia,
A
sup, b)
def
call (self, x):
xs, ys, C = self.abscissae, self.ordinates, self.C
i, j,
, , , = interpolation base.locate(self, x)
h
i = xs[j] - xs[i]
x
low = xs[j] - x
x
low3 = math.pow(x low, 3)
x
high = x - xs[i]
x
high3 = math.pow(x high, 3)
hi
sqrd 6=hi*h i/6.0
return C[i]*x
low3/(6.0*h i)+C[j]*x high3/(6.0*h i)+\
(ys[i]-C[i]*hi
sqrd 6)*x low/h i+(ys[j]- ...