【问题标题】:Julia - Defining a function that outputs a functionJulia - 定义一个输出函数的函数
【发布时间】:2017-03-19 01:32:26
【问题描述】:

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

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

给出可以在 ODE 求解器中使用的函数 dH。 (忘记该系统是否定义明确或其他)。

似乎找不到任何输出此类其他函数的函数的文档。谢谢大家帮忙~

编辑:它确实返回一个 dH,但我似乎不能像普通函数一样使用它,例如dH(1,[1,2,3,4]) 只返回对象(我认为?) dH 但不评估任何内容。

编辑:感谢您帮助我意识到我应该输入输入类型,我希望 f,g 成为函数句柄。

【问题讨论】:

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

标签: function closures output julia


【解决方案1】:

你想要的似乎是一个闭包。

在你的情况下,一般的想法应该是:

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

【讨论】:

  • 他在做同样的事情,他只是使用内联语法(或其他任何名称)。
  • 谢谢托马斯!这对我有用(最多有一些小警告)。不知道为什么这有效,但内联函数定义没有。但是,这样更干净(我猜?)。我遇到的一些奇怪的错误是,我想根据用户输入(例如额外的真/假输入)制作一个可以有 2 种不同大小的 dH。在“真”下,我将定义一种 dH 形式并将其返回,在“假”下,我将定义另一种形式并将其返回。然而,它总是返回后者(“假”)。无论如何,这是一个单独的问题,非常感谢您帮助解决这个问题!
  • @AaronChen 在if 语句中,您必须使用匿名函数,因为if 语句没有自己的范围。只要代码中没有逻辑错误,您的内联内容也应该可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
相关资源
最近更新 更多