在 julia 中与 HCubature 集成

Integrating with HCubature in julia

提问人:Student Debil 提问时间:11/8/2023 更新时间:11/9/2023 访问量:23

问:

我有一个问题。 假设我们有一个依赖于 3 个变量的函数: f(x,y,z) = x+y+z 我想对它进行关于 x 和 y 的积分,并使 z 保持不变。我们可以取 z = 0 或其他任何值。

我试过很简单:

using HCubature

f(x,y,z) = x+y+z

result = hcubature((x,y)->f(x,y,0),(0,0),(1,1))

但它给出了一个错误

ERROR: LoadError: MethodError: no method matching (::var"#1#2")(::StaticArraysCore.SVector{2, Float64})
Closest candidates are:
  (::var"#1#2")(::Any, ::Any) at ~/magisterka/sandbox.jl:5
Stacktrace:
 [1] (::HCubature.GenzMalik{2, Float64})(f::var"#1#2", a::StaticArraysCore.SVector{2, Float64}, b::StaticArraysCore.SVector{2, Float64}, norm::typeof(LinearAlgebra.norm))
   @ HCubature ~/.julia/packages/HCubature/QvyJW/src/genz-malik.jl:121
 [2] hcubature_(f::var"#1#2", a::StaticArraysCore.SVector{2, Float64}, b::StaticArraysCore.SVector{2, Float64}, norm::typeof(LinearAlgebra.norm), rtol_::Int64, atol::Int64, maxevals::Int64, initdiv::Int64)
   @ HCubature ~/.julia/packages/HCubature/QvyJW/src/HCubature.jl:61
 [3] hcubature_(f::Function, a::Tuple{Int64, Int64}, b::Tuple{Int64, Int64}, norm::Function, rtol::Int64, atol::Int64, maxevals::Int64, initdiv::Int64)
   @ HCubature ~/.julia/packages/HCubature/QvyJW/src/HCubature.jl:132
 [4] hcubature(f::var"#1#2", a::Tuple{Int64, Int64}, b::Tuple{Int64, Int64}; norm::Function, rtol::Int64, atol::Int64, maxevals::Int64, initdiv::Int64)
   @ HCubature ~/.julia/packages/HCubature/QvyJW/src/HCubature.jl:179
 [5] hcubature(f::var"#1#2", a::Tuple{Int64, Int64}, b::Tuple{Int64, Int64})
   @ HCubature ~/.julia/packages/HCubature/QvyJW/src/HCubature.jl:179
 [6] top-level scope
   @ ~/magisterka/sandbox.jl:5

如何将 f(x,y,z) 与固定 z 集成? 我仍然试图理解 HCubature 包,所以我会感谢任何帮助

朱莉娅 数控积分

评论


答:

0赞 SGJ 11/9/2023 #1

HCubature 中的被积数将单个向量作为参数,而不是多个参数。这适用于您的示例:(x,y)

julia> using HCubature

julia> f(x,y,z) = x+y+z;

julia> hcubature(r->f(r[1],r[2],0), (0,0), (1,1))
(1.0, 0.0)