Re: How can I teach Mathematica new functions

*To*: mathgroup at smc.vnet.net*Subject*: [mg21717] Re: [mg21708] How can I teach Mathematica new functions*From*: BobHanlon at aol.com*Date*: Sun, 23 Jan 2000 17:58:01 -0500 (EST)*Sender*: owner-wri-mathgroup at wolfram.com

Clear[sbj] If you provide a general definition for sbj then Mathematica will always apply that definition so that sbj could never appear in an output. On the other hand, you must provide a means to evaluate sbj for numeric inputs. Consequently, define sbj only for numeric inputs. sbj[n_?NumericQ, z_?NumericQ] := Sqrt[Pi/(2*z)]*BesselJ[n + 1/2, z] {sbj[n, z], sbj[3, z], sbj[n, 4.2], sbj[3, 4.2], sbj[2, Pi], sbj[2, Pi] // N} {sbj[n, z], sbj[3, z], sbj[n, 4.2], 0.23697022838678544, BesselJ[5/2, Pi]/Sqrt[2], 0.30396355092701327} Plot[Evaluate[Table[sbj[n, z], {n, 0, 2}]], {z, 0, 3Pi}, PlotStyle -> {RGBColor[1, 0, 0], RGBColor[0, 1, 0], RGBColor[0, 0, 1]}]; In working on other definitions related to sbj, it is useful to have the substitution rules SBJtoBJ = sbj[n_, z_] :> Sqrt[Pi/(2*z)]*BesselJ[n + 1/2, z]; BJtoSBJ = BesselJ[n_, z_] :> Sqrt[2*z/Pi]*sbj[n - 1/2, z]; For its derivative Simplify[D[sbj[n, z] /. SBJtoBJ, z] /. BJtoSBJ] (Sqrt[1/z]*(z*sbj[n - 1, z] - sbj[n, z] - z*sbj[n + 1, z]))/ (2*Sqrt[z]) Derivative[0, 1][sbj][n_, z_] := Sqrt[1/z]*(z*sbj[n - 1, z] - sbj[n, z] - z*sbj[n + 1, z])/(2 Sqrt[z]) D[sbj[n, z], z] == %% True Simplify[D[sbj[n, z], z], Element[z, Reals]] -((-z*sbj[n - 1, z] + sbj[n, z] + z*sbj[n + 1, z])/ (2*Abs[z])) Its integral Integrate[sbj[n, z] /. SBJtoBJ, z] // Simplify 2^(-n - 2)*Sqrt[Pi]*Sqrt[1/z]*z^(n + 3/2)*Gamma[(n + 1)/2]* HypergeometricPFQRegularized[{(n + 1)/2}, {n + 3/2, (n + 3)/2}, -(z^2/4)] sbj /: Integrate[sbj[n_, z_], z_] := 2^(-n - 2) * Sqrt[Pi] * Sqrt[1/z]*z^(n + 3/2) * Gamma[(n + 1)/2] * HypergeometricPFQRegularized[{(n + 1)/2}, {n + 3/2, (n + 3)/2}, -z^2/4] Integrate[sbj[n, z], z] == %% True A definite integral Integrate[sbj[n, z] /. SBJtoBJ, {z, 0, Infinity}] /. BJtoSBJ Sqrt[Pi/2]*If[Re[n] > -1, Gamma[(n + 1)/2]/ (Sqrt[2]*Gamma[n/2 + 1]), Integrate[ Sqrt[1/z]*Sqrt[(2*z)/Pi]*sbj[n + 1/2 - 1/2, z], {z, 0, Infinity}]] sbj /: Integrate[sbj[n_, z_], {z_, 0, Infinity}, opts___] := If[Simplify[Re[n] > -1, Assumptions /. Flatten[{opts}]], Sqrt[Pi] * Gamma[(n + 1)/2]/ (2*Gamma[n/2 + 1]), Integrate[sbj[n, z], {z, 0, Infinity}]] Integrate[sbj[n, z], {z, 0, Infinity}] If[Re[n] > -1, (Sqrt[Pi]*Gamma[(n + 1)/2])/ (2*Gamma[n/2 + 1]), Integrate[sbj[n, z], {z, 0, Infinity}]] Integrate[sbj[n, z], {z, 0, Infinity}, Assumptions -> n > -1] == %[[2]] True And any other definitions that you need in your application. Bob Hanlon In a message dated 1/23/2000 3:14:08 AM, gar at gone.home writes: >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? >