2016-06-26 15 views
1

私はジュリア言語で一般的なルンゲ・クッタステップ関数を実装したいと思います。 Pythonでは、このRK4関数が入力として受け取る引数の1つとして関数を渡すことができます。 Juliaのそれを好きなら、パフォーマンスのペナルティはありますか?引数としての関数の効率的な使用

My機能は次のようになります。Psはモデルのパラメータを持つジュリアタイプで、VsはODEの変数の多次元配列で、RHSは右側です

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 

ODEの部分的時間微分(partial time derivatives)である。

+7

Juliaで関数を引数として渡すことができます。何が問題ですか? –

+1

@FengyangWangのコメントに追加するだけです。引数としての関数はv0.4ではいくぶん遅くなっています。これは一部の人が回避する理由ですが、これはv0.5で修正されています。関連するgithubプルリクエストはここにあります(https://github.com/JuliaLang/julia/pull/13412) –

+2

はい、私はこのような関数を渡すことが "正しい"方法であるかどうか私の質問で追加するべきでしたJuliaで、またはより遅いコードになります.. – Ohm

答えて

6

これを行う標準的な方法は、関数を引数として渡すことです。 Julia 0.5以降、高次関数の使用は高速です。

関数を引数として受け入れる標準ライブラリ関数( "高次関数")がたくさんあるので、このスタイルはJuliaでは慣用的です。たとえば、関数の1つのメソッドの簡単な実装を次に示します。

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  
関連する問題