By the way your nummerical approximation will finally get called when you do something like:
sage: f(4).numerical_approx() -0.287903316665065 or use it's shorter alias: sage: f(4).n() -0.287903316665065 By the way, the sinus was a bad example since that uses ginac as a backend. You should look at the cotangent (i.e. Function_cot ). Defined in devel/sage/sage/functions/trig.py that is a better example. On Jan 11, 10:19 am, Chris Swierczewski <cswie...@gmail.com> wrote: > Hello, > > This question is about good / best practices for creating a "symbolic > wrapper" for a purely numerical function. > > I have a rather nice function that I've written as a class (with __call__ > overloading, etc.) called RiemannTheta that at the moment can only handle > numerical input. In particular, an instance of this class is a function, > which I will call theta, from C^g --> C. This function can also numerically > compute directional derivatives. For example, for g=3 I can compute the > value of the first derivative in the [0,1,0] direction at the point [2,4,8] > like so: > > sage: theta = RiemannTheta( <initializing arguments that define a specific > Riemann Theta function> ) > sage: theta([2,4,8], derivs=[[0,1,0]]) > <complex number output> > > What I would like to have is the ability to "lazily" evaluate symbolic > expressions like: > > sage: f = theta([x,x^2,x^3]) > > So that > > sage: f(x=2) == theta([2,4,8]) > True > > I also want to be able to write > > sage: f010 = theta([x,x^2,x^3], derivs=[0,1,0]) > sage: f010(x=2) == theta([2,4,8], derivs=[[0,1,0]]) > True > > and I want to write a RiemannTheta.derivative(x) that will compute the > symbolic derivative via the chain rule for vector to scalar-valued > functions. Again, the key issue here is that *theta can only accept > numerical input. * > * > * > So *my main question is*: what would be a / the Pythonic or Sage-thonic > approach to appending this kind of behavior? The first step would be to > detect symbolic expression input in RiemannTheta.__call__(). (In such a way > that it's as fast as possible.) My thoughts were to create a new class, > RiemannTheta_symbolic, with a RiemannTheta object stored as an attribute. > There would be a layer of lazy symbolic expression handling to make it such > that RiemannTheta isn't called until all unknown variables are given complex > subs. I'm afraid to inherit anything in sage.symbolic (or whatever is > relevant in this case) since it seems rather complicated. (But I'm willing > to dive into it if necessary.) > > Thanks for any insight or information. > > -- > Chris Swierczewski -- To post to this group, send an email to sage-devel@googlegroups.com To unsubscribe from this group, send an email to sage-devel+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/sage-devel URL: http://www.sagemath.org