|
@@ -11,51 +11,88 @@ def LeRu_cutoff(z):
|
|
# Wu, Wang, Radio Science, Volume 26, Number 6, Pages 1393-1401, November-December 1991,
|
|
# Wu, Wang, Radio Science, Volume 26, Number 6, Pages 1393-1401, November-December 1991,
|
|
# after eq 13f.
|
|
# after eq 13f.
|
|
# Riccati-Bessel z*j_n(z)
|
|
# Riccati-Bessel z*j_n(z)
|
|
-def psi(n,z):
|
|
|
|
- return mp.sqrt( (mp.pi * z)/2 ) * mp.autoprec(mp.besselj)(n+1/2,z)
|
|
|
|
|
|
+def psi(n, z):
|
|
|
|
+ return mp.sqrt((mp.pi * z)/2) * mp.autoprec(mp.besselj)(n+1/2, z)
|
|
# Riccati-Bessel -z*y_n(z)
|
|
# Riccati-Bessel -z*y_n(z)
|
|
-def xi(n,z):
|
|
|
|
- return -mp.sqrt( (mp.pi * z)/2 ) * mp.autoprec(mp.bessely)(n+1/2,z)
|
|
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+def xi(n, z):
|
|
|
|
+ return -mp.sqrt((mp.pi * z)/2) * mp.autoprec(mp.bessely)(n+1/2, z)
|
|
# Riccati-Bessel psi - i* xi
|
|
# Riccati-Bessel psi - i* xi
|
|
-def ksi(n,z):
|
|
|
|
- return psi(n,z) - 1.j * xi(n,z)
|
|
|
|
|
|
|
|
-def psi_div_ksi(n,z):
|
|
|
|
- return psi(n,z)/ksi(n,z)
|
|
|
|
|
|
|
|
-def psi_mul_ksi(n,z):
|
|
|
|
- return psi(n,z)*ksi(n,z)
|
|
|
|
|
|
+def ksi(n, z):
|
|
|
|
+ return psi(n, z) - 1.j * xi(n, z)
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+def psi_div_ksi(n, z):
|
|
|
|
+ return psi(n, z)/ksi(n, z)
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+def psi_mul_ksi(n, z):
|
|
|
|
+ return psi(n, z)*ksi(n, z)
|
|
|
|
+
|
|
|
|
|
|
-def psi_div_xi(n,z):
|
|
|
|
- return psi(n,z)/xi(n,z)
|
|
|
|
|
|
+def psi_div_xi(n, z):
|
|
|
|
+ return psi(n, z)/xi(n, z)
|
|
|
|
|
|
# to compare r(n,z) with Wolfram Alpha
|
|
# to compare r(n,z) with Wolfram Alpha
|
|
# n=49, z=1.3-2.1i, SphericalBesselJ[n-1,z]/SphericalBesselJ[n,z]
|
|
# n=49, z=1.3-2.1i, SphericalBesselJ[n-1,z]/SphericalBesselJ[n,z]
|
|
-def r(n,z):
|
|
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+def r(n, z):
|
|
if n > 0:
|
|
if n > 0:
|
|
- return psi(n-1,z)/psi(n,z)
|
|
|
|
|
|
+ return psi(n-1, z)/psi(n, z)
|
|
return mp.cos(z)/mp.sin(z)
|
|
return mp.cos(z)/mp.sin(z)
|
|
|
|
|
|
|
|
|
|
def D(n, z, f):
|
|
def D(n, z, f):
|
|
- return f(n-1,z)/f(n,z) - n/z
|
|
|
|
|
|
+ return f(n-1, z)/f(n, z) - n/z
|
|
|
|
|
|
-def D1(n,z):
|
|
|
|
- if n == 0: return mp.cos(z)/mp.sin(z)
|
|
|
|
|
|
+
|
|
|
|
+def D1(n, z):
|
|
|
|
+ if n == 0:
|
|
|
|
+ return mp.cos(z)/mp.sin(z)
|
|
return D(n, z, psi)
|
|
return D(n, z, psi)
|
|
|
|
|
|
# Wolfram Alpha example D2(10, 10-10j): SphericalBesselY[9, 10-10i]/SphericalBesselY[10,10-10i]-10/(10-10i)
|
|
# Wolfram Alpha example D2(10, 10-10j): SphericalBesselY[9, 10-10i]/SphericalBesselY[10,10-10i]-10/(10-10i)
|
|
-def D2(n,z):
|
|
|
|
- if n == 0: return -mp.sin(z)/mp.cos(z)
|
|
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+def D2(n, z):
|
|
|
|
+ if n == 0:
|
|
|
|
+ return -mp.sin(z)/mp.cos(z)
|
|
return D(n, z, xi)
|
|
return D(n, z, xi)
|
|
|
|
|
|
-def D3(n,z):
|
|
|
|
- if n == 0: return 1j
|
|
|
|
|
|
+
|
|
|
|
+def D3(n, z):
|
|
|
|
+ if n == 0:
|
|
|
|
+ return 1j
|
|
return D(n, z, ksi)
|
|
return D(n, z, ksi)
|
|
|
|
|
|
|
|
|
|
# bulk sphere
|
|
# bulk sphere
|
|
|
|
+
|
|
|
|
+# Le Ru
|
|
|
|
+def an_lr(n, x, m):
|
|
|
|
+ print(f'D1(x) = {D1(n, x)}\n\
|
|
|
|
+ D1(mx) = {D1(n, m*x)}\n\
|
|
|
|
+ D3(x) = {D3(n, x)}\n\
|
|
|
|
+ psi_n = {psi(n,x)}\n\
|
|
|
|
+ ksi_n = {ksi(n,x)}\n\
|
|
|
|
+ ')
|
|
|
|
+
|
|
|
|
+ return (
|
|
|
|
+ (
|
|
|
|
+ psi(n, x)*(m*D1(n, x)-D1(n, m*x))
|
|
|
|
+ ) /
|
|
|
|
+ (
|
|
|
|
+ ksi(n, x)*(m * D3(n, x)-D1(n, m*x))
|
|
|
|
+ )
|
|
|
|
+ )
|
|
|
|
+
|
|
# Ovidio
|
|
# Ovidio
|
|
|
|
+
|
|
|
|
+
|
|
def an(n, x, m):
|
|
def an(n, x, m):
|
|
# print(f'D1 = {D1(n, m*x)}\n\
|
|
# print(f'D1 = {D1(n, m*x)}\n\
|
|
# psi_n = {psi(n,x)}\n\
|
|
# psi_n = {psi(n,x)}\n\
|
|
@@ -64,9 +101,11 @@ def an(n, x, m):
|
|
# ksi_nm1 = {ksi(n-1,x)}\n\
|
|
# ksi_nm1 = {ksi(n-1,x)}\n\
|
|
# ')
|
|
# ')
|
|
return (
|
|
return (
|
|
- ( ( D1(n, m*x)/m + n/x )*psi(n,x) - psi(n-1,x) ) /
|
|
|
|
- ( ( D1(n, m*x)/m + n/x )*ksi(n,x) - ksi(n-1,x) )
|
|
|
|
|
|
+ ((D1(n, m*x)/m + n/x)*psi(n, x) - psi(n-1, x)) /
|
|
|
|
+ ((D1(n, m*x)/m + n/x)*ksi(n, x) - ksi(n-1, x))
|
|
)
|
|
)
|
|
|
|
+
|
|
|
|
+
|
|
def bn(n, x, m):
|
|
def bn(n, x, m):
|
|
# print(f'D1 = {D1(n, m*x)}\n\
|
|
# print(f'D1 = {D1(n, m*x)}\n\
|
|
# psi_n = {psi(n,x)}\n\
|
|
# psi_n = {psi(n,x)}\n\
|
|
@@ -75,8 +114,8 @@ def bn(n, x, m):
|
|
# ksi_nm1 = {ksi(n-1,x)}\n\
|
|
# ksi_nm1 = {ksi(n-1,x)}\n\
|
|
# ')
|
|
# ')
|
|
return (
|
|
return (
|
|
- ( ( D1(n, m*x)*m + n/x ) * psi(n,x) - psi(n-1,x) ) /
|
|
|
|
- ( ( D1(n, m*x)*m + n/x ) * ksi(n,x) - ksi(n-1,x) )
|
|
|
|
|
|
+ ((D1(n, m*x)*m + n/x) * psi(n, x) - psi(n-1, x)) /
|
|
|
|
+ ((D1(n, m*x)*m + n/x) * ksi(n, x) - ksi(n-1, x))
|
|
)
|
|
)
|
|
|
|
|
|
# # Du
|
|
# # Du
|
|
@@ -93,34 +132,41 @@ def bn(n, x, m):
|
|
# (r(n,mx)*m*ksi(n,x)-ksi(n-1,x))
|
|
# (r(n,mx)*m*ksi(n,x)-ksi(n-1,x))
|
|
# )
|
|
# )
|
|
|
|
|
|
-def Qext_diff(n,x,m):
|
|
|
|
- return ((2*n +1)*2/x**2) * (an(n,x,m) + bn(n,x,m)).real
|
|
|
|
|
|
|
|
-def Qsca_diff(n,x,m):
|
|
|
|
- return ((2*n +1)*2/x**2) * (abs(an(n,x,m))**2 + abs(bn(n,x,m))**2)
|
|
|
|
|
|
+def Qext_diff(n, x, m):
|
|
|
|
+ return ((2*n + 1)*2/x**2) * (an(n, x, m) + bn(n, x, m)).real
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+def Qsca_diff(n, x, m):
|
|
|
|
+ return ((2*n + 1)*2/x**2) * (abs(an(n, x, m))**2 + abs(bn(n, x, m))**2)
|
|
|
|
+
|
|
|
|
|
|
def Qany(x, m, nmax, output_dps, Qdiff):
|
|
def Qany(x, m, nmax, output_dps, Qdiff):
|
|
Qany = 0
|
|
Qany = 0
|
|
Qlist = []
|
|
Qlist = []
|
|
- Qprev=""
|
|
|
|
|
|
+ Qprev = ""
|
|
convergence_max_length = 35
|
|
convergence_max_length = 35
|
|
i = 0
|
|
i = 0
|
|
for n in range(1, nmax+1):
|
|
for n in range(1, nmax+1):
|
|
- diff = Qdiff(n,x,m)
|
|
|
|
|
|
+ diff = Qdiff(n, x, m)
|
|
Qany += diff
|
|
Qany += diff
|
|
Qnext = mp.nstr(Qany, output_dps)
|
|
Qnext = mp.nstr(Qany, output_dps)
|
|
Qlist.append(Qany)
|
|
Qlist.append(Qany)
|
|
i += 1
|
|
i += 1
|
|
- if Qprev !=Qnext: i = 0
|
|
|
|
|
|
+ if Qprev != Qnext:
|
|
|
|
+ i = 0
|
|
Qprev = Qnext
|
|
Qprev = Qnext
|
|
print(n, ' ', end='', flush=True)
|
|
print(n, ' ', end='', flush=True)
|
|
- if i >= convergence_max_length: break
|
|
|
|
|
|
+ if i >= convergence_max_length:
|
|
|
|
+ break
|
|
print('')
|
|
print('')
|
|
Qlist.append(Qany)
|
|
Qlist.append(Qany)
|
|
return Qlist
|
|
return Qlist
|
|
|
|
|
|
|
|
+
|
|
def Qsca(x, m, nmax, output_dps):
|
|
def Qsca(x, m, nmax, output_dps):
|
|
return Qany(x, m, nmax, output_dps, Qsca_diff)
|
|
return Qany(x, m, nmax, output_dps, Qsca_diff)
|
|
|
|
|
|
|
|
+
|
|
def Qext(x, m, nmax, output_dps):
|
|
def Qext(x, m, nmax, output_dps):
|
|
return Qany(x, m, nmax, output_dps, Qext_diff)
|
|
return Qany(x, m, nmax, output_dps, Qext_diff)
|