funcenv
Создайте функциональную среду
Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.
Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразуют Notebook MuPAD в Live скрипты MATLAB.
funcenv(f1
, <f2
>, <slotTable
>)
funcenv(f)
создает функциональную среду из f
.
funcenv
подачи для генерации функциональной среды доменного типа DOM_FUNC_ENV
.
С точки зрения пользователя функциональные среды похожи на процедуры и могут быть названы как любая функция MuPAD®.
Однако в отличие от простых процедур, функциональная среда позволяет тесную интеграцию в систему MuPAD. В частности, стандартные системные функции, такие как diff
расширение
, float
и т.д. может быть сказан, как действовать на символьные вызовы функции к функциональной среде.
Для этого функциональная среда хранит специальные функциональные атрибуты (пазы) во внутренней таблице. Каждый раз, когда сверхзагружаемая системная функция, такая как diff
расширение
, float
сталкивается с объектом типа DOM_FUNC_ENV
, его поисковые запросы функциональная среда для соответствующего паза. Если найдено, это вызывает соответствующий паз и возвращает значение, произведенное пазом.
Пазы могут быть включены в функциональную среду путем создания таблицы slotTable
и передача этого к funcenv
, когда функциональная среда создается. В качестве альтернативы функциональный slot
может использоваться, чтобы добавить дальнейшие пазы в существующую функциональную среду.
Смотрите Пример 1 ниже для получения дополнительной информации.
Первый аргумент f1
из funcenv
определяет оценку вызовов функции. С f:= funcenv(f1)
, вызов f(x)
возвращает результат f1(x)
. Обратите внимание на то, что вызовы формы f:= funcenv(f)
возможны (и, на самом деле, типичны). Этот вызов встраивает процедуру f
в функциональную среду того же имени. Исходная процедура f
хранится внутренне в функциональной среде f
. После этого вызова дальнейшие функциональные атрибуты могут быть присоединены к f
через slot
функция.
Второй аргумент f2
из funcenv
определяет экран выход символьных вызовов функции. Рассмотрите f:= funcenv(f1, f2)
. Если вызов f(x)
возвращает символьный вызов функции f(x)
с 0-th операндом f
, затем f2
называется: возвращаемое значение f2(f(x))
используется в качестве экрана выход f(x)
.
Остерегайтесь: f2(f(x))
не должен приводить к результату, содержащему дальнейший символьный вызов f
, потому что это приведет к бесконечной рекурсии, вызывая сообщение об ошибке.
Третий аргумент slotTable
из funcenv
таблица, содержащая функциональные атрибуты (пазы). Таблица должна использовать строки в качестве индексов, чтобы обратиться к системным функциям. Например,
slotTable := table("diff" = mydiff, "float" = myfloat): f := funcenv(f1, f2, slotTable):
присоединяет функции паза mydiff
и myfloat
к f
. Они вызваны системными функциями diff
и float
, соответственно, каждый раз, когда они сталкиваются с символьным выражением f(x)
с 0-th операндом f
. Внутренняя таблица паза может быть изменена или заполнена дополнительными функциональными атрибутами через функциональный slot
.
Если первый аргумент f1
из funcenv
самостоятельно функциональная среда, затем возвращаемое значение является физической копией f1
.
Документация float
печать
, и slot
обеспечивает дальнейшие примеры, включающие функциональные среды.
Мы хотим ввести функциональный f
это представляет решение дифференциального уравнения. Во-первых, мы задаем функциональный f
, который отвечает на любой звонок f(x)
символически:
f := proc(x) begin procname(args()) end_proc: f(x), f(3 + y)
Из-за дифференциального уравнения, производных f
может быть переписан в терминах f
. Как мы можем сказать системе MuPAD дифференцировать символьные вызовы функций, такие как f(x)
соответственно? Для этого мы сначала должны встроить процедуру f
в функциональную среду:
f := funcenv(f):
Функциональная среда ведет себя как исходная процедура:
f(x), f(3 + y)
Системные функции, такие как diff
все еще обработайте символьные вызовы f
как вызывает к неизвестным функциям:
diff(f(x + 3), x)
Однако как функциональная среда, f
может получить атрибуты та перегрузка системные функции. Следующий slot
вызовите присоединяет фиктивный "diff"
припишите f
:
f::diff := mydiff: diff(2*f(x^2) + x, x)
Мы присоединяем более значимый "diff"
припишите f
это на основе. Обратите внимание на то, что произвольные вызовы diff(f(y), x1, x2, ..)
должны быть обработаны этим пазом:
fdiff := proc(fcall) local y; begin y:= op(fcall, 1); (y + sin(y)*f(y))*diff(y, args(2..args(0))) end_proc: f := slot(f, "diff", fdiff):
Теперь, насколько дифференцирование затронуто, функциональный f
полностью интегрирован в MuPAD:
diff(f(x), x), diff(f(x), x, x)
diff(sin(x)*f(x^2), x)
Поскольку Разложение Тейлора вокруг конечных точек только должно оценить производные, также Разложения Тейлора f
может быть вычислен:
taylor(f(x^2), x = 0, 9)
delete f, fdiff:
Предположим, что вы задали функциональный f
это может возвратить себя символически, и вы хотите такие символьные выражения формы f(x,...)
быть распечатанным специальным способом. С этой целью встройте свой proceduref
в функциональной среде и предоставлении выходная процедура в качестве второго аргумента к соответствующему funcenv
вызвать. Каждый раз, когда выражение формы f(x,...)
должен быть распечатан, выходная процедура будет вызвана аргументами x,...
из выражения:
f := funcenv(f, proc(x) begin if nops(x) = 2 then "f does strange things with its arguments ". expr2text(op(x, 1))." and ".expr2text(op(x,2)) else FAIL end end):
delete a, b: print(f(a, b)/2): print(f(a, b, c)/2):
delete f:
|
Произвольный объект MuPAD. Как правило, процедура. Это обрабатывает оценку вызова функции к функциональной среде. |
|
Процедура, обрабатывающая экран выход символьных вызовов функции |
|
Таблица функциональных атрибутов (пазы) |
Функциональная среда типа DOM_FUNC_ENV
.