线性方程组迭代算法的Python实现

jacobi,GS,SOR迭代法

def JacobiIter(A:np.ndarray,
b:np.ndarray,
tol:float=1e-5,
maxIter:int=100)->Tuple[np.ndarray,np.ndarray]:
"""使用Jacobi迭代法求解线性方程组Ax=b input:
A: np.ndarray, 系数矩阵
b: np.ndarray, 右端常数
tol: float, 误差限
maxIter: int, 最大迭代次数 output:
x: np.ndarray, 解向量
errors: np.ndarray, 误差序列
"""
from numpy import dot
from numpy.linalg import norm
x0=np.zeros(b.shape)
L=-1*np.tril(A,k=-1).copy()
U=-1*np.triu(A,k=1).copy()
D=np.diag(np.diag(A)).copy()
Dinv=np.linalg.inv(D)
errors=[]
for i in range(maxIter):
x_next=dot(Dinv,(dot((L+U),x0)+b))
# error check
error=norm(b-dot(A,x_next),2)/norm(b,2)
errors.append(error)
if error<tol:
return x_next,np.array(errors)
else:
x0=x_next def GaussIter(A:np.ndarray,
b:np.ndarray,
tol:float=1e-5,
maxIter:int=100)->Tuple[np.ndarray,np.ndarray]:
"""使用Gauss-Seidel迭代法求解线性方程组Ax=b input:
A: np.ndarray, 系数矩阵
b: np.ndarray, 右端常数
tol: float, 误差限
maxIter: int, 最大迭代次数 output:
x: np.ndarray, 解向量
errors: np.ndarray, 误差序列
"""
from numpy import dot
from numpy.linalg import norm
x0=np.zeros(b.shape)
L=-1*np.tril(A,k=-1).copy()
U=-1*np.triu(A,k=1).copy()
D=np.diag(np.diag(A)).copy()
DsubLinv=np.linalg.inv(D-L)
errors=[]
for i in range(maxIter):
x_next=DsubLinv.dot(U).dot(x0)+DsubLinv.dot(b)
# error check
error=norm(b-dot(A,x_next),2)/norm(b,2)
errors.append(error)
if error<tol:
return x_next,np.array(errors)
else:
x0=x_next def SORIter(A:np.ndarray,
b:np.ndarray,
w:float=1.0,
tol:float=1e-5,
maxIter:int=100)->Tuple[np.ndarray,np.ndarray]:
"""使用SOR迭代法求解线性方程组Ax=b input:
A: np.ndarray, 系数矩阵
b: np.ndarray, 右端常数
w: float, 松弛因子(0~2.0)
tol: float, 误差限
maxIter: int, 最大迭代次数 output:
x: np.ndarray, 解向量
errors: np.ndarray, 误差序列
"""
from numpy import dot
from numpy.linalg import norm
x0=np.zeros(b.shape)
L=-1*np.tril(A,k=-1).copy()
U=-1*np.triu(A,k=1).copy()
D=np.diag(np.diag(A)).copy() DsubOmegaLinv=np.linalg.inv(D-w*L)
errors=[]
for i in range(maxIter):
x_next=DsubOmegaLinv.dot((1-w)*D+w*U).dot(x0)+w*DsubOmegaLinv.dot(b)
# error check
error=norm(b-dot(A,x_next),2)/norm(b,2)
errors.append(error)
if error<tol:
return x_next,np.array(errors)
else:
x0=x_next
  • 验证
import numpy as np
from formu_lib import *
A=np.array([[2,-1,0],
[-1,3,-1],
[0,-1,2]])
b=np.array([1,8,-5])
extractVal=np.array([2,3,-1]) x1,er1=JacobiIter(A,b)
x2,er2=GaussIter(A,b)
x3,er3=SORIter(A,b,1.2) ind1,ind2,ind3=list(range(len(er1))),list(range(len(er2))),list(range(len(er3)))
plotLines([ind1,ind2,ind3],[er1,er2,er3],["Jacobi iter error","Gauss iter error","SOR iter error"]) showError(x1,extractVal)
showError(x2,extractVal)
showError(x3,extractVal)

# 雅可比迭代法
数值解: [ 1.9999746 2.99999435 -1.0000254 ],
精确解: [ 2 3 -1],
误差: 9.719103983280175e-06
# GS迭代法
数值解: [ 1.9999619 2.9999746 -1.0000127],
精确解: [ 2 3 -1],
误差: 1.2701315856479742e-05
# SOR迭代法
数值解: [ 2.00001461 2.999993 -1.00000098],
精确解: [ 2 3 -1],
误差: 4.338862621105977e-06

正定对称线性方程组的不定常迭代:最速下降法,共轭梯度法

def SPDmethodSolve(A:np.ndarray,
b:np.ndarray,
tol:float=1e-5,
maxIter:int=200)->Tuple[np.ndarray,np.ndarray]:
"""使用最速下降法求解线性方程组Ax=b input:
A: np.ndarray, 系数矩阵,必须是对称正定矩阵
b: np.ndarray, 右端常数
tol: float, 误差限
maxIter: int, 最大迭代次数 output:
x: np.ndarray, 解向量
errors: np.ndarray, 误差序列
"""
from numpy import dot
from numpy.linalg import norm
x0=np.zeros(b.shape)
i,errors=0,[]
while True :
if i>maxIter:
maxIter=1.5*maxIter
print(f"迭代次数过多,自动调整为 {maxIter}")
# 计算残量r^k作为前进方向.
r=b-dot(A,x0)
# 计算前进距离a_k
a=InnerProduct(r,r)/InnerProduct(dot(A,r),r)
x_next=x0+a*r
error=norm(b-dot(A,x_next),2)/norm(b,2)
errors.append(error)
if errors[-1]<tol:
return x_next,np.array(errors)
else:
x0=x_next
i+=1 def conjGrad(A:np.ndarray,
b:np.ndarray,
tol:float=1e-5,
maxIter:int=200)->Tuple[np.ndarray,np.ndarray]:
"""使用共轭梯度法求解线性方程组Ax=b input:
A: np.ndarray, 系数矩阵,必须是对称正定矩阵
b: np.ndarray, 右端常数
tol: float, 误差限
maxIter: int, 最大迭代次数 output:
x: np.ndarray, 解向量
errors: np.ndarray, 误差序列
"""
from numpy import dot
from numpy.linalg import norm
# 选择初值x0,初始方向p0=r0=b-Ax0
x0=np.zeros(b.shape)
i,errors=0,[]
r0=b-dot(A,x0)
p_0=b-dot(A,x0)
errors.append(norm(r0,2)/norm(b,2))
while True :
if i>maxIter:
maxIter=1.5*maxIter
print(f"迭代次数过多,自动调整为 {maxIter}")
# 计算a_k,x^{k+1}=x_k+a_k*p_k
a_k=InnerProduct(r0,p_0)/InnerProduct(dot(A,p_0),p_0)
x_next=x0+a_k*p_0
# 计算下一步的残量
r_k_next=b-dot(A,x_next)
errors.append(norm(r_k_next,ord=2)/norm(b,2))
# 如果残量足够小,则停止迭代
if errors[-1]<tol:
return x_next,np.array(errors)
else:
# 计算下一步的搜索方向
beta_k=-1*InnerProduct(r_k_next,A.dot(p_0))/InnerProduct(p_0,A.dot(p_0))
p_0=r_k_next+beta_k*p_0
x0=x_next
i+=1
  • 验证

from formu_lib import *
import numpy as np A=np.array([[4,-1,0],
[-1,4,-1],
[0,-1,4]])
b=np.array([3,2,3])
extractVal=np.array([1,1,1]) x1,er1=SPDmethodSolve(A,b,1e-6)
x2,er2=conjGrad(A,b,1e-6) plotLines([list(range(len(er1))),list(range(len(er2)))],[er1,er2],["SPD method error","conjugate gradient error"]) showError(x1,extractVal)
showError(x2,extractVal)

# SPD method
数值解: [0.99999951 0.99999951 0.99999951],
精确解: [1 1 1],
误差: 4.891480784863234e-07
# conjugate gradient method
数值解: [1. 1. 1.],
精确解: [1 1 1],
误差: 0.0

【数值计算方法】线性方程组迭代算法的Python实现的更多相关文章

  1. 多线性方程组迭代算法——Gauss-Seidel迭代算法的Python实现

    多线性方程组(张量)迭代算法的原理请看这里:原理部分请留言,不方便公开分享 Jacobi迭代算法里有详细注释:多线性方程组迭代算法——Jacobi迭代算法的Python实现 import numpy ...

  2. 多线性方程组迭代算法——Jacobi迭代算法的Python实现

    多线性方程(张量)组迭代算法的原理请看这里:若想看原理部分请留言,不方便公开分享 Gauss-Seidel迭代算法:多线性方程组迭代算法——Gauss-Seidel迭代算法的Python实现 impo ...

  3. 线性方程组迭代算法——Gauss-Seidel迭代算法的python实现

    原理: 请看本人博客:线性方程组的迭代求解算法——原理 代码: import numpy as np max=100#迭代次数上限 Delta=0.01 m=2#阶数:矩阵为2阶 n=3#维数:3X3 ...

  4. 线性方程组迭代算法——Jacobi迭代算法的python实现

    原理: 请看本人博客:线性方程组的迭代求解算法——原理 代码: import numpy as np max=100#迭代次数上限 Delta=0.01 m=2#阶数:矩阵为2阶 n=3#维数:3X3 ...

  5. 蒙特·卡罗算法的Python实现

    一 背景 此算法诞生的背景是: 曼哈顿计划,有极大的计算需求. 计算机刚开始发展,最适合做计算. 蒙特卡洛算法理论基础是概率论,实际就是暴力计算逼近理想结果.正是在以上两个背景下,它刚好得到了极大的应 ...

  6. 常用排序算法的python实现和性能分析

    常用排序算法的python实现和性能分析 一年一度的换工作高峰又到了,HR大概每天都塞几份简历过来,基本上一天安排两个面试的话,当天就只能加班干活了.趁着面试别人的机会,自己也把一些基础算法和一些面试 ...

  7. 数据关联分析 association analysis (Aprior算法,python代码)

    1基本概念 购物篮事务(market basket transaction),如下表,表中每一行对应一个事务,包含唯一标识TID,和购买的商品集合.本文介绍一种成为关联分析(association a ...

  8. 机器学习算法与Python实践之(四)支持向量机(SVM)实现

    机器学习算法与Python实践之(四)支持向量机(SVM)实现 机器学习算法与Python实践之(四)支持向量机(SVM)实现 zouxy09@qq.com http://blog.csdn.net/ ...

  9. 机器学习算法与Python实践之(五)k均值聚类(k-means)

    机器学习算法与Python实践这个系列主要是参考<机器学习实战>这本书.因为自己想学习Python,然后也想对一些机器学习算法加深下了解,所以就想通过Python来实现几个比较常用的机器学 ...

  10. 机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)

    http://blog.csdn.net/zouxy09/article/details/20319673 机器学习算法与Python实践之(七)逻辑回归(Logistic Regression) z ...

随机推荐

  1. ASP.NET Core EventStream (SSE) 使用以及 WebSocket 比较

    在开发环境中,对于实时数据流的需求非常常见,最常用的技术包括 Server-Sent Events (SSE) 和 WebSocket. 什么是 Server-Sent Events (SSE)? S ...

  2. Qt音视频开发08-ffmpeg内核优化(极速打开/超时回调/实时响应)

    一.前言 最初编写这套视频解析组件的时候,面对的场景是视频监控行业,对应设备都是网络监控摄像机,传过来的都是rtsp这种视频流,做过这一块的人都知道,打开某个视频流默认耗时比较大,基本上在2s左右,那 ...

  3. Qt编写安防视频监控系统62-子模块6预置位

    一.前言 预置位功能,只对带有预置位的球机才起作用,有云台的球机未必有预置位,要仔细查看清楚,不清楚可以询问厂家或者查阅手册,在本模块中,可以获取预置位.添加预置位.调用预置位.删除预置位.调用起始位 ...

  4. 记一次简单的存储过程和Pivot行转列

    首先我很讨厌写存储过程,其次我很讨厌 没办法,主要是需要进行 行转列,项目经理说可以用Pivot.我不是很精通sql,但是我会百度呀~ pivot需要有确定的列名.那我这个项目里面没办法确定,最后问了 ...

  5. COCI 2024/2025 #3

    T1 P11474 [COCI 2024/2025 #3] 公交车 / Autobus 愤怒,从红升橙足以说明其恶心,考场上调了半小时才过. 这道题的车能够开 \(24\) 小时,并且他能从前一天开到 ...

  6. C Primer Plus 第6版 第八章 编程练习参考答案

    编译环境VS Code+WSL GCC 源码请到文末下载 . 我给第一题写了Linux shell脚本,感兴趣的同学可以尝试修改并运行一下. /*第1题************************ ...

  7. 循序渐进--从零开始建设k8s监控之alertmanager+发送飞书(三)

    前言 书接上文,prometheus已经安装好了,监控数据是有了,我们需要对其进行告警,并且可以发送到对应的平台,比如飞书.钉钉等,这里选择用飞书来测试 环境准备 组件 版本 操作系统 Ubuntu ...

  8. c# 微软小冰-虚拟女友聊天

    using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System ...

  9. angularjs和ajax的结合使用 (四)

    知道的朋友了解 我不是属于讲按部就班技术的那种人.什么xx入门 ,入门到精通,入门到入土. 其实非要严格说的话已经跟angularjs 什么ajax 偏的有点远了,之所以还是叫这个名称,因为都属于we ...

  10. 安全可信 | 通过双项测试!TeleDB实力亮剑!

    近日,天翼云TeleDB数据库在中国信通院"可信数据库"系列测试的赛道上,一次性跨越"分布式事务型数据库基础能力测试"与"性能测试"的双重大 ...