Ошибка Maple: конечное значение в цикле for должно быть числовым или символьным

#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 (один).