Re: Re: How can I teach Mathematica new functions
- To: mathgroup at smc.vnet.net
- Subject: [mg21749] Re: [mg21724] Re: How can I teach Mathematica new functions
- From: hwolf at debis.com
- Date: Thu, 27 Jan 2000 22:56:31 -0500 (EST)
- Organization: debis Systemhaus
- References: <86e8lb$fbo@smc.vnet.net> <200001260845.DAA02267@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Jens-Peer Kuska schrieb: > > > you are wrong because you where too lazy. First of all you should *not* > define an explicit sbj[_,_] when you don't like to use the built-in > functions. You must define rules for > > Derivative[0,1][sbj][n_,z_]:= .. > > and rules for simplifications of spherical bessel functions, then you > have Mathematica taught a new function and Mathematica will work with it > like a built-in one. > > You have only created a short reference to the built-in function and it's no > wonder that you only get built-in functions out. > > Regards > Jens > > gargamel wrote: > > > > Hello all, > > > > This is a real example, but my qestion is general: > > > > Suppose I define a new function, namely a spherical bessel function: > > > > sbj[n_,z_]=Sqrt[Pi/(2*z)]*BesselJ[n+1/2,z] > > > > Now I can easily do all kind of manipulations on my function. > > For example, by typing: > > > > D[sbj[n,x],x] > > > > I get a fancy expression in terms of the BesselJ function (which I won't > > copy here). > > But I would want a simpler expression in terms of my function sbj > > (which would be: > > > > -sbj(n,x)/(2x)+1/2*(sbj(n+1,x)-sbj(n-1,x)) > > > > if I'm not mistaking). > > > > So basically what I want to do is to teach Mathematic the new function and > > ask it > > to use it to "simplify" results. It would also be nice if Mathematica's > > functions Simplify > > and FullSimplify would be able to incorporate new functions that I defines. > > > > I didn't find any way to do this. It seems to me that Mathematica knows only > > what > > It was taught at the "factory". Sure, you can define new function and even > > due some > > manipulations on them but they never become a real part of Mathematica's > > knowledge > > (and Mathematica will never give you your function as an answer to a > > problem). > > > > Am I wrong? Well, Jens, this of course is the right way to define a functional calculus for the spherical Bessel functions, e.g. when you want to write a Package which knows everything about them. But as you stated so well, this is some work, although Bob Hanlon has shown us a fine way how to get at all those definitions needed. However, sometimes, mostly say, I *want* to be lazy and do no more work than is neccessary. So I'd like to introduce the explicit rules, do the calculation and then of course reconvert the result. This indeed works, if you apply the definition and the reconversion in *different* contexts. See: In[1]:= j; r; This is just to define global symbols such that no local ones were created -- it's not essential, just for a more pleasing result. In[2]:= Begin["`sbj`"]; sbj[n_, z_] := Sqrt[Pi/(2*z)]*BesselJ[n + 1/2, z]; result = D[sbj[j, r], r]; End[]; Expand[PowerExpand[`sbj`result /. BesselJ[n_, z_] :> Sqrt[2*z/Pi]*sbj[n, z]]] Out[6]= 1/2*sbj[-(1/2) + j, r] - sbj[1/2 + j, r]/(2*r) - 1/2*sbj[3/2 + j, r] plain, simple, the desired result let's look, what happend: In[7]:= Information["sbj", LongForm -> False] "Global`sbj" In[8]:= Information["`sbj`sbj", LongForm -> False] "Global`sbj`sbj" Global`sbj`sbj[Global`sbj`n_, Global`sbj`z_] := Sqrt[Pi/(2*Global`sbj`z)]*BesselJ[Global`sbj`n + 1/2, Global`sbj`z] Now what to do, if you want another (different) calculation? Just copy the text above and insert the new expression you want to evaluate, e.g. In[9]:= Begin["`sbj`"]; sbj[n_, z_] := Sqrt[Pi/(2*z)]*BesselJ[n + 1/2, z]; result = Integrate[sbj[j, r], r]; End[]; Expand[PowerExpand[`sbj`result /. BesselJ[n_, z_] :> Sqrt[2*z/Pi]*sbj[n, z]]] Out[13]= 2^(-2 - j)*Sqrt[Pi]*r^(1 + j)*Gamma[1/2 + j/2]* HypergeometricPFQRegularized[{1/2 + j/2}, {1 + 1/2*(1 + 2*j), 3/2 + j/2}, -(r^2/4)] It would be great if we could hide the "copied lines" in a function and execute the expression as an argument. I tried, but didn't succeed. The reason was, the localization to the context "`sbj`" did not work when executed within a CompoundExpression, Module, Block or With construct. It even doesn't do within the following "textual macro" In[1]:= ToExpression[StringJoin["j;r; Begin[\"`sbj`\"]; sbj[n_,z_]:=Sqrt[Pi/(2*z)]*BesselJ[n+1/2,z]; result=", StringTake[ToString[Hold[D[sbj[j, r], r]]], {6, -2}], "; End[]; Expand at PowerExpand[`sbj`result/. BesselJ[n_,z_]:>Sqrt[2 z/Pi]*sbj[n,z] \ ]"]] Can someone explain me why this is so? Kind regards, Hartmut
- References:
- Re: How can I teach Mathematica new functions
- From: Jens-Peer Kuska <kuska@informatik.uni-leipzig.de>
- Re: How can I teach Mathematica new functions