Real Interpolation using GSL¶
-
class
sage.gsl.interpolation.Spline¶ Bases:
objectCreate a spline interpolation object.
Given a list
of pairs, s = spline(v)is an objectssuch that
is the value of the spline interpolation through the points
in
at the point
.The values in
do not have to be sorted. Moreover, one can append
values to
, delete values from
, or change values in
, 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
-th interpolation point, where
is larger than
len(S), then points
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.
-
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 (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
-
definite_integral(a, b)¶ Value of the definite integral between
and
.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
.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 (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)]
-
