Error, final value in for loop must be numeric or character
|
|
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.
Solution: Define n to correct this error.
Example 2 In this example x is set to 13−j where j has no value.
Solution: As with the previous example, define j to correct this error.
Example 3 Here N is not initialized to a numeric value.
Solution: Initialize N.
|
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}! Есть два способа сделать его осмысленным.
- Вы имели в виду функцию с целым доменом? Тогда ваш сюжет должен представлять собой набор точек. В этом случае вам нужен точечный график, вы можете использовать
plots:-pointplot
или добавить параметрstyle=point
вplot
. Смотрите их справочные страницы для более подробной информации. Вот самое простое редактирование вашей сюжетной линии (сохранение части определенияtest
такой же, как в вашем посте).
plot( [ seq( [n, test(n)], n = 1..10 ) ], style = point );
А сюжетный результат следующий.
- В вашей функции вы хотите, чтобы цикл 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);
Вот сюжет.
Это действительно «x -> test(floor(x))».
0
AmirHosein Sadeghimanesh
5 Июн 2022 в 08:53