2016-06-26 4 views
1

Я хотел бы реализовать общую функцию шага Runge-Kutta на языке Julia. В 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 является многомерный массив переменных ОДУ, а правая часть является правая рука (частичные производные по времени) ОДУ.

+7

Вы можете передать функцию в качестве аргумента в Джулию. В чем проблема? –

+1

Просто добавьте комментарий @FengyangWang; функции, поскольку аргументы несколько медленнее в v0.4, поэтому некоторые люди избегают их, но это исправлено в v0.5. Релевантный запрос на github pull [здесь] (https://github.com/JuliaLang/julia/pull/13412) –

+2

Да, я должен был добавить в свой вопрос, является ли передача такой функции «правильным» способом в Julia, или это приводит к более медленному коду. – Ohm

ответ

6

Стандартный способ сделать это - просто передать функцию в качестве аргумента. Использование функций более высокого порядка происходит быстро с июля 0.5.

Существует множество стандартных библиотечных функций, которые принимают функции как аргументы («функции более высокого порядка»), поэтому этот стиль идиоматичен в Юлии. Например, вот простая реализация одного метода для функции 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  
Смежные вопросы