Computes the value of a Hermite quintic spline or the value of one of its derivatives. In particular, computes solutions to the Feynman-Kac PDE handled by function imsl_f_feynman_kac.
#include <imsl.h>
float *imsl_f_feynman_kac_evaluate (int nw, int m, float breakpoints[], float w[], float coef[],…, 0)
The type double function is imsl_d_feynman_kac_evaluate.
int nw
(Input)
Length of the array containing the evaluation points of the
spline.
int m
(Input)
Number of breakpoints for the Hermite quintic spline interpolation.
It is required that m
2. When applied to imsl_f_feynman_kac,
m is identical
to argument nxgrid.
float breakpoints[]
(Input)
Array of length m containing the
breakpoints for the Hermite quintic spline interpolation. The breakpoints must
be in strictly increasing order. When applied to imsl_f_feynman_kac,
breakpoints[] is
identical to array xgrid[].
float w[]
(Input)
Vector of length nw containing the
evaluation points for the spline. It is required that breakpoints[0]
w[i]
breakpoints[m-1]
for
i=0,…,nw-1.
float coef[]
(Input)
Vector of length 3*m containing the
coefficients of the Hermite quintic spline.
When applied to imsl_f_feynman_kac,
this vector is one of the rows of output arrays y or y_prime related to the
spline coefficients at time points t=tgrid[j], j=1,…, ntgrid.
A pointer to an array of length nw containing the values of the Hermite quintic spline or one of its derivatives at the evaluation points in array w[]. If no values can be computed, then NULL is returned.
#include <imsl.h>
float *imsl_f_feynman_kac_evaluate(int nw, int m, float breakpoints[], float w[], float coef[],
IMSL_DERIV, int deriv,
IMSL_RETURN_USER, float value[],
0)
IMSL_DERIV, int deriv
(Input)
Let
= deriv and let
be the given Hermite quintic spline.
Then, this option produces the d-th derivative of
at
,
. It is required that deriv = 0,1,2
or 3.
Default: deriv = 0.
IMSL_RETURN_USER,
float value[]
(Output)
A user defined array of length nw to receive the
d-th derivative of
at the evaluation points in
w[]. When using
this option, the return value of the function is NULL.
The Hermite quintic spline interpolation is done over the
composite interval
, where breakpoints[i-1]
=
are given by
.
The Hermite quintic spline function is constructed using three primary functions, defined by

For each

the spline is locally defined by

where

are the values of a given twice continuously differentiable
function
and its first two derivatives at
the breakpoints.
The approximating function
is twice continuously
differentiable on
, whereas the third derivative is in
general only continuous within the interior of the intervals
. From the local representation of
it follows that
.
The spline coefficients
are stored as successive
triplets in array coef[].
For a given
, function imsl_f_feynman_kac_evaluate
uses the information in coef[]
together with the values of
and its derivatives at
to compute
using the local representation
on the particular subinterval containing
.
Consider function
, a polynomial of degree 5, on the
interval
with breakpoints
. Then, the end derivative values are
and
.
Since the Hermite quintic interpolates all polynomials up
to degree 5 exactly, the spline interpolation on
must agree with the exact
function value up to rounding errors.
#include <imsl.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
/* Define function */
#define F(x) pow(x,5.0)
int main()
{
int i;
int nw = 7;
int m = 2;
float breakpoints[] = { -1.0, 1.0 };
float w[] = { -0.75, -0.5, -0.25, 0.0,
0.25, 0.5, 0.75 };
float coef[] = { -1.0, 5.0, -20.0,
1.0, 5.0, 20.0 };
float *result = NULL;
result = imsl_f_feynman_kac_evaluate(nw, m, breakpoints, w, coef, 0);
/* Print results */
printf(" x F(x) Interpolant Error\n\n");
for (i=0; i<=6; i++)
printf(" %6.3f %10.3f %10.3f %10.7f\n", w[i], F(w[i]),
result[i], fabs(F(w[i])-result[i]));
}
x F(x) Interpolant Error
-0.750 -0.237 -0.237 0.0000000
-0.500 -0.031 -0.031 0.0000000
-0.250 -0.001 -0.001 0.0000000
0.000 0.000 0.000 0.0000000
0.250 0.001 0.001 0.0000000
0.500 0.031 0.031 0.0000000
0.750 0.237 0.237 0.0000000