Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.
Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.
Если ваш код вызывает процедуру с теми же аргументами несколько раз, избегайте ненужных переоценок, и таким образом, улучшайте производительность. Вместо нескольких оценок вызова процедуры с теми же аргументами MuPAD® может сохранить результаты первого вызова процедуры в специальной таблице. Эта таблица называется помнить таблицей. Система хранит аргументы вызова процедуры как индексы помнить записей таблицы и соответствующие результаты как значения этих записей. Когда вы вызываете процедуру с помощью тех же аргументов в качестве в предыдущих вызовах, MuPAD получает доступ к помнить таблице той процедуры. Если помнить таблица содержит запись с обязательными аргументами, MuPAD возвращает значение той записи. В противном случае MuPAD оценивает вызов процедуры и пишет аргументы и соответствующие результаты к помнить таблице процедуры.
Используя помнить механизм в MuPAD может значительно ускорить ваши вычисления, особенно когда вы используете рекурсивные вызовы процедуры. Например, создайте процедуру, которая вычисляет числа Лукаса. Числа Лукаса являются последовательностью целых чисел. Формула рекурсии, которая задает n
th номер Лукаса, подобна определению Чисел Фибоначчи:
Рекурсивная процедура выполнения возвращает любой номер Лукаса:
lucas:= proc(n:Type::PosInt) begin if n = 1 then 1 elif n = 2 then 3 else lucas(n - 1) + lucas(n - 2) end_if end_proc:
Однако, если значение, n
является большим, вычисляя n
th номер Лукаса, может быть очень медленным. Количество необходимых вызовов процедуры экспоненциально. Часто, вызовы процедуры самостоятельно с теми же аргументами, и это переоценивает результат в каждом вызове:
time(lucas(35))
Используя помнить механизм устраняет эти переоценки. Чтобы включить помнить механизм для конкретной процедуры, используйте функцию prog::remember
. Эта функция возвращает измененную копию процедуры, которая хранит результаты предыдущих вызовов в помнить таблице:
lucas := prog::remember(lucas):
Когда вы вызываете эту процедуру, MuPAD получает доступ к помнить таблице. Если система находит необходимую запись в помнить таблице, это возвращается сразу, помнил результаты. Теперь, MuPAD вычисляет 35-е и даже 100-й номер Лукаса почти немедленно:
time(lucas(35)), time(lucas(100))
Также можно включить помнить механизм для конкретной процедуры при помощи опции remember
для той процедуры. Например, используйте опцию remember
, чтобы включить помнить механизм для процедуры lucas
:
lucas:= proc(n:Type::PosInt) option remember; begin if n = 1 then 1 elif n = 2 then 3 else lucas(n - 1) + lucas(n - 2) end_if end_proc:
Для дальнейших вычислений удалите процедуру lucas
:
delete lucas:
По умолчанию помнить механизм не рассматривает контекстной информации вызова процедуры. Таким образом помнить механизм игнорирует любые изменения в наборе предположений на аргументах вызова процедуры и количестве цифр, используемых для арифметики с плавающей точкой. По умолчанию помните, что таблицы содержат только аргументы и результаты вызовов процедуры. Они не хранят контекстную информацию. Например, создайте функциональный f
, который вычисляет обратную величину номера. Используйте prog::remember
, чтобы включить помнить механизм для этой функции:
f := (x)-> 1.0/x: f := prog::remember(f):
Количество по умолчанию значительных цифр для чисел с плавающей запятой равняется 10. Используйте функциональный f
, чтобы вычислить обратную величину 3. Система отображает результат с точностью с 10 цифрами:
f(3)
Теперь увеличьте число цифр к 50. Затем вызовите функциональный f
с аргументом 3 снова. По умолчанию MuPAD не понимает, что вы увеличили требуемую точность. Система получает доступ к помнить таблице, находит запись, которая соответствует аргументу 3 и возвращает результат, ранее вычисленный для того аргумента. Поскольку MuPAD должен отобразить вывод с 50 цифрами, последние цифры в отображенном результате являются неправильными:
DIGITS := 50: f(3)
Для дальнейших вычислений восстановите значение по умолчанию DIGITS
и удалите f
:
delete DIGITS, f
Несмотря на то, что по умолчанию помнить механизм в MuPAD игнорирует всю контекстную информацию, можно расширить вызов функции prog::remember
и учесть свойства аргументов и текущую точность арифметики с плавающей точкой. Например, создайте функциональный f
, который вычисляет обратную величину номера. Используйте prog::remember
, чтобы включить помнить механизм для этой функции. В вызове функции prog::remember
задайте функцию зависимости. Функция зависимости является функцией, которая вычисляет текущие свойства входных параметров и значения DIGITS
и ORDER
. Затем prog::remember
сравнивает эту контекстную информацию с контекстной информацией, используемой, чтобы вычислить помнившие значения. Если контекстной информацией является то же самое, prog::remember
возвращает помнивший результат. В противном случае MuPAD оценивает текущий вызов процедуры и добавляет новый результат в помнить таблицу.
Опция remember
не позволяет вам задать функцию зависимости. Если результаты процедуры зависят от контекстной информации, используйте функцию prog::remember
для той процедуры.
В этом примере функция зависимости является списком, который проверяет и свойства входных параметров и значение DIGITS
:
f := (x)-> 1.0/x: f := prog::remember(f, () -> [property::depends(args()), DIGITS]):
Количество по умолчанию значительных цифр для чисел с плавающей запятой равняется 10. Используйте функциональный f
, чтобы вычислить обратную величину 3. Система отображает результат с точностью с 10 цифрами:
f(3)
Если вы определяете номер цифр к 50, и затем вызываете функциональный f
с тем же аргументом 3, prog::remember
понимает, что количество цифр изменилось. Вместо того, чтобы возвратить предыдущий результат, сохраненный в помнить таблице, система переоценивает результат и обновляет помнить таблицу:
DIGITS := 50: f(3)
Для дальнейших вычислений восстановите значение по умолчанию DIGITS
и удалите f
:
delete DIGITS, f
В некоторых случаях помнить механизм может привести к неправильным результатам. Например, если вложенная процедура использует помнить механизм, и вы переопределяете внутреннюю процедуру, MuPAD не распознает изменений и не переоценивает вызов процедуры.
Создайте следующую процедуру f
как обертка для функции MuPAD heaviside
. Используйте prog::remember
, чтобы включить помнить механизм для процедуры f
:
f := proc(x) begin heaviside(x) end: f := prog::remember(f):
Теперь вычислите функцию Heaviside для значений-10, 0, и 10. MuPAD использует значение heaviside(0)=1/2
:
f(-10), f(0), f(10)
Можно задать различное значение для heaviside(0)
. Во-первых, используйте функцию unprotect
, чтобы смочь перезаписать значение heaviside
. Затем присвойте новое значение heaviside(0)
:
unprotect(heaviside): heaviside(0):= 0:
Несмотря на новое значение heaviside(0) = 0
, процедура обертки f
возвращает старое значение 1/2:
f(0)
Результат вызова процедуры, который не изменяет f(0)
, потому что система не переоценивает этот результат. Это находит результат в помнить таблице процедуры f
и возвращает тот результат. Чтобы отобразить содержимое помнить таблицы, вызовите процедуру обертки f
с опцией Remember
в качестве первого аргумента и опции Print
в качестве второго аргумента. Значение 106 во втором столбце является значением MAXEFFORT
, используемого во время вычислений.
f(Remember, Print)
Чтобы обеспечить переоценку вызовов процедуры f
, очистите помнить таблицу той процедуры. Чтобы очистить помнить таблицу, вызовите f
с опцией Remember
в качестве первого аргумента и опции Clear
в качестве второго аргумента:
f(Remember, Clear):
Теперь f
возвращает правильный результат:
f(0)
Если вы используете опцию remember
, также можно очистить помнить таблицу и обеспечить переоценку. Например, перепишите процедуру f
можно следующим образом:
f := proc(x) option remember; begin heaviside(x) end: f(0)
Теперь восстановите функцию heaviside
к ее определению по умолчанию:
heaviside(0):= 1/2:
Чтобы очистить помнить таблицу, составленную опцией remember
, используйте функцию forget
:
forget(f): f(0)
Используйте функцию protect
с опцией ProtectLevelError
, чтобы предотвратить дальнейшие изменения в heaviside
. Кроме того, удалите процедуру f
:
protect(heaviside, ProtectLevelError): delete f
Помнить механизм является мощным инструментом для того, чтобы улучшать производительность процедур MuPAD. Тем не менее, можно столкнуться с некоторыми проблемами при использовании этого механизма:
Помните, что таблицы эффективны, только если время доступа помнить таблицы является значительно меньше, чем время должно было оценить результат. Если помнить таблица является очень большой, оценка может быть в вычислительном отношении более дешевой, чем доступ к результату, сохраненному в помнить таблице.
Большое хранение помнит, что таблицы требуют большого объема памяти. Особенно, помните таблицы, составленные с опцией, remember
может стать очень большим, и значительно уменьшать доступную память. Количество записей в помнит, что таблицы, составленные prog::remember
, ограничиваются. Когда количество записей в помнить таблице, составленной prog::remember
, достигает максимального количества, система удаляет группу более старых записей.
Используя prog::remember
или опцию remember
для непериодических вызовов процедуры может значительно уменьшить производительность кода. Избегайте использования помнить механизма для непериодических вызовов процедуры, особенно если аргументы являются числовыми.
Если вы изменяете свойства входных параметров или изменяете переменные DIGITS
или ORDER
, помнить механизм игнорирует эти изменения по умолчанию. Смотрите Результаты Запоминания Без Контекста.
В некоторых случаях необходимо очистить помнить таблицу процедуры, чтобы осуществить переоценку и избежать неправильных результатов. Например, очистка, помнить таблица может быть необходимой, когда процедура заменяет глобальные переменные или если глобальные переменные влияют на результаты процедуры. Смотрите, что Очистка Помнит Таблицы.
Многие предопределили функции MuPAD, сохранили специальные значения в их помнить таблицы. Поэтому очистка помнить таблицы предопределенных функций MuPAD не рекомендуется. Обратите внимание на то, что функция forget
не делает ошибки, когда вы вызываете его для предопределенной функции MuPAD.