Страница 1 из 1

автоматический пересчёт ноутбука

Добавлено: Вс дек 12, 2010 2:54 pm
ice-9
можно ли как-то заставить весь ноутбук автоматически пересчитываться через определённый интервал времени?
заместо человека с секундомером и ctrl+a, shift+enter (:

заранее спасибо

Добавлено: Вс дек 12, 2010 6:04 pm
Gordon
Вот так

Код: Выделить всё

Dynamic[Refresh[FrontEndExecute[FrontEndToken["EvaluateNotebook"]],
  UpdateInterval -> 10]]
DateString[]
FrontEndExecute[FrontEndToken["EvaluatorAbort"]];

или

Код: Выделить всё

Dynamic[FrontEndExecute[FrontEndToken["EvaluateNotebook"]]]
...
Pause[10]

Добавлено: Вс дек 19, 2010 3:46 pm
ice-9
большое спасибо, работает.

но теперь другая проблема: в процессе циклирования, mathematica забирает куда-то оперативную память. я там наугад навставлял ClearSystemCache[] и $HistoryLength=0, но теперь уже не Kernel, а оболочка подгребает постепенно под себя оперативку.

прошу прощения за чайницкие вопросы, и заранее спасибо за ц.у.

Добавлено: Вс дек 19, 2010 9:35 pm
Gordon
Скажите лучше зачем вам такое нужно?

Добавлено: Пн дек 20, 2010 9:27 am
ice-9
это глубоко личный вопрос (:
на большой физической установке, надо в режиме онлайн обрабатывать некие результаты измерений. пока опытные в программировании товарищи отвлекутся от своих животрепещущих задач, напишут соответствующий софт, и отловят все физические ошибки - поседеть можно, поэтому в качестве костыля временно хочется пользоваться тем, что я на коленке умею делать.

ну так чё, можете посоветовать что-нибудь? кроме как выпить яду.

Добавлено: Пн дек 20, 2010 12:43 pm
Gordon
Тут решается СЛ уравнений, которые каждые две сек. генерируются и заменяют предыдущие.

Код: Выделить всё

n = 7;
Dynamic[MatrixForm[data = RandomInteger[{-10, 10}, {n + 1, n}]],
 UpdateInterval -> 2]
Dynamic[MatrixForm[res = LinearSolve[data[[;; n]], data[[n + 1]]]]]
Dynamic[ListPlot[res, Joined -> True, PlotRange -> {-10, 10}]]
Dynamic[chk = data[[;; n]].res - data[[n + 1]]]

Добавлено: Пн дек 20, 2010 2:14 pm
ice-9
всё это весьма элегантно, но неясно как соотносится с моим вопросом.
вы советуете все команды засунуть в Dynamic[], вместо того чтобы пересчитывать ноутбук? это было бы довольно неудобно (ноутбук большой). в вашем примере я вижу, что нумерация in-out не растёт, в отличие от предыдущих рецептов. захватывается ли память - пока не понял. кроме того у вас вообще весь пример в один cell упихан, насколько это критично - тоже непонятно.

Добавлено: Пн дек 20, 2010 7:42 pm
Gordon
Это был еще один ответ на первый вопрос про автоматический пересчет. Тут он будет происходить сразу после изменения каких-либо исходных данных.
Если все вычисления-формулы объединить в одну ячейку, то можно обойтись и одним Dynamic-ом

Код: Выделить всё

n = 7;
Dynamic[TableForm@{MatrixForm[
    data = RandomInteger[{-10, 10}, {n + 1, n}]],
   MatrixForm[res = LinearSolve[data[[;; n]], data[[n + 1]]]],
   ListPlot[res, Joined -> True, PlotRange -> {-10, 10},
    ImageSize -> 400],
   {chk = data[[;; n]].res - data[[n + 1]]}}, UpdateInterval -> 2]


Этот вариант мне кажется стабильнее, чем тот что в первом сообщении, эмулирующий ctrl+a, shift+enter.
Что там с памятью не знаю, может у вас там накопления типа a*=b или еще что, которые при многократном пересчете отнимают все больше памяти.
Если каждый новый расчет не зависит от предыдущего, то можно вставить в начало после динамика Remove["Global`*"].

Добавлено: Пн дек 20, 2010 8:03 pm
ice-9
расчёт не зависит от предыдущего, все входные данные каждый раз вычитываются из файлов.

спасибо, попробую. скорее всего, не поможет: память поедает не Kernel (после того как вставлено HistoryLength). если вообще всё тормознуть и закрыть ядро, подмятая в процессе расчётов (а я уже чё-то начинаю сомневаться что расчёты входят в задачу. надо бы понаблюдать что делает просто открытое окно) оболочкой память - не освобождается. я понятия не имею что происходит, но ситуация, похоже, тупиковая. ваш пример, к слову, который систему уравнений решает, тоже потихоньку-потихоньку, память занимает, как оказалось при длительном наблюдении.

в этой связи вот какой дурацкий вопрос: есть ли команда, которая закрывает математику? именно не ядро (Exit[]), а оболочку.