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 обеспечивает дальнейшие примеры, включающие функциональные среды.

Примеры

Пример 1

Мы хотим ввести функциональный 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:

Пример 2

Предположим, что вы задали функциональный 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:

Параметры

f1

Произвольный объект MuPAD. Как правило, процедура. Это обрабатывает оценку вызова функции к функциональной среде.

f2

Процедура, обрабатывающая экран вывод символьных вызовов функции

slotTable

Таблица функциональных атрибутов (слоты)

Возвращаемые значения

Функциональная среда типа DOM_FUNC_ENV.

Алгоритмы

Математические функции, такие как exp, ln и т.д. или abs, Re, Im и т.д. реализован как функциональные среды.