我可以使用quadgk
在Julia中进行单变量数值积分。一些简单的例子:
julia> f(x) = cos(x)
f (generic function with 1 method)
julia> quadgk(f, 0, pi)
(8.326672684688674e-17,0.0)
julia> quadgk(f, 0, pi/2)
(1.0,1.1102230246251565e-16)
julia> g(x) = cos(x)^2
g (generic function with 1 method)
julia> quadgk(g, 0, pi/2)
(0.7853981633974483,0.0)
julia> pi/4
0.7853981633974483
documentation for quadgk似乎并不意味着支持多维集成,如果我试图将其误用于2D积分,我肯定会收到错误:
julia> quadgk( h, 0, pi/2, 0, pi/2)
ERROR: `h` has no method matching h(::Float64)
文档确实建议有一些外部包用于集成,但没有命名它们。我猜这样的包可以做二维积分。这个任务的最佳包装是什么?
答案 0 :(得分:2)
我想你想看一下Cubature包:
https://github.com/stevengj/Cubature.jl
可以说,quadgk
应该只是从标准库中删除,因为它是有限的,只会误导人们不要寻找集成进行集成。
答案 1 :(得分:2)
除了Cubature.jl
之外,还有另一个Julia软件包允许您计算多维数值积分:Cuba.jl
(https://github.com/giordano/Cuba.jl)。您可以使用包管理器安装它:
Pkg.add("Cuba")
该软件包的完整文档位于https://cubajl.readthedocs.org(同样位于PDF version)
免责声明:我是该套餐的作者。
Cuba.jl
只是托马斯·哈恩(Thomas Hahn)围绕Cuba Library的Julia包装器,提供了四种独立的算法来计算积分:Vegas,Suave,Divonne,Cuhre。
域[0,1]中cos(x)的积分可以使用以下命令之一计算:
Vegas((x,f)->f[1]=cos(x[1]), 1, 1)
Suave((x,f)->f[1]=cos(x[1]), 1, 1)
Divonne((x,f)->f[1]=cos(x[1]), 1, 1)
Cuhre((x,f)->f[1]=cos(x[1]), 1, 1)
其中Ω= [0,1]³和
可以使用以下Julia脚本计算:
using Cuba
function integrand(x, f)
f[1] = sin(x[1])*cos(x[2])*exp(x[3])
f[2] = exp(-(x[1]^2 + x[2]^2 + x[3]^2))
f[3] = 1/(1 - x[1]*x[2]*x[3])
end
result = Cuhre(integrand, 3, 3, epsabs=1e-12, epsrel=1e-10)
answer = [(e-1)*(1-cos(1))*sin(1), (sqrt(pi)*erf(1)/2)^3, zeta(3)]
for i = 1:3
println("Component $i")
println(" Result of Cuba: ", result[1][i], " ± ", result[2][i])
println(" Exact result: ", answer[i])
println(" Actual error: ", abs(result[1][i] - answer[i]))
end
,它提供以下输出
Component 1
Result of Cuba: 0.6646696797813739 ± 1.0050367631018485e-13
Exact result: 0.6646696797813771
Actual error: 3.219646771412954e-15
Component 2
Result of Cuba: 0.4165383858806454 ± 2.932866749838454e-11
Exact result: 0.41653838588663805
Actual error: 5.9926508200192075e-12
Component 3
Result of Cuba: 1.2020569031649702 ± 1.1958522385908214e-10
Exact result: 1.2020569031595951
Actual error: 5.375033751420233e-12
答案 2 :(得分:0)
您可以尝试使用HCubature.jl
软件包:
using HCubature
# Integrating cos(x) between 1.0 and 2.0
hcubature(x -> cos(x[1]), [1.0], [2.0])
# Integrating cos(x1)sin(x2) with domains of [1.0,2.0] for x1 and [1.1,3.0] for x2
hcubature(x -> cos(x[1]) * sin(x[2]), [1.0, 1.1], [2.0, 3.0])