Метод решения

Для разреженных матриц большого размера прямые методы, строящие полное разложение матрицы, как правило, невыгодны: в процессе разложения в позициях исходных нулей возникают новые ненулевые элементы — так называемое заполнение. В результате теряется главное преимущество разреженной матрицы — малый объём памяти и малое число арифметических операций.

Мы будем решать систему (3.1) итерационным предобусловленным методом сопряжённых градиентов (PCG, preconditioned conjugate gradient). Метод применим к симметричным положительно определённым матрицам — именно такие возникают в задачах МКЭ с эллиптическими операторами и в неявных схемах теплопроводности. Распишем алгоритм по шагам.

Пусть x0=0x_0 = 0 — начальное приближение. Начальный остаток примет вид

r0=bAx0.r_0 = b - A \cdot x_0.
(3.2)

Начальное направление поиска и вектор предобуславливания имеют вид

Pz0=r0,p0=z0,P \cdot z_0 = r_0, \qquad p_0 = z_0,
(3.3)

где PP — матрица предобуславливателя: она приближает AA, но системы с ней решаются существенно дешевле. Далее на каждой итерации k=0,1,2,k = 0, 1, 2, \ldots вычисляем

αk=rkTzkpkTApk,\alpha_k = \frac{r_k^T \cdot z_k}{p_k^T \cdot A \cdot p_k},
(3.4)
xk+1=xk+αkpk,x_{k+1} = x_k + \alpha_k \cdot p_k,
(3.5)
rk+1=rkαkApk,r_{k+1} = r_k - \alpha_k \cdot A \cdot p_k,
(3.6)
Pzk+1=rk+1,P \cdot z_{k+1} = r_{k+1},
(3.7)
βk=rk+1Tzk+1rkTzk,\beta_k = \frac{r_{k+1}^T \cdot z_{k+1}}{r_k^T \cdot z_k},
(3.8)
pk+1=zk+1+βkpk.p_{k+1} = z_{k+1} + \beta_k \cdot p_k.
(3.9)

Итерации продолжаются, пока квадрат нормы остатка не опустится ниже заданного порога

rk+1Trk+1<ε.r_{k+1}^T \cdot r_{k+1} < \varepsilon.
(3.10)

Основная вычислительная стоимость каждой итерации — одно умножение разреженной матрицы на вектор ApkA \cdot p_k. Именно поэтому перед началом итераций матрица конвертируется из COO в CSR: в этом формате умножение строки на вектор проходит только по ненулевым элементам.

Схема одной итерации предобусловленного метода сопряжённых градиентов
Рис. 3.2. Одна итерация PCG: шаг ApkA \cdot p_k — самый дорогостоящий.

Далее поговорим о предобуславливателях.