解线性方程组——(Jacobi)雅克比迭代法 | 北太天元

news2024/9/20 16:25:47

一、Jacobi迭代法

n = 3 n=3 n=3 , 阶数为 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公式为
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迭代可以用于并行计算。

或等价的,将 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 x = D − 1 ( b + ( L + U ) x ) \begin{gathered} (D-L-U)x = b\\ Dx = b+(L+U)x\\ x=D^{-1}(b+(L+U)x)\\ \end{gathered} (DLU)x=bDx=b+(L+U)xx=D1(b+(L+U)x)
得Jacobi公式 x ( k + 1 ) = D − 1 ( b + ( L + U ) x ( k ) ) x^{(k+1)}=D^{-1}(b+(L+U)x^{(k)}) x(k+1)=D1(b+(L+U)x(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 12 a 13 a 21 a 23 a 31 a 32 ] [ 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_{12} &a_{13}\\ a_{21} & &a_{23}\\ a_{31} & a_{32} &\\ \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 a21a31a12a32a13a23 x1(k)x2(k)x3(k)
下面是其一般形式下的算法

二、算法

💖 Jacobi迭代法

主要思路

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

添加一些限制

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

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

实现步骤

  • 步骤 1: k = 0 k=0 k=0 x = x ( 0 ) x=x^{(0)} x=x(0)
  • 步骤 2: 计算残差 r = ∥ b − A x ∥ r=\|b-Ax\| r=bAx
    • 如果残差 r r r > e_tol 且 k < N k<N k<N,转步骤 3;
    • 否则,转步骤 5;
  • 步骤 3: 更新解向量
    x = D − 1 ( b + ( L + U ) x ( 0 ) ) x=D^{-1}(b+(L+U)x^{(0)}) x=D1(b+(L+U)x(0))
  • 步骤 4: x 0 = x x0=x x0=x k = k + 1 k=k+1 k=k+1,转步骤 2;
  • 步骤 5: 输出 x x x

在这里插入图片描述

三、北太天元源程序

Jacobi迭代

function [x,k,r] = myJacobi(A,b,x0,e_tol,N)
% Jacobi迭代法解线性方程组
% Input: A, b(列向量), x0(初始值)
%        e_tol: error tolerant  
%        N: 限制迭代次数小于 N 次
% Output: x , k(迭代次数),r:残差
%   Version:            1.0
%   last modified:      01/27/2024
    n = 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 < N
        x(:,k+2) = inv(D)*(b+(L+U)*x(:,k+1));
        r = norm(b - A*x(:,k+2),2); % 残差
        k = k+1;
    end
    x = x(:,2:k+1); % x取迭代时的结果
    
    if k>N
        fprintf('迭代超出最大迭代次数');
    else
        fprintf('迭代次数=%i\n',k);
    end
end

保存为 myJacobi.m文件

四、数值算例

例1

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.000000000000000
   2.000000000000000
  -1.000000000000000
   1.000000000000000

下面我们用Jacobi迭代法进行求解

设 N = 100 , e_tol = 1e-8, x0=[0; 0; 0; 0]

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];
t1 =tic;
    [x11,k1] = myJacobi(A,b,x0,e_tol,N)
toc(t1);
t2 = tic;
    [x12] = gsem_column(A,b)
toc(t2);
% 作图查看误差变化
    x_exact=[1;2;-1;1]; %真解
    n = length(b);
    error=zeros(n,k1);% 每个分量的误差
        error = abs(x_exact - x11) 
    res =zeros(1,k1); % 残差
    for i=1:1:k1
        res(i) = norm(b-A*x11(:,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('每个数值解的变化')
    % 残差变化
        figure(2);
        plot(1:k1,res,'-*r');
        legend('残差');
        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('误差变化')

迭代次数=26

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

例2

[ 3 − 1 0 0 0 1 2 − 1 3 − 1 0 1 2 0 0 − 1 3 − 1 0 0 0 0 − 1 3 − 1 0 0 1 2 0 − 1 3 − 1 1 2 0 0 0 − 1 3 ] [ x 1 x 2 x 3 x 4 x 4 x 5 x 6 ] = [ 5 2 3 2 1 1 3 2 5 2 ] . \begin{bmatrix}3&-1&0&0&0&\frac{1}{2}\\-1&3&-1&0&\frac{1}{2}&0\\0&-1&3&-1&0&0\\0&0&-1&3&-1&0\\0&\dfrac{1}{2}&0&-1&3&-1\\\frac{1}{2}&0&0&0&-1&3\end{bmatrix}\begin{bmatrix}x_1\\x_2\\x_3\\x_4\\x_4\\x_5\\x_6\end{bmatrix}=\begin{bmatrix}\frac{5}{2}\\ \frac{3}{2}\\1\\1\\\frac{3}{2}\\\frac{5}{2}\end{bmatrix}. 3100021131021001310000131002101312100013 x1x2x3x4x4x5x6 = 2523112325 .
使用Gauss消去法与Jacobi迭代法分别对其进行求解,并观察有何差异。
试着得到在更高阶数下的结果。

x x x的真解为 [ 1 , 1 , 1 , 1 , 1 , 1 ] T [1,1,1,1,1,1]^T [1,1,1,1,1,1]T

稀疏矩阵的构造:

function [A,b,x_sp] = setup_Sparse1(n)
    % 定义一个 n 阶的稀疏矩阵, 真解全为1
    % Input: n
    % Output: A,b
    %
    %   Version:            1.0
    %   last modified:      09/28/2023
    A = zeros(n,n);b = ones(n,1) * 1.5;
    b([1,n],1) = 2.5; b([n/2,n/2 + 1],1) = 1;
    x_sp = ones(n,1); % 真解
    for i = 1:1:n
        A(i,n+1-i) = 1/2;
        A(i,i) = 3;
    end
    for i =1:1:n-1
        A(i,i+1)= -1;A(i+1,i)= -1;
    end
end

保存为 setup_Sparse1.m 文件

实现代码

%% 测试 消去法 与 迭代法 在处理稀疏矩阵问题上的差距
clc;clear all,format long;
N = 100; e_tol = 1e-8;
n = 6; %  n 为 6 50 100 500 1000
[A,b,x]=setup_Sparse1(n);
x0 = zeros(n,1); 

t1 =tic;
[x11,k1,r1] = myJacobi(A,b,x0,e_tol,N);
toc(t1);

t2 = tic;
[x12] = gsem_column(A,b);
toc(t2);
r2 = norm(b-A*x12);

结果如下:
n=6时

  • Jacobi迭代次数为33次,耗时 0.254356 秒。 r = 8.383869485405770 e − 09 r= 8.383869485405770e-09 r=8.383869485405770e09
  • Gauss列主元耗时 0.246983 秒。 r = 0 r=0 r=0

n=50时

  • Jacobi迭代次数为84次,耗时 0.252936 秒。 r = 8.506205291756777 e − 09 r= 8.506205291756777e-09 r=8.506205291756777e09
  • Gauss列主元耗时 0.499854 秒。 r = 5.197930934883577 e − 15 r=5.197930934883577e-15 r=5.197930934883577e15

n=100时

  • Jacobi迭代次数为84次,耗时 1.017717 秒。 r = 9.969971572640032 e − 09 r= 9.969971572640032e-09 r=9.969971572640032e09
  • Gauss列主元耗时 1.121281 秒。 r = 7.077617359078848 e − 15 r=7.077617359078848e-15 r=7.077617359078848e15

n=500时

  • Jacobi迭代次数为84次,耗时 20.812204 秒。 r = 9.964771950043455 e − 09 r= 9.964771950043455e-09 r=9.964771950043455e09
  • Gauss列主元耗时 21.329216 秒。 r = 8.862333997095065 e − 15 r=8.862333997095065e-15 r=8.862333997095065e15

n=1000时

  • Jacobi迭代次数为84次,耗时 34.252031 秒。 r = 9.964771950894769 e − 09 r= 9.964771950894769e-09 r=9.964771950894769e09
  • Gauss列主元耗时 89.985333 秒。 r = 1.072960336432300 e − 14 r=1.072960336432300e-14 r=1.072960336432300e14

可以看出,随着稀疏矩阵规模的不断增大,迭代法相比直接法的优势越来越明显。
直接法即能够在有限步内完成计算,随着阶数增大,(gauss消去法运算量 O ( n 3 ) O(n^3) O(n3)),所需步数,指数级增加。

而Jacobi迭代法,只需把精度控制在所需范围内即算完成任务,能够节约很多时间。

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

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

相关文章

武汉大学博士,华为上班5年多,月薪多少。。。

最近&#xff0c;一位来自武汉大学的博士研究生透露了自己在华为公司工作五年后的薪酬情况。 据他透露&#xff0c;他在2018年加入华为时的月薪为2.4万&#xff0c;随着时间的推移&#xff0c;到了2023年&#xff0c;他的月薪已经增长至4.4万&#xff01;此外&#xff0c;他还透…

微信小程序webview和小程序通讯

1.背景介绍 1.1需要在小程序嵌入vr页面&#xff0c;同时在vr页面添加操作按钮与小程序进行通信交互 1.2 开发工具&#xff1a;uniapp开发小程序 1.3原型图 功能&#xff1a;.点击体验官带看跳转小程序的体验官带看页面 功能&#xff1a;点击立即咨询唤起小程序弹窗打电话 2.…

React-RTK

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;React篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来React篇专栏内容:React-RTK 目录 1、介绍 2、安装 3、编写RTK使用示例 4、官方提供项目包示例 创建 Redux …

uniapp中vue写微信小程序的生命周期差别

根据uniapp官网里的生命周期&#xff0c;感觉不太对劲&#xff0c;就自己测试了几个&#xff0c;发现有所差别。 红字数字 为 实际测试生命周期顺序。 因为需要页面传参 后再 初始化数据&#xff0c;而onLoad(option)接收参数后&#xff0c;就已经过了create()了&#xff0c;所…

tokio多任务绑定cpu(绑核)

tokio 是 rust 生态中流行的异步运行时框架。在实际生产中我们如果希望 tokio 应用程序与特定的 cpu core 绑定该怎么处理呢&#xff1f; 首先我们先写一段简单的多任务程序。 use tokio; use tokio::runtime; use core_affinity;fn tokio_sample() {let rt runtime::Builde…

3.SpringCloud版本

1.SpringCloud与SpringBoot之间版本对应 2.服务拆分的注意事项 1.不同微服务&#xff0c;不要重复开发相同业务。 2.微服务的数据独立&#xff0c;每个微服务都有自己独立的数据库&#xff0c;不要访问其他微服务的数据库。 3.微服务可以将自己的的业务暴露为接口&#xff…

C++:基础语法

一、命名空间 在C/C中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称将都存在于全局作用域中&#xff0c;可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化&#xff0c; 以避免命名冲突或名字污染&#xff0c;n…

24V转2.8V2A降压芯片WT6030

24V转2.8V2A降压芯片WT6030 WT6030是一种高效同步整流降压开关模式转换器&#xff0c;集成内部功率MOSFET。该器件在宽输入电源范围内提供3A峰值输出电流&#xff0c;展现出卓越的负载和线路调节性能。其设计仅需要最小数量的外部现成组件&#xff0c;并且采用了节省空间的ESO…

GITHUB的VB代码无法加载的问题解决

GITHUB里有不少好的VB代码&#xff0c;但是下载之后&#xff0c;经常出现工程加载出错的问题&#xff0c;例如&#xff1a; LOG文件为&#xff1a; 不能加载 0 行 0: 不能加载文件 D:\xxxx\Semi VB API Loader\frmMain.frm 。 原因其实很简单&#xff0c;github里的换行符是u…

如何在PostgreSQL中使用索引覆盖扫描提高查询性能?

文章目录 解决方案1. 创建合适的索引2. 确保查询能够使用索引覆盖扫描3. 调整查询以利用索引覆盖扫描4. 监控和调优 示例代码1. 创建索引2. 编写查询3. 检查是否使用索引覆盖扫描4. 调整索引 总结 在PostgreSQL中&#xff0c;索引是提高查询性能的关键工具之一。索引允许数据库…

C# 字面量null对于引用类型变量✓和值类型变量×

编译器让相同的字符串字面量共享堆中的同一内存位置以节约内存。 在C#中&#xff0c;字面量&#xff08;literal&#xff09;是指直接表示固定值的符号&#xff0c;比如数字、字符串或者布尔值。而关键字&#xff08;keyword&#xff09;则是由编程语言定义的具有特殊含义的标…

积极探索新质生产力,九河云携手华为云技术交流引领数智跃迁

4月18日&#xff0c;九河云携手华为云举办了华为云SA技术培训会议&#xff0c;培训邀请到华为云技术人员作为主讲人&#xff0c;通过理论讲解与案例结合的方式&#xff0c;围绕ECS和EBS之间的联动&#xff0c;调优和数据保护等方面展开&#xff0c;深入浅出地讲解了基于EBS部署…

Python从0到100(十四):高级函数及函数使用进阶

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

【机器学习】分类与预测算法的评价与优化

以实际案例解析F1值与P-R曲线的应用 一、分类算法与性能评价的重要性二、F1值与P-R曲线的概念与意义三、实例解析&#xff1a;以垃圾邮件检测为例四、代码实现与结果分析五、结论与展望 在数据驱动的时代&#xff0c;机器学习算法以其强大的数据处理和分析能力&#xff0c;成为…

day07 51单片机-18B20温度检测

18B20温度检测 1.1 需求描述 本案例讲解如何从18B20传感器获取温度信息并显示在LCD上。 1.2 硬件设计 1.2.1 硬件原理图 1.2.3 18B20工作原理 可以看到18B20有两根引脚负责供电&#xff0c;一根引脚负责数据交换。18B20就是通过数据线和单片机进行数据交换的。 1&#xf…

PROSAIL模型前向模拟与植被参数遥感提取代码实现

原文链接&#xff1a;PROSAIL模型前向模拟与植被参数遥感提取代码实现https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247602140&idx7&sn7c4ca9239865d536ba81ba4c26a34031&chksmfa820e3bcdf5872d540c0dfe8c533c8696c8b4658427aab254f246a739f96b36bc37…

GPT 在目标设定中的应用:实现梦想的技术方法

在技术快速进步的时代&#xff0c;我们设定和实现目标的方式正在不断发展。 该领域最重要的创新之一是引入生成式预训练 Transformer (GPT)。 本文将探讨 GPT 技术如何彻底改变目标设定的艺术&#xff0c;提供实用的见解和案例研究来展示其影响。 GPT 和目标设定简介 ​ 了解 …

Ansible安装基本原理及操作(初识)

作者主页&#xff1a;点击&#xff01; Ansible专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年4月23日15点18分 Ansible 是一款功能强大且易于使用的IT自动化工具&#xff0c;可用于配置管理、应用程序部署和云端管理。它使用无代理模式&#xff08;agentles…

控制台居然可以这么玩?五分钟带你上手ANSI指令,实现一个log工具包

目录 前言 基础知识 进阶实践 ANSI参数 ANSI类 JSLog类 工具的使用说明 配置相关 全局配置项 默认配置 基本用法 打印字符 添加全局配置项 清空所有样式及操作行为 校验传入的参数是否正确 样式控制 Node环境 浏览器中 光标控制指令 光标位置偏移 滚动条控…

Pytorch:张量的梯度计算

目录 一、自动微分简单介绍1、基本原理2、梯度计算过程3、示例&#xff1a;基于 PyTorch 的自动微分a.示例详解b.梯度计算过程c.可视化计算图 4、总结 二、为什么要计算损失&#xff0c;为何权重更新是对的&#xff1f;1、梯度下降数学原理2、梯度上升 三、在模型中使用自动微分…