# Real Interpolation using GSL#

class sage.calculus.interpolation.Spline#

Bases: object

Create a spline interpolation object.

Given a list $$v$$ of pairs, s = spline(v) is an object s such that $$s(x)$$ is the value of the spline interpolation through the points in $$v$$ at the point $$x$$.

The values in $$v$$ do not have to be sorted. Moreover, one can append values to $$v$$, delete values from $$v$$, or change values in $$v$$, and the spline is recomputed.

EXAMPLES:

sage: S = spline([(0, 1), (1, 2), (4, 5), (5, 3)]); S
[(0, 1), (1, 2), (4, 5), (5, 3)]
sage: S(1.5)
2.76136363636...


Changing the points of the spline causes the spline to be recomputed:

sage: S[0] = (0, 2); S
[(0, 2), (1, 2), (4, 5), (5, 3)]
sage: S(1.5)
2.507575757575...


We may delete interpolation points of the spline:

sage: del S[2]; S
[(0, 2), (1, 2), (5, 3)]
sage: S(1.5)
2.04296875


We may append to the list of interpolation points:

sage: S.append((4, 5)); S
[(0, 2), (1, 2), (5, 3), (4, 5)]
sage: S(1.5)
2.507575757575...


If we set the $$n$$-th interpolation point, where $$n$$ is larger than len(S), then points $$(0, 0)$$ will be inserted between the interpolation points and the point to be added:

sage: S[6] = (6, 3); S
[(0, 2), (1, 2), (5, 3), (4, 5), (0, 0), (0, 0), (6, 3)]


This example is in the GSL documentation:

sage: v = [(i + RDF(i).sin()/2, i + RDF(i^2).cos()) for i in range(10)]
sage: s = spline(v)
sage: show(point(v) + plot(s,0,9, hue=.8))                                      # needs sage.plot


We compute the area underneath the spline:

sage: s.definite_integral(0, 9)
41.196516041067...


sage: s.definite_integral(0, 4) + s.definite_integral(4, 9)
41.196516041067...


Switching the order of the bounds changes the sign of the integral:

sage: s.definite_integral(9, 0)
-41.196516041067...


We compute the first and second-order derivatives at a few points:

sage: s.derivative(5)
-0.1623008526180...
sage: s.derivative(6)
0.2099798628571...
sage: s.derivative(5, order=2)
-3.0874707456138...
sage: s.derivative(6, order=2)
2.6187684827485...


Only the first two derivatives are supported:

sage: s.derivative(4, order=3)
Traceback (most recent call last):
...
ValueError: Order of derivative must be 1 or 2.

append(xy)#

EXAMPLES:

sage: S = spline([(1,1), (2,3), (4,5)]); S.append((5,7)); S
[(1, 1), (2, 3), (4, 5), (5, 7)]


The spline is recomputed when points are appended (github issue #13519):

sage: S = spline([(1,1), (2,3), (4,5)]); S
[(1, 1), (2, 3), (4, 5)]
sage: S(3)
4.25
sage: S.append((5, 5)); S
[(1, 1), (2, 3), (4, 5), (5, 5)]
sage: S(3)
4.375

definite_integral(a, b)#

Value of the definite integral between $$a$$ and $$b$$.

INPUT:

• a – Lower bound for the integral.

• b – Upper bound for the integral.

EXAMPLES:

We draw a cubic spline through three points and compute the area underneath the curve:

sage: s = spline([(0, 0), (1, 3), (2, 0)])
sage: s.definite_integral(0, 2)
3.75
sage: s.definite_integral(0, 1)
1.875
sage: s.definite_integral(0, 1) + s.definite_integral(1, 2)
3.75
sage: s.definite_integral(2, 0)
-3.75

derivative(x, order=1)#

Value of the first or second derivative of the spline at $$x$$.

INPUT:

• x – value at which to evaluate the derivative.

• order (default: 1) – order of the derivative. Must be 1 or 2.

EXAMPLES:

We draw a cubic spline through three points and compute the derivatives:

sage: s = spline([(0, 0), (2, 3), (4, 0)])
sage: s.derivative(0)
2.25
sage: s.derivative(2)
0.0
sage: s.derivative(4)
-2.25
sage: s.derivative(1, order=2)
-1.125
sage: s.derivative(3, order=2)
-1.125

list()#

Underlying list of points that this spline goes through.

EXAMPLES:

sage: S = spline([(1,1), (2,3), (4,5)]); S.list()
[(1, 1), (2, 3), (4, 5)]


This is a copy of the list, not a reference (github issue #13530):

sage: S = spline([(1,1), (2,3), (4,5)])
sage: L = S.list(); L
[(1, 1), (2, 3), (4, 5)]
sage: L[2] = (3, 2)
sage: L
[(1, 1), (2, 3), (3, 2)]
sage: S.list()
[(1, 1), (2, 3), (4, 5)]

sage.calculus.interpolation.spline#

alias of Spline