2016-11-05 201 views
4

我試圖創建一個小函數來定義哈密爾頓流,如果輸入哈密爾頓函數組成的函數。例如。我想定義Julia - 定義輸出函數的函數

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 

給出一個函數dH,我可以在ODE求解器中使用。 (忘記該系統是否定義良好或任何其他)。

似乎無法找到任何輸出其他功能的功能文檔。謝謝你的任何幫助〜

編輯:它確實返回一個dH,但我似乎無法使用它像一個正常的功能,例如, dH(1,[1,2,3,4])只是返回對象(我認爲?)dH,但不計算任何東西。

編輯:感謝幫助我意識到我應該把輸入類型,我想f,g是功能句柄。

+0

你的代碼中包含邏輯錯誤,似乎並沒有在其定義在所有使用's'參數,但在其他方面有效的代碼它輸出一個「函數」(一個閉包,確切地說,這是一個lambda,可以正常調用)。例如。你可以把它叫做'dh = makeThedH(1,2)'然後'dh(1,[1,2,3,4])',如果你的定義中沒有錯誤'dh',那麼這個將按預期工作。你爲什麼認爲這是不正確的語法? –

+0

感謝您輸入Tasos。它需要$ s $參數,因爲ode求解器需要它具有該輸入(即使它不依賴於它)。至於調用函數,原諒我,因爲我認爲我應該給予輸入類型。 f和g應該讀爲f :: Function,而不是g :: Function。當我呼叫dH(1,[1,2,3,4])時,它不輸出任何數字,它只是說有一個dH創建,這就是它... –

回答

5

你想要的東西似乎是封閉的。

在你的情況,一般的想法,而應該是:

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

他在做同樣的事情,他只是使用內聯語法(或任何它被稱爲)。 –

+0

謝謝Thomas!這對我來說很有效(達到一些小問題)。但不知道爲什麼這會起作用,並且定義的內聯函數沒有。但是,這樣更清潔(我猜?)。我遇到的一些錯誤很奇怪,我想根據用戶輸入做出一個dH,它可以是2種不同的大小(如額外的真/假輸入)。在「真實」下,我將定義一種形式的dH並將其返回,在「假」下面,另一個形式返回。但是,它總是返回後者(「錯誤」)。無論如何,這是一個單獨的問題,非常感謝你幫助解決這個問題! –

+2

@AaronChen在'if'語句中,你必須使用匿名函數,因爲'if'語句沒有自己的範圍。此外,只要代碼中沒有邏輯錯誤,內聯的東西就可以工作。 –