#maple
Вопрос:
У меня есть эта простая процедура в Maple, которую я хочу построить.
test:=proc(n)
local i,t;
for i from 1 to n do
t:=1;
od;
return t;
end:
Сама процедура работает нормально.
> test(19)
1
Когда я хочу построить график, я получаю следующую ошибку:
> plot(test(x),x=1..10)
Error, (in test) final value in for loop must be numeric or character
Пожалуйста, помогите
Ответ №1:
Обычная модель оценки Maple заключается в том, что аргументы, передаваемые командам, оцениваются заранее, до вычисления, выполняемого в теле собственной процедуры команды.
Поэтому, если вы перейдете test(x)
к plot
команде, Maple сначала оценит этот аргумент test(x)
, x
просто указав символическое имя.
Только позже при построении графика plot
команда заменит это имя фактическими числовыми значениями x
.
Таким образом, аргумент test(x)
оценивается заранее. Но давайте посмотрим, что произойдет, когда мы попробуем провести такую предварительную оценку test(x)
.
test:=proc(n)
local i,t;
for i from 1 to n do
t:=1;
od;
return t;
end:
test(x);
Error, (in test) final value in for loop
must be numeric or character
Мы видим, что ваша test
процедура не настроена на получение нечислового символьного имени, например, x
для своего собственного аргумента.
Другими словами, проблема заключается в том, что вы передаете plot
команде.
Такого рода проблемы иногда называют «преждевременной оценкой». Это распространенная ошибка использования клена. Есть несколько способов избежать этой проблемы.
Один из способов-использовать так называемую последовательность вызова команды «форма оператора» plot
.
plot(test, 1..10);
Другой способ-отложить оценку test(x)
. Следующее использование так называемых кавычек неравномерности (они же одиночные правые галочки, т. е. апострофы) задерживает оценку test(x)
. Это test(x)
предотвращает оценку до тех пор, пока внутренние процедуры построения графиков не заменят символическое имя x
фактическими числовыми значениями.
plot('test(x)', x=1..10);
Другой метод состоит в том, чтобы переписать test
так, чтобы любой вызов к нему возвращался без оценки, если его аргумент не является числовым.
test:=proc(n)
local i,t;
if not type(n,numeric) then
return 'procname'(args);
end if;
for i from 1 to n do
t:=1;
od;
return t;
end:
# no longer produces an error
test(x);
test(x)
# the passed argument is numeric
test(19);
1
plot(test(x), x=1..10);
Я не буду утруждать себя показом реальных графиков здесь, так как в вашем примере получается только график константы 1 (один).