Проблемы обработки параметров процедур

Форум пользователей пакета Maple

Модератор: Admin

imperfect
Сообщения: 8
Зарегистрирован: Ср окт 06, 2010 6:15 pm

Проблемы обработки параметров процедур

Сообщение imperfect » Пн ноя 29, 2010 5:42 pm

Опять же вопрос про хитрости с передачей параметров процедурам в Maple. Есть команда:

Код: Выделить всё

Student[Calculus1][ApproximateInt](x^(2*l1+2)*('Func(E1, l1, x)')^2, x = 0 .. 10, partition = 100)

Func(E1,l1,x) - функция от параметров E1 и l1, которым до вызова команды были присвоены правильные значения. Вылетает с ошибкой

Код: Выделить всё

Error, (in Student:-Calculus1:-ApproximateInt) invalid input: Func expects its 1st argument, E, to be of type numeric, but received E1

Если же убрать кавычки '' при вызове Func(), то получаем ошибку :

Код: Выделить всё

 Error, invalid input: Func expects its 3rd argument, R, to be of type numeric, but received x

как и следовало ожидать, т.к. maple пытается вычислить аргументы функции перед подстановкой. Как выйти из этой ситуации? Указанная процедура Func() используется как функция и по параметру E и по r в разных местах программы, так что избавиться от одного из них нельзя.

Kitonum
Сообщения: 2084
Зарегистрирован: Ср дек 31, 2008 1:55 pm
Откуда: г. Пенза

Re: Проблемы обработки параметров процедур

Сообщение Kitonum » Пн ноя 29, 2010 9:54 pm

imperfect писал(а):Опять же вопрос про хитрости с передачей параметров процедурам в Maple. Есть команда:

Код: Выделить всё

Student[Calculus1][ApproximateInt](x^(2*l1+2)*('Func(E1, l1, x)')^2, x = 0 .. 10, partition = 100)

Func(E1,l1,x) - функция от параметров E1 и l1, которым до вызова команды были присвоены правильные значения. Вылетает с ошибкой

Код: Выделить всё

Error, (in Student:-Calculus1:-ApproximateInt) invalid input: Func expects its 1st argument, E, to be of type numeric, but received E1

Если же убрать кавычки '' при вызове Func(), то получаем ошибку :

Код: Выделить всё

 Error, invalid input: Func expects its 3rd argument, R, to be of type numeric, but received x

как и следовало ожидать, т.к. maple пытается вычислить аргументы функции перед подстановкой. Как выйти из этой ситуации? Указанная процедура Func() используется как функция и по параметру E и по r в разных местах программы, так что избавиться от одного из них нельзя.

Вы, наверное, неправильно задали функцию. У меня всё считается корректно:

Func:=(E1,l1,x)->E1+l1+x: E1:=1: l1:=1:
Student[Calculus1][ApproximateInt](x^(2*l1+2)*Func(E1, l1, x)^2, x = 0 .. 10, partition = 100);


13919347922269/6400000

imperfect
Сообщения: 8
Зарегистрирован: Ср окт 06, 2010 6:15 pm

Сообщение imperfect » Пн ноя 29, 2010 11:18 pm

Функция задана так

Код: Выделить всё

Func := proc (E::numeric, L::integer, R::numeric) local a0, a1, a2, S, n, Z; Z := 1; a0 := 1; a1 := -Z/(L+1); a2 := -(2*a1*Z+2*E*a0)/(4*L+6); S := a0+a1*R+a2*R^2; for n from 3 while 0.1e-19 < abs(a2*R^(n-1)) or 0.1e-19 < abs(a1*R^(n-2)) do a0 := a1; a1 := a2; a2 := -(2*a1*Z+2*E*a0)/((2*L+1+n)*n); S := S+a2*R^n end do; return evalf(S) end proc
тип входных параметров указан явно

Kitonum
Сообщения: 2084
Зарегистрирован: Ср дек 31, 2008 1:55 pm
Откуда: г. Пенза

Сообщение Kitonum » Вт ноя 30, 2010 2:12 am

imperfect писал(а):Функция задана так

Код: Выделить всё

Func := proc (E::numeric, L::integer, R::numeric) local a0, a1, a2, S, n, Z; Z := 1; a0 := 1; a1 := -Z/(L+1); a2 := -(2*a1*Z+2*E*a0)/(4*L+6); S := a0+a1*R+a2*R^2; for n from 3 while 0.1e-19 < abs(a2*R^(n-1)) or 0.1e-19 < abs(a1*R^(n-2)) do a0 := a1; a1 := a2; a2 := -(2*a1*Z+2*E*a0)/((2*L+1+n)*n); S := S+a2*R^n end do; return evalf(S) end proc
тип входных параметров указан явно

При использовании Func ставьте штрихи так: 'Func'

imperfect
Сообщения: 8
Зарегистрирован: Ср окт 06, 2010 6:15 pm

Сообщение imperfect » Вт ноя 30, 2010 11:53 am

Со штрихами не работает, и без них тоже. Это описано в шапке темы. В том то и дело, что со штрихами не проходят первые переменные, а без них - x.

mois
Сообщения: 95
Зарегистрирован: Ср дек 09, 2009 9:04 pm

Сообщение mois » Вт ноя 30, 2010 3:33 pm

Я проверил предложение Kitonum. У меня тоже все работает с Вашей функцией:

Func := proc (E::numeric, L::integer, R::numeric) local a0, a1, a2, S, n, Z; Z := 1; a0 := 1; a1 := -Z/(L+1); a2 := -(2*a1*Z+2*E*a0)/(4*L+6); S := a0+a1*R+a2*R^2; for n from 3 while 0.1e-19 < abs(a2*R^(n-1)) or 0.1e-19 < abs(a1*R^(n-2)) do a0 := a1; a1 := a2; a2 := -(2*a1*Z+2*E*a0)/((2*L+1+n)*n); S := S+a2*R^n end do; return evalf(S) end proc:

E1:=1: l1:=1:

Student[Calculus1][ApproximateInt](x^(2*l1+2)*'Func'(E1, l1, x)^2, x = 0 .. 10, partition = 100);

1.551092718
Движение - все, конечная цель - ничто

imperfect
Сообщения: 8
Зарегистрирован: Ср окт 06, 2010 6:15 pm

Сообщение imperfect » Ср дек 01, 2010 1:58 pm

Большое спасибо Kitonum за ответ и mois что не поленились проверить! Сам бы точно не догадался. Maple не перестает удивлять: если поставить кавычки так 'Func(E,l,x)' то происходит описанная мною ошибка, если же так 'Func'(E,l,x) то все в порядке. Если кто-то знает, напишите, что пытается сделать программа в этих случаях

mois
Сообщения: 95
Зарегистрирован: Ср дек 09, 2009 9:04 pm

Сообщение mois » Ср дек 01, 2010 2:38 pm

Рассмотрим простой пример. Пусть дана функция:

f:=(x::integer)->x^2;

Теперь присвоим x нецелое значение:

x:=2.5;

При прямом обращение к функции с этим значением получаем ошибку, как и следовало ожидать:

f(x);

Error, invalid input: f expects its 1st argument, x, to be of type integer, but received 2.5

Когда все берем в кавычки, то вычисления функции не происходит и присвоение параметру х тоже не происходит. Т.е. в этом случае в Вашу процедуру числовые значения параметров не передаются.

'f(x)';

f(x)

Это эквивалентно следующей записи, когда имя функции и переменные отдельно взяты в кавычки:

'f'('x');

f(x)


Когда берем в кавычки только имя функции, то вычисления функции не происходит, но присвоение параметру х происходит, т.к. этот параметр не в кавычках. Т.е. в этом случае в Вашу процедуру числовые значения параметров передаются.

'f'(x);

f(2.5)
Движение - все, конечная цель - ничто