@@ -47,26 +47,20 @@ External links: [DLMF](https://dlmf.nist.gov/9.2.2), [Wikipedia](https://en.wiki
47
47
See also: [`airyaiprime`](@ref), [`airybi`](@ref)
48
48
"""
49
49
airyai (z:: Number ) = _airyai (float (z))
50
+ airyaix (z:: Number ) = _airyaix (float (z))
50
51
51
52
function _airyai (z:: Complex{T} ) where T <: Union{Float32, Float64}
52
- if ~ isfinite (z)
53
- if abs (angle (z)) < T (2 π/ 3 )
54
- return exp (- z)
55
- else
56
- return 1 / z
57
- end
58
- end
59
-
60
53
x, y = reim (z)
61
54
62
55
check_conj = false
63
56
if y < zero (T)
64
57
z = conj (z)
58
+ y = - y
65
59
check_conj = true
66
60
end
67
61
68
62
if airy_large_argument_cutoff (x, y)
69
- r = airyaix_large_args (z)[1 ] * exp ( - T ( 2 / 3 ) * z * sqrt (z))
63
+ r = airyai_large_args (z)[1 ]
70
64
elseif airyai_levin_cutoff (x, y)
71
65
r = airyaix_levin (z, Val (17 )) * exp (- T (2 / 3 ) * z * sqrt (z))
72
66
elseif airyai_power_series_cutoff (x, y)
@@ -85,6 +79,7 @@ function _airyaix(z::Complex{T}) where T <: Union{Float32, Float64}
85
79
check_conj = false
86
80
if y < zero (T)
87
81
z = conj (z)
82
+ y = - y
88
83
check_conj = true
89
84
end
90
85
@@ -122,26 +117,20 @@ External links: [DLMF](https://dlmf.nist.gov/9.2), [Wikipedia](https://en.wikipe
122
117
See also: [`airyai`](@ref), [`airybi`](@ref)
123
118
"""
124
119
airyaiprime (z:: Number ) = _airyaiprime (float (z))
120
+ airyaiprimex (z:: Number ) = _airyaiprimex (float (z))
125
121
126
122
function _airyaiprime (z:: Complex{T} ) where T <: Union{Float32, Float64}
127
- if ~ isfinite (z)
128
- if abs (angle (z)) < T (2 π/ 3 )
129
- return - exp (- z)
130
- else
131
- return 1 / z
132
- end
133
- end
134
-
135
123
x, y = reim (z)
136
124
137
125
check_conj = false
138
126
if y < zero (T)
139
127
z = conj (z)
128
+ y = - y
140
129
check_conj = true
141
130
end
142
131
143
132
if airy_large_argument_cutoff (x, y)
144
- r = airyaix_large_args (z)[2 ] * exp ( - T ( 2 / 3 ) * z * sqrt (z))
133
+ r = airyai_large_args (z)[2 ]
145
134
elseif airyai_levin_cutoff (x, y)
146
135
r = airyaiprimex_levin (z, Val (17 )) * exp (- T (2 / 3 ) * z * sqrt (z))
147
136
elseif airyai_power_series_cutoff (x, y)
@@ -159,6 +148,7 @@ function _airyaiprimex(z::Complex{T}) where T <: Union{Float32, Float64}
159
148
check_conj = false
160
149
if y < zero (T)
161
150
z = conj (z)
151
+ y = - y
162
152
check_conj = true
163
153
end
164
154
@@ -198,24 +188,26 @@ See also: [`airybiprime`](@ref), [`airyai`](@ref)
198
188
airybi (z:: Number ) = _airybi (float (z))
199
189
200
190
function _airybi (z:: Complex{T} ) where T <: Union{Float32, Float64}
201
- if ~ isfinite (z)
202
- if abs (angle (z)) < T (2 π/ 3 )
203
- return exp (z)
204
- else
205
- return 1 / z
206
- end
207
- end
208
191
x, y = real (z), imag (z)
209
192
193
+ check_conj = false
194
+ if y < zero (T)
195
+ z = conj (z)
196
+ y = - y
197
+ check_conj = true
198
+ end
199
+
210
200
if airy_large_argument_cutoff (z)
211
- return airybi_large_args (z)[1 ]
201
+ r = airybi_large_args (z)[1 ]
212
202
elseif x > 1.1 && y > 4.2
213
- return airybi_levin (z, Val (16 ))
203
+ r = airybi_levin (z, Val (16 ))
214
204
elseif angle (z) < 7pi / 8 || x > - 4.5
215
- return airybi_power_series (z)[1 ]
205
+ r = airybi_power_series (z)[1 ]
216
206
else
217
- return cispi (- 1 / 6 ) * _airyai (z * cispi (- 2 / 3 )) + cispi (1 / 6 ) * _airyai (z* cispi (2 / 3 ))
207
+ r = cispi (- 1 / 6 ) * _airyai (z * cispi (- 2 / 3 )) + cispi (1 / 6 ) * _airyai (z* cispi (2 / 3 ))
218
208
end
209
+
210
+ return check_conj ? conj (r) : r
219
211
end
220
212
"""
221
213
airybiprime(z)
@@ -240,24 +232,26 @@ See also: [`airybi`](@ref), [`airyai`](@ref)
240
232
airybiprime (z:: Number ) = _airybiprime (float (z))
241
233
242
234
function _airybiprime (z:: Complex{T} ) where T <: Union{Float32, Float64}
243
- if ~ isfinite (z)
244
- if abs (angle (z)) < T (2 π/ 3 )
245
- return exp (z)
246
- else
247
- return - 1 / z
248
- end
249
- end
250
235
x, y = real (z), imag (z)
251
236
237
+ check_conj = false
238
+ if y < zero (T)
239
+ z = conj (z)
240
+ y = - y
241
+ check_conj = true
242
+ end
243
+
252
244
if airy_large_argument_cutoff (z)
253
- return airybi_large_args (z)[2 ]
245
+ r = airybi_large_args (z)[2 ]
254
246
elseif x > 1.1 && y > 4.2
255
- return airybiprime_levin (z, Val (16 ))
247
+ r = airybiprime_levin (z, Val (16 ))
256
248
elseif angle (z) < 7pi / 8 || x > - 4.5
257
- return airybi_power_series (z)[2 ]
249
+ r = airybi_power_series (z)[2 ]
258
250
else
259
- return cispi (- 5 / 6 ) * airyaiprime (z * cispi (- 2 / 3 )) + cispi (5 / 6 ) * airyaiprime (z* cispi (2 / 3 ))
251
+ r = cispi (- 5 / 6 ) * airyaiprime (z * cispi (- 2 / 3 )) + cispi (5 / 6 ) * airyaiprime (z* cispi (2 / 3 ))
260
252
end
253
+
254
+ return check_conj ? conj (r) : r
261
255
end
262
256
263
257
# ####
@@ -307,18 +301,26 @@ airy_large_argument_cutoff(z::ComplexOrReal{Float32}) = abs(z) > 4
307
301
308
302
# valid in 0 <= angle(z) <= pi
309
303
# use conjugation for bottom half plane
310
- airyai_large_args (z:: Complex{T} ) where T = airyaix_large_args (z) .* exp (- 2 / 3 * z * sqrt (z))
304
+ function airyai_large_args (z:: Complex{T} ) where T
305
+ out = airyaix_large_args (z)
306
+ return isfinite (z) ? out .* exp (- T (2 / 3 ) * z * sqrt (z)) : out
307
+ end
311
308
312
309
function airybi_large_args (z:: Complex{T} ) where T
313
- if imag (z) < zero (T)
314
- out = conj .(airybix_large_args (conj (z)))
315
- else
316
- out = airybix_large_args (z)
317
- end
318
- return out .* exp (T (2 / 3 ) * z * sqrt (z))
310
+ out = airybix_large_args (z)
311
+ return isfinite (z) ? out .* exp (T (2 / 3 ) * z * sqrt (z)) : out
319
312
end
320
313
321
314
@inline function airyaix_large_args (z:: Complex{T} ) where T
315
+ if ~ isfinite (z)
316
+ if abs (angle (z)) < T (2 π/ 3 )
317
+ e = exp (- z)
318
+ return (e, - e)
319
+ else
320
+ invz = 1 / z
321
+ return (invz, invz)
322
+ end
323
+ end
322
324
xsqr = sqrt (z)
323
325
xsqrx = Base. FastMath. inv_fast (z * xsqr)
324
326
A, B, C, D = compute_airy_asy_coef (z, xsqrx)
337
339
end
338
340
339
341
@inline function airybix_large_args (z:: Complex{T} ) where T
342
+ if ~ isfinite (z)
343
+ if abs (angle (z)) < T (2 π/ 3 )
344
+ e = exp (z)
345
+ return (e, e)
346
+ else
347
+ invz = 1 / z
348
+ return (invz, - invz)
349
+ end
350
+ end
340
351
xsqr = sqrt (z)
341
352
xsqrx = Base. FastMath. inv_fast (z * xsqr)
342
353
A, B, C, D = compute_airy_asy_coef (z, xsqrx)
0 commit comments