Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
""" Complex Interpolation
AUTHORS:
- Ethan Van Andel (2009): initial version
Development supported by NSF award No. 0702939. """
#***************************************************************************** # Copyright (C) 2009 Ethan Van Andel <evlutte@gmail.com>, # # Distributed under the terms of the GNU General Public License (GPL) # # This code is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # The full text of the GPL is available at: # # http://www.gnu.org/licenses/ #***************************************************************************** from __future__ import absolute_import
cimport numpy as np
""" Creates 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`` -- A 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))) 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())
Polygon approximation of an circle::
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) """
cdef class PSpline: """ 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) """ cdef int N cdef np.ndarray pts
def __init__(self, pts): """ TESTS::
sage: pts = [(-1, -1), (1, -1), (1, 1), (-1, 1)] sage: ps = polygon_spline(pts) """ else:
def value(self, double t): """ Returns 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*pi) 0j sage: ps.value(10) (0.26760455264...+1j) """
def derivative(self, double t): """ Returns 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: ps.derivative(0) - ps.derivative(2*pi) 0j sage: ps.derivative(10) (-1.27323954473...+0j) """
""" Creates 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`` A 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: show(parametric_plot((fx, fy), (0, 2*pi))) 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())
Polygon approximation of a circle::
sage: pts = [e^(I*t / 25) for t in range(25)] sage: cs = complex_cubic_spline(pts) sage: cs.derivative(2) (-0.0497765406583...+0.151095006434...j) """
cdef class CCSpline: """ 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) """ cdef int N cdef np.ndarray avec,bvec,cvec,dvec
#standard cubic interpolation method def __init__(self, pts): """ TESTS::
sage: pts = [(-1, -1), (1, -1), (1, 1), (-1, 1)] sage: cs = complex_cubic_spline(pts) """ cdef int N, i, k
def value(self, double t): """ Returns 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: cs.value(0) - cs.value(2*pi) 0j sage: cs.value(-2.73452) (0.934561222231...+0.881366116402...j) """
def derivative(self, double t): """ Returns 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: cs.derivative(0) - cs.derivative(2 * pi) 0j sage: cs.derivative(-6) (2.52047692949...-1.89392588310...j) """ |