解线性方程组——(Gauss-Seidel)高斯-赛德尔迭代法 | 北太天元

一、Gauss-Seidel迭代法

n = 3 n=3 n=3
A = ( a 11 a 12 a 13 a 21 a 22 a 23 a 31 a 32 a 33 ) , b = ( b 1 b 2 b 3 ) , A=\begin{pmatrix} a_{11} & a_{12} &a_{13}\\ a_{21} & a_{22} &a_{23}\\ a_{31} & a_{32} &a_{33}\\ \end{pmatrix} ,\quad b=\begin{pmatrix} b_1\\b_2\\ b_3 \end{pmatrix}, A= a11a21a31a12a22a32a13a23a33 ,b= b1b2b3 ,

先看一下Jacobi公式的特点

Jacobi公式为
x 1 ( k + 1 ) = b 1 − a 12 x 2 ( k ) − a 13 x 3 ( k ) a 11 x 2 ( k + 1 ) = b 2 − a 21 x 1 ( k ) − a 23 x 3 ( k ) a 22 x 3 ( k + 1 ) = b 3 − a 31 x 1 ( k ) − a 32 x 2 ( k ) a 33 \begin{gathered} x_1^{(k+1)} =\frac{b_{1}-a_{12}x_{2}^{(k)}-a_{13}x_{3}^{(k)}}{a_{11}} \\ x_2^{(k+1)} =\frac{b_{2}-a_{21}x_{1}^{(k)}-a_{23}x_{3}^{(k)}}{a_{22}} \\ x_3^{(k+1)} =\frac{b_{3}-a_{31}x_{1}^{(k)}-a_{32}x_{2}^{(k)}}{a_{33}} \end{gathered} x1(k+1)=a11b1a12x2(k)a13x3(k)x2(k+1)=a22b2a21x1(k)a23x3(k)x3(k+1)=a33b3a31x1(k)a32x2(k)

可以看出Jacobi方法每次迭代使用的是上一步的结果,每行全部独立计算完后才进入下一轮迭代。

而实际上计算 x 2 x_2 x2时, 本次迭代产生的 x 1 x_1 x1已经更新, 使用 x 3 x_3 x3时, x 1 , x 2 x_1,x_2 x1,x2已经更新。由此想法(尽可能使用最新产生的结果),得到Gauss-Seidel方法

Gauss-Seidel公式为
x 1 ( k + 1 ) = b 1 − a 12 x 2 ( k ) − a 13 x 3 ( k ) a 11 x 2 ( k + 1 ) = b 2 − a 21 x 1 ( k + 1 ) − a 23 x 3 ( k ) a 22 x 3 ( k + 1 ) = b 3 − a 31 x 1 ( k + 1 ) − a 32 x 2 ( k + 1 ) a 33 \begin{aligned} x_1^{(k+1)} &=\frac{b_{1}-a_{12}x_{2}^{(k)}-a_{13}x_{3}^{(k)}}{a_{11}} \\ x_2^{(k+1)} &=\frac{b_{2}-a_{21}x_{1}^{(k+1)}-a_{23}x_{3}^{(k)}}{a_{22}} \\ x_3^{(k+1)} &=\frac{b_{3}-a_{31}x_{1}^{(k+1)}-a_{32}x_{2}^{(k+1)}}{a_{33}} \end{aligned} x1(k+1)x2(k+1)x3(k+1)=a11b1a12x2(k)a13x3(k)=a22b2a21x1(k+1)a23x3(k)=a33b3a31x1(k+1)a32x2(k+1)

或等价的,将 A A A 分解为 A = D − L − U A=D-L-U A=DLU,其中
D = d i a g ( a 11 , a 22 , a 33 ) , D=diag(a_{11},a_{22},a_{33}), D=diag(a11,a22,a33), L = − [ 0 0 0 a 21 0 0 a 31 a 32 0 ] , U = − [ 0 a 12 a 13 0 0 a 23 0 0 0 ] . L=-\begin{bmatrix} 0 & 0 &0\\ a_{21} & 0&0\\ a_{31} & a_{32} &0\\ \end{bmatrix},\quad U=-\begin{bmatrix} 0 & a_{12} &a_{13}\\ 0 & 0&a_{23}\\ 0 & 0 &0\\ \end{bmatrix}. L= 0a21a3100a32000 ,U= 000a1200a13a230 . ( D − L − U ) x = b D x = b + ( L + U ) x D x ( k + 1 ) = b + L x ( k + 1 ) + U x ( k ) ( D − L ) x ( k + 1 ) = b + U x ( k ) x ( k + 1 ) = ( D − L ) − 1 ( b + U x ( k ) ) \begin{aligned} (D-L-U)x &= b\\ Dx &= b+(L+U)x\\ Dx^{(k+1)}&=b+Lx^{(k+1)}+Ux^{(k)}\\ (D-L)x^{(k+1)}&=b+Ux^{(k)}\\ x^{(k+1)}&=(D-L)^{-1}(b+Ux^{(k)}) \end{aligned} (DLU)xDxDx(k+1)(DL)x(k+1)x(k+1)=b=b+(L+U)x=b+Lx(k+1)+Ux(k)=b+Ux(k)=(DL)1(b+Ux(k))

其中 x ( k + 1 ) = D − 1 ( b + L x ( k + 1 ) + U x ( k ) ) x^{(k+1)}=D^{-1}(b+Lx^{(k+1)}+Ux^{(k)}) x(k+1)=D1(b+Lx(k+1)+Ux(k))
写成矩阵的形式
[ x 1 ( k + 1 ) x 2 ( k + 1 ) x 3 ( k + 1 ) ] = [ 1 a 11 1 a 22 1 a 33 ] ( [ b 1 b 2 b 3 ] − [ a 21 a 31 a 32 ] [ x 1 ( k + 1 ) x 2 ( k + 1 ) x 3 ( k + 1 ) ] − [ a 12 a 13 a 23 ] [ x 1 ( k ) x 2 ( k ) x 3 ( k ) ] ) \begin{bmatrix} x_1^{(k+1)}\\x_2^{(k+1)}\\ x_3^{(k+1)} \end{bmatrix} = \begin{bmatrix} \frac{1}{a_{11}} & &\\ & \frac{1}{a_{22}} &\\ & &\frac{1}{a_{33}}\\ \end{bmatrix}\left( \begin{bmatrix} b_1\\b_2\\ b_3 \end{bmatrix}-\begin{bmatrix} & &\\ a_{21} & &\\ a_{31} & a_{32} &\ \\ \end{bmatrix}\begin{bmatrix} x_1^{(k+1)}\\x_2^{(k+1)}\\ x_3^{(k+1)} \end{bmatrix} -\begin{bmatrix} \ & a_{12} &a_{13}\\ & &a_{23}\\ & &\\ \end{bmatrix}\begin{bmatrix} x_1^{(k)}\\x_2^{(k)}\\x_3^{(k)}\end{bmatrix}\right) x1(k+1)x2(k+1)x3(k+1) = a111a221a331 b1b2b3 a21a31a32  x1(k+1)x2(k+1)x3(k+1)  a12a13a23 x1(k)x2(k)x3(k)
下面是其一般形式下的算法

二、算法

♡ \heartsuit Gauss-Seidel迭代法

主要思路

输入 : A , b , x ( 0 ) A,b,x^{(0)} A,b,x(0)
输出 : x x x
x ( 0 ) = initial vector  x ( k + 1 ) = ( D − L ) − 1 ( b + U x ( k ) ) \begin{aligned} x^{(0)} &=\text{ initial vector } \\ x^{(k+1)}&=(D-L)^{-1}(b+Ux^{(k)}) \end{aligned} x(0)x(k+1)= initial vector =(DL)1(b+Ux(k))

添加一些限制

  • 容许误差 e_tol,
  • 最大迭代步 N N N.

当 残差 <e_tol 或 迭代步数 ≥ N \geq N N 时,都会停止迭代,输出结果

实现步骤

  • 步骤 1 1 1: k = 0 k=0 k=0, x = x ( 0 ) x=x^{(0)} x=x(0)

  • 步骤 2 2 2: 计算残差 r = ∥ b − A x ∥ r=\|b-Ax\| r=bAx

    • 如果残差 r r r >e_tol 且 k < N k<N k<N,转步骤 3 3 3;
    • 否则, 转步骤 5 5 5
  • 步骤 3 3 3: 更新解向量 x = ( D − L ) − 1 ( b + U x ( 0 ) ) x=(D-L)^{-1}(b+Ux^{(0)}) x=(DL)1(b+Ux(0))

  • 步骤 4 4 4 x 0 = x x0=x x0=x, k = k + 1 k=k+1 k=k+1,转步骤 2 2 2;

  • 步骤 5 5 5: 输出 x x x.

在这里插入图片描述

三、北太天元源程序

Gauss-Seidel

function [x,k,r] = myGS(A,b,x0,e_tol,N)
% Gauss-Seidel迭代法解线性方程组
% Input: A, b(列向量), x0(初始值)
%        e_tol: error tolerant  
%        N: 限制迭代次数小于 N 次
% Output: x , k(迭代次数),r:残差
%   Version:            1.0
%   last modified:      01/29/2024n = length(b); k = 0; x=zeros(n,N); % 记录每一次迭代的结果,方便后续作误差分析x(:,1)=x0; L = -tril(A,-1); U = -triu(A,1); D = diag(diag(A));r = norm(b - A*x,2);while r > e_tol && k < Nx(:,k+2) = inv(D-L)*(b+U*x(:,k+1)); % 不同之处r = norm(b - A*x(:,k+2),2); % 残差k = k+1;endx = x(:,2:k+1); % x取迭代时的结果if k>Nfprintf('迭代超出最大迭代次数');elsefprintf('迭代次数=%i\n',k);end
end

保存为 myGS.m 文件

四、数值算例

(此例子与 Jaboci迭代法 文章中的例子相同,可以对比着来看)

A x = b Ax=b Ax=b,求 x x x
A = ( 10 − 1 2 0 − 1 11 − 1 3 2 − 1 10 − 1 0 3 − 1 8 ) b = ( 6 25 − 11 15 ) A = \begin{pmatrix} 10 & -1 & 2 & 0 \\ -1 & 11 & -1 & 3 \\ 2 & -1 & 10 & -1 \\ 0 & 3 & -1 & 8 \\ \end{pmatrix}\quad b = \begin{pmatrix} 6 \\ 25 \\ -11 \\ 15 \\ \end{pmatrix} A= 1012011113211010318 b= 6251115

用Gauss列主元消去法,得

x = 1.0000000000000002.000000000000000-1.0000000000000001.000000000000000

下面我们用Gauss-Seidel 迭代法进行求解

%% Gauss-Seidel test
% time :      4/24/2024%% example 1
clc;clear all,format long;
N = 100; e_tol = 1e-8;
A=[10 -1 2 0; -1 11 -1 3; 2 -1 10 -1; 0 3 -1 8];
b=[6; 25; -11; 15];
x0=[0; 0; 0; 0];[x11,k1] = myGS(A,b,x0,e_tol,N)[x12,k2] = myJacobi(A,b,x0,e_tol,N)
% 作图查看误差变化x_exact=[1;2;-1;1]; %真解n = length(b);error=zeros(n,k1);% 每个分量的误差error = abs(x_exact - x11) res =zeros(1,k1); % 残差res1 = res;res2 = res;for i=1:1:k1res1(i) = norm(b-A*x11(:,i),2);end for i=1:1:k2res2(i) = norm(b-A*x12(:,i),2);end% 数值解figure(1);plot(1:k1,x11(1,:),'-*r',1:k1,x11(2,:),'-og', 1:k1,x11(3,:),'-+b',1:k1,x11(4,:),'-dk');legend('x_1','x_2','x_3','x_4');title('G-S下每个数值解的变化')% 残差变化figure(2);plot(1:k1,res1,'-*r');hold onplot(1:k2,res2,'-*b');legend('G-S','Jacobi');title('残差变化')% 误差figure(3);plot(1:k1,error(1,:),'-*r',1:k1,error(2,:),'-og', 1:k1,error(3,:),'-+b',1:k1,error(4,:),'-dk');legend('x_1','x_2','x_3','x_4');title('G-S下每个数值解的误差变化')

运行后得到
在这里插入图片描述
在这里插入图片描述

和Jacobi相比,其 达到相同精度 所需要得迭代步数更少,如下图
在这里插入图片描述
Gauss-Seidel 需进行 10次迭代

而 Jacobi 需进行 26 次迭代

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

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

相关文章

缓存神器-JetCache

序言 今天和大家聊聊阿里的一款缓存神器 JetCache。 一、缓存在开发实践中的问题 1.1 缓存方案的可扩展性问题 谈及缓存&#xff0c;其实有许多方案可供选择。例如&#xff1a;Guava Cache、Caffine、Encache、Redis 等。 这些缓存技术都能满足我们的需求&#xff0c;但现…

《从零开始的Java世界》10File类与IO流

《从零开始的Java世界》系列主要讲解Javase部分&#xff0c;从最简单的程序设计到面向对象编程&#xff0c;再到异常处理、常用API的使用&#xff0c;最后到注解、反射&#xff0c;涵盖Java基础所需的所有知识点。学习者应该从学会如何使用&#xff0c;到知道其实现原理全方位式…

LAMP(Linux+Apache+MySQL+PHP)环境介绍、配置、搭建

LAMP(LinuxApacheMySQLPHP)环境介绍、配置、搭建 LAMP介绍 LAMP是由Linux&#xff0c; Apache&#xff0c; MySQL&#xff0c; PHP组成的&#xff0c;即把Apache、MySQL以及PHP安装在Linux系统上&#xff0c;组成一个环境来运行PHP的脚本语言。Apache是最常用的Web服务软件&a…

纸箱码垛机:从传统到智能,科技如何助力产业升级

随着科技的飞速发展&#xff0c;传统工业领域正经历着一场重要的变革。作为物流行业重要一环的纸箱码垛机&#xff0c;其从传统到智能的转型升级&#xff0c;不仅提高了生产效率&#xff0c;还大幅降低了人工成本&#xff0c;为产业升级提供了强大助力。星派将探讨纸箱码垛机的…

【Unity】UnityEvent(一)

​UnityEvent----高效管理游戏事件的利器 在游戏开发中&#xff0c;事件系统是实现各种功能的关键组成部分。它允许我们将不同对象之间的交互解耦&#xff0c;使得代码更加模块化和易于维护。而UnityEvent作为Unity引擎提供的一种强大的事件系统工具&#xff0c;为开发者提供了…

CPDA|0到1突破:构建高效数据分析体系的秘密武器

在现今信息爆炸的时代&#xff0c;数据已经渗透到了我们生活的方方面面&#xff0c;成为了决策、创新和竞争优势的关键。因此&#xff0c;构建一套高效的数据分析体系&#xff0c;对于企业和个人而言&#xff0c;都是至关重要的。那么&#xff0c;如何在众多的数据海洋中脱颖而…

分类神经网络1:VGGNet模型复现

目录 分类网络的常见形式 VGG网络架构 VGG网络部分实现代码 分类网络的常见形式 常见的分类网络通常由特征提取部分和分类部分组成。 特征提取部分实质就是各种神经网络&#xff0c;如VGG、ResNet、DenseNet、MobileNet等。其负责捕获数据的有用信息&#xff0c;一般是通过…

5分钟——测试搭建的springboot接口(二)

5分钟——测试搭建的springboot接口&#xff08;二&#xff09; 1. 查看数据库字段2. 测试getAll接口3. 测试add接口4. 测试update接口5. 测试deleteById接口 1. 查看数据库字段 2. 测试getAll接口 3. 测试add接口 4. 测试update接口 5. 测试deleteById接口

Docker 开启远程安全访问

说明 如果你的服务器是公网IP&#xff0c;并且开放了docker的远程访问&#xff0c;如果没有进行保护是非常危险的&#xff0c;任何人都可以向你的docker中推送镜像、运行实例。我曾开放过阿里云服务器中docker的远程访问权限&#xff0c;在没有开启保护的状态下&#xff0c;几…

用 LMDeploy 高效部署 Llama-3-8B,1.8倍vLLM推理效率

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总…

Springboot 整合 Quartz框架做定时任务

在Spring Boot中整合Quartz&#xff0c;可以实现定时任务调度的功能 1、首先&#xff0c;在pom.xml文件中添加Quartz和Spring Boot Starter Quartz的依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-bo…

一些好听且有心意的英文全名Burwood新南威尔士州伯伍德喝酒上脸就是乙醛中毒1. 康奈尔大学官宣恢复标化要求2. 香港城市大学(东莞)正式设立!

目录 一些好听且有心意的英文全名 Burwood新南威尔士州伯伍德 喝酒上脸就是乙醛中毒 1. 康奈尔大学官宣恢复标化要求 2. 香港城市大学&#xff08;东莞&#xff09;正式设立&#xff01; 一些好听且有心意的英文全名 在选择好听且有意义的英文全名时&#xff0c;我们可…

synchronized的底层原理

目录 介绍 实现原理 对象头 Monitor&#xff08;监视器&#xff09; 锁升级 偏向锁 轻量级锁 重量级锁 锁的优缺点 介绍 synchronized 是 Java 中的关键字&#xff0c;它用于锁定代码块或方法&#xff0c;以确保同一时刻只有一个线程可以进入被锁定的部分。这在多线程…

css盒子设置圆角边框的方法

前言 欢迎来到我的博客 个人主页&#xff1a;北岭敲键盘的荒漠猫-CSDN博客 本文为我整理的设置圆角边框的方法 需求描述 我们在设置盒子边框时&#xff0c;他总是方方正正的。 我们想让这个直直的边框委婉一点该怎么办呢。这个就提到了我们这篇文章讲的东西&#xff1a; bord…

聚观早报 | OpenAI在印度开始招聘;特斯拉将发布一季度财报

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 4月23日消息 OpenAI在印度开始招聘 特斯拉将发布一季度财报 理想汽车全线产品降价 优酷升级悬疑剧场为白夜剧场 …

ffmpeg支持MP3编码的方法

目录 现象 解决办法 如果有编译包没有链接上的情况 现象 解决办法 在ffmpeg安装包目录下 &#xff0c;通过./configure --list-encoders 和 ./configure --list-decoders 命令可以看到&#xff0c;ffmpeg只支持mp3解码&#xff0c;但是不支持mp3编码。 上网查寻后发现&…

C++ :设计模式实现

文章目录 原则单一职责原则开闭原则依赖倒置原则接口隔离原则里氏替换原则 设计模式单例模式观察者模式策略模式代理模式 原则 单一职责原则 定义&#xff1a; 即一个类只负责一项职责 问题&#xff1a; 类 T 负责两个不同的职责&#xff1a;职责 P1&#xff0c;职责 P2。当…

Tomcat源码解析——一次请求的处理流程

在上一篇文章中&#xff0c;我们知道Tomcat在启动后&#xff0c;会在Connector中开启一个Acceptor(接收器)绑定线程然后用于监听socket的连接&#xff0c;那么当我们发出请求时&#xff0c;第一步也就是建立TCP连接&#xff0c;则会从Acceptor的run方法处进入。 Acceptor&…

使用CSS+HTML完成导航栏

HTML <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>导航栏示例</title> &l…

07 内核开发-避免命名冲突经验技巧分享

07 内核开发-避免命名冲突经验技巧分享 目录 07 内核开发-避免命名冲突经验技巧分享 1.如何在内核开发过程中&#xff0c;避免命名冲突 2. 背景 3.避免方法 4.了解下 文件/proc/kallsyms 5.总结 课程简介&#xff1a; Linux内核开发入门是一门旨在帮助学习者从最基本的…