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

news2024/9/22 9:31:26

更多精彩,关注博客园主页,不断学习!不断进步!

我的主页

csdn很少看私信,有事请b站私信

博客园主页-发文字笔记-常用

有限元鹰的主页 内容:

  1. ABAQUS数值模拟相关
  2. Python科学计算
  3. 开源框架,编程学习笔记

哔哩哔哩主页-发视频-常用

FE-有限元鹰的个人空间 内容:

  1. 模拟案例
  2. 网格划分
  3. 游戏视频,及其他搬运视频

文章目录

  • 我的主页
    • 博客园主页-发文字笔记-常用
    • 哔哩哔哩主页-发视频-常用
  • 线性方程组迭代算法的Python实现
    • jacobi,GS,SOR迭代法
    • 正定对称线性方程组的不定常迭代:最速下降法,共轭梯度法

线性方程组迭代算法的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)

img

# 雅可比迭代法
数值解: [ 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
  • 验证

img

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)

img

# 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1990033.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pip 安装 scikit-learn

第一步&#xff1a;更新pip 可以首先执行 python -m ensurepip 然后执行 python -m pip install --upgrade pip 即可更新完毕。 python -m ensurepip python -m pip install --upgrade pip第二步 安装sklearn的时候一定要注意顺序。 安装顺序&#xff1a;numpy / scipy / ma…

汇编语言入门基础(访问寄存器和内存)

目录 访问寄存器和内存 2.1 寄存器是CPU内部的信息存储单元 2.1.1 通用寄存器--以AX为例 2.1.2 将AX分成AH与AL 2.2 “字”再寄存器中的存储 2.3 mov和add指令 2.3.1 练习1 2.3.2 练习2 2.4 确定物理地址的方法 2.4.1 物理地址 2.4.2 8086CPU给出物理地址的方法 2.4.…

swin和vit

参考&#xff1a;https://blog.csdn.net/weixin_44878336/article/details/125444556 Swin Transformer与Vision Transformer的对比 二者的不同之处&#xff1a; Swin-Transformer所构建的特征图是具有层次性的&#xff0c;很像我们之前将的卷积神经网络那样&#xff0c;随着…

基于检索增强生成 (RAG) 的大语言模型优化研究

复旦大学的研究人员对检索增强生成技术 (RAG) 的现有方法进行了系统性的研究&#xff0c;提出了一种三步式方法来优化 RAG 框架&#xff0c;并通过实验证明了该方法在提高大型语言模型性能方面的有效性&#xff0c;特别是在多模态检索和问答方面的应用。 论文介绍 基于检索的…

HexView 刷写文件脚本处理工具-基本功能介绍(二)-导入文件

菜单 保存(Save) 在对数据进行任何修改后(例如修改十六进制行或块的基地址),保存选项将被启用。这表示文件已被修改。在这种情况下,“保存”选项允许你将数据存储到当前文件名中。Hexview会以当前文件格式写入数据。当前文件格式显示在状态行中。 另存为(Save as) 允…

LVS详细介绍及常见模式(NAT,DR,防火墙标记)实验详解

目录 一、什么是LVS 二、LVS的核心思想 三、 LVS的优势 四、LVS的调度算法 4.1. LVS的调度算法类型 4.2. LVS静态调度算法 4.3. LVS动态调度算法 4.4.在4.15版本内核以后新增调度算法 五、LVS软件相关信息 六、ipvsadm命令 七、 LVS的NAT模式实验详解 7.1实验环境 7.…

“DS18B20,感知每一度细微变化,记录每一刻温暖。”#DS18B20温度传感器

“DS18B20&#xff0c;感知每一度细微变化&#xff0c;记录每一刻温暖。”#DS18B20温度传感器 前言预备知识1.DS18B20核心参数2.DS18B20初始化函数代码编写2.1分析DS18B20初始化时序图2.2依据时序图编写相应代码 3.向DS18B20写入一个字节函数代码编写3.1分析DS18B20写时序图3.2…

Zoho工作邮箱支持哪些功能?

工作域名邮箱都有哪些常见功能呢&#xff1f;一、消息流 &#xff1b;二、邮件委托给同事代为处理&#xff1b;三、附件查看器 &#xff1b;四、在邮箱里直接和同事音频/视频通话等八大功能。 一、消息流 - 邮箱里的社交渠道 Zoho Mail等专业工作邮箱平台引入了消息流功能&…

免账户免权限免费获取 A股 全市场股票ETF指数 分钟级数据

日期 2024/8/2 意外发现的&#xff0c;抛砖引玉&#xff0c;测试了下&#xff0c;其他券商的也可以。 可以直接获取 1m 5m 1day 级别的数据&#xff0c;全A股市场的都可以。期货未测试。 需要 其他的级别的分数数据可以自行合成。 原理 券商版qmt获取行情数据时&#xff0c;不…

JavaSE之常用API(后篇)

接上篇 五、Random 5.1 使用 5.2 练习 六、包装类 6.1 是什么 包装类:封装了基本类的一些操作,更加方便使用 为了对象的完整性,更重要的是配合泛型一起使用 byte Byte short Short int Integer long Long float Float double Double boolean Boolean char Character 八种包装…

Cadence学习笔记 Day0 Cadence17.4环境安装

当然是选择“吴法安装” 直接跟着吴川斌博客的方法来就可以了&#xff0c;这里大致记录一下我的安装步骤&#xff1a; 安装许可证管理器破解许可证管理器安装软件以及补丁破解软件 获取 直接放出链接&#xff1a;吴川斌的博客 下载得到&#xff1a; 一、安装许可证管理器&am…

Redis未授权利用方式总结

前言 目前的大多数网站搭建的Redis 均采用 docker 一键部署的方式&#xff0c;而 docker 镜像中的 redis 默认不是以 root 权限运行的&#xff0c;也就是说即使拿下这台 redis&#xff0c;我们也只能在对方服务器的本地内网中漫游&#xff0c;当然还是会有部分 redis 部署在服…

Tensorflow—第四讲网络八股扩展

本讲概述 一、自制数据集 我们用六万张数字图片自制训练集&#xff0c;一万张数字图片制作测试集 代码&#xff08;注释已经很清楚了&#xff0c;就不解释了&#xff09;&#xff1a; def generateds(path, txt):f open(txt, r) # 以只读形式打开txt文件contents f.readl…

【喜报】龙信助力上饶市公安局斩获全国刑侦部门数据侦查技战法大赛两项大奖

文章关键词&#xff1a;电子数据取证、手机取证、云取证、现场勘查、电子物证 8月2日&#xff0c;全国刑侦部门数据侦查技战法大赛在福建晋江市落下帷幕。来自全国各地的33支参赛队伍汇聚一堂&#xff0c;展现了全国公安刑侦部门数据侦查的新思路、新做法。 在这一高水平的竞技…

ant tree 数据的最优解

项目背景 : react ant ant 官网中目前只提供了 默认父子关联 或 checkStrictly(父子不关联)注意 : 不能盲目选择父子关联 , 虽然选中父 , 子也联动确实是需要的效果 , 但有一个bug 如下图 (当选中部分子 , 所有子被选中)解决方案 : 只能取消父子关联 , 自己去判断当前点击处…

C Primer Plus 第7章——第一篇

你该逆袭了 第7章:重点摘录 零、本章介绍一、if 语句二、if else 语句1、介绍 getchar( ) 和 putchar( )2、ctype.h 系列 的 字符函数(1)、isalnum( )(2)、isalpha( )(3)、isblank( )(4)、iscntrl( )(5)、isdigit( )(6)、isgraph( )(7)、islower( )(8)、isprint( )(9)、ispunct…

CV党福音:YOLOv8实现分类

YOLO作为目标检测领域的常青树&#xff0c;如今以及更新到了YOLOv10&#xff0c;并且还有YOLOX、YOLOS等变体&#xff0c;可以说该系列已经在目标检测领域占据了半壁江山&#xff0c;如今&#xff0c;YOLOv8的发行者ultralytics竟有一统江山之意&#xff0c;其在提出的框架中不…

基于Springboot+Vue3的简易教学管理系统

作品展示 基于SpringbootVue3的简易信息教学管理系统 第1章 系统设计 1.1 系统功能模块设计 该系统实现的功能模块包括&#xff1a; 教师端&#xff1a; 学生信息管理&#xff1a;添加、删除、修改以及查询学生信息 √课程信息管理&#xff1a;添加、删除、修改以及查…

智慧图书馆:构建高效视频智能管理方案,提升图书馆个性化服务

一、背景分析 随着信息技术的飞速发展&#xff0c;智慧图书馆作为现代公共文化服务的重要载体&#xff0c;正逐步从传统的纸质阅读空间向数字化、智能化方向转型。其中&#xff0c;视频智能管理方案作为智慧图书馆安全管理体系的重要组成部分&#xff0c;不仅能够有效提升图书…

深入浅出Mysql 第二期

从更新语句中看日志系统 探究技术的本质&#xff0c;享受技术的乐趣&#xff01;由于时间原因以及自己的原因导致拖更了&#xff0c;不过没关系&#xff0c;我保证后面每天一更&#xff0c;周末休息&#xff01;好了&#xff0c;闲话少说&#xff0c;今天我们通过一个更新操作…