Julia 朱莉娅:如何改变贝塞尔函数中参数的类型?

Julia 朱莉娅:如何改变贝塞尔函数中参数的类型?,julia,Julia,这是我的密码: using Plots using SpecialFunctions using QuadGK kappa = 1 B = 1 xi = (kappa/B)^4 function correlation(x) quadgk(q -> q * SpecialFunctions.besselj0(x*q)/(q^4 + xi), 0, 1e6)[1]/kappa end r = range(-20, 20, length = 1001) plot(r, cor

这是我的密码:

using Plots
using SpecialFunctions
using QuadGK

kappa = 1
B = 1
xi = (kappa/B)^4

function correlation(x)
    quadgk(q -> q * SpecialFunctions.besselj0(x*q)/(q^4 + xi), 0, 1e6)[1]/kappa 
end

r = range(-20, 20, length = 1001)

plot(r, correlation(r))
贝塞尔函数有个错误。我知道这个参数是问题所在,它的格式应该是
::BigFloat
::Float16
,或
::Float32
,但我不知道如何做。我尝试编写
x.*q
,但问题仍然存在,我得到了错误:

ERROR: MethodError: no method matching besselj0(::StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}})

此外,我正在寻找一种写入+无穷大而不是
1e6

的方法,只需将
correlation(r)
替换为
correlation。(r)
在代码中使用广播,如前所述

问题的核心是,在Julia中,函数在默认情况下是不可广播的——您通常必须选择使用它(特别是当您使用数字代码时)。以下是一个基本示例:

julia> sin(1)
0.8414709848078965

julia> sin([1])
ERROR: MethodError: no method matching sin(::Array{Int64,1})
Closest candidates are:
  sin(::BigFloat) at mpfr.jl:727
  sin(::Missing) at math.jl:1197
  sin(::Complex{Float16}) at math.jl:1145
  ...
Stacktrace:
 [1] top-level scope at REPL[2]:1

julia> sin.([1])
1-element Array{Float64,1}:
 0.8414709848078965
但是,在您的情况下,
相关
函数非常昂贵。在这种情况下,我通常使用ProgressMeter.jl来监控计算的进度(它显示了您可以期望计算完成的时间)。所以你可以写:

using ProgressMeter
result = @showprogress map(correlation, r)
并使用
map
功能将
correlation
功能应用于
r
的所有元素(在这种情况下,结果将与广播相同)

最后,如果不在
quadgk
中使用全局变量,计算速度会快得多。最好将
kappa
xi
作为参数传递给函数,如下所示:

function correlation(x, kappa, xi)
    quadgk(q -> q * SpecialFunctions.besselj0(x*q)/(q^4 + xi), 0, 1e6)[1]/kappa 
end

result = @showprogress map(x -> correlation(x, kappa, xi), r)

第二个问题的答案可能是
Inf
,但我不知道QuadGK是否接受这一点作为集成边界。