Skip to content

Commit 2ad562d

Browse files
committed
fix negative orders
1 parent e0b19ed commit 2ad562d

File tree

3 files changed

+20
-81
lines changed

3 files changed

+20
-81
lines changed

src/bessely.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@ Bessel function of the second kind of order nu, ``Y_{nu}(x)``.
236236
nu and x must be real where nu and x can be positive or negative.
237237
"""
238238
function bessely(nu::Real, x::T) where T
239+
isnan(nu) || isnan(x) && return NaN
239240
isinteger(nu) && return bessely(Int(nu), x)
240241
abs_nu = abs(nu)
241242
abs_x = abs(x)

src/sphericalbessel.jl

Lines changed: 11 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,12 @@
11
function sphericalbesselj(nu::Real, x::T) where T
2-
isinteger(nu) && return sphericalbesselj(Int(nu), x)
2+
isnan(nu) || isnan(x) && return NaN
3+
x < zero(T) && return throw(DomainError(x, "Complex result returned for real arguments. Complex arguments are currently not supported"))
34
abs_nu = abs(nu)
4-
abs_x = abs(x)
55

6-
Jnu = sphericalbesselj_positive_args(abs_nu, abs_x)
7-
if nu >= zero(T)
8-
if x >= zero(T)
9-
return Jnu
10-
else
11-
return throw(DomainError(x, "Complex result returned for real arguments. Complex arguments are currently not supported"))
12-
#return Jnu * cispi(abs_nu)
13-
end
14-
else
15-
Ynu = sphericalbessely_positive_args(abs_nu, abs_x)
16-
spi, cpi = sincospi(abs_nu)
17-
out = Jnu * cpi - Ynu * spi
18-
if x >= zero(T)
19-
return out
20-
else
21-
return throw(DomainError(x, "Complex result returned for real arguments. Complex arguments are currently not supported"))
22-
#return out * cispi(nu)
23-
end
24-
end
25-
end
26-
27-
function sphericalbesselj(nu::Integer, x::T) where T
28-
abs_nu = abs(nu)
29-
abs_x = abs(x)
30-
sg = iseven(abs_nu) ? 1 : -1
31-
32-
Jnu = sphericalbesselj_positive_args(abs_nu, abs_x)
33-
if nu >= zero(T)
34-
return x >= zero(T) ? Jnu : Jnu * sg
6+
if nu < zero(T)
7+
return SQPIO2(T) * besselj(nu + 1/2, x) / sqrt(x)
358
else
36-
if x >= zero(T)
37-
return Jnu * sg
38-
else
39-
Ynu = sphericalbessely_positive_args(abs_nu, abs_x)
40-
spi, cpi = sincospi(abs_nu)
41-
return (cpi*Jnu - spi*Ynu) * sg
42-
end
9+
return sphericalbesselj_positive_args(nu, x)
4310
end
4411
end
4512

@@ -52,7 +19,7 @@ function sphericalbesselj_positive_args(nu::Real, x::T) where T
5219
return x^nu * a * coef
5320
elseif isinteger(nu)
5421
if (x >= nu && nu < 250) || (x < nu && nu < 60)
55-
return sphericalbesselj_recurrence(nu, x)
22+
return sphericalbesselj_recurrence(Int(nu), x)
5623
else
5724
return SQPIO2(T) * besselj(nu + 1/2, x) / sqrt(x)
5825
end
@@ -89,52 +56,15 @@ function sphericalbesselj_recurrence(nu::Integer, x::T) where T
8956
end
9057
end
9158

92-
93-
9459
function sphericalbessely(nu::Real, x::T) where T
95-
isinteger(nu) && return sphericalbessely(Int(nu), x)
60+
isnan(nu) || isnan(x) && return NaN
61+
x < zero(T) && return throw(DomainError(x, "Complex result returned for real arguments. Complex arguments are currently not supported"))
9662
abs_nu = abs(nu)
97-
abs_x = abs(x)
9863

99-
Ynu = sphericalbessely_positive_args(abs_nu, abs_x)
100-
if nu >= zero(T)
101-
if x >= zero(T)
102-
return Ynu
103-
else
104-
return throw(DomainError(x, "Complex result returned for real arguments. Complex arguments are currently not supported"))
105-
#return Ynu * cispi(-nu) + 2im * besselj_positive_args(abs_nu, abs_x) * cospi(abs_nu)
106-
end
107-
else
108-
Jnu = sphericalbesselj_positive_args(abs_nu, abs_x)
109-
spi, cpi = sincospi(abs_nu)
110-
if x >= zero(T)
111-
return Ynu * cpi + Jnu * spi
112-
else
113-
return throw(DomainError(x, "Complex result returned for real arguments. Complex arguments are currently not supported"))
114-
#return cpi * (Ynu * cispi(nu) + 2im * Jnu * cpi) + Jnu * spi * cispi(abs_nu)
115-
end
116-
end
117-
end
118-
function sphericalbessely(nu::Integer, x::T) where T
119-
abs_nu = abs(nu)
120-
abs_x = abs(x)
121-
sg = iseven(abs_nu) ? 1 : -1
122-
123-
Ynu = sphericalbessely_positive_args(abs_nu, abs_x)
124-
if nu >= zero(T)
125-
if x >= zero(T)
126-
return Ynu
127-
else
128-
return throw(DomainError(x, "Complex result returned for real arguments. Complex arguments are currently not supported"))
129-
#return Ynu * sg + 2im * sg * besselj_positive_args(abs_nu, abs_x)
130-
end
64+
if nu < zero(T)
65+
return SQPIO2(T) * bessely(nu + 1/2, x) / sqrt(x)
13166
else
132-
if x >= zero(T)
133-
return Ynu * sg
134-
else
135-
return throw(DomainError(x, "Complex result returned for real arguments. Complex arguments are currently not supported"))
136-
#return Ynu + 2im * besselj_positive_args(abs_nu, abs_x)
137-
end
67+
return sphericalbessely_positive_args(nu, x)
13868
end
13969
end
14070

test/sphericalbessel_test.jl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,11 @@ for x in 5.5:4.0:160.0, v in [20, 25.0, 32.4, 40.0, 45.12, 50.0, 55.2, 60.124, 7
1818
@test isapprox(Bessels.sphericalbesselj(v, x), SpecialFunctions.sphericalbesselj(v, x), rtol=3e-12)
1919
@test isapprox(Bessels.sphericalbessely(v, x), SpecialFunctions.sphericalbessely(v, x), rtol=3e-12)
2020
end
21+
22+
v, x = -4.0, 5.6
23+
@test isapprox(Bessels.sphericalbesselj(v, x), 0.07774965105230025584537, rtol=3e-12)
24+
@test isapprox(Bessels.sphericalbessely(v, x), -0.1833997131521190346258, rtol=3e-12)
25+
26+
v, x = -6.8, 15.6
27+
@test isapprox(Bessels.sphericalbesselj(v, x), 0.04386355397884301866595, rtol=3e-12)
28+
@test isapprox(Bessels.sphericalbessely(v, x), 0.05061013363904335437354, rtol=3e-12)

0 commit comments

Comments
 (0)