Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

This may not be perfect yet, but seems to work. This uses NumPy for numeric evaluation and SymPy for symbolic evaluation (e.g. of sinc(0)).

import numpy as np
import sympy

def sinc_evalf(self, x, parent=None, algorithm=None):
    if parent is None:
        parent = RR
    return parent(np.sinc(x / np.pi))

def sinc_eval(self, x):
    return sympy.functions.sinc(x._sympy_())

def sinc_deriv(self, x, diff_param=None):
    _x = SR.var("_x")
    return (sin(_x) / _x).diff(_x).subs({_x: x})

sinc = function("sinc", nargs=1, evalf_func=sinc_evalf,
                eval_func=sinc_eval, derivative_func=sinc_deriv)

# dirty workaround to make conversion from sympy to sage work
sympy.functions.sinc._sage_ = lambda self: sinc(*(arg._sage_() for arg in self.args), hold=True)

Examples:

sage: sinc(0)
1
sage: sinc(-1)
sinc(1)
sage: sinc(1).n()
0.841470984807897
sage: sinc(0.01)
0.999983333416666
sage: sinc(pi)
0
sage: sinc(x)
sinc(x)
sage: sinc(x).diff(x)
cos(x)/x - sin(x)/x^2
sage: x, y = SR.var("x,y")
sage: sinc(x).diff(y)
0
sage: sinc(x).integral(x)
sin_integral(x)
sage: bool(sinc(2*x^2).diff(x) == (sin(2*x^2) / (2*x^2)).diff(x))
True