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

Блокноты 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 не оценивает возвращенные значения некоторых других системных функций. Например, система не оценивает результаты, возвращенные функциями text2expr и subs. Страницы справки для таких функций предоставляют информацию об уровнях оценки возвращенных значений.

  • Если оценка происходит в вызове функции 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 влияет на все интерактивные оценки, за исключением оценок в массивах, матрицах, таблицах и полиномах. Например, используйте следующее рекурсивное определение для идентификаторов a, b и c. Оценка идентификатора a переходит только к второму уровню:

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

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

delete x, a, b, c:

Новое значение LEVEL не влияет на оценки, которые происходят в процедурах. Уровень оценки в процедурах остается равным 1. Например, создайте процедуру myProc, который задает значения идентификаторов a, b и 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