Gauss-Seidel迭代法
求解线性方程组
A
x
=
b
\boldsymbol{Ax}=\boldsymbol{b}
Ax=b,其中
A
\boldsymbol{A}
A是
n
×
n
n\times n
n×n维可逆系数矩阵,
b
\boldsymbol{b}
b是
n
n
n维列向量。
Gauss-Seidel迭代法和Jacobi迭代法的区别在于,Gauss-Seidel迭代法一旦获得新信息便立即利用。比如,先计算
x
1
x_1
x1的新迭代值
x
1
(
k
+
1
)
=
1
a
11
(
b
1
−
∑
j
=
2
n
a
1
j
x
j
(
k
)
)
,
x_1^{(k+1)}=\frac{1}{a_{11}} (b_1 - \sum_{j=2}^{n}{a_{1j}x_j^{(k)}}),
x1(k+1)=a111(b1−j=2∑na1jxj(k)), 在后面计算
x
i
(
k
+
1
)
x_i^{(k+1)}
xi(k+1)时就用
x
1
(
k
+
1
)
x_1^{(k+1)}
x1(k+1) 替代
x
1
(
k
)
x_1^{(k)}
x1(k)。Gauss-Seidel迭代法的分量形式为
x
i
(
k
+
1
)
=
1
a
i
i
(
b
i
−
∑
j
=
1
i
−
1
a
i
j
x
j
(
k
+
1
)
−
∑
j
=
i
+
1
n
a
i
j
x
j
(
k
)
)
。
x_i^{(k+1)}=\frac{1}{a_{ii}} (b_i - \sum_{j=1}^{i-1}{a_{ij}x_j^{(k+1)}}-\sum_{j=i+1}^{n}{a_{ij}x_j^{(k)}})。
xi(k+1)=aii1(bi−j=1∑i−1aijxj(k+1)−j=i+1∑naijxj(k))。 沿用Jacobi迭代法中的符号,Gauss-Seidel迭代法的矩阵表示为
x
(
k
+
1
)
=
−
(
D
+
L
)
−
1
U
x
(
k
)
+
(
D
+
L
)
−
1
b
。
\boldsymbol{x}^{(k+1)}=-(\boldsymbol{D+L})^{-1}\boldsymbol{U}\boldsymbol{x}^{(k)}+(\boldsymbol{D+L})^{-1}\boldsymbol{b}。
x(k+1)=−(D+L)−1Ux(k)+(D+L)−1b。 定理1:若
A
\boldsymbol{A}
A为严格对角占优,或不可约对角占优矩阵,则Gauss-Seidel迭代法收敛。
定理2:若
A
\boldsymbol{A}
A为Hermite正定矩阵,则Gauss-Seidel迭代法收敛。
C语言实现Gauss-Seidel迭代法
void gauss_seidel(const Matrix *A, const Matrix *b, Matrix *x, const int it)
{
double tmp = 0;
int r = 0, c = 0;
for (int k = 0; k < it; k++)
{
for (r = 0; r < x->row; r++)
{
tmp = 0;
for (c = 0; c < A->column; c++)
{
if (c != r)
tmp += A->data[r * (A->column) + c] * x->data[c];
}
x->data[r] = (b->data[r] - tmp) / (A->data[r * (A->column) + r]);
}
}
}