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
, expand
, float
и т.д. может быть сказан, как действовать на символьные вызовы функции к функциональной среде.
Для этого функциональная среда хранит специальные функциональные атрибуты (слоты) во внутренней таблице. Каждый раз, когда сверхзагружаемая системная функция, такая как diff
, expand
, 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
, print
и 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
.