Итерация

При решении задач математической физики разностными методами процесс вычислений часто носит итеративный характер. Такие процессы можно задавать с помощью уже описанных средств языка Норма. Для этого необходимо изменить описание областей, определенных в задаче, добавив дополнительное направление, соответствующее индексу итерации. Однако такое расширение не всегда оправдано, так как это направление, по существу, является фиктивным, оно отражает способ вычисления, а не пространственно-временную сетку. Кроме этого, для такого фиктивного направления не всегда известны границы диапазона.

Специальная конструкция ITERATION позволяет задать итеративный вычислительный процесс и обойти при этом отмеченные выше трудности.

Неформально, итерация задает итеративные вычисления с индексом итерации, меняющимся от 0 до некоторого целого положительного значения, которое определяется условием завершения итерации.

Рассмотрим итеративный вычислительный процесс решения системы уравнений:

методом Якоби

условие завершения

Программа на Норме, соответствующая этим расчетным формулам приведена здесь.

В заголовке итерации (строка 14) указывается индекс итерации - в данном случае n, и перечисляются величины, участвующие в итеративных вычислениях и представляющие результат этих вычислений - в данном случае это X (значение с последнего шага итерации). Значения X могут использоваться для вычислений вне итерации; в данном примере эти значения просто объявлены выходными.

При описании итерации можно использовать возможность задания граничных значений итерируемых величин (необязательных - в этом примере граничных значений нет). Граничные значения итерируемой переменной задаются при помощи обычных операторов языка Норма внутри блока BOUNDARY...END BOUNDARY. Эти значения считаются неизменными на протяжении всей итерации и определены на каждом шаге итерации.

Начальные значения для итерируемых величин задаются при помощи блоков INITIAL...END INITIAL, которых может быть несколько. Если значения итерируемых величин зависят только от значений с предыдущего слоя (однослойная итерация), то указывается один блок (строки 15-17):

INITIAL n=0:
FOR Oi ASSUME X=X0.
END INITIAL

Тело итерации представляет собой часть программы, написанной на языке Норма. В частности, внутри итерации можно определить новую итерацию по другому направлению. В примере тело итерации состоит из единственного оператора ASSUME (строка 18).

Индекс итерации может использоваться в списке индексов, указываемом для итерируемой величины, т.е. фактически можно считать, что итерируемая величина в пределах итерации имеет дополнительный итерационный индекс (по фиктивному направлению). Индекс итерации без смещения можно не указывать.

Индекс итерации может быть указан только у итерируемых величин.

В теле конструкции ITERATION могут вычисляться значения величин, не указанных в списке итерируемых величин. Такие величины могут потребоваться, например, для представления промежуточных результатов, вычисляемых на каждом из витков итерации. Использование таких величин не приводит к нарушению правила об однократном присваивании - считается, что на каждом витке итерации используется новая копия величины.

Итерационный процесс завершается, если логическое выражение, заданное в условии выхода EXIT WHEN (строка 19), принимает значение истина.