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
谢谢
假设正确定义了 Instance
和 Pwla
类型以及 costOfNextPeriods
函数(即 Julia 编译器可以在它们上面嵌入具体类型),您使用的模式应该是有效的。您可以 运行 @code_warntype
在您的功能上以确保它是这种情况(如果您在某处获得 Any
或 red 墨水输出,则您有问题).如果您发布了一个完全可重现的示例,我可以告诉您如何检查它。
但是,请注意,如果您在代码的热点部分的某处使用 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 值类型不稳定性在 红色墨水.
我正在编写一个算法,我必须在其中集成两个函数(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
谢谢
假设正确定义了 Instance
和 Pwla
类型以及 costOfNextPeriods
函数(即 Julia 编译器可以在它们上面嵌入具体类型),您使用的模式应该是有效的。您可以 运行 @code_warntype
在您的功能上以确保它是这种情况(如果您在某处获得 Any
或 red 墨水输出,则您有问题).如果您发布了一个完全可重现的示例,我可以告诉您如何检查它。
但是,请注意,如果您在代码的热点部分的某处使用 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 值类型不稳定性在 红色墨水.