我想在Julia语言中实现一个通用的Runge-Kutta步骤函数。在Python中,我可以将一个函数作为此RK4函数作为输入获取的参数之一传递。如果我像朱莉娅那样做,会有性能损失吗?
我的功能如下:
function uv_rk4_step(rhs,Vs,Ps)
Vs_k1 = rhs(Vs,Ps)
Vs_k1 = Ps.dt*Vs_k1
Vs_k2 = rhs((Vs+(1/2)*Vs_k1),Ps)
Vs_k2 = Ps.dt*Vs_k2
Vs_k3 = rhs((Vs+(1/2)*Vs_k2),Ps)
Vs_k3 = Ps.dt*Vs_k3
Vs_k4 = rhs((Vs+(1/2)*Vs_k3),Ps)
Vs_k4 = Ps.dt*Vs_k4
Vs_next = Vs+(1/6)*Vs_k1+(1/3)*Vs_k2+(1/3)*Vs_k3+(1/6)*Vs_k4
end
当Ps是具有模型参数的Julia类型时,Vs是ODE变量的多维数组,而rhs是ODE的右侧(部分时间导数)。
答案 0 :(得分:6)
执行此操作的标准方法是将函数作为参数传递。自Julia 0.5以来,使用高阶函数的速度很快。
有很多标准库函数接受函数作为参数(“高阶函数”),所以这种风格在Julia中是惯用的。例如,这是map
函数的一种方法的简单实现:
julia> mymap(f, xs) = [f(x) for x in xs]
mymap (generic function with 1 method)
julia> mymap(sin, [0, π/2, 3π/2])
3-element Array{Float64,1}:
0.0
1.0
-1.0