2016-06-26 10 views
1

Ich möchte eine generische Runge-Kutta-Step-Funktion in Julia-Sprache implementieren. In Python kann ich einfach eine Funktion als eines der Argumente übergeben, die diese RK4-Funktion als Eingabe erhält. Gibt es eine Leistungseinbuße, wenn ich das in Julia mache?Effiziente Verwendung von Funktionen als Argumente

sieht Meine Funktion wie folgt aus:

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 

Wo Ps ist ein Typ Julia, die die Parameter des Modells hat, ist Vs die mehrdimensionalen Matrix der Variablen der DGL und rhs ist die rechte Seite (partielle Zeitableitungen) der ODE.

+7

Sie eine Funktion als Argument in Julia passieren können. Was ist das Problem? –

+1

Nur zum Kommentar von @FengyangWang hinzufügen; Funktionen als Argumente sind in v0.4 etwas langsamer, weshalb einige Leute sie vermieden haben, aber dies ist in v0.5 behoben. Relevante Github-Pull-Anforderung ist [hier] (https://github.com/JuliaLang/julia/pull/13412) –

+2

Ja, ich hätte in meiner Frage hinzugefügt werden sollen, ob das Übergeben einer Funktion wie dieser der "richtige" Weg ist, es zu tun in Julia oder führt es zu einem langsameren Code .. – Ohm

Antwort

6

Der Standard Weg, dies zu tun, ist nur die Funktion als Argument übergeben. Die Verwendung von Funktionen höherer Ordnung ist seit Julia 0.5 schnell.

Es gibt viele Standardbibliotheksfunktionen, die Funktionen als Argumente akzeptieren ("Funktionen höherer Ordnung"), daher ist dieser Stil in Julia idiomatisch. Zum Beispiel, hier ist eine einfache Implementierung eines Verfahrens zur map Funktion:

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  
Verwandte Themen