解线性方程组python实现迭代法(Jacobi迭代、Gauss-Seidel迭代、松弛迭代)

1. Jacobi迭代

        Jacobi迭代法是一种用于求解线性方程组的迭代算法。它属于迭代法中的直接迭代法,通过不断迭代更新解向量来逼近线性方程组的解。

        Jacobi迭代法的基本概念如下:

  1. 给定线性方程组的系数矩阵A和右侧常数向量b。

  2. 将系数矩阵A进行对角分解,得到三个矩阵D、L和U,其中D是A的对角矩阵,L是A的严格下三角矩阵(即主对角线以下元素为0),U是A的严格上三角矩阵(即主对角线以上元素为0)。

  3. 初始化解向量x为任意初始值(可以是全0向量)。

  4. 迭代更新解向量x,直到满足收敛条件:

    • 计算残差向量r = b - Ax,其中A是系数矩阵,x是当前解向量。
    • 使用更新公式:x = D^(-1) * (b - (L + U)x),其中D^(-1)表示D的逆矩阵。
    • 重复进行以上两步操作,直到残差向量r的范数小于设定的收敛阈值或达到最大迭代次数。
  5. 返回近似解向量x。

        Jacobi迭代法的收敛性和速度与系数矩阵A的特性有关。当系数矩阵A是对角占优或严格对角占优时,Jacobi迭代法具有收敛性。然而,在某些情况下,Jacobi迭代法的收敛速度较慢,因此可以结合其他迭代方法,如Gauss-Seidel迭代法或逐次超松弛法,来改进迭代效果。

"""
@Time : 2023/10/19 0019 17:11
@Auth : yeqcJacobi 雅可比迭代法
"""
import numpy as npdef Jacobi(A, b, max_iter=100, epsilon=1e-10):n = len(b)x = np.zeros(n)  # 初始解x_new = np.zeros(n)  # 存储更新后的解向量for iter in range(max_iter):for i in range(n):sum_ax = np.dot(A[i], x) - A[i][i] * x[i]  # 计算除去对角元素的和x_new[i] = (b[i] - sum_ax) / A[i][i]  # 更新解向量的第i个分量# 判断终止条件if np.linalg.norm(x_new - x) < epsilon:breakx = np.copy(x_new)  # 更新解向量return x# 示例
A = np.array([[9, -1, -1], [-1, 8, 0], [-1, 0, 9]])b = np.array([7, 7, 8])x = Jacobi(A, b)
print("解:", x)

2. Gauss-Seidel迭代

        Gauss-Seidel迭代法是一种求解线性方程组的迭代算法,它是Jacobi迭代法的改进版。该方法通过不断迭代更新解向量的每个分量来逼近线性方程组的解。

        Gauss-Seidel迭代法的基本概念如下:

  1. 给定线性方程组的系数矩阵A和右侧常数向量b。

  2. 将系数矩阵A进行对角分解,得到三个矩阵D、L和U,其中D是A的对角矩阵,L是A的严格下三角矩阵(即主对角线以下元素为0),U是A的严格上三角矩阵(即主对角线以上元素为0)。

  3. 初始化解向量x为任意初始值(可以是全0向量)。

  4. 迭代更新解向量x,直到满足收敛条件:

    • 对于第i个未知数,计算其新值:x(i) = (1 / a(i, i)) * (b(i) - Σ(a(i, j) * x(j), j=1 to i-1) - Σ(a(i, j) * x(j), j=i+1 to n)),其中a(i, j)表示系数矩阵A的第i行第j列元素。
    • 通过不断更新解向量x中的每个分量,得到新的解向量。
    • 重复进行以上两步操作,直到满足收敛条件:残差向量的范数小于设定的收敛阈值或达到最大迭代次数。
  5. 返回近似解向量x。

        Gauss-Seidel迭代法相比于Jacobi迭代法的改进之处在于,在每次迭代中,它使用了已经更新过的解向量的新分量来计算下一个未知数的新值,从而加快了收敛速度。然而,与Jacobi迭代法类似,Gauss-Seidel迭代法也需要满足一定的收敛条件才能得到有效的结果。

"""
@Time : 2023/10/19 0019 17:11
@Auth : yeqcGauss-Seidel 高斯赛德尔迭代
"""
import numpy as npdef Jacobi(A, b, max_iter=100, epsilon=1e-10):n = len(b)x = np.zeros(n)  # 初始解x_new = np.zeros(n)  # 存储更新后的解向量for iter in range(max_iter):for i in range(n):sum_ax = np.dot(A[i], x_new) - A[i][i] * x[i]  # 计算除去对角元素的和,注意:高斯-赛德尔,这里使用x_new而不是xx_new[i] = (b[i] - sum_ax) / A[i][i]  # 更新解向量的第i个分量# 判断终止条件if np.linalg.norm(x_new - x) < epsilon:breakx = np.copy(x_new)  # 更新解向量return x# 示例
A = np.array([[9, -1, -1], [-1, 8, 0], [-1, 0, 9]])b = np.array([7, 7, 8])x = Jacobi(A, b)
print("解:", x)

3. 松弛迭代

        松弛迭代(Relaxation Iteration)是一种用于求解线性方程组的迭代算法,常用于解决稀疏矩阵和大规模线性方程组的问题。它在Gauss-Seidel迭代法的基础上引入了一个松弛因子,用于加速收敛过程。

        松弛迭代的基本概念如下:

  1. 给定线性方程组的系数矩阵A和右侧常数向量b。

  2. 将系数矩阵A进行对角分解,得到三个矩阵D、L和U,其中D是A的对角矩阵,L是A的严格下三角矩阵(即主对角线以下元素为0),U是A的严格上三角矩阵(即主对角线以上元素为0)。

  3. 初始化解向量x为任意初始值(可以是全0向量)。

  4. 迭代更新解向量x,直到满足收敛条件:

    • 对于第i个未知数,计算其新值:x(i) = (1 - w) * x(i) + (w / a(i, i)) * (b(i) - Σ(a(i, j) * x(j), j=1 to i-1) - Σ(a(i, j) * x(j), j=i+1 to n)),其中a(i, j)表示系数矩阵A的第i行第j列元素,w是松弛因子(取值范围为0 < w < 2)。
    • 通过不断更新解向量x中的每个分量,得到新的解向量。
    • 重复进行以上两步操作,直到满足收敛条件:残差向量的范数小于设定的收敛阈值或达到最大迭代次数。
  5. 返回近似解向量x。

        松弛迭代法引入了松弛因子w,用于调整每次迭代更新的幅度。当松弛因子接近于1时,算法的收敛速度较慢;当松弛因子接近于0或2时,算法的收敛速度较快。恰当选择松弛因子可以显著提高算法的收敛速度,但过大或过小的松弛因子可能会导致算法发散。

        需要注意的是,在松弛迭代法中,松弛因子的选择是一个重要的问题,需要根据具体问题进行调试和优化。通常情况下,可以通过试验和经验来确定合适的松弛因子。

"""
@Time : 2023/10/19 0019 17:11
@Auth : yeqc松弛迭代
"""
import numpy as npdef relaxation_iteration(A, b, x0, max_iter=100, tol=1e-6, omega=1.0):n = len(A)x = x0.copy()for k in range(max_iter):for i in range(n):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:], x0[i + 1:]))if np.linalg.norm(x - x0) < tol:breakx0 = x.copy()return x# 示例
A = np.array([[9, -1, -1], [-1, 8, 0], [-1, 0, 9]])b = np.array([7, 7, 8])
x0 = np.zeros(3)  # 初始解向量
omega = 1.2  # 松弛因子
x = relaxation_iteration(A, b, x0, omega=omega)print("解:", x)

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

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

相关文章

解剖—单链表相关OJ练习题

目录 一、移除链表元素 二、找出链表的中间节点 三、合并两个有序链表 四、反转链表 五、求链表中倒数第k个结点 六、链表分割 七、链表的回文结构 八、判断链表是否相交 九、判断链表中是否有环(一) 十、 判断链表中是否有环(二) 注&#xff1a;第六题和第七题牛…

docker 基本用法-操作镜像

1.下载镜像 docker search centos #默认从 Docker Hub 中搜索镜像 访问 dockerhub&#xff1a;https://registry.hub.docker.com docker pull centos 拉取镜像 如果不能拉取 方法 1.需要配置配置镜像加速器 tee /etc/docker/daemon.json << EOF {"registry-mirro…

【文献copilot】调用文心一言api对论文逐段总结

文献copilot&#xff1a;调用文心一言api对论文逐段总结 当我读文献的时候&#xff0c;感觉读得太慢了&#xff0c;看翻译软件翻译的又觉得翻译的不好。于是我就写了个程序辅助我读文献&#xff0c;它可以逐段总结&#xff0c;输出格式是&#xff1a;原文一句话总结分段总结&a…

css钟表数字样式

如图&#xff1a; 代码 font-size: 28px;font-family: Yourname;font-weight: 500;color: #00e8ff;

CSS基础入门01

目录 1.CSS是什么 2.基本语法规范 3.引入方式 3.1内部样式表 3.2行内样式表 3.3外部样式 4.代码风格 4.1样式格式 4.2样式大小写 4.3空格规范 5.选择器 5.1选择器的功能 5.2选择器的种类 6.基础选择器 6.1标签选择器 6.2类选择器 6.3id 选择器 6.4通配符选择…

jQuery实现输入框提示并点击回显功能呢

html代码: <input type"text" id"affOrganization" name"affOrganization" class"form-control" placeholder"Search..." style"width: 300px" > <div class"search_suggest" id"gov_se…

黑豹程序员-架构师学习路线图-百科:开启分布式架构开发先河,让Java戴上全球第一的皇冠-EJB

文章目录 1、EJB的传奇2、什么是 EJB3、从拥抱到抛弃4、最终版EJB3.0 1、EJB的传奇 EJB这项技术其实已经消亡了&#xff0c;但为何我还专门单另拿出来讲呢&#xff1f;原因有三。 第一、EJB是J2EE雄霸全球的功臣&#xff0c;它把我们编程推向了分布式架构开发&#xff0c;为开…

Ubuntu的EFI分区无法删除

本文解决的问题&#xff1a;双系统装完后需要删除ubuntu的分区&#xff0c;但是EFI系统分区无法删除。 第一步&#xff1a;cmd中输入命令 diskpart 并回车&#xff0c;如图中①&#xff1b; 第二步&#xff1a;在弹出窗口②中依次输入如下命令即可删除EFI分区&#xff1b; /…

创新的营销模式与线上商城的完美结合

分享购&#xff0c;一个与众不同的电商平台&#xff0c;以一种全新的营销模式和独特的商业运营模式&#xff0c;颠覆了传统电商的观念&#xff0c;让每个人都能拥有属于自己的线上商城。它集自营品牌、供应链管理和CPS等多种优势于一身&#xff0c;形成了一种创新的交易和共享生…

移动App安全检测的必要性,app安全测试报告的编写注意事项

随着移动互联网的迅猛发展&#xff0c;移动App已经成为人们日常生活中不可或缺的一部分。然而&#xff0c;虽然App给我们带来了便利和乐趣&#xff0c;但也伴随着一些潜在的安全风险。黑客、病毒、恶意软件等威胁着用户的隐私和财产安全&#xff0c;因此进行安全检测就显得尤为…

Vue 组件和文件及文件夹命名规范、SPA、创建路由、router-link 相关属性、路由建立多视图单页应用

目录 一.vue组件&#xff08;重点&#xff09; 1.1 组件介绍 1.2 局部组件 1.3 全局组件 二.自定义事件 2.1 子 -> 父 2.2 父 -> 子 三.vue中文件及文件夹命名规范 四.SPA 4.1 SPA简介 4.2 SPA技术点 五.使用路由建立多视图单页应用 5.1 引入依赖库 5.2 创建…

算法进修Day-33

算法进修Day-33 65. 有效数字 难度&#xff1a;困难 题目要求 有效数字&#xff08;按顺序&#xff09;可以分成以下几个部分&#xff1a; 一个 小数 或者 整数&#xff08;可选&#xff09;一个 e 或 E &#xff0c;后面跟着一个 整数 小数&#xff08;按顺序&#xff09;…

什么是USRP软件无线电设备?

什么是USRP软件无线电设备&#xff1f; USRP软件无线电设备提供软件定义的RF架构&#xff0c;可让工程师使用自定义信号处理功能来设计、原型验证和部署无线系统。从基于大型开放式FPGA的经济款到高性能无线电设备&#xff0c;多种硬件可满足您的不同需求。您可以使用LabVIEW或…

施密特正交化

相信大家在平时的期末考试中一定少不了对某某向量组执行标准正交化类型的题目。今天我们从这个题目入手&#xff0c;说明这个如何执行施密特正交化&#xff0c;以及为什么要进行正交化。 一、例子 例子&#xff1a;设 a 1 [ 1 2 − 1 ] a_1\begin{bmatrix}1\\2\\-1\end{bmat…

Node-创建Web应用

题记 node创建web应用&#xff0c;以下是所有流程和代码 与php比较&#xff1a;使用 PHP 来编写后端的代码&#xff0c;需要 Apache 或者 Nginx 的 HTTP 服务器&#xff0c;并配上 mod_php5 模块和 php-cgi。 Node应用的组成 node应用由三部分组成&#xff1a; require 指令&a…

vulkan SDK安装

文章目录 一. vulcan官网二.安装流程 一. vulcan官网 https://vulkan.lunarg.com/sdk/home#windows 二.安装流程 点击下载 双击下载的*.exe进行安装 点击下一步 点击下一步 选择安装位置&#xff0c;点击下一步 点击全选&#xff0c;选择下一步 勾选同意&#xf…

PTrade财务数据获取函数的问题

前文介绍了PTrade的get_fundamentals函数&#xff0c;可以用于获取股票的财务数据。但在实际应用中&#xff0c;会遇到如下的问题。 前文我们通过将回测时间设置为2023-05-05进行回测调用get_fundamentals&#xff0c;得到如下查询结果&#xff1a; secu_codepubl_dateend_da…

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-[5]客户端与服务端连接

红队专题 招募六边形战士队员端操作系统SystemInfo类获取系统信息发送系统信息头文件声明头文件调用 未找到来自 OleAcc.dll 的导入LINK 招募六边形战士队员 一起学习 代码审计、安全开发、web攻防、逆向等。。。 私信联系 端 发送连接->进入主线程->返回socket->…

ps插件Coolorus for Mac中文激活版

Coolorus是一款非常实用的Photoshop插件&#xff0c;它为Photoshop增加了色环配色面板&#xff0c;让设计师可以更直观地选择颜色。同时&#xff0c;Coolorus还提供了多种专业配色方案&#xff0c;如鲜艳色、复古色、日常色等&#xff0c;设计师可以直接套用这些方案&#xff0…

Python中的内存管理:深入分析垃圾回收机制

python中有一个名为refchian的环状双向链表&#xff0c;python运行时创建的所有对象都会添加到refchain中。在refchain中的对象PyObject里都有一个ob_refcnt用来保存当前对象的引用计数器&#xff0c;就是该对象被引用的次数&#xff0c;当对象有新引用时ob_refcnt就会增加&…