home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 9 / 09.iso / e / e032 / 3.ddi / FILES / PROGRAMM.PAK / STRUVE.M < prev    next >
Encoding:
Text File  |  1992-07-29  |  1.5 KB  |  62 lines

  1.  
  2. (*********************************************************************
  3.  
  4.         Adapted from
  5.         Roman E. Maeder: Programming in Mathematica,
  6.         Second Edition, Addison-Wesley, 1991.
  7.  
  8.  *********************************************************************)
  9.  
  10.  
  11. BeginPackage["MathFunctions`Struve`"]
  12.  
  13. StruveH::usage "StruveH[nu, z] gives the Struve function."
  14.  
  15. Begin["`Private`"]
  16.  
  17. Attributes[StruveH] = {Listable}
  18.  
  19. (* special values *)
  20.  
  21. StruveH[r_Rational?Positive, z_] :=
  22.     BesselY[r, z] +
  23.     Sum[Gamma[m + 1/2] (z/2)^(-2m + r - 1)/Gamma[r + 1/2 - m], {m, 0, r-1/2}]/Pi /;
  24.         Denominator[r] == 2
  25.  
  26. StruveH[r_Rational?Negative, z_] :=
  27.     (-1)^(-r-1/2) BesselJ[-r, z] /; Denominator[r] == 2
  28.  
  29. (* Series expansion *)
  30.  
  31. StruveH/: Series[StruveH[nu_?NumberQ, z_], {z_, 0, ord_Integer}] :=
  32.     (z/2)^(nu + 1) Sum[ (-1)^m (z/2)^(2m)/Gamma[m + 3/2]/Gamma[m + nu + 3/2],
  33.                        {m, 0, (ord-nu-1)/2} ] + O[z]^(ord+1)
  34.  
  35. (* numerical evaluation *)
  36.  
  37. StruveH[_, 0] := 0
  38.  
  39. StruveH[nu_?NumberQ, z_?NumberQ] :=
  40.     Module[{s=0, so=-1, prec = Precision[z], 
  41.             z2 = -(z/2)^2,k1 = 3/2, k2 = nu + 3/2, g1, g2, zf},
  42.         zf = (z/2)^(nu+1); g1 = Gamma[k1]; g2 = Gamma[k2];
  43.         While[so != s,
  44.             so = s; s += N[zf/g1/g2, prec];
  45.             g1 *= k1; g2 *= k2; zf *= z2;
  46.             k1++; k2++
  47.         ];
  48.         s
  49.     ] /; Precision[z] < Infinity
  50.  
  51. (* derivatives *)
  52.  
  53. Derivative[0, n_Integer?Positive][StruveH][nu_, z_] :=
  54.     D[ (StruveH[nu-1, z] - StruveH[nu+1, z] + (z/2)^nu/Sqrt[Pi]/Gamma[nu + 3/2])/2,
  55.        {z, n-1} ]
  56.  
  57. End[]
  58.  
  59. Protect[StruveH]
  60.  
  61. EndPackage[]
  62.