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是否接受这一点作为集成边界。