qpms/tests/bessel_precision/sagebesselgen.py

80 lines
2.3 KiB
Python
Raw Normal View History

from __future__ import print_function
def printhankelrow(lMax, x, file=sys.stdout):
print(lMax, N(x), end=' ', file=file);
for l in range(lMax+1):
print(N(spherical_hankel1(l,x)), end = ' ', file=file)
print('', file=file)
def printbesselJrow(lMax, x, file=sys.stdout):
print(lMax, N(x), end=' ', file=file);
for l in range(lMax+1):
print(N(spherical_bessel_J(l,x)), end = ' ', file=file)
print('', file=file)
def printbesselYrow(lMax, x, file=sys.stdout):
print(lMax, N(x), end=' ', file=file);
for l in range(lMax+1):
print(N(spherical_bessel_Y(l,x)), end = ' ', file=file)
print('', file=file)
#cf DLMF 10.51.2
def printbesselDJrow(lMax, x, file=sys.stdout):
print(lMax, N(x), end=' ', file=file);
for l in range(lMax+1):
print(N(-spherical_bessel_J(l+1,x)
+ l/x*spherical_bessel_J(l,x)), end = ' ', file=file)
print('', file=file)
def printbesselDYrow(lMax, x, file=sys.stdout):
print(lMax, N(x), end=' ', file=file);
for l in range(lMax+1):
print(N(-spherical_bessel_Y(l+1,x)
+ l/x*spherical_bessel_Y(l,x)), end = ' ', file=file)
print('', file=file)
def ank(n, k):
return factorial(n+k)/2**k/factorial(k)/factorial(n-k)
def genall(lMax):
f = open('besselDJcases', 'w')
for o in IntegerRange(1,100):
printbesselDJrow(lMax, o, file=f)
printbesselDJrow(lMax, 1/o, file=f)
printbesselDJrow(lMax, o/sqrt(3), file=f)
f = open('besselDYcases', 'w')
for o in IntegerRange(1,100):
printbesselDYrow(lMax, o, file=f)
printbesselDYrow(lMax, 1/o, file=f)
printbesselDYrow(lMax, o/sqrt(3), file=f)
f = open('besselJcases', 'w')
for o in IntegerRange(1,100):
printbesselJrow(lMax, o, file=f)
printbesselJrow(lMax, 1/o, file=f)
printbesselJrow(lMax, o/sqrt(3), file=f)
f = open('besselYcases', 'w')
for o in IntegerRange(1,100):
printbesselYrow(lMax, o, file=f)
printbesselYrow(lMax, 1/o, file=f)
printbesselYrow(lMax, o/sqrt(3), file=f)
import math
M_LN2 = math.log(2)
def ankf(n,k):
n = float(n)
k = float(k)
return math.exp(math.lgamma(n+k+1) - k * M_LN2 - math.lgamma(k+1) - math.lgamma(n-k+1))
def ankrelerr(n,k):
a = ank(n,k)
b = ankf(n,k)
return 2 * abs(a - b)/(abs(a)+abs(b))