Complex Interpolation¶
AUTHORS:
Ethan Van Andel (2009): initial version
Development supported by NSF award No. 0702939.
- class sage.calculus.interpolators.CCSpline[source]¶
Bases:
object
A
CCSpline
object contains a cubic interpolation of a figure in the complex plane.EXAMPLES:
A simple
square
:sage: pts = [(-1, -1), (1, -1), (1, 1), (-1, 1)] sage: cs = complex_cubic_spline(pts) sage: cs.value(0) (-1-1j) sage: cs.derivative(0) (0.9549296...-0.9549296...j)
>>> from sage.all import * >>> pts = [(-Integer(1), -Integer(1)), (Integer(1), -Integer(1)), (Integer(1), Integer(1)), (-Integer(1), Integer(1))] >>> cs = complex_cubic_spline(pts) >>> cs.value(Integer(0)) (-1-1j) >>> cs.derivative(Integer(0)) (0.9549296...-0.9549296...j)
- derivative(t)[source]¶
Return the derivative (speed and direction of the curve) of a given point from the parameter
t
.INPUT:
t
– double; the parameter value for the parameterized curve, between 0 and 2*pi
OUTPUT:
A complex number representing the derivative at the point on the figure corresponding to the input
t
.EXAMPLES:
sage: pts = [(-1, -1), (1, -1), (1, 1), (-1, 1)] sage: cs = complex_cubic_spline(pts) sage: cs.derivative(3 / 5) (1.40578892327...-0.225417136326...j) sage: from math import pi sage: cs.derivative(0) - cs.derivative(2 * pi) 0j sage: cs.derivative(-6) (2.52047692949...-1.89392588310...j)
>>> from sage.all import * >>> pts = [(-Integer(1), -Integer(1)), (Integer(1), -Integer(1)), (Integer(1), Integer(1)), (-Integer(1), Integer(1))] >>> cs = complex_cubic_spline(pts) >>> cs.derivative(Integer(3) / Integer(5)) (1.40578892327...-0.225417136326...j) >>> from math import pi >>> cs.derivative(Integer(0)) - cs.derivative(Integer(2) * pi) 0j >>> cs.derivative(-Integer(6)) (2.52047692949...-1.89392588310...j)
- value(t)[source]¶
Return the location of a given point from the parameter
t
.INPUT:
t
– double; the parameter value for the parameterized curve, between 0 and 2*pi
OUTPUT:
A complex number representing the point on the figure corresponding to the input
t
.EXAMPLES:
sage: pts = [(-1, -1), (1, -1), (1, 1), (-1, 1)] sage: cs = complex_cubic_spline(pts) sage: cs.value(4 / 7) (-0.303961332787...-1.34716728183...j) sage: from math import pi sage: cs.value(0) - cs.value(2*pi) 0j sage: cs.value(-2.73452) (0.934561222231...+0.881366116402...j)
>>> from sage.all import * >>> pts = [(-Integer(1), -Integer(1)), (Integer(1), -Integer(1)), (Integer(1), Integer(1)), (-Integer(1), Integer(1))] >>> cs = complex_cubic_spline(pts) >>> cs.value(Integer(4) / Integer(7)) (-0.303961332787...-1.34716728183...j) >>> from math import pi >>> cs.value(Integer(0)) - cs.value(Integer(2)*pi) 0j >>> cs.value(-RealNumber('2.73452')) (0.934561222231...+0.881366116402...j)
- class sage.calculus.interpolators.PSpline[source]¶
Bases:
object
A
CCSpline
object contains a polygon interpolation of a figure in the complex plane.EXAMPLES:
A simple
square
:sage: pts = [(-1, -1), (1, -1), (1, 1), (-1, 1)] sage: ps = polygon_spline(pts) sage: ps.value(0) (-1-1j) sage: ps.derivative(0) (1.27323954...+0j)
>>> from sage.all import * >>> pts = [(-Integer(1), -Integer(1)), (Integer(1), -Integer(1)), (Integer(1), Integer(1)), (-Integer(1), Integer(1))] >>> ps = polygon_spline(pts) >>> ps.value(Integer(0)) (-1-1j) >>> ps.derivative(Integer(0)) (1.27323954...+0j)
- derivative(t)[source]¶
Return the derivative (speed and direction of the curve) of a given point from the parameter
t
.INPUT:
t
– double; the parameter value for the parameterized curve, between 0 and 2*pi
OUTPUT:
A complex number representing the derivative at the point on the polygon corresponding to the input
t
.EXAMPLES:
sage: pts = [(-1, -1), (1, -1), (1, 1), (-1, 1)] sage: ps = polygon_spline(pts) sage: ps.derivative(1 / 3) (1.27323954473...+0j) sage: from math import pi sage: ps.derivative(0) - ps.derivative(2*pi) 0j sage: ps.derivative(10) (-1.27323954473...+0j)
>>> from sage.all import * >>> pts = [(-Integer(1), -Integer(1)), (Integer(1), -Integer(1)), (Integer(1), Integer(1)), (-Integer(1), Integer(1))] >>> ps = polygon_spline(pts) >>> ps.derivative(Integer(1) / Integer(3)) (1.27323954473...+0j) >>> from math import pi >>> ps.derivative(Integer(0)) - ps.derivative(Integer(2)*pi) 0j >>> ps.derivative(Integer(10)) (-1.27323954473...+0j)
- value(t)[source]¶
Return the derivative (speed and direction of the curve) of a given point from the parameter
t
.INPUT:
t
– double; the parameter value for the parameterized curve, between 0 and 2*pi
OUTPUT:
A complex number representing the point on the polygon corresponding to the input
t
.EXAMPLES:
sage: pts = [(-1, -1), (1, -1), (1, 1), (-1, 1)] sage: ps = polygon_spline(pts) sage: ps.value(.5) (-0.363380227632...-1j) sage: ps.value(0) - ps.value(2*RDF.pi()) 0j sage: ps.value(10) (0.26760455264...+1j)
>>> from sage.all import * >>> pts = [(-Integer(1), -Integer(1)), (Integer(1), -Integer(1)), (Integer(1), Integer(1)), (-Integer(1), Integer(1))] >>> ps = polygon_spline(pts) >>> ps.value(RealNumber('.5')) (-0.363380227632...-1j) >>> ps.value(Integer(0)) - ps.value(Integer(2)*RDF.pi()) 0j >>> ps.value(Integer(10)) (0.26760455264...+1j)
- sage.calculus.interpolators.complex_cubic_spline(pts)[source]¶
Create a cubic spline interpolated figure from a set of complex or \((x,y)\) points. The figure will be a parametric curve from 0 to 2*pi. The returned values will be complex, not \((x,y)\).
INPUT:
pts
– list or array of complex numbers, or tuples of the form \((x,y)\)
EXAMPLES:
A simple
square
:sage: pts = [(-1, -1), (1, -1), (1, 1), (-1, 1)] sage: cs = complex_cubic_spline(pts) sage: fx = lambda x: cs.value(x).real sage: fy = lambda x: cs.value(x).imag sage: from math import pi sage: show(parametric_plot((fx, fy), (0, 2*pi))) # needs sage.plot sage: m = Riemann_Map([lambda x: cs.value(real(x))], ....: [lambda x: cs.derivative(real(x))], 0) sage: show(m.plot_colored() + m.plot_spiderweb()) # needs sage.plot
>>> from sage.all import * >>> pts = [(-Integer(1), -Integer(1)), (Integer(1), -Integer(1)), (Integer(1), Integer(1)), (-Integer(1), Integer(1))] >>> cs = complex_cubic_spline(pts) >>> fx = lambda x: cs.value(x).real >>> fy = lambda x: cs.value(x).imag >>> from math import pi >>> show(parametric_plot((fx, fy), (Integer(0), Integer(2)*pi))) # needs sage.plot >>> m = Riemann_Map([lambda x: cs.value(real(x))], ... [lambda x: cs.derivative(real(x))], Integer(0)) >>> show(m.plot_colored() + m.plot_spiderweb()) # needs sage.plot
Polygon approximation of a circle:
sage: from cmath import exp sage: pts = [exp(1j * t / 25) for t in range(25)] sage: cs = complex_cubic_spline(pts) sage: cs.derivative(2) (-0.0497765406583...+0.151095006434...j)
>>> from sage.all import * >>> from cmath import exp >>> pts = [exp(ComplexNumber(0, '1') * t / Integer(25)) for t in range(Integer(25))] >>> cs = complex_cubic_spline(pts) >>> cs.derivative(Integer(2)) (-0.0497765406583...+0.151095006434...j)
- sage.calculus.interpolators.polygon_spline(pts)[source]¶
Create a polygon from a set of complex or \((x,y)\) points. The polygon will be a parametric curve from 0 to 2*pi. The returned values will be complex, not \((x,y)\).
INPUT:
pts
– list or array of complex numbers of tuples of the form \((x,y)\)
EXAMPLES:
A simple square:
sage: pts = [(-1, -1), (1, -1), (1, 1), (-1, 1)] sage: ps = polygon_spline(pts) sage: fx = lambda x: ps.value(x).real sage: fy = lambda x: ps.value(x).imag sage: show(parametric_plot((fx, fy), (0, 2*pi))) # needs sage.plot sage.symbolic sage: m = Riemann_Map([lambda x: ps.value(real(x))], ....: [lambda x: ps.derivative(real(x))], 0) sage: show(m.plot_colored() + m.plot_spiderweb()) # needs sage.plot
>>> from sage.all import * >>> pts = [(-Integer(1), -Integer(1)), (Integer(1), -Integer(1)), (Integer(1), Integer(1)), (-Integer(1), Integer(1))] >>> ps = polygon_spline(pts) >>> fx = lambda x: ps.value(x).real >>> fy = lambda x: ps.value(x).imag >>> show(parametric_plot((fx, fy), (Integer(0), Integer(2)*pi))) # needs sage.plot sage.symbolic >>> m = Riemann_Map([lambda x: ps.value(real(x))], ... [lambda x: ps.derivative(real(x))], Integer(0)) >>> show(m.plot_colored() + m.plot_spiderweb()) # needs sage.plot
Polygon approximation of a circle:
sage: # needs sage.symbolic sage: pts = [e^(I*t / 25) for t in range(25)] sage: ps = polygon_spline(pts) sage: ps.derivative(2) (-0.0470303661...+0.1520363883...j)
>>> from sage.all import * >>> # needs sage.symbolic >>> pts = [e**(I*t / Integer(25)) for t in range(Integer(25))] >>> ps = polygon_spline(pts) >>> ps.derivative(Integer(2)) (-0.0470303661...+0.1520363883...j)