1. Если имя параметра функции передаваемой в качестве фактического значения аргумента функции Test [т.е. имя переменного верхнего предела] фиксировано
Код:
> Test:=proc(a::function)
evalf(subs(psi=3, a));
end proc:
> Test(Int(x, x=1..psi));
4.
2. Примечание. A. Если возвращаемый результат не обязательно должен быть с плавающей точкой, то используют value в том месте, где Вы применили evalf. B. Непонятно зачем аргумент описан как function.
Код:
> Test:=proc(Intergal)
value(subs(psi=3, Intergal));
end proc:
> MyInt:= Test(Int(x, x=1..psi));
> evalf(MyInt);
MyInt:= 4
4.
Добавлено спустя 1 час 42 минуты 52 секунды:3. Уточнение к п. 2.B. Причину моего непонимания таким описанием аргумента можно проиллюстрировать следующим
Код:
> f:= Int(x, x=1..3):
> type (f, 'function');
true
Т.е. Maple считает оператор Int(x, x=1..3) — функцией. Однако в математическом анализе принято считать Int(x, x=1..3) вещественным числом, а не функцией. Что, в таком случае нам дает такое описание аргумента процедуры?
4.
Для справки. В Maple, как минимум до 10-ой версии включительно, описание аргументов используется только для проверки соответствия типов фактических значений аргументов типам формальных аргументов. Это выполняется с целью избежания некорректного использования функций (или их неверного выполнения — это с какой стороны смотреть). Также типизацию рекомендуется делать во имя совместимости с будущими версиями. Однако несовместимость версий Maple столь велика, а нововведения порой столь неожиданны для непосвященных, что надеяться на совместимость с отдаленными версиями — не приходится.]
Добавлено спустя 1 час 54 секунды:5.
Дополнение. Если уже описывать типы — то все (и возвращаемого значения). Я бы так переписал пример, приведенный в открывающем тему сообщении
Код:
> f:= (z) -> Int(x, x=1..z):
> g:= (u) -> Int(x^2, x=1..u):
> Test:=proc(Intergal::procedure)::float;
evalf(Intergal(3));
end proc:
> Test(f); Test(g);
4.
8.666666667
Конечно, теперь вызов Test(Int((x, x=1..z))) приведет к генерации ошибки: “Error, invalid input: Test expects its 1st argument, Intergal, to be of type procedure, but received Int(x,x = 1 .. z)”.
Добавлено на следующий день6. Приведенный в п.2 вариант решения предполагает отличие переменной интегрирования от верхнего предела интегрирования. Например, в следующем случае получим ошибку времени выполнения
Код:
> Test:=proc(a::function)
evalf(subs(psi=3, a));
end proc;
> Test(Int(psi, psi =1..psi));
Error, (in evalf/int) invalid arguments
Аналогично
Код:
> Test:=proc(a::function)
value(subs(psi=3, a));
end proc:
> Test(Int(psi, psi=1..psi));
Error, (in int) wrong number (or type) of arguments
Чтобы избежать подобных ситуаций можно поступить так
Код:
> Test:=proc(a::function)
value(eval(a, psi=3));
end proc:
> Test(Int(psi, psi=1.. psi));
4
Для подстановки значений параметров в интеграл используется именно eval, а не subs. Среди обрисованных способов подход п. 5 мне нравится больше.