Как написать длинную функцию в Mathematica?Используя ноутбук как функцию? - PullRequest
2 голосов
/ 04 декабря 2011

Я определил некоторую переменную в начале тетради Mathematica и впоследствии использовал ее для вычисления моих результатов.Теперь я хочу сделать один и тот же расчет несколько раз для разных значений переменной и где-то использовать результаты.Поэтому было бы полезно определить новую функцию с этой переменной в качестве параметра и содержимым моей записной книжки в качестве тела.Но тогда я должен был бы написать все в одной строке ввода, и не было бы удобного способа увидеть промежуточные результаты.

Есть ли какой-нибудь хороший способ справиться с такой ситуацией?

Чтобы прояснить, что я имею в виду, приведу короткий пример:

Что я мог бы сделать, это примерно так:

In[1] := f[variable_] := (
            calculations;
            many lines of calcalutions;
            many lines of calcalutions;
            (* some comments *);
            (* finally the result... *);
            result
         )

И затем использовать эту функцию:

In[1] := f[value1] + f[value2]

Но если кого-то интересует промежуточный результат строки 1 функции f («вычисления»), то необходимо скопировать строку в другое место.Но тогда вы не можете просто удалить точку с запятой в конце строки, чтобы увидеть результат строки.

Ответы [ 3 ]

4 голосов
/ 06 декабря 2011

Использование

    lc = Notebook[{Cell[
   BoxData[\(\(Pause[1]\) ;\)]
   , "Input"], Cell[
   BoxData[\(\(Print[\(Date[]\)]\) ;\)]
   , "Input"], Cell[
   BoxData[\(\(Print[
         \("variable = ", variable\)] \) ;\)]
   , "Input"], Cell[
   BoxData[\(result = \(variable^2\)\)]
   , "Input"]}, WindowSize -> 
  {701, 810}, WindowMargins -> 
  {{Automatic, 149}, {Automatic, 
    35}}, FrontEndVersion -> "8.0 for Microsoft Windows (64-bit) (October \
6, 2011)", StyleDefinitions -> 
  "Default.nb"];

Или, если вы сохранили его в longcalc.nb в том же каталоге, что и ваш рабочий блокнот, то

lc = Get[FileNameJoin[{SetDirectory[NotebookDirectory[]], "longcalc.nb"}]];

Теперь в вашем рабочем блокноте оцените:

f[var_] := (variable = var; 
   NotebookEvaluate[NotebookPut[lc], InsertResults -> True]);
f[value1] + f[value2]

будет делать то, что вы хотите.

3 голосов
/ 04 декабря 2011

Если вы делаете вместо

f[variable_] := (
            {calculations,
            many lines of calcalutions,
            many lines of calcalutions,
            (* some comments *);
            (* finally the result... *);
            result}
         )

тогда ваша функция вернет список {ir1,ir2,...,result}, где ir1 и т. Д. Являются промежуточными результатами. Затем можно назначить {ir1,ir2,..,re}=f[value], после чего re будет содержать конечный результат, а ir - промежуточные результаты.

Это работает?

2 голосов
/ 05 декабря 2011

вы также можете сделать intRes={}; вне функции и внутри функции сбросить значения в нее. Конечно, это сложно, если вы используете распараллеливание внутри своей функции или распараллеливаете всю функцию.

AppendTo[intRes,ir1];
AppendTo[intRes,ir2];

или

f[variable_] := Block[{output={}},
                      calculations;   
                      AppendTo[output,ir1];
                      many lines of calcalutions;   
                      (* some comments *);  
                      AppendTo[output,ir2]; 
                      (* finally the result... *);   
                      {output,result}];

и выполнить как {intRes,result}=f[var]; - intRes будет списком промежуточных результатов.

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

Для более медленных функций используйте Monitor[] или Dynamic[] или PrintTemporary[] или ProgressIndicator[]
Результаты этих выходов изменяются и / или исчезают по мере выполнения функции.

Если вы хотите более постоянную запись (скажем, функция работает очень быстро), используйте Print [], чтобы увидеть промежуточный вывод.

Если конечно вам не нужны промежуточные результаты в вычислениях.

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