2016-11-05 4 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' параметр вообще в его определении, но в противном случае правильный код который выводит «функцию» (замыкание, а точнее, это лямбда и может быть вызвано нормально). Например. вы должны называть его «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

Спасибо Томас! Это сработало для меня (вплоть до некоторых незначительных оговорок). Не уверен, почему это работает, и определение функции в строке не было. Но, это чище, так (я думаю?). Некоторая ошибка, с которой я столкнулся, странно, что я хотел сделать dH, который мог бы быть двух разных размеров в зависимости от пользовательского ввода (например, дополнительного ввода true/false). Под «true» я бы определил одну форму dH и вернул ее, а под «false» - другую и вернул ее. Однако он всегда возвращал последний («ложный»). В любом случае, это отдельная проблема, спасибо вам большое за помощь в решении этого! –

+2

@AaronChen в операторах 'if', вы должны использовать анонимные функции, так как операторы' if' не имеют своей собственной области. Кроме того, ваш встроенный файл должен работать, если в коде нет логических ошибок. –

Смежные вопросы