2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Передача функции в процедуру, Maple
Сообщение29.11.2008, 20:41 
Приветствую, All!
Хочу написать процедуру, которой в качестве параметра передается функция с параметром и в теле процедедуры эта функция вычисляется и ее значение возвращает процедура.
Я делаю так:

Код:

> restart;
> Test:=proc(a::function)
>    local psi;
>    psi:=3;
>
>    return evalf(a);
>
> end proc;
>

  Test := proc(a::function)
local psi;
    psi := 3; return evalf(a)
end proc

> Test(Int(x, x=1.. psi));

                                psi
                               /
                              |
                              |     x dx
                              |
                             /
                               1.


Т.е. если в теле процедуры параметру \psi присвоить какое-нибудь значение, то это значение присваивается локальной переменной, а не интегральному параметру.

 
 
 
 
Сообщение30.11.2008, 18:16 
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 мне нравится больше.

 
 
 [ Сообщений: 2 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group