Уровень оценки

Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.

Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразуют Notebook MuPAD в Live скрипты MATLAB.

Что такое уровень оценки?

Значение идентификатора может содержать произвольные объекты MuPAD®, включая идентификаторы. Если значение идентификатора содержит другой идентификатор, MuPAD пытается найти значение того второго идентификатора. Если значение того второго идентификатора также содержит идентификаторы, MuPAD пытается найти их значения и так далее. Как правило, оценка продолжается, пока система не заменяет все идентификаторы, которые имеют значения этими значениями. Конечный результат может содержать идентификаторы, которые не имеют присвоенных значений. Этот рекурсивный процесс оценки называется полной оценкой. Каждый шаг оценки в этом рекурсивном процессе является уровнем оценки. Например, оцените значение идентификатора y:

y := a + x: a := 1: y

Получившееся выражение x + 1 полная оценка y. level функция демонстрирует каждый шаг этой рекурсивной оценки. Нулевой уровень оценки возвращает идентификатор y самостоятельно:

level(y, 0)

Первый уровень получает доступ к значению идентификатора и возвращает то значение:

level(y, 1)

Когда вы оцениваете y до второго уровня система распознает что выражение x + a содержит идентификаторы, которые могли также присвоить значения. При поиске этих значений система находит что идентификатор a имеет значение 1, и идентификатор x не имеет присвоенного значения:

level(y, 2)

В этом примере MuPAD полностью оценивает идентификатор y при помощи всего двух шагов оценки. Оценка y до третьих и более высоких уровней возвращает то же выражение:

level(y, 3)

delete a, x, y

Неполные оценки

MuPAD не всегда оценивает идентификаторы полностью. Для некоторых выражений полная оценка требует огромного количества шагов. Чтобы избежать очень длинных или бесконечных оценок, система реализует две переменные окружения, LEVEL и MAXLEVEL. Эти переменные ограничивают уровни оценки. Если текущий уровень оценки превышает ограничение, установленное этими переменными, MuPAD останавливает процесс оценки, прежде чем система сможет заменить все идентификаторы их присвоенными значениями.

Переменная окружения LEVEL предельные уровни оценки к заданному значению. Это не пытается обнаружить и предотвратить бесконечный цикл оценки. Для интерактивных расчетов, значения по умолчанию переменной окружения LEVEL :

LEVEL

Когда уровень оценки достигает значения LEVEL, MuPAD останавливает оценку и возвращает результат последнего вычисленного шага оценки:

LEVEL := 10:
x := x + 1: x

delete LEVEL, x

MuPAD не задает одно универсальное значение LEVEL для всех расчетов. Для большинства расчетов значение равняется 100, но существуют исключения к этому правилу:

  • Если оценка происходит в процедуре, MuPAD ограничивает уровень оценки 1.

  • Если оценка происходит в матрице, MuPAD ограничивает уровень оценки 1.

  • MuPAD не оценивает массивы, таблицы и полиномы. (Уровень оценки для этих объектов 0.)

  • MuPAD не оценивает возвращенное значение last() вызов функции или его эквивалентный %. (Уровень оценки 0.)

  • MuPAD не оценивает возвращенные значения некоторых других системных функций. Например, система не оценивает результаты, возвращенные subs и text2expr функции. Страницы справки для таких функций предоставляют информацию об уровнях оценки возвращенных значений.

  • Если оценка происходит в вызове функции level(expression, n), MuPAD игнорирует значение среды LEVEL. Вместо этого система использует уровень оценки n.

Например, несмотря на то, что   LEVEL = 100 по умолчанию, вызов функции    level(a + x, 1) выполняет выражение   a + x к первому уровню оценок:

a := b: b := 2: level(a + x, 1)

delete a, b, x

Для большего количества примеров неполных оценок и информации об осуществлении таких оценок, смотрите Оценку Осуществления.

Чтобы обнаружить и предотвратить бесконечные циклы, MuPAD реализует другую переменную окружения, MAXLEVEL. Значение по умолчанию MAXLEVEL поскольку все расчеты

MAXLEVEL

Когда уровень оценки достигает значения MAXLEVEL, MuPAD принимает, что оценка бесконечна и выдает ошибку:

MAXLEVEL := 2:
a := b: b := c: c := d: a
Error: Recursive definition: Reached maximal evaluation level.
delete MAXLEVEL, a, b, c, d

Если значение MAXLEVEL больше значения LEVEL, глобальная переменная MAXLEVEL не влияет на ту оценку. В противном случае, значение MAXLEVEL ограничивает количество шагов оценки. Например, значения по умолчанию LEVEL и MAXLEVEL равны (оба значения равняются 100). Если оценка достигает уровня 100, MuPAD использует глобальную переменную MAXLEVEL и, поэтому, выдает ошибку:

x := x + 1: x
Error: Recursive definition: Reached maximal evaluation level.
delete x

Управляйте уровнями оценки

Можно изменить значения переменных окружения LEVEL и MAXLEVEL. Например, следующие уравнения задают идентификаторы x k рекурсивно:

(x[k] := (k + 1)*x[k + 1]) $ k = 1..9:
x[10] := 10:

Используя level функционируйте, оцените идентификатор x 1 к уровням от 1 до 10. Для этого идентификатора уровень 10 возвращает полную оценку:

for l from 0 to 10 do
  print(level = l, hold(x[1]) = level(x[1], l))
end_for

Начиная со значения по умолчанию значения среды LEVEL = 100 больше 10, в интерактивных расчетах, MuPAD возвращает полностью оцененный идентификатор x 1:

x[1]

Удалите идентификаторы x k:

delete x

Установите значение переменной окружения LEVEL к 2:

LEVEL := 2:

Теперь MuPAD оценивает идентификатор x 1 только до второго уровня:

(x[k] := (k + 1)*x[k + 1]) $ k = 1..9:
x[10] := 10:
x[1]

Новое значение LEVEL влияет на все интерактивные оценки, за исключением оценок в массивах, матрицах, таблицах и полиномах. Например, используйте следующее рекурсивное определение в идентификаторах aB, и c. Оценка идентификатора a доходы только к второму уровню:

a := b: b := c: c := 1: a

Для дальнейших расчетов удалите идентификаторы:

delete x, a, b, c:

Новое значение LEVEL не влияет на оценки, которые происходят в процедурах. Уровень оценки в процедурах остается равным 1. Например, создайте процедуру myProc это задает значения идентификаторов aB, и c рекурсивно:

myProc:= proc(d)
begin
   a := b: b := c: c := d: a
end_proc:

Процедура оценивает идентификатор a до первого уровня оценки:

myProc(10)

delete a, b, c, d:

Можно изменить уровень оценки в конкретной процедуре. Это изменение не влияет на оценки, происходящие в других процедурах или в интерактивных расчетах:

myProc:= proc(d)
begin
   LEVEL := 3:
   a := b: b := c: c := d: a
end_proc:
myProc(10)

Для дальнейших расчетов удалите идентификаторы и восстановите значение LEVEL к его значению по умолчанию:

delete a, b, c, d:
delete LEVEL:

Другая переменная окружения, MAXLEVEL позволяет системе обнаружить и прервать бесконечные циклы оценки. Значение по умолчанию этой переменной равняется 100. Это значение рекомендуется для большинства расчетов. Если ваш код имеет рекурсивные оценки, которые требуют больше чем 99 шагов, изменяют значение MAXLEVEL. Например, следующее определение идентификатора x 1 требует 111 шагов оценки. MuPAD выдает ошибку, потому что система не может оценить x каждый 99-й шаг и принимает, что цикл оценки бесконечен:

(x[k] := (k + 1)*x[k + 1]) $ k = 1..110:
x[111] := 1:
x[1]
Error: Recursive definition: Reached maximal evaluation level.
delete x

Избегать ошибки, значения MAXLEVEL должен превысить количество необходимых шагов оценки, по крайней мере, на 1. Изменение значения к 112 твердости ошибка. Теперь MuPAD оценивает идентификатор x 1 к 100-му уровню оценки, который является значением по умолчанию переменной окружения LEVEL:

MAXLEVEL:= 112:
(x[k] := (k + 1)*x[k + 1]) $ k = 1..110:
x[111] := 1:
x[1]

delete x

Чтобы оценить x 1 к 111-му уровню оценки, необходимо изменить оба LEVEL и MAXLEVEL переменные. Кроме того, можно использовать level функция вместо того, чтобы изменить значение LEVEL:

MAXLEVEL:= 112:
(x[k] := (k + 1)*x[k + 1]) $ k = 1..110:
x[111] := 1:
level(x[1], 111)

Увеличьте значение MAXLEVEL только, когда вы знаете, что ваш код требует его. Не увеличивайте это значение для расчетов, где можно избежать его. Если ваш код имеет бесконечные циклы, увеличенный уровень MAXLEVEL может значительно уменьшить производительность. Всегда восстанавливайте значение по умолчанию для дальнейших расчетов:

delete x, MAXLEVEL
Для просмотра документации необходимо авторизоваться на сайте