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.