Julia - 定义一个输出函数的函数

4

我正在尝试创建一个小函数,如果输入了构成哈密顿量的函数,则定义哈密顿流。例如,我想定义

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成为函数句柄。

你的代码存在逻辑错误,并且在定义中似乎根本没有使用s参数,但是它是有效的代码,可以输出一个“函数”(确切地说是闭包,它是一个lambda并且可以正常调用)。例如,您可以将其称为dh = makeThedH(1,2),然后dh(1, [1,2,3,4]),如果在dh的定义中没有错误,则这将按预期工作。您认为这不是正确的语法的原因是什么? - Tasos Papastylianou
感谢您的输入,Tasos。它需要$s$参数,因为ode求解器需要它来进行输入(即使它不依赖于它)。至于调用函数,我想我应该给出输入类型,对此请原谅。f和g应该读作f :: Function,g :: Function。当我调用dH(1,[1,2,3,4])时,它不会输出任何数字,只是说有一个dH被创建了,就是这样... - Aaron Chen
1个回答

4
你想要的似乎是一个闭包。
在你的情况下,一般的想法应该是:
function makeThedH(f,g)
    # optional initial stuff (initializations if needed)
    function dH(s,u)
        # stuff (body of your dH function)
    end
end

3
他正在做同样的事情,只是他使用内联语法(或者叫什么)而已。 - Tasos Papastylianou
谢谢Thomas!这对我有用(除了一些小问题)。不确定为什么这个方法有效而内联函数定义则无效。但是,这种方式更清晰(我猜?)。我遇到的一个奇怪的错误是,我想创建一个dH,它可以根据用户输入的不同大小(例如额外的true/false输入)而有所不同。在“true”下,我会定义一种形式的dH并返回它,在“false”下,我会定义另一种形式并返回它。然而,它总是返回后者(“false”)。无论如何,这是一个单独的问题,非常感谢您帮助解决这个问题! - Aaron Chen
2
@AaronChen 在 if 语句中,你必须使用匿名函数,因为 if 语句没有自己的作用域。只要代码中没有逻辑错误,你的内联内容应该可以正常工作。 - Fengyang Wang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接