## table of contents

blt::spline(3tcl) | BLT Built-In Commands | blt::spline(3tcl) |

# NAME¶

spline - Fit curves with spline interpolation

# SYNOPSIS¶

**spline natural ***x y sx sy*

**spline quadratic ***x y sx sy*

# DESCRIPTION¶

The **spline** command computes a spline fitting a set of data
points (x and y vectors) and produces a vector of the interpolated images
(y-coordinates) at a given set of x-coordinates.

# INTRODUCTION¶

Curve fitting has many applications. In graphs, curve fitting can be useful for displaying curves which are aesthetically pleasing to the eye. Another advantage is that you can quickly generate arbitrary points on the curve from a small set of data points.

A spline is a device used in drafting to produce smoothed curves.
The points of the curve, known as *knots*, are fixed and the
*spline*, typically a thin strip of wood or metal, is bent around the
knots to create the smoothed curve. Spline interpolation is the mathematical
equivalent. The curves between adjacent knots are piecewise functions such
that the resulting spline runs exactly through all the knots. The order and
coefficients of the polynominal determine the "looseness" or
"tightness" of the curve fit from the line segments formed by the
knots.

The **spline** command performs spline interpolation using
cubic ("natural") or quadratic polynomial functions. It computes
the spline based upon the knots, which are given as x and y vectors. The
interpolated new points are determined by another vector which represents
the abscissas (x-coordinates) or the new points. The ordinates
(y-coordinates) are interpolated using the spline and written to another
vector.

# EXAMPLE¶

Before we can use the **spline** command, we need to create two
BLT vectors which will represent the knots (x and y coordinates) of the data
that we're going to fit. Obviously, both vectors must be the same
length.

# Create sample data of ten points. vector x(10) y(10) for {set i 10} {$i > 0} {incr i -1} {

set x($i-1) [expr $i*$i]

set y($i-1) [expr sin($i*$i*$i)] }

We now have two vectors **x** and **y** representing the ten
data points we're trying to fit. The order of the values of **x** must be
monotonically increasing. We can use the vector's **sort** operation to
sort the vectors.

x sort y

The components of **x** are sorted in increasing order. The
components of **y** are rearranged so that the original x,y coordinate
pairings are retained.

A third vector is needed to indicate the abscissas (x-coordinates) of the new points to be interpolated by the spline. Like the x vector, the vector of abscissas must be monotonically increasing. All the abscissas must lie between the first and last knots (x vector) forming the spline.

How the abscissas are picked is arbitrary. But if we are going to
plot the spline, we will want to include the knots too. Since both the
quadratic and natural splines preserve the knots (an abscissa from the x
vector will always produce the corresponding ordinate from the y vector), we
can simply make the new vector a superset of **x**. It will contain the
same coordinates as **x**, but also the abscissas of the new points we
want interpolated. A simple way is to use the vector's **populate**
operation.

x populate sx 10

This creates a new vector **sx**. It contains the abscissas of
**x**, but in addition **sx** will have ten evenly distributed values
between each abscissa. You can interpolate any points you wish, simply by
setting the vector values.

Finally, we generate the ordinates (the images of the spline)
using the **spline** command. The ordinates are stored in a fourth
vector.

spline natural x y sx sy

This creates a new vector **sy**. It will have the same length
as **sx**. The vectors **sx** and **sy** represent the smoothed
curve which we can now plot.

graph .graph .graph element create original -x x -y x -color blue .graph element create spline -x sx -y sy -color red table . .graph

The **natural** operation employs a cubic interpolant when
forming the spline. In terms of the draftmen's spline, a *natural
spline* requires the least amount of energy to bend the spline (strip of
wood), while still passing through each knot. In mathematical terms, the
second derivatives of the first and last points are zero.

Alternatively, you can generate a spline using the
**quadratic** operation. Quadratic interpolation produces a spline which
follows the line segments of the data points much more closely.

spline quadratic x y sx sy

# OPERATIONS¶

**spline natural***x y sx sy*- Computes a cubic spline from the data points represented by the vectors
*x*and*y*and interpolates new points using vector*sx*as the x-coordinates. The resulting y-coordinates are written to a new vector*sy*. The vectors*x*and*y*must be the same length and contain at least three components. The order of the components of*x*must be monotonically increasing.*Sx*is the vector containing the x-coordinates of the points to be interpolated. No component of*sx*can be less than first component of*x*or greater than the last component. The order of the components of*sx*must be monotonically increasing.*Sy*is the name of the vector where the calculated y-coordinates will be stored. If*sy*does not already exist, a new vector will be created. **spline quadratic***x y sx sy*- Computes a quadratic spline from the data points represented by the
vectors
*x*and*y*and interpolates new points using vector*sx*as the x-coordinates. The resulting y-coordinates are written to a new vector*sy*. The vectors*x*and*y*must be the same length and contain at least three components. The order of the components of*x*must be monotonically increasing.*Sx*is the vector containing the x-coordinates of the points to be interpolated. No component of*sx*can be less than first component of*x*or greater than the last component. The order of the components of*sx*must be monotonically increasing.*Sy*is the name of the vector where the calculated y-coordinates are stored. If*sy*does not already exist, a new vector will be created.

# REFERENCES¶

Numerical Analysis by R. Burden, J. Faires and A. Reynolds. Prindle, Weber & Schmidt, 1981, pp. 112 Shape Preserving Quadratic Splines by D.F.Mcallister & J.A.Roulier Coded by S.L.Dodd & M.Roulier N.C.State University.

The original code for the quadratric spline can be found in TOMS #574.

# KEYWORDS¶

spline, vector, graph

2.5 | BLT |