mpmath_riccati_bessel.py 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #!/usr/bin/env python3
  2. import mpmath as mp
  3. # APPLIED OPTICS / Vol. 53, No. 31 / 1 November 2014, eq(13)
  4. def LeRu_cutoff(z):
  5. x = mp.fabs(z)
  6. return int(x + 11 * x**(1/3) + 1)
  7. # Wu, Wang, Radio Science, Volume 26, Number 6, Pages 1393-1401, November-December 1991,
  8. # after eq 13f.
  9. # Riccati-Bessel z*j_n(z)
  10. def psi(n,z):
  11. return mp.sqrt( (mp.pi * z)/2 ) * mp.autoprec(mp.besselj)(n+1/2,z)
  12. # Riccati-Bessel -z*y_n(z)
  13. def xi(n,z):
  14. return -mp.sqrt( (mp.pi * z)/2 ) * mp.autoprec(mp.bessely)(n+1/2,z)
  15. # Riccati-Bessel psi - i* xi
  16. def ksi(n,z):
  17. return psi(n,z) - 1.j * xi(n,z)
  18. def psi_div_ksi(n,z):
  19. return psi(n,z)/ksi(n,z)
  20. def psi_mul_ksi(n,z):
  21. return psi(n,z)*ksi(n,z)
  22. def psi_div_xi(n,z):
  23. return psi(n,z)/xi(n,z)
  24. # to compare r(n,z) with Wolfram Alpha
  25. # n=49, z=1.3-2.1i, SphericalBesselJ[n-1,z]/SphericalBesselJ[n,z]
  26. def r(n,z):
  27. if n > 0:
  28. return psi(n-1,z)/psi(n,z)
  29. return mp.cos(z)/mp.sin(z)
  30. def D(n, z, f):
  31. return f(n-1,z)/f(n,z) - n/z
  32. def D1(n,z):
  33. if n == 0: return mp.cos(z)/mp.sin(z)
  34. return D(n, z, psi)
  35. # Wolfram Alpha example D2(10, 10-10j): SphericalBesselY[9, 10-10i]/SphericalBesselY[10,10-10i]-10/(10-10i)
  36. def D2(n,z):
  37. if n == 0: return -mp.sin(z)/mp.cos(z)
  38. return D(n, z, xi)
  39. def D3(n,z):
  40. if n == 0: return 1j
  41. return D(n, z, ksi)