Julia中数值积分的高效实现

Efficient implementation of numerical integration in Julia

我正在编写一个算法,我必须在其中集成两个函数(costOfNextPeriods 和 pdf)的乘积。因为这两个函数都有多个参数,所以我将它们包装成一个只有一个参数的函数。我的问题是这是否有效,因为我知道我最关心算法的性能。像这样在范围内定义函数好吗?

function expCost(y::Float64, period::Int, instance::Instance, pwla::Pwla)
    dist = instance.distributions[period]
    functionToIntegrate(demand) = costOfNextPeriods(y, demand, period+1, instance, pwla)*pdf(dist,demand)
    return quadgk(functionToIntegrate,0,Inf)[1]
end

谢谢

假设正确定义了 InstancePwla 类型以及 costOfNextPeriods 函数(即 Julia 编译器可以在它们上面嵌入具体类型),您使用的模式应该是有效的。您可以 运行 @code_warntype 在您的功能上以确保它是这种情况(如果您在某处获得 Anyred 墨水输出,则您有问题).如果您发布了一个完全可重现的示例,我可以告诉您如何检查它。

但是,请注意,如果您在代码的热点部分的某处使用 expCost 函数,效率将不高。原因是 quadgk 函数本身的类型不稳定(我假设您使用 QuadGK.jl 包中的 quadgk 函数)。因此,Julia 编译器无法推断出 expCost 的 return 类型。在这种情况下,最好像这样显式声明函数 return 类型:

function expCost(some_arguments...)::Float64
    # whatever you do internally
end

(此处我将 return 值注释为 Float64 但请将其更改为您期望的 return 值类型)

此外,当您在 expCost 函数上 运行 @code_warntype 时,我相信您会看到此 return 值类型不稳定性在 红色墨水.