Skip to content

Commit 6bb4d23

Browse files
committed
update method instances
1 parent 2e36bbb commit 6bb4d23

File tree

2 files changed

+37
-38
lines changed

2 files changed

+37
-38
lines changed

src/besselj.jl

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -152,33 +152,36 @@ function besselj1(x::Float32)
152152
end
153153

154154
function besselj(nu::Real, x::T) where T
155+
isinteger(nu) && return besselj(Int(nu), x)
155156
abs_nu = abs(nu)
156157
abs_x = abs(x)
157158

158159
Jnu = besselj_positive_args(abs_nu, abs_x)
160+
if nu >= zero(T)
161+
return x >= zero(T) ? Jnu : cispi(abs_nu)*Jnu
162+
else
163+
Ynu = bessely_positive_args(abs_nu, abs_x)
164+
spi, cpi = sincospi(abs_nu)
165+
out = cpi*Jnu - spi*Ynu
166+
return x >= zero(T) ? out : out * cispi(nu)
167+
end
168+
end
169+
170+
function besselj(nu::Int, x::T) where T
171+
abs_nu = abs(nu)
172+
abs_x = abs(x)
173+
sg = (iseven(Int(abs_nu)) ? 1 : -1)
159174

175+
Jnu = besselj_positive_args(abs_nu, abs_x)
160176
if nu >= zero(T)
161-
if x >= zero(T)
162-
return Jnu
163-
else
164-
if isinteger(abs_nu)
165-
return Jnu * (iseven(Int(abs_nu)) ? 1 : -1)
166-
else
167-
return cispi(abs_nu)*Jnu
168-
end
169-
end
177+
return x >= zero(T) ? Jnu : Jnu * sg
170178
else
171179
if x >= zero(T)
172-
isinteger(nu) && return Jnu * (iseven(Int(abs_nu)) ? 1 : -1)
173-
Ynu = bessely_positive_args(abs_nu, abs_x)
174-
spi, cpi = sincospi(abs_nu)
175-
return cpi*Jnu - spi*Ynu
180+
return Jnu * sg
176181
else
177182
Ynu = bessely_positive_args(abs_nu, abs_x)
178183
spi, cpi = sincospi(abs_nu)
179-
out = cpi*Jnu - spi*Ynu
180-
isinteger(nu) && return out * (iseven(Int(abs_nu)) ? 1 : -1)
181-
return cispi(nu)*out
184+
return (cpi*Jnu - spi*Ynu) * sg
182185
end
183186
end
184187
end

src/bessely.jl

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -188,39 +188,35 @@ Bessel function of the first kind of order nu, ``J_{nu}(x)``.
188188
Nu must be real.
189189
"""
190190

191-
192191
function bessely(nu::Real, x::T) where T
192+
isinteger(nu) && return bessely(Int(nu), x)
193193
abs_nu = abs(nu)
194194
abs_x = abs(x)
195195

196196
Ynu = bessely_positive_args(abs_nu, abs_x)
197+
Jnu = besselj_positive_args(abs_nu, abs_x)
198+
spi, cpi = sincospi(abs_nu)
199+
if nu >= zero(T)
200+
return x >= zero(T) ? Ynu : cispi(-nu)*Ynu + 2im*cpi*Jnu
201+
else
202+
return x >= zero(T) ? cpi*Ynu + spi*Jnu : cpi * (cispi(nu)*Ynu + 2im * cpi * Jnu) + spi * cispi(abs_nu) * Jnu
203+
end
204+
end
205+
function bessely(nu::Int, x::T) where T
206+
abs_nu = abs(nu)
207+
abs_x = abs(x)
208+
sg = (iseven(Int(abs_nu)) ? 1 : -1)
197209

198-
if nu > zero(T)
199-
if x > zero(T)
200-
return Ynu
201-
else
202-
Jnu = besselj_positive_args(abs_nu, abs_x)
203-
return cispi(-nu)*Ynu + 2im*cospi(nu)*Jnu
204-
end
210+
Ynu = bessely_positive_args(abs_nu, abs_x)
211+
if nu >= zero(T)
212+
return x >= zero(T) ? Ynu : Ynu * sg + 2im * sg * besselj_positive_args(abs_nu, abs_x)
205213
elseif nu < zero(T)
206-
if x > zero(T)
207-
isinteger(nu) && return Ynu * (iseven(Int(abs_nu)) ? 1 : -1)
208-
Jnu = besselj_positive_args(abs_nu, abs_x)
209-
spi, cpi = sincospi(abs_nu)
210-
return cpi*Ynu + spi*Jnu
211-
else
212-
Jnu = besselj_positive_args(abs_nu, abs_x)
213-
isinteger(nu) && return Ynu + 2im * Jnu
214-
spi, cpi = sincospi(abs_nu)
215-
out = cpi * (cispi(nu)*Ynu + 2im * cpi * Jnu)
216-
return out + spi * cispi(abs_nu) * Jnu
217-
end
218-
else
219-
return -T(Inf)
214+
return x > zero(T) ? Ynu * sg : Ynu + 2im * besselj_positive_args(abs_nu, abs_x)
220215
end
221216
end
222217

223218
function bessely_positive_args(nu, x::T) where T
219+
iszero(x) && return -T(Inf)
224220

225221
# use forward recurrence if nu is an integer up until it becomes inefficient
226222
(isinteger(nu) && nu < 250) && return besselj_up_recurrence(x, bessely1(x), bessely0(x), 1, nu)[1]

0 commit comments

Comments
 (0)