Real Interpolation using GSL
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 + sin(i)/2, i+cos(i^2)) for i in range(10)]
sage: s = spline(v)
sage: show(point(v) + plot(s,0,9, hue=.8))
We compute the area underneath the spline:
sage: s.definite_integral(0, 9)
41.196516041067...
The definite integral is additive:
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.16230085261803...
sage: s.derivative(6)
0.20997986285714...
sage: s.derivative(5, order=2)
-3.08747074561380...
sage: s.derivative(6, order=2)
2.61876848274853...
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.
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 (trac ticket #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
Value of the definite integral between \(a\) and \(b\).
INPUT:
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
Value of the first or second derivative of the spline at \(x\).
INPUT:
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
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 (trac ticket #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)]