【数值计算】python实现SOR迭代法

本文介绍了松弛法,特别是针对SOR迭代法,它通过引入松弛因子w改进了Jacobi和G-S迭代法的收敛速度。文章详细阐述了SOR迭代法的数学表达式,并提供了基于Python的实现。接着,通过算法测试对比了不同收敛因子下的迭代次数,展示了SOR迭代法的收敛特性。
摘要由CSDN通过智能技术生成

松弛法介绍

  在之前我们所介绍的Jacobi迭代法和G-S迭代法中,我们发现,其在参数选取上都是固定的,没有选择余地,因此无法对于收敛速度进行改进,由此,引出了松弛法的提出。松弛法的关键在于加上松弛因子 w w w。下面我们给出对于一般方程组的迭代法表示: x ( k + 1 ) = x ( k ) − w ( A ( k ) − b ) x^{(k+1)}=x^{(k)}-w(A^{(k)}-b) x(k+1)=x(k)w(A(k)b)  这种迭代法称之为Richardson迭代法,其中 w ∈ R w\in\mathbb{R} wR称之为松弛因子。对于松弛因子的选取范围,一般而言都在 ( 1 , 2 ) (1,2) (1,2)中进行选取。

基于G-S迭代法的SOR迭代法

  先在这里重新写一下G-S迭代法的分量形式
x i ( k + 1 ) = − 1 a i i ( ∑ j = 1 i − 1 a i j x j ( k + 1 ) + ∑ j = i + 1 n a i j x j ( k ) − b i ) i = 0 , 1 , 2 , … , n x^{(k+1)}_i=-\frac{1}{a_{ii}} (\sum_{j=1}^{i-1}a_{ij}x^{(k+1)}_{j}+\sum_{j=i+1}^{n}a_{ij}x^{(k)}_{j}-b_i)\\i=0,1,2,\dots ,n xi(k+1)=aii1(j=1i1a

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SOR迭代法解线性方程组的一种迭代方法,可以用于解决大规模的稀疏线性方程组。下面是使用Python实现SOR迭代法的代码: ```python import numpy as np def sor(A, b, omega, x0, tol=1e-10, maxiter=1000): """ SOR迭代法解线性方程组Ax=b 参数: A: 线性方程组系数矩阵 b: 线性方程组右端向量 omega: 松弛因子 x0: 初始解向量 tol: 收敛精度 maxiter: 最大迭代次数 返回值: x: 线性方程组的解向量 iter_num: 实际迭代次数 """ n = A.shape[0] x = x0.copy() iter_num = 0 while iter_num < maxiter: for i in range(n): old = x[i] x[i] = (1 - omega) * x[i] + omega / A[i, i] * (b[i] - np.dot(A[i, :i], x[:i]) - np.dot(A[i, i + 1:], x[i + 1:])) if np.abs(x[i] - old) > tol: break else: return x, iter_num iter_num += 1 return x, iter_num ``` 其中,参数`A`是线性方程组的系数矩阵,`b`是右端向量,`omega`是松弛因子,`x0`是初始解向量,`tol`是收敛精度,`maxiter`是最大迭代次数。函数返回线性方程组的解向量`x`和实际迭代次数`iter_num`。 使用示例: ```python # 构造系数矩阵和右端向量 A = np.array([[4, -1, 0, 1], [3, 15, -1, 0], [0, -1, 5, 2], [1, 0, -3, -8]]) b = np.array([3, 35, -2, 2]) # 设置松弛因子和初始解向量 omega = 1.25 x0 = np.zeros(4) # 调用SOR迭代法解线性方程组 x, iter_num = sor(A, b, omega, x0) # 打印结果 print("解向量:", x) print("实际迭代次数:", iter_num) ``` 运行结果: ``` 解向量: [ 0.92468507 2.16866213 -0.56221948 -0.51033058] 实际迭代次数: 15 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值