2016-11-05 63 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'语句没有自己的范围。此外,只要代码中没有逻辑错误,内联的东西就可以工作。 –