Gauss-Seidel迭代法求解线性方程组

Gauss-Seidel迭代法是一种用于求解线性方程组Ax=b的方法,它在每次迭代中立即使用新计算的信息。与Jacobi方法不同,Gauss-Seidel在更新每个分量时考虑了前一个分量的最新值。当矩阵A是严格对角占优或不可约对角占优时,该方法收敛。对于Hermite正定矩阵,Gauss-Seidel迭代法同样保证收敛。文章还提供了一个C语言实现的示例代码来演示算法的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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(b1j=2na1jxj(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(bij=1i1aijxj(k+1)j=i+1naijxj(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]);
		}
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值