On 8-Dec-09, at 8:59 PM, Dan Drake wrote:
> On Tue, 08 Dec 2009 at 10:44PM -0300, Pablo De Napoli wrote:
>> I'm trying to do some computations with Bessel functions using Sage.
>> Unfortunately, they don't seem to behave like other functions. For
>> example:
>> to get the plot of the sine function over the interval (0,100)
>>
>> plot(sin(x),(x,0,100))
>>
>> works. However,
>>
>> plot(bessel_J(0,x),(x,0,100))
>>
>> does not.
>
> Part of the reason is that (I think) the Bessel functions are not
> implemented as fully symbolic functions; they are more numerical in
> nature under our current implementation.
Implementing a particular symbolic function is not outlandishly
difficult, thanks to the tireless work of Burcin Erocal and Mike
Hansen. (Apologies to any contributers I have forgotten.)
You need to subclass sage.symbolic.function.SFunction. I don't see
many examples, so here is a minimal one:
from sage.symbolic.function import SFunction
from sage.rings.all import RealField
class bessel_J_class(SFunction):
def __init__(self, *args, **kwds):
kwds['nargs'] = 2
kwds['evalf_func'] = self._evalf_func_
SFunction.__init__(self, "bessel_J", *args, **kwds)
def _evalf_func_(self, *args, **kwds):
prec = kwds['prec']
vals = [ arg.n(prec) for arg in args ]
v = bessel_J(*vals)
return RealField(prec)(v)
symbolic_bessel_J = bessel_J_class()
Then the following works for me:
sage: var('x')
sage: plot(symbolic_bessel_J(0, x), (x, 0, 100))
Nick