2

Julia言語で一般的なRunge-Kuttaステップ関数を実装したいと思います. Python では、この RK4 関数が入力として取得する引数の 1 つとして関数を渡すことができます。Juliaでそのようにすると、パフォーマンスが低下しますか?

私の関数は次のようになります。

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 の右辺 (部分時間導関数) です。

4

1 に答える 1

8

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

関数を引数として受け入れる標準ライブラリ関数 (「高階関数」) はたくさんあるため、このスタイルは Julia では慣用的です。たとえば、map関数の 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    
于 2016-06-27T01:38:26.533 に答える