SOR迭代法python
时间: 2023-11-04 08:07:04 浏览: 249
SOR迭代法(Successive Over-Relaxation method)是一种求解线性方程组的迭代方法,它是对Gauss-Seidel迭代法的改进。SOR迭代法的基本思想是在Gauss-Seidel迭代法的基础上,引入一个松弛因子ω,使得每次迭代时,新的解向量与旧的解向量之间有一定的比例关系,从而加快收敛速度。
SOR迭代法的迭代公式为:
$$x_i^{(k+1)}=(1-\omega)x_i^{(k)}+\frac{\omega}{a_{ii}}\left(b_i-\sum_{j=1}^{i-1}a_{ij}x_j^{(k+1)}-\sum_{j=i+1}^na_{ij}x_j^{(k)}\right)$$
其中,$x_i^{(k)}$表示第k次迭代后第i个未知量的解,$a_{ij}$表示系数矩阵中第i行第j列的元素,$b_i$表示方程组中第i个方程的常数项,$\omega$为松弛因子。
SOR迭代法的收敛性与松弛因子有关,当$0<\omega<2$时,SOR迭代法收敛。当$\omega=1$时,SOR迭代法等价于Gauss-Seidel迭代法。
以下是使用Python实现SOR迭代法的代码:
```python
import numpy as np
def sor(A, b, omega, x0, tol=1e-6, max_iter=1000):
"""
使用SOR迭代法求解线性方程组Ax=b
:param A: 系数矩阵
:param b: 常数向量
:param omega: 松弛因子
:param x0: 初始解向量
:param tol: 收敛精度
:param max_iter: 最大迭代次数
:return: 解向量
"""
n = len(b)
x = x0.copy()
for k in range(max_iter):
for i in range(n):
s1 = sum(A[i][j] * x[j] for j in range(i))
s2 = sum(A[i][j] * x[j] for j in range(i + 1, n))
x[i] = (1 - omega) * x[i] + omega / A[i][i] * (b[i] - s1 - s2)
if np.linalg.norm(np.dot(A, x) - b) < tol:
return x
return x
# 示例
A = np.array([[4, -1, 0, 0], [-1, 4, -1, 0], [0, -1, 4, -1], [0, 0, -1, 3]])
b = np.array([15, 10, 10, 10])
x0 = np.zeros_like(b)
omega = 1.5
x = sor(A, b, omega, x0)
print(x)
```
阅读全文