@@ -140,17 +140,21 @@ cos(f::Fun{S,T}) where {S<:RealSpace,T<:Real} = real(exp(im*f))
140
140
141
141
atan (f:: Fun )= cumsum (f' / (1 + f^ 2 ))+ atan (first (f))
142
142
143
-
144
- # this is used to find a point in which to impose a boundary
145
- # condition in calculating secial functions
146
- function specialfunctionnormalizationpoint (op,growth,f)
143
+ function _specialfunctionnormalizationpoint (op,growth,f)
147
144
g= chop (growth (f),eps (cfstype (f)))
148
145
d = domain (g)
149
146
T = eltype (d)
150
147
xmin = isempty (g. coefficients) ? leftendpoint (d) : T (argmin (g)):: T
151
148
xmax = isempty (g. coefficients) ? rightendpoint (d) : T (argmax (g)):: T
152
149
opfxmin,opfxmax = op (f (xmin)),op (f (xmax))
153
150
opmax = maximum (abs,(opfxmin,opfxmax))
151
+ xmin, xmax, opfxmin, opfxmax, opmax
152
+ end
153
+
154
+ # this is used to find a point in which to impose a boundary
155
+ # condition in calculating secial functions
156
+ function specialfunctionnormalizationpoint (op,growth,f)
157
+ xmin, xmax, opfxmin, opfxmax, opmax = _specialfunctionnormalizationpoint (op,growth,f)
154
158
if abs (opfxmin) == opmax
155
159
xmax,opfxmax = xmin,opfxmin
156
160
end
@@ -192,7 +196,15 @@ for (op, ODE, RHS, growth) in ((:(exp), "D-f'", "0", :(real)
192
196
end
193
197
end
194
198
195
-
199
+ function specialfunctionnormalizationpoint2 (op, growth, f, T = cfstype (f))
200
+ xmin, xmax, opfxmin, opfxmax, opmax = _specialfunctionnormalizationpoint (op,growth,f)
201
+ while opmax≤ 10 eps (T) || abs (f (xmin)- f (xmax))≤ 10 eps (T)
202
+ xmin,xmax = rand (domain (f)),rand (domain (f))
203
+ opfxmin,opfxmax = op (f (xmin)),op (f (xmax))
204
+ opmax = maximum (abs,(opfxmin,opfxmax))
205
+ end
206
+ xmin, xmax, opfxmin, opfxmax, opmax
207
+ end
196
208
197
209
for (op,ODE,RHS,growth) in ((:(erf)," f'*D^2+(2f*f'^2-f'')*D" ," 0" ,:(imag)),
198
210
(:(erfi)," f'*D^2-(2f*f'^2+f'')*D" ," 0" ,:(real)),
@@ -207,22 +219,13 @@ for (op,ODE,RHS,growth) in ((:(erf),"f'*D^2+(2f*f'^2-f'')*D","0",:(imag)),
207
219
L,R = Meta. parse (ODE),Meta. parse (RHS)
208
220
@eval begin
209
221
function $op (fin:: Fun )
210
- f= setcanonicaldomain (fin)
211
-
212
222
T = cfstype (fin)
213
- g= chop ($ growth (f),eps (T))
214
- xmin = isempty (g. coefficients) ? leftendpoint (domain (g)) : argmin (g)
215
- xmax = isempty (g. coefficients) ? rightendpoint (domain (g)) : argmax (g)
216
- opfxmin,opfxmax = $ op (f (xmin)),$ op (f (xmax))
217
- opmax = maximum (abs,(opfxmin,opfxmax))
218
- while opmax≤ 10 eps (T) || abs (f (xmin)- f (xmax))≤ 10 eps (T)
219
- xmin,xmax = rand (domain (f)),rand (domain (f))
220
- opfxmin,opfxmax = $ op (f (xmin)),$ op (f (xmax))
221
- opmax = maximum (abs,(opfxmin,opfxmax))
222
- end
223
- D= Derivative (space (f))
224
- B= [Evaluation (space (f),xmin),Evaluation (space (f),xmax)]
225
- u= \ ([B;eval ($ L)],[opfxmin;opfxmax;eval ($ R)];tolerance= 10 eps (T)* opmax)
223
+ f= setcanonicaldomain (fin)
224
+ xmin, xmax, opfxmin, opfxmax, opmax = specialfunctionnormalizationpoint2 ($ op, $ growth, f, T)
225
+ S = space (f)
226
+ B= [Evaluation (S,xmin), Evaluation (S,xmax)]
227
+ D= Derivative (S)
228
+ u= \ ([B;$ L], [opfxmin;opfxmax;$ R]; tolerance= 10 eps (T)* opmax)
226
229
227
230
setdomain (u,domain (fin))
228
231
end
0 commit comments