Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Алгоритмы решения систем линейных уравнений с блочно-ленточными матрицами. Монография
.pdf
Алгоритмы решения СЛАУ с блочно-ленточными матрицами. Глава 4 91
P
P
( 1) * 1+ −− −+
1,1 1,2
+ −+ − +
1,m 1
...
( ) (P)
x[i m ]= b x[i P m] b x[i P m + ]
b x[i P m ] a ;
1 * * 1 ...+− − + − +
( ) (P)
m,m m
m,1 m,2
}
Этот цикл можно заменить новым:
for (i = P*m; i < N+P*m; i = i+P*m) {
for (j = 0; i < m/4; j = j+4) {
vx[i j]= vb vvx[i P m] vb x[i P m + ]
(P) (P)
vb vvx[i P m ] va ;
(P) ( )
( 1) * 1+ − − −+
* * 1 ...
P
}}
Описанный метод может быть скомбинирован с алгоритмом, рассмо-
тренным в следующем параграфе.
Результаты данного параграфа были получены в [71].

5. АЛГОРИТМЫ ИТЕРАЦИОННОГО ТИПА
И ИХ УСКОРЕНИЕ
5.1. Итерационные алгоритмы решения СЛАУ
с блочно-ленточными матрицами
Итерационные алгоритмы решения СЛАУ
Приведем известные элементы теории итерационных алгоритмов [5; 6].
Поскольку предполагается рассматривать решатели для СЛАУ большой размерности, чтобы обеспечить приемлемую точность и не выходить
за пределы имеющейся памяти, необходимо использовать итерационные
алгоритмы.
Как обычно, при решении задач большой размерности необходимо
сбалансировать соблюдение точности (не должна накапливаться погрешность), ограничения по памяти и время работы вычислительной системы.
Время работы итерационного процесса зависит от количества итераций
и времени выполнения одной итерации.
Систему уравнений
Ax = b0
будем решать итерационным алгоритмом
Здесь k — номер итерации, x
дает пользователь,
(k + 1)
x
B = I – t*C
b = t* C
(k)
= Bx
+ b.
(0)
— начальное приближение, которое за-
–1*
A,
–1*
b0,
C — произвольная невырожденная матрица (C > 0), а t > 0 — числовой
параметр.
Точное решение этого уравнения может быть представлено в виде
x = (I – B)
–1
*b.
Как известно, для сходимости итерационного процесса необходимо и достаточно, чтобы все собственные значения матрицы B были по модулю мень-

Алгоритмы решения СЛАУ с блочно-ленточными матрицами. Глава 5 93
ше 1. Из этого условия, в частности, вытекает, что для сходимости итерационного процесса достаточно, чтобы норма (любая) матрицы B была меньше 1.
Время работы итерационного алгоритма равно произведению количе-
ства итераций на время выполнения одной итерации.
Оценка количества итераций итерационного алгоритма
Количество итераций итерационного процесса зависит от величины
наибольшего собственного числа матрицы B: чем меньше это число, тем
меньше шагов итерационного процесса.
Более точно. Пусть требуется найти решение исходной СЛАУ с относи-
тельной невязкой delta: ||(x
приближения берется правая часть СЛАУ. Тогда значение k-ой итерации
равно
(k)
x
= (Bk + B
k –1
= (I – B)–1*b – B
Отклонение k-ой итерации от точного решения можно оценить следую-
щим образом
(k)
||x
–(I – B)–1* b || <= || B
k+1
*||(I–B)-1 ||* ||b ||.
||B||
Замечание. Как известно, «спектр полинома от оператора равен по-
линому от спектра» [72]: Sp(I – B) = Sp(I) – Sp(B). Из этого утверждения
вытекает: если оператор B имеет положительный спектр, меньший 1, то
оператор (I – B) также имеет положительный спектр, все элементы которого также меньше 1. Поэтому, если спектр положительно определенного
оператора B меньше 1, то этим же свойством обладает и оператор (I – B).
Пусть R — спектральная норма оператора B. Тогда отклонение k-ой ите-
рации от точного решения несложно оценить следующим образом:
(k)
||x
–(I – B)–1*b || = ||(I – B
k +1
= || B
*(I – B)–1*b || <= || B
Из этой оценки вытекает, что если выполняется R
R < 1, то количество итераций для получения относительной точности решения Eps оценивается неравенством:
k < – log
(Eps*(1 – R)).
R
(k)
– b)||/||b|| < delta. Пусть в качестве начального
+…+ B + I)*b = (I – B
k +1
*(I – B)–1*b.
k +1
*(I–B)–1*b || <= || B
k +1
)*(I – B)–1*b –(I – B)–1*b || =
k +1
||*||(I – B)–1 ||*|| b || < R
k +1
)*(I – B)–1*b =
k +1
||*||(I–B)–1 ||*||b || <=
k +1
*(I – R)–1*|| b ||.
k +1
*(I – R)–1 < Eps и

94 Б. Я. Штейнберг, О. Б. Штейнберг
Время выполнения одной итерации
Одна итерация алгоритма
B*x +b = (I – t*C
–1
*A)*x +b = (1–t)*x – t*C–1*O*x + b.
Итак, основное время вычисления одной итерации отнимает вычисление вектора C
–1
*O*x.
Требования к матрице С
Суммарный объем памяти для хранения матриц B и C не может быть
меньше объема памяти для хранения исходной матрицы A. Чтобы объем
памяти для хранения матриц B и C был таким же, как объем памяти для хранения матрицы A, нужно, чтобы матрица C была подматрицей матрицы A.
Матрица C должна быть обратима.
Величина R = 1 – t*inf Sp(C–1*A ) должна быть меньше 1 (inf Sp(C–1*A) > 0).
Вычисление C–1*x должно требовать мало времени.
Выбор параметра t
Если матрицы A и C обратимые, то матрица B обратима для всех малых
чисел t таких, что число t–1 больше наибольшего собственного значения
матрицы C–1*A.
В качестве t можно взять число t = 1/(||C–1||*||A||) — eps (здесь eps — некоторое заданное положительное число), поскольку наибольшее собственное число матрицы C–1*A не больше нормы этой матрицы, которая не боль-
ше ||C–1||*||A||.
От выбора этого параметра t зависит количество шагов итерационного
процесса.
Ленточные матрицы для численных методов решения
дифференциальных уравнений в частных производных
Ленточная матрица возникает при численных методах конечно-разностных или конечно-элементных при покрытии прямоугольника прямоугольной сеткой (и при соответствующей нумерации узлов). Если область
односвязная и не прямоугольная, то можно на эту область построить отображение прямоугольника с его прямоугольной сеткой — и получить ту же
ленточную матрицу.

Алгоритмы решения СЛАУ с блочно-ленточными матрицами. Глава 5 95
Рисунок 21. Ортогональная сетка на прямоугольной области.
Рисунок 22. Криволинейная ортогональная сетка.
Если на (трехмерном) прямоугольном параллелепипеде построить сет-
ку, узлы которой занумеровать соответствующим образом, матрица конечно-разностной схемы также получится ленточной. Можно рассматривать
отображения прямоугольного параллелепипеда с координатной сеткой на
другие области, перенося на них сетку. Если склеивать противоположные
стороны, могут получаться обобщенные диагонали.
Рисунок 23. Блочная матрица с семью диагоналями.

96 Б. Я. Штейнберг, О. Б. Штейнберг
Большая
память
Рисунок 24. Большая медленная и маленькая быстрая память.
Быстрая
память
Регистры
Требования к выбору параметров итерационного алгоритма
Итерационный процесс должен сходиться и сходиться быстро к решению с заданной точностью. Из отмеченных выше условий вытекают требования к выбору параметров итерационного процесса (C > 0) и t > 0.
Норма матрицы B должна быть меньше 1.
Объем памяти для хранения матриц B и C должен быть ненамного
больше объема памяти для хранения матрицы A.
Вычисление C–1*x должно требовать мало времени.
Выбор матрицы С
В качестве матрицы C будем рассматривать блочную ленточную матрицу с малым количеством ненулевых диагоналей 2*k + 1, близких к главной.
Эта матрица получается из матрицы A обнулением всех элементов Aij, для
которых |i – j| > k.
Матрицу A представим в виде A = С + О, где О — матрица, состоящая из
оставшихся элементов матрицы A после обнуления (вычитания) элементов
по главной диагонали и k соседних (с каждой стороны) диагоналей. Если
A симметричная, то O тоже симметричная. Если у A было преобладание
по главной диагонали, то C обладает этим же свойством и, следовательно,
обратима.
Сделав LU разложение матрицы C (или C = L * D*L* для симметричной
матрицы), можно быстро вычислять C–1*x на каждой итерации алгоритма.
Особенность программ решения СЛАУ
с блочно-ленточной матрицей
Программы решения СЛАУ с блочно-ленточной матрицей содержат
двойные (программные) циклы. Эти двойные циклы читают элементы блоков. Количество итераций в таком двойном цикле равна размерности блока.
После LU разложения по главной диагонали у матриц L и U часть программных циклов имеет треугольный вид.

Алгоритмы решения СЛАУ с блочно-ленточными матрицами. Глава 5 97
Матрица U после LU разложения является верхнетреугольной блочной
двухдиагональной. При этом блоки по главной диагонали имеют треугольный вид (рисунок 17).
Симметричные матрицы
Симметричные матрицы хранятся в памяти только верхней (или нижней)
половиной. Разложение матрицы C имеет вид C = L*Lt. Алгоритм нуждается
в некоторой модификации, когда при чтении L приходится работать с Lt.
Седловые матрицы
Матрицы с седловой особенностью имеют симметричную подматрицу,
состоящую из блоков главной диагонали и рядом расположенных диагоналей блоков. Матрица С — симметричная. Остальная часть матрицы с
седловой особенностью кососимметрична (тоже может храниться только
ее половина).
5.2. Умножение и итерационное умножение
блочно-ленточной матрицы на вектор
Рассмотрим задачу умножения треугольной ленточной матрицы на
вектор.
Y = A*x.
Пусть у рассматриваемой ленточной матрицы ненулевая главная диагональ и m ненулевых диагоналей ниже главной, но эти диагонали могут не
быть рядом друг с другом. Пусть ненулевыми являются диагонали, которые
находятся на расстоянии от главной
k(j), j = 1, 2, …, m; k(1) < k(2)<…<k(m).
Главную диагональ можем добавлять в этот список, полагая k(0) = 0.
Пусть матрица представлена списком диагоналей D[j, *], j = 1, 2, …, m.
В j-ой диагонали находятся следующие элементы матрицы A:
D[j, i] = A[i+k(i), i].
Ненулевые элементы матрицы A, лежащие на j-ой диагонали:
A[i, j] = D[i – k(j), i].

98 Б. Я. Штейнберг, О. Б. Штейнберг
Тогда умножение матрицы A на вектор x можно записать следующим
образом:
for (i1 = 0; i1 < N; i1++){ // цикл просматривает строки
матрицы A и элементы вектора x
for (i2 = 0; i2 < m; i2++) { // цикл просматривает нену-
левые диагонали
if (i1>k(i2)) {
y[i1] += D[i2,i1]*x[i1 – k(i2)];
}}}
Чтобы этот код выполнялся быстрее, желательно избавиться от условных операторов. Можно переставить местами заголовки циклов и сделать
раскрутку цикла, просматривающего диагонали.
Умножение верхнетреугольной диагональной матрицы выполняется
аналогично.
Переход к случаю блочно-ленточной матрицы выполняется простым
обобщением.
Не видно поводов для ускорения задачи умножения матрицы на вектор
за счет распараллеливания или локализации данных, поскольку каждый
элемент матрицы используется в алгоритме один раз. Если матрица симметрическая или кососимметрическая, то каждый элемент матрицы используется дважды и следует попытаться организовать вычисления так, чтобы
вычисления с одним и тем же элементом матрицы были рядом — тогда
второе чтение этого элемента матрицы будет из кэш-памяти.
В итерационных алгоритмах приходится одну и ту же матрицу много
раз умножать на векторы. Итерации такого алгоритма нельзя выполнять параллельно, поскольку вектор, на который умножается матрица на текущей
итерации, зависит от вектора, на который умножалась матрица на предыдущей итерации.
Если ненулевые диагонали ленточной матрицы расположены рядом с
главной диагональю, то итерационное умножение матрицы на вектор может быть эффективно распараллелено на ВС с распределенной памятью и
такое распараллеливание может быть ускорено методом размещения данных в распределенной памяти с перекрытиями [26; 52].
В работах [26; 27; 28; 29] итерационные алгоритмы ускоряются, используя следующую идею. Не завершив одну итерацию, начинают вычисления
следующей итерации, пока необходимые для начала вычисления данные
находятся в кэш-памяти. Этот подход в сочетании с распараллеливанием
позволяют ускорять итерационные алгоритмы в несколько раз, а иногда и

Алгоритмы решения СЛАУ с блочно-ленточными матрицами. Глава 5 99
в несколько десятков раз. Матрицы ускоряемых таким образом итерационных алгоритмов являются блочно-ленточными. Неоптимизированные исходные алгоритмы записываются в виде гнезда циклов. Возникает задача
приводить другие итерационные алгоритмы с блочно-ленточными матрицами к виду, допускающему ускорение указанным способом.
5.3. О сводимости программ,
аффинно вычисляющих данные,
к задачам линейной алгебры
Будем рассматривать программы, в которых любые вычисляемые дан-
ные аффинно зависят от других вычисляемых данных. Допускается зависимость от самих себя, т. е. рекуррентно вычисляемые данные, но рекуррентная зависимость тоже должна быть аффинной. Множество таких программ
будем называть аффинно вычисляемыми программами или программами,
аффинно вычисляющими данные.
Пример 37. Аффинно вычисляемая программа
for (j = 0; j < N; j++) {
B[j] = j*j+C[j];
A[j] = 3*A[j]+B[j];
}
Переменная j возводится в квадрат, но она не является вычисляемой в программе.
Конец примера.
Пример 38. Следующий программный цикл не является аффинно
вычисляемым
for (j = 0; j < N; j++) {
if (A[j] < 0) {
A[j] = 3*A[j]+B[j];
}
}
Конец примера.

100 Б. Я. Штейнберг, О. Б. Штейнберг
Можно рассмотреть пространство линейных комбинаций всех данных
программы. Тогда программа может рассматриваться как оператор в этом
пространстве. Если программа является аффинно вычисляемой, то ей соответствует линейный оператор (и оператор прибавления вектора). Если
множество вычисляемых данных программы конечно, рассматриваемой
программе соответствует матрица.
Рассмотрим обобщение алгоритма Гаусса-Зейделя:
for (It = 0; It < maxIt; It++) {
for (i1 = 1; i1 < N; i1++) {
for (i2 = 1; i2 < N; i2++) {
x[i1,i2] = a1[i1,i2]*[x[i1–1,i2] + b1[i1,i2]*x[i1+1,i2]+
c1[i1,i2]* x[i1,i2–1] + d1[i1,i2]*x[i1,i2+1]+ e1[i1,i2];
}}}
Здесь a1[i1, i2], b1[i1, i2], c1[i1, i2], d1[i1, i2], e1[i1, i2]; a2[i1, i2], b2[i1, i2],
c2[i1, i2], d2*[i1, i2], e2[i1, i2] — массивы, не меняющие своих значений при
вычислении программы (входные не вычисляемые данные).
В этом примере вычисляются элементы двумерного массива X.
Можно заметить, что вхождения всех переменных не зависят от счетчика внешнего цикла, который считает итерации алгоритма. Внутреннее
двойное гнездо циклов вычисляет элемент массива x[i1, i2] через элементы
[x[i1–1, i2] и x[i1, i2–1], которые вычислены на этой же итерации; и через
элементы x[i1+1, i2] и x[i1, i2+1], которые вычислены на предыдущей итерации внешнего цикла.
Будем рассматривать множество всех элементов массива X как вектор
XX (размера N
2
). Вектор можно рассматривать как одномерный массив. Значение этого вектора зависит от итерации внешнего цикла, и поэтому XXk
будет обозначать значение этого вектора на итерации k внешнего цикла.
Тогда вычисление этого вектора можно представить в виде
k
= A*XXk + B*XX
XX
k – 1
+ E.
Здесь:
A — матрица (размера N
2*N2
), составленная из нулей и элементов массивов
a1[i1, i2] и c1[i1, i2];
B — матрица (размера N2*N2), составленная из нулей и элементов массивов
b1[i1, i2] и d1[i1, i2];
E — вектор (размера N2), составленный из элементов e1[i1, i2].
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
