Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Алгоритмы решения систем линейных уравнений с блочно-ленточными матрицами. Монография

.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
2 Мб
Скачать
Алгоритмы решения СЛАУ с блочно-ленточными матрицами. Глава 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 = (IB)
–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
*||(IB)-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
*(IB)–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
||*||(IB)–1 ||*||b || <=
k +1
*(I – R)–1*|| b ||.
k +1
*(I – R)–1 < Eps и
94 Б. Я. Штейнберг, О. Б. Штейнберг
Время выполнения одной итерации
Одна итерация алгоритма
B*x +b = (It*C
–1
*A)*x +b = (1–t)*xt*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, для которых |ij| > 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[ik(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].
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]