при передаче чистой функции в модуль - PullRequest
1 голос
/ 12 января 2012

Просто хотел проверить, безопасно ли делать следующее:

Допустим, у меня есть функция 'f (x)', которая также зависит от других параметров. Например, функция a*Exp[ (x-x0)^2/(2*std^2)]

Из пользовательского интерфейса я читаю введенные пользователем значения (через ползунки) для параметров a и x0 и std, затем я делаю чисто функциональную переменную

 f=Function[{x,a,x0,std}, a*Exp[ (x-x0)^2/(2*std^2)]

Выше сделано в том же контексте (в области управления Манипулировать), когда я читаю пользовательский ввод, затем, когда пользователь нажимает кнопку для запуска программы, я вызываю другую функцию более низкого уровня для обработки этого ввода, как это

 foo[f,a,x0,std]

затем внутри foo он оценивает f по некоторым точкам сетки (x1, x2 и т. Д.), Делая такие вызовы

 foo[f_,a_,x0,std_]:=Module[{x1,x2...},     
   .....
   f[x1,a,x0,std];
   f[x2,a,x0,std];
   f[x3,a,x0,std]; etc... 
   ....
   ]

Обратите внимание, что внутри foo используется только параметр x для чистой функции, остальные просто отправляются в путь.

Но поскольку они не используются внутри foo, я думаю не передавать все остальные параметры a, x0, std.

Итак, я изменил чистую функцию, чтобы она стала

 f=Function[{x}, a*Exp[ (x-x0)^2/(2*std^2)];

затем назвал foo вот так

 foo[f]

тогда внутри foo, я делаю

 foo[f_]:=Module[{},     
   .....
   f[x1];
   f[x2];
   f[x3]; etc...
   ....
   ]

Я проверил это, и оно работает. (Сначала я подумал, что поскольку в модуле foo контекст отличается, мне пришлось передать a,x0,std вместе с f. Но мне не нужно было. Кажется, значения a, x0 и stdx внутри чистого функция сохраняется как глобальные и передается в чистом теле функции.

Мой вопрос: вы видите какие-либо проблемы со вторым подходом выше? что-то я пропускаю? в тестах, которые я сделал, пока все отлично работает. И это сделало бы это намного проще, поскольку теперь мне нужно только передать саму чистую функцию, а не передавать все остальные параметры, используемые для построения, поскольку они не нужны внутри foo.

Другими словами, я пытаюсь выбрать между этими двумя настройками:

enter image description here

Просто подумал проверить.

спасибо

1 Ответ

7 голосов
/ 12 января 2012

Как насчет чего-то такого:

mkf[a_, x0_, std_] := 
 Function[{x}, Evaluate[a*Exp[(x - x0)^2/(2*std^2)]]]

foo[f_] := Module[{x},
      x = 1;
      f[x]
      ]

foo[mkf[1, 1, 1]]

Вы генерируете функцию, которую хотите использовать, прежде чем передавать ее дальше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...