举例怎么检验系数矩阵用Jacobi迭代法和Gauss-Seidel迭代法是否收敛,用python实现
时间: 2024-05-15 19:19:40 浏览: 103
利用Python,实现雅克比(Jacobi)迭代法以及高斯-塞德尔(G-S)迭代法【矩阵形式】
5星 · 资源好评率100%
假设有如下线性方程组:
$$
\begin{cases}
3x_1-x_2+x_3=5\\
x_1+4x_2-x_3=-7\\
2x_1+x_2+5x_3=6
\end{cases}
$$
其系数矩阵为:
$$
A=\begin{bmatrix}
3 & -1 & 1\\
1 & 4 & -1\\
2 & 1 & 5
\end{bmatrix}
$$
我们可以通过Jacobi迭代法和Gauss-Seidel迭代法来求解该方程组,其中,Jacobi迭代法的迭代公式为:
$$
x_i^{(k+1)}=\frac{1}{a_{ii}}\left(b_i-\sum_{j\neq i}a_{ij}x_j^{(k)}\right)
$$
而Gauss-Seidel迭代法的迭代公式为:
$$
x_i^{(k+1)}=\frac{1}{a_{ii}}\left(b_i-\sum_{j<i}a_{ij}x_j^{(k+1)}-\sum_{j>i}a_{ij}x_j^{(k)}\right)
$$
我们可以通过比较两种迭代法的收敛性来检验系数矩阵的收敛性。
下面是Python实现的代码,其中,我们设置了一个最大迭代次数max_iter和一个误差限eps,当迭代次数超过max_iter或误差小于eps时停止迭代。
```
import numpy as np
# 定义系数矩阵A和常数向量b
A = np.array([[3, -1, 1],
[1, 4, -1],
[2, 1, 5]])
b = np.array([5, -7, 6])
# 定义Jacobi迭代法的迭代函数
def jacobi(A, b, x0, eps=1e-6, max_iter=1000):
n = len(A)
x = x0.copy()
for k in range(max_iter):
x_new = np.zeros_like(x)
for i in range(n):
x_new[i] = (b[i] - np.dot(A[i], x) + A[i,i] * x[i]) / A[i,i]
if np.linalg.norm(x_new - x) < eps:
break
x = x_new
return x
# 定义Gauss-Seidel迭代法的迭代函数
def gauss_seidel(A, b, x0, eps=1e-6, max_iter=1000):
n = len(A)
x = x0.copy()
for k in range(max_iter):
x_new = np.zeros_like(x)
for i in range(n):
x_new[i] = (b[i] - np.dot(A[i,:i], x_new[:i]) - np.dot(A[i,i+1:], x[i+1:])) / A[i,i]
if np.linalg.norm(x_new - x) < eps:
break
x = x_new
return x
# 测试Jacobi迭代法和Gauss-Seidel迭代法的收敛性
x0 = np.zeros(3)
x_jacobi = jacobi(A, b, x0)
x_gauss_seidel = gauss_seidel(A, b, x0)
print("Jacobi迭代法的解:", x_jacobi)
print("Gauss-Seidel迭代法的解:", x_gauss_seidel)
```
我们可以通过调整max_iter和eps来测试不同的情况下是否收敛。
阅读全文