2016-11-05 20 views
4

Ich versuche, eine kleine Funktion zu erstellen, um den Hamilton-Fluss zu definieren, wenn die Funktionen eingegeben werden, aus denen der Hamilton-Operator besteht. Z.B. Ich würde gerneJulia - Definieren einer Funktion, die eine Funktion ausgibt

function makeThedH(f::Function,g::Function) 

dH1(s,u) = cos(u[3]).*f(u[1],u[2]); 
dH2(s,u) = sin(u[3]).*f(u[1],u[2]); 
dH3(s,u) = dot([1,2] , g(u[1],u[2])).*f(u[1],u[2]).^0.5 ; 
dH4(s,u) = dot([1,2] , g(u[1],u[2])); 
dH(s,u) = [dH1(s,u), dH2(s,u), dH3(s,u),dH4(s,u)]; 
return dH; 

end 

definieren, um eine Funktion dH zu geben, die ich in einem ODE-Löser verwenden könnte. (Vergessen Sie, ob dieses System gut definiert ist oder nicht).

Ich kann anscheinend keine Dokumentation für Funktionen finden, die andere Funktionen wie diese ausgeben. Danke für irgendeine Hilfe ~

Edit: Es gibt ein dH zurück, aber ich kann nicht scheinen, es wie eine normale Funktion zu verwenden, z. dH (1, [1,2,3,4]) gibt nur das Objekt zurück (denke ich?) dH, bewertet aber nichts.

Edit: Danke, dass Sie mir helfen, zu erkennen, dass ich die Eingabe-Typen einfügen sollte, die ich möchte, dass f, g Funktionshilfen sind.

+0

Ihr Code logische Fehler enthält, und scheint nicht zu den 's' Parameter überhaupt in seiner Definition zu verwenden, ist aber ansonsten gültige Code was eine "Funktion" ausgibt (ein Verschluss, um genau zu sein, der ein Lambda ist und normal aufgerufen werden kann). Z.B. Sie würden es als 'dh = makeThedH (1,2)' und dann 'dh (1, [1,2,3,4])' nennen, und wenn es keine Fehler in Ihrer Definition für "dh" gäbe, dann dies würde wie erwartet funktionieren. Warum denkst du, dass das nicht die richtige Syntax ist? –

+0

Danke für die Eingabe Tasos. Es benötigt den $ s $ -Parameter, da der Ode-Solver diese Eingabe benötigt (auch wenn er nicht davon abhängig ist). Wie für den Aufruf der Funktion, vergib mir, wie ich denke, ich hätte Eingabe-Typen geben sollen. f und g sollten stattdessen als f :: Function, g :: Function gelesen werden. Wenn ich dH (1, [1,2,3,4]) anrufe, gibt es keine Zahl aus, sondern nur, dass ein DH erstellt wurde und das ist es ... –

Antwort

5

Was Sie wollen, scheint eine Schließung zu sein.

In Ihrem Fall sollte die allgemeine Idee eher sein:

function makeThedH(f,g) 
    # optional initial stuff (initializations if needed) 
    function dH(s,u) 
     # stuff (body of your dH function) 
    end 
end 
+3

Er macht dasselbe, er benutzt nur Inline Syntax (oder wie auch immer es heißt) stattdessen. –

+0

Danke Thomas! Dies funktionierte für mich (bis auf einige kleinere Vorbehalte). Nicht sicher, warum das funktioniert und die In-Line-Funktion hat dies jedoch nicht getan. Aber es ist sauberer (denke ich?). Ein Fehler, auf den ich gestoßen bin, war seltsam, dass ich ein dH erstellen wollte, das je nach Benutzereingabe zwei verschiedene Größen haben kann (wie eine extra True/False-Eingabe). Unter "wahr" würde ich eine Form von dH definieren und sie unter "false" zurückgeben und zurückgeben. Es hat jedoch immer nur Letzteres zurückgegeben ("falsch"). Wie auch immer, das ist ein separates Problem, vielen Dank für die Hilfe bei der Lösung dieses Problems! –

+2

@AaronChen In 'if' Anweisungen müssen Sie anonyme Funktionen verwenden, da' if' Anweisungen keinen eigenen Bereich haben. Auch Ihre Inline-Sachen sollten funktionieren, solange es im Code keine logischen Fehler gibt. –

Verwandte Themen