Experiment with some spline approximation methods

`splinetool `

splinetool(x,y)

`splinetool `

is a graphical
user interface (GUI), whose initial menu provides you with various
choices for data including the option of importing some data from
the workspace.

`splinetool(x,y) `

brings
up the GUI with the specified data `x`

and `y`

,
which are vectors of the same length.

The purpose of this example is to explore the various end conditions available with cubic spline interpolation:

Type

`splinetool`

at the command line.Select

**Import your own data**from the initial screen, and accept the default function. You should see the following display.The default approximation shown is the cubic spline interpolant with the not-a-knot end condition.

The vector

`x`

of data sites is`linspace(0,2*pi,31)`

and the values are`cos(x)`

. This differs from simply providing the vector`y`

of values in that the cosine function is explicitly recorded as the underlying function. Therefore, the error shown in the graph is the error in the spline as an approximation to the cosine rather than as an approximation to the given values. Notice the resulting relatively large error, about`5e-5`

, near the endpoints.For comparison, follow these steps:

Click on

**New**in the**List of approximations**.In

**Approximation method**, select**complete**from the list of**End conditions**.Since the first derivative of the cosine function is sine, adjust the first-derivative values to their known values of zero at both the left end and the right end.

This procedure results in the display shown below (after the mouse is used to move the Legend further down). Note that the right end slope is zero only up to round-off.

**Bottomline**tells you that the toolbox function`csape`

was used to create the spline.Be impressed by the improvement in the error, which is only about

`5e-6`

.For further comparison, follow these steps:

Click on

**New**in the**List of approximations**.In

**Approximation method**, select**natural**from the list of**End conditions**.

Note the deterioration of the approximation near the ends, an error of about

`2e-3`

, which is much worse than with the not-a-knot end conditions.For a final comparison, follow these steps:

Click on

**New**in the**List of approximations**.Since we know that the cosine function is periodic, in

**Approximation method**, select**periodic**from the list of**End conditions**.

Note the dramatic improvement in the approximation, back to an error of about

`5e-6`

, particularly compared to the**natural**end conditions.

This example uses cubic spline interpolation and least-squares approximation to determine an estimate of the initial acceleration for a drag car:

Type

`splinetool`

at the command line or if the GUI is already running, click on**File > Restart**.Choose

**Richard Tapia's drag racing data**. These data show the distance traveled by a drag car as a function of time. The message window asks you to estimate the initial acceleration by setting the initial speed to zero. Click on**OK,**or use**Space**or**Enter,**to remove the message window.In

**Approximation method**, select**complete**from the list of**End conditions**.Adjust the initial speed by changing the first derivative at the left endpoint to zero.

Look for the value of the initial acceleration, which is given by the value of the second derivative at the left endpoint. You can toggle between the first derivative and the second derivative at this endpoint by clicking on the

**left end**button. The value of the second derivative should be around`187`

in the units chosen. Choose**View > Show****2nd Derivative**to see this graphically.For comparison, click on

**New**, then choose**Least-Squares Approximation**as the**Approximation method**. With this method, you can no longer specify end conditions. Instead, you may vary the order of the method. Verify that the initial acceleration is close to the cubic interpolation value.The results of this procedure are shown below.

This example encourages you to place five interior knots in
such a way that the least-squares approximation to these data by cubic
splines has an absolute error no bigger than `.04`

everywhere:

Type

`splinetool`

at the command line or if the GUI is already running, click on**File > Restart**.Choose

**Titanium heat data**.Select

**Least-Squares Approximation**as the**Approximation method.**Notice how poorly this approximates the data since there are no interior knots. To view the current knots and add new knots, choose

**knots**from**Data, breaks/knots, weights**. The knots are now listed in**knots**, and also displayed in the data graph as vertical lines. Notice that there are just the two end knots, each with multiplicity 4.Right-click in the data graph and choose

**Add Knot**. This brings up crosshairs for you to move with the mouse. Its precise horizontal location is shown in the edit field below the list of knots. A mouse click places a new knot at the current location of the crosshairs. One possible strategy is to place the additional knot at the place of maximum absolute error, as shown in the auxiliary graph below the data graph.If you right-click and choose

**Replicate Knot**, you will increase the multiplicity of the current knot, which is shown by its repeated occurrence in**Knots**. If you don't like a particular knot, you can delete it. To delete a specific knot, you must first select it in either the list of knots or the data graph, and then right-click in the graph and choose**Delete Knot**.You could also ask for an approximation using six polynomial pieces, which corresponds to five interior knots. To do this, enter

`6`

as**# pieces**in**Data, breaks/knots, weights**.After you have the five interior knots, try to make the error even smaller by moving the knots. To do this, select the knot you want to move by clicking on its vertical line in the graph, then use the interface control below

**Knots**in**Data, breaks/knots, weights**and observe how the error changes with the movement of the knot. You can also use the edit field to overwrite the current knot location. You could also try**adjust**, which redistributes the current knot sequence.Use

**Replicate**in**List of approximations**to save any good knot distribution for later use. Rename the replicated approximation to`lstsqr`

using**Rename**. To return to the original approximation, click on its name in**List of approximations**.

This example experiments with smoothing splines:

Type

`splinetool`

at the command line or, if the GUI is already running, click on**File > Restart**.Choose

**Titanium heat data**.In

**Approximation method**, choose**Smoothing Spline**.Vary

**Parameter**between 0 and 1, which changes the approximation from the least-squares straight-line approximation to the “natural” cubic spline interpolant.Vary

**Tolerance**between 0 and some large value, even`inf`

. The approximation changes from the best possible one, the “natural” cubic spline interpolant, to the least-squares straight-line approximation.As you increase the

**Parameter**value or decrease the**Tolerance**value, the error decreases. However, a smaller error corresponds to more roughness, as measured by the size of the second derivative. To see this, choose**View >****Show 2nd Derivative**and vary the**Parameter**and**Tolerance**values once again.This step modifies the weights in the error measure to force the approximation to pass through a particular data point.

Set

**Tolerance**to`0.2`

. Notice that the approximation does not pass through the highest data point. To see the large error at this site, choose**View >****Error**.To force the smoothing spline to go through this point, choose

**Error Weights**from**Data, breaks/knots, weights**.Click on the highest data point in the graph and notice its site, which is indicated in

**Sites and Values**.Use the edit field beneath the list of weights to change the current weight to

`1000`

. Notice how much closer the smoothing spline now comes to that highest data point, and the decrease in the error at that site. Turn on the grid, by**Tools > Grid**, to locate the error at that site more readily.

This step modifies the weights in the roughness measure to permit a more accurate but less smooth approximation in the peak area while insisting on a smoother, hence less accurate, approximation away from the peak area.

Choose

**Jumps in Roughness Weight**from**Data, breaks/knots, weights**.Choose

**View >****Show 2nd Derivative**Select any data point to the left of the peak in the data.

Set the jump at the selected site to

`-1`

by changing its value in the edit field below it. Since the roughness weight for the very first site interval is 1, you have just set the roughness weight to the right of the highlighted site to 0. Correspondingly, the second derivative has become relatively small to the left of that site.Select any data point to the right of the peak in the data.

Set the jump across the selected site to

`1`

. Since the roughness weight just to the left of the highlighted site is 0, you have just set the roughness weight to the right of the highlighted site to 1. Correspondingly, the second derivative has become relatively small to the right of that site. The total effect is a very smooth but not very accurate fit away from the peak, while in the peak area, the spline fit is much better but the second derivative is much larger, as is shown in the auxiliary graph below.At the sites where there is a jump in the roughness weight, there is a corresponding jump in the second derivative. If you increase the

**Parameter**value, the error across the peak area decreases but the second derivative remains quite large, while the opposite holds true away from the peak area.

The Spline Tool is shown in the following figure comparing cubic spline interpolation with a smoothing spline on sample data created by adding noise to the cosine function.

The approximation methods and options supported by the GUI are shown below.

Approximation Method | Option |
---|---|

Cubic Interpolating Spline | Adjust the type and values of the end conditions. |

Smoothing Spline | Choose between cubic (order 4) and quintic (order 6) splines. Adjust the value of the tolerance and/or smoothing parameter. Adjust the weights in the error and roughness measures. |

Least-Squares Approximation | Vary the order from 1 to 14. The default order is 4, which gives cubic approximating splines. Modify the number of polynomial pieces. Add and move knots to improve the fit. Adjust the weights in the error measure. |

Spline Interpolation | Vary the order from 2 to 14. The default order is 4, which gives cubic spline interpolants. If the default knots supplied are not satisfactory, you can move them around to vary the fit. |

You can generate and compare several approximations to the same data. One of the approximations is always marked as “current” using a thicker line width. The following displays are available:

Data graph. It shows:

The data

The approximations chosen for display in

**List of approximations**The current knot sequence or the current break sequence

Auxiliary graph (if viewed) for the current approximation. You can invoke this graph by selecting any one of the items in the

**View**menu. It shows one of the following:The first derivative

The second derivative

The error

By default, the error is the difference between the given data values and the value of the approximation at the data sites. In particular, the error is zero (up to round-off) when the approximation is an interpolant. However, if you provide the data values by specifying a function, then the error displayed is the difference between that function and the current approximation. This also happens if you change the y-label of the data graph to the name of a function.

You can annotate and print the graphs with the **File > Print to Figure** menu.

You can export the data and approximations to the workspace
for further use or analysis with the **File >
Export Data** and **File > Export
Spline** menus, respectively.

You can create, with the **File > Generate
Code** menu, a function file that you can use to generate,
from the original data, any or all graphs currently shown. This file
also provides you with a written record of the commands used to generate
the current graph(s).

You can save, with the **Replicate** button,
the current approximation before you experiment further. If, at a
later time, you click on the approximation so saved, `splinetool`

restores
everything to the way it was, including the data used in the construction
of the saved approximation. This is true even if, since saving this
approximation, you have edited the data while working on other approximations.

You can add, delete, or move data, knots, and breaks by right-clicking
in the graph, or selecting the appropriate item in the **Edit** menu.

You can toggle the grid or the legend in the graph(s) with the **Tools** menu.