spline_value

Computes the value of a spline or the value of one of its derivatives.

Synopsis

#include <imsl.h>

float imsl_f_spline_value (float x, Imsl_f_spline *sp, , 0)

The type double function is imsl_d_spline_value.

Required Arguments

float x (Input)
Evaluation point for the spline.

Imsl_f_spline *sp (Input)
Pointer to the structure that represents the spline.

Return Value

The value of a spline or one of its derivatives at the point x. If no value can be computed, NaN is returned.

Synopsis with Optional Arguments

#include <imsl.h>

float imsl_f_spline_value (float x, Imsl_f_spline *sp,

IMSL_DERIV, int deriv,

IMSL_GRID, int n, float *xvec, float **value,

IMSL_GRID_USER, int n, float *xvec, float value_user[],

0)

Optional Arguments

IMSL_DERIV, int deriv (Input)
Let d = deriv and let s be the spline that is represented by the structure *sp. Then, this option produces the d-th derivative of s at x, s(d) (x).
Default: deriv = 0

IMSL_GRID, int n, float *xvec, float **value (Input/Output)
The argument xvec is the array of length n containing the points at which the spline is to be evaluated. The d-th derivative of the spline at the points in xvec is returned in value.

IMSL_GRID_USER int n, float *xvec, float value_user[] (Input/Output)
The argument xvec is the array of length n containing the points at which the spline is to be evaluated. The d-th derivative of the spline at the points in xvec is returned in value_user.

Description

The function imsl_f_spline_value computes the value of a spline or one of its derivatives. This function is based on the routine BVALUE by de Boor (1978, p. 144).

Examples

 

Example 1

In this example, a cubic spline interpolant to a function f is computed. The values of this spline are then compared with the exact function values. Since the default settings are used, the interpolant is determined by the “not-a-knot” condition (see de Boor 1978).

 

#include <imsl.h>

#include <stdio.h>

#include <math.h>

 

#define NDATA 11

/* Define function */

#define F(x) (float)(sin(15.0*x))

 

int main()

{

int i;

float fdata[NDATA], xdata[NDATA], x, y;

Imsl_f_spline *sp;

/* Set up a grid */

for (i = 0; i < NDATA; i++) {

xdata[i] = (float)i /((float)(NDATA-1));

fdata[i] = F(xdata[i]);

}

/* Compute cubic spline interpolant */

sp = imsl_f_spline_interp (NDATA, xdata,fdata, 0);

/* Print results */

printf(" x F(x) Interpolant Error\n");

for (i = NDATA/2; i < 3*NDATA/2; i++){

x = (float) i /(float)(2*NDATA-2);

y = imsl_f_spline_value(x, sp, 0);

printf(" %6.3f %10.3f %10.3f %10.4f\n", x, F(x), y,

fabs(F(x)-y));

}

}

Output

 

x F(x) Interpolant Error

0.250 -0.572 -0.549 0.0228

0.300 -0.978 -0.978 0.0000

0.350 -0.859 -0.843 0.0162

0.400 -0.279 -0.279 0.0000

0.450 0.450 0.441 0.0093

0.500 0.938 0.938 0.0000

0.550 0.923 0.903 0.0199

0.600 0.412 0.412 0.0000

0.650 -0.320 -0.315 0.0049

0.700 -0.880 -0.880 0.0000

0.750 -0.968 -0.938 0.0295

Example 2

Recall that in the first example, a cubic spline interpolant to a function f is computed. The values of this spline are then compared with the exact function values. This example compares the values of the first derivatives.

 

#include <imsl.h>

#include <stdio.h>

#include <math.h>

 

#define NDATA 11

/* Define function */

#define F(x) (float)(sin(15.0*x))

#define FP(x) (float)(15.*cos(15.0*x))

 

int main()

{

int i;

float fdata[NDATA], xdata[NDATA], x, y;

Imsl_f_spline *sp;

/* Set up a grid */

for (i = 0; i < NDATA; i++) {

xdata[i] = (float)i /((float)(NDATA-1));

fdata[i] = F(xdata[i]);

}

/* Compute cubic spline interpolant */

sp = imsl_f_spline_interp (NDATA, xdata, fdata, 0);

/* Print results */

printf(" x FP(x) Interpolant Deriv Error\n");

for (i = NDATA/2; i < 3*NDATA/2; i++) {

x = (float) i /(float)(2*NDATA-2);

y = imsl_f_spline_value(x, sp, IMSL_DERIV, 1, 0);

printf(" %6.3f %10.3f %10.3f %10.4f \n", x, FP(x), y,

fabs(FP(x)-y));

}

}

Output

 

x FP(x) Interpolant Deriv Error

0.250 -12.308 -12.559 0.2510

0.300 -3.162 -3.218 0.0560

0.350 7.681 7.796 0.1151

0.400 14.403 13.919 0.4833

0.450 13.395 13.530 0.1346

0.500 5.200 5.007 0.1926

0.550 -5.786 -5.840 0.0535

0.600 -13.667 -13.201 0.4660

0.650 -14.214 -14.393 0.1798

0.700 -7.133 -6.734 0.3990

0.750 3.775 3.911 0.1359

Fatal Errors

IMSL_KNOT_MULTIPLICITY

Multiplicity of the knots cannot exceed the order of the spline.

IMSL_KNOT_NOT_INCREASING

The knots must be nondecreasing.