Error final value in for loop must be numeric or character

Error, final value in for loop must be numeric or character Description Examples See Also Description The terminal condition in a for loop must be a numeric value, except when iterating over the letters in a string where a character is accepted. Examples...

Error, final value in for loop must be numeric or character

Description

Examples

See Also

Description

The terminal condition in a for loop must be a numeric value, except when iterating over the letters in a string where a character is accepted.


Examples

Example 1

Note that n has no value.


for i from 1 to n do     sinπ2⋅iend do;

Error, final value in for loop must be numeric or character

Solution:

Define n  to correct this error.


n≔4

n:=4

(2.1)

for i from 1 to n do     sinπ2⋅iend do;

1

0

−1

0

(2.2)

Example 2

In this example x is set to 13−j where j has no value.


G≔procx      local i≔1;      to x do           i≔i⋅x      end do  end proc:


G13−j

Error, (in G) final value in for loop must be numeric or character

Solution:

As with the previous example, define  to correct this error.


j≔7

j:=7

(2.3)

G13−j

46656

(2.4)

Example 3

Here is not initialized to a numeric value.


for n to N−1 do      xn+1 ≔ xn+Δxn; yn+1 ≔ yn+Δyn  end do;

Error, final value in for loop must be numeric or character

Solution:

Initialize N.


N≔5

N:=5

(2.5)

for n to N−1 do      xn+1 ≔ xn+Δxn; yn+1 ≔ yn+Δyn  end do;

x2:=x1+Δx⁡1

y2:=y1+Δy⁡1

x3:=x1+Δx⁡1+Δx⁡2

y3:=y1+Δy⁡1+Δy⁡2

x4:=x1+Δx⁡1+Δx⁡2+Δx⁡3

y4:=y1+Δy⁡1+Δy⁡2+Δy⁡3

x5:=x1+Δx⁡1+Δx⁡2+Δx⁡3+Δx⁡4

y5:=y1+Δy⁡1+Δy⁡2+Δy⁡3+Δy⁡4

(2.6)


See Also

loops

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

Maple’s usual evaluation model is that arguments passed to commands are evaluated up front, prior to the computation done within the body of the command’s own procedure.

So if you pass test(x) to the plot command then Maple will evaluate that argument test(x) up front, with x being simply a symbolic name.

It’s only later in the construction of the plot that the plot command would substitute actual numeric values for that x name.

So, the argument test(x) is evaluated up front. But let’s see what happens when we try such an up front evaluation of 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

We can see that your test procedure is not set up to receive a non-numeric, symbolic name such as x for its own argument.

In other words, the problem lies in what you are passing to the plot command.

This kind of problem is sometimes called «premature evaluation». It’s a common Maple usage mistake. There are a few ways to avoid the problem.

One way is to utilize the so-called «operator form» calling sequence of the plot command.

plot(test, 1..10);

Another way is to delay the evaluation of test(x). The following use of so-called unevalution quotes (aka single right ticks, ie. apostrophes) delays the evaluation of test(x). That prevents test(x) from being evaluated until the internal plotting routines substitute the symbolic name x with actual numeric values.

plot('test(x)', x=1..10);

Another technique is to rewrite test so that any call to it will return unevaluated unless its argument is numeric.

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);

I won’t bother showing the actual plots here, as your example produces just the plot of the constant 1 (one).

всем привет. пишу курсовую работу по теме «проектирование цифрового фильтра». В программе есть 1на маленькая ошибка, если поможете мне ее устранить, то в далььнейшем проблем с курсовой не будет.
текст программы:

Код

restart:with(plots):Warning, the name changecoords has been redefined

> N:=64;

                               N := 64

> fs:=10000;

                             fs := 10000

> fl:=2300;

                              fl := 2300

> fh:=2700;

                              fh := 2700

> m:=10;

                               m := 10

> T:=2^m-1;
> 

                              T := 1023

> F1:=evalf(fl/fs);

                          F1 := 0.2300000000

> F2:=evalf(fh/fs);

                          F2 := 0.2700000000

> Dirac(0):=1;

                            Dirac(0) := 1

> 
> fp1:=2*Pi*F1; 
> fp2:=2*Pi*F2;

                        fp1 := 0.4600000000 Pi


                        fp2 := 0.5400000000 Pi

> g:=(sin(t*fp2)-sin(t*fp1))/(t*Pi);

              sin(0.5400000000 t Pi) - sin(0.4600000000 t Pi)
         g := -----------------------------------------------
                                   t Pi

> Ñ := (n) -> limit(g,t=n); h := aray(0..N); N2:=N/2;

                         Ñ := n ->  lim    g
                                   t -> n


                          h := aray(0 .. 64)


                               N2 := 32

> for n from 0 to N2 do h[N2-n]:= evalf(C(n)); h[N2+n]:=h[N2-n]; od:
> õ:=array[-N..Ò]: y:=array(0..T):
> for n from -N to -1 do x[n]:=0; od:
> for n from 0 to Ò do x[n]:=Dirac(n); od:
Error, final value in for loop must be numeric or character

> for n from 0 to Ò do y[n] := sum(h[k]*x[n-k], k=0..N); od:
Error, final value in for loop must be numeric or character

Добавлено через 1 минуту
а,все.. понял в чем косяк, просите за отнятое время

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

Nusha341

Сообщения: 5
Зарегистрирован: Ср мар 06, 2019 10:32 am

Ошибка в построении массива решений дифференциальной системы

Добрый день!
Подскажите, пожалуйста, что я делаю не так.
Решаю систему дифференциальных уравнений. dsol:=dsolve({sys,ic}),numeric,method=ck45,maxfun=500000);
Задаю период, количество точек, шаг
for i from 0 to N do ds:=dsol(h*i); T[i]:=rhs(ds[1]); X[i]:=rhs(ds[2]); Y[i]:=rhs(ds[3]) od;
Все работает. Все точки выводятся
Следующая задача вывести точки через период.
M:=30;-количество периодов
L:=M*T;
for k from 0 to L do ds:=dsol(T*k); T[k]:=rhs(ds[1]); X[k]:=rhs(ds[2]); Y[k]:=rhs(ds[3]) od;
Ошибка
Error, final value in for loop must be numeric or character
L у меня число(2/5*pi). Непонятно, что исправить, чтобы заработало
Спасибо!


Markiyan Hirnyk

Сообщения: 1366
Зарегистрирован: Вс дек 04, 2011 11:07 pm

Re: Ошибка в построении массива решений дифференциальной системы

Сообщение Markiyan Hirnyk » Вс мар 31, 2019 10:04 am

Вот упрощенная версия вашей проблемы и один из возможных способов ее решения:

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

restart; L := 20*Pi; for k from 0 to L do print(k) end do;
Error, final value in for loop must be numeric or character
L := floor(20*Pi); for k from 0 to L do print(k) end do;


Nusha341

Сообщения: 5
Зарегистрирован: Ср мар 06, 2019 10:32 am

Re: Ошибка в построении массива решений дифференциальной системы

Сообщение Nusha341 » Вс мар 31, 2019 11:25 am

Спасибо за совет
Действительно работает. Но это очень сильная погрешность
Я в итоге по вашему примеру просто заменила Pi=3,14. Погрешность меньше, но тоже работает.
Спасибо!



Nusha341

Сообщения: 5
Зарегистрирован: Ср мар 06, 2019 10:32 am

Re: Ошибка в построении массива решений дифференциальной системы

Сообщение Nusha341 » Ср апр 17, 2019 10:49 pm

Я грубо сказала, но получается, что мы вместо, например, 5.67 получим 6. А когда у нас цифры колебаются от 5 до 6, то точность до целых будет не показательна


Markiyan Hirnyk

Сообщения: 1366
Зарегистрирован: Вс дек 04, 2011 11:07 pm

Re: Ошибка в построении массива решений дифференциальной системы

Сообщение Markiyan Hirnyk » Чт апр 18, 2019 6:36 am

Nusha341, Вы пишете

что мы вместо, например, 5.67 получим 6.

Во первых, целая часть 5.67 равна 5, а не 6. Далее, в Мэйпле

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

sum(f(n), n = 1 .. 5.67);
                f(1) + f(2) + f(3) + f(4) + f(5)
sum(f(n), n = 1 .. 5);
                f(1) + f(2) + f(3) + f(4) + f(5)

Если у Вас еще имеются недоуменные вопросы, пожалуйста, задавайте их.


У меня есть эта простая процедура в 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

Пожалуйста помоги

2 ответа

Обычная модель оценки 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.

Такую проблему иногда называют «преждевременной оценкой». Это распространенная ошибка использования Maple. Есть несколько способов избежать проблемы.

Один из способов — использовать так называемую «форму оператора» последовательности вызова команды 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 (один).


2

acer
30 Авг 2021 в 14:39

@acer уже говорил о технической проблеме, но в вашем случае может быть проблема математическая. Областью определения вашей функции являются натуральные числа, то есть множество положительных целых чисел {1, 2, 3, 4, 5, …}, а не множество действительных чисел! Как вы интерпретируете выполнение цикла for до реального числа, например, Pi или sqrt (2) до 5/2? Почему я говорю о реальных числах? Потому что в своей сюжетной линии вы использовали plot( text(x), x = 1..10 ). x=1..10 в plot обозначает x на действительном интервале (1, 10), а не целочисленном наборе {1, 2, …, 10}! Есть два способа сделать его осмысленным.

  1. Вы имели в виду функцию с целым доменом? Тогда ваш сюжет должен представлять собой набор точек. В этом случае вам нужен точечный график, вы можете использовать plots:-pointplot или добавить параметр style=point в plot. Смотрите их справочные страницы для более подробной информации. Вот самое простое редактирование вашей сюжетной линии (сохранение части определения test такой же, как в вашем посте).
plot( [ seq( [n, test(n)], n = 1..10 ) ], style = point );

А сюжетный результат следующий.

enter image description here

  1. В вашей функции вы хотите, чтобы цикл for выполнялся до тех пор, пока целое число не будет связано с действительным числом, например его полом? Это то, что делает цикл for в Maple по умолчанию. См. следующий пример.
t := 0:
for i from 1 by 1 to 5/2 do
    t := t + 1:
end do;

Как вы можете видеть, Maple делает два шага, один для i=1 и один для i=2, он обрабатывается буквально как for i from 1 by 1 to floor(5/2) do, и это поведение по умолчанию не для каждого действительного числа, если вы замените 5/2 от sqrt(2) или Pi, Maple вместо этого выдаст вам сообщение об ошибке. Но в любом случае исправление, которое @acer предоставил для вашего кода, отображает функцию «x -> test (floor (x))» в вашем случае, когда x исходит из рациональных чисел (и чисел с плавающей запятой ^_^). Если вы измените свой код вместо того, чтобы возвращать постоянное число, вы также увидите его на своем графике. Например, попробуем следующее.

test := proc(n)
  local i,t:
  if not type(n, numeric) then
    return 'procname'(args):
  end if:
  t := 0:
  for i from 1 to n do
    t := t + 1:
  end do:
  return(t):
end:
plot(test(x), x=1..10);

Вот сюжет.

enter image description here

Это действительно «x -> test(floor(x))».


0

AmirHosein Sadeghimanesh
5 Июн 2022 в 08:53

Понравилась статья? Поделить с друзьями:
  • Error filter addon
  • Error files missing from job please recheck что делать
  • Error filehoster under maintenance перевод
  • Error file write operation failed что делать
  • Error file ui uixmlinit cpp