Блокноты 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.