2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Передача функции в процедуру, Maple
Сообщение29.11.2008, 20:41 


10/06/06
26
г. Красногорск Московская обл.
Приветствую, 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 
Заслуженный участник


12/07/07
4529
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 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group