MATLAB 共轭梯度法求解线性方程组(附代码)

news2024/9/17 7:44:37

共轭梯度法求解线性方程组

在这里插入图片描述

1. 引言

共轭梯度法(Conjugate Gradient Method)是一种用于求解大型稀疏对称正定线性方程组的迭代算法。该方法结合了梯度下降法和共轭方向的概念,以达到更快速的收敛。共轭梯度法 是介于最速下降法与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点,在有限元求解中经常用到此方法求解椭圆问题。

2. 数学原理

2.1 问题描述

给定一个对称正定矩阵 ( A ) 和一个向量 ( b ),我们需要求解线性方程组 ( Ax = b )。

2.2 目标函数

我们可以通过最小化二次型函数来求解上述线性方程组:

f ( x ) = 1 2 x T A x − b T x f(x) = \frac{1}{2} x^T A x - b^T x f(x)=21xTAxbTx

其梯度为:

∇ f ( x ) = A x − b \nabla f(x) = A x - b f(x)=Axb

2.3 梯度下降法

梯度下降法的更新公式为:

x k + 1 = x k − α k ∇ f ( x k ) x_{k+1} = x_k - \alpha_k \nabla f(x_k) xk+1=xkαkf(xk)

其中 α k \alpha_k αk 是步长。

2.4 共轭方向

共轭方向是一组特殊的搜索方向,满足以下条件:

p i T A p j = 0 for i ≠ j p_i^T A p_j = 0 \quad \text{for} \quad i \neq j piTApj=0fori=j.

2.5 共轭梯度法的迭代公式

  1. 初始化:选择初始点 x 0 x_0 x0,计算 r 0 = b − A x 0 r_0 = b - A x_0 r0=bAx0,并令 p 0 = r 0 p_0 = r_0 p0=r0.
  2. 迭代步骤:
    • 计算步长 α k \alpha_k αk
      α k = r k T r k p k T A p k \alpha_k = \frac{r_k^T r_k}{p_k^T A p_k} αk=pkTApkrkTrk.
    • 更新解向量 x k + 1 x_{k+1} xk+1
      x k + 1 = x k + α k p k x_{k+1} = x_k + \alpha_k p_k xk+1=xk+αkpk.
    • 更新残差 r k + 1 r_{k+1} rk+1
      r k + 1 = r k − α k A p k r_{k+1} = r_k - \alpha_k A p_k rk+1=rkαkApk.
    • 计算方向更新系数 β k \beta_k βk
      β k = r k + 1 T r k + 1 r k T r k \beta_k = \frac{r_{k+1}^T r_{k+1}}{r_k^T r_k} βk=rkTrkrk+1Trk+1.
    • 更新搜索方向 p k + 1 p_{k+1} pk+1
      p k + 1 = r k + 1 + β k p k p_{k+1} = r_{k+1} + \beta_k p_k pk+1=rk+1+βkpk.
  3. 检查收敛:如果 r k + 1 r_{k+1} rk+1 足够小,则停止迭代。

3. MATLAB 实现

以下是详细的 MATLAB 程序实现共轭梯度法。

function [u,iter,res_norms] = conjugate_gradient(A, F, tol, maxIter)
%% 使用共轭梯度法求解 A * u = F
% A - 系数矩阵
% F - 右端向量
% tol - 收敛容差
% maxIter - 最大迭代次数

% 初始化解向量
u = zeros(size(F));
r = F - A * u;  % 初始残差
p = r;  % 初始方向向量
rsold = r' * r;  % 初始残差范数
    res_norms = zeros(maxIter, 1);
    res_norms(1) = sqrt(rsold);
    
for iter = 1:maxIter
    Ap = A * p;
    alpha = rsold / (p' * Ap);
    u = u + alpha * p;  % 更新解
    r = r - alpha * Ap;  % 更新残差
    rsnew = r' * r;  % 新的残差范数
    res_norms(iter+1) = sqrt(rsnew);
    % 检查收敛性
    if sqrt(rsnew) < tol
        res_norms = res_norms(1:iter+1);
        break;
    end

    p = r + (rsnew / rsold) * p;  % 更新方向向量
    rsold = rsnew;
end

搞个 250000阶的大矩阵测试一下:

% 测试案例
n = 250000; % 矩阵规模
A = gallery('poisson', sqrt(n)); % 生成对称正定矩阵
b = rand(n, 1); % 生成右侧向量
% x0 = zeros(n, 1); % 初始解
tol = 1e-8;
max_iter = 100000;

% 调用共轭梯度法
[x, k, res_norms] = conjugate_gradient(A, b,  tol, max_iter);

% 显示结果
fprintf('迭代次数 k: %d\n', k);

% 可视化结果
figure;
semilogy(res_norms, 'o-');
xlabel('迭代次数');
ylabel('残差范数');
title('共轭梯度法残差范数收敛曲线');
grid on;
set(gca,'FontName','Monospaced');

画出收敛曲线:
在这里插入图片描述
残差设定 1 e − 8 1e-8 1e8量级,几秒就能算出结果,效果不错!

如果读者有需求,我们将通过一系列博客展示数值分析课程相关的丰富内容,所有文章均有相应代码实现。请持续关注!


作者 :计算小屋
个人主页 : 计算小屋的主页

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

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

相关文章

Android 11(R) IPC Binder机制 初版

Android 系统分为三层。最上层是application应用层&#xff0c;第二层是framework层&#xff0c;第三层是native层 1.Android 中的应用层和系统服务层不在同一个进程&#xff0c;系统服务在单独的进程中。每个应用的进程都是zygote fork出来的。 2.Android中不同应用属于不同…

数据驱动未来:构建下一代湖仓一体电商数据分析平台,引领实时商业智能革命

1.1 项目背景 本项目是一个创新的湖仓一体实时电商数据分析平台&#xff0c;旨在为电商平台提供深度的数据洞察和业务分析。技术层面&#xff0c;项目涵盖了从基础架构搭建到大数据技术组件的集成&#xff0c;采用了湖仓一体的设计理念&#xff0c;实现了数据仓库与数据湖的有…

《程序猿入职必会(4) · Vue 完成 CURD 案例 》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

【优选算法】——leetcode——438.找到字符串中所有字母异位词

目录 1.题目 2.题目理解 3.算法原理 1.如何快速判断两个字符串是否是异位词 2.解决问题 暴力求解——>滑动窗口哈希表 滑动窗口 利用滑动窗口哈希表解决问题 优化&#xff1a;更新结果的判断条件 4.编程代码 C代码 1.频率统计 2. 双指针 C语言代码 1.字符频率…

传统CS网络的新生——基于2G网络的远程灌溉实现

概述&#xff1a;iphone 实现远程电话触发&#xff0c;实现灌溉绿植的一般方法 方法一&#xff1a; 远程电话触发&#xff0c;音频线左右声道会产生一个信号&#xff0c;可以在后端利用SR锁存器暂存信号&#xff0c;后级可以接相应的控制电路实现灌溉。 方法二&#xff1a; 同…

记录阮一峰grid教程笔记

前言 看了阮一峰的grid教程&#xff0c;做一个笔记&#xff0c;主要自己看&#xff0c;有理解错误的地方后续更正&#xff0c;有新的理解后续补充。教程链接如下&#xff1a; CSS Grid 网格布局教程 - 阮一峰的网络日志 grid主要分为容器属性和项目的属性&#xff0c;在行列布…

React 学习——Context机制层级组件通信

核心思路&#xff1a;&#xff08;适用于所有层级&#xff0c;不仅仅是爷孙 父子&#xff09; createContext方法创建一个上下文对象在顶层组件 通过Provider组件提供数据在底层组件&#xff0c;通过useContext钩子函数使用数据 import { createContext, useContext } from …

NSSRound#4 Team

[NSSRound#4 SWPU]1zweb 考察&#xff1a;phar的反序列化 1.打开环境&#xff0c;审计代码 1.非预期解 直接用file伪协议读取flag,或直接读取flag file:///flag /flag 2.正常解法 用读取文件读取index.php,upload.php的源码 index.php: <?php class LoveNss{publi…

Java面试八股之Spring DAO的作用

Spring DAO的作用 Spring DAO (Data Access Object) 是 Spring 框架的一个重要组成部分&#xff0c;它提供了一套用于简化数据访问操作的抽象层。Spring DAO 的核心目的是使开发人员能够更容易地处理数据访问相关的异常&#xff0c;并提供一致的异常处理机制&#xff0c;同时简…

翻译: 可视化深度学习神经网络一

这是一个随意书写的28*28像素、分辨率很低的数字 3 但你的大脑一看见就能轻松辨识出来 &#xff0c;我想要你好好欣赏这点 人脑能够毫无障碍地辨识是非常厉害的 我的意思是&#xff0c;这个、这个、还有这个&#xff0c;都能被识别为 3 即使前后图像的图形组成有很大差异 当你…

什么情况?我代码没了

前两天检视代码时&#xff0c;发现PR里面有两个提交的描述信息一模一样&#xff0c;于是我提出应该将这两个提交合并成一个&#xff0c;保持提交树的清晰。 1 先储存起来&#xff01; 而同事这时正在开发别的特性&#xff0c;工作区不是干净的&#xff0c;没法直接执行 git r…

c程序杂谈系列(职责链模式与if_else)

从处理器的角度来说&#xff0c;条件分支会导致指令流水线的中断&#xff0c;所以控制语句需要严格保存状态&#xff0c;因为处理器是很难直接进行逻辑判断的&#xff0c;有可能它会执行一段时间&#xff0c;发现出错后再返回&#xff0c;也有可能通过延时等手段完成控制流的正…

python生成二维码指向说明书

python生成二维码转向文档 python生成二维码指向说明书 import qrcode# 生成包含本地文档路径的二维码 def generate_qrcode(local_file_path):qr qrcode.QRCode(version1,error_correctionqrcode.constants.ERROR_CORRECT_L,box_size10,border4,)qr.add_data(local_file_pa…

为什么要做边界值测试?

边界值测试的理解 边界值测试&#xff08;Boundary Value Testing&#xff09;是一种常用的软件测试方法&#xff0c;它侧重于测试输入值的边缘或临界条件。这些边缘条件通常包括最小值、最大值以及接近这些最小值和最大值的值。边界值测试的基本思想是&#xff0c;许多软件错…

微信支付API列表

接入前准备 更新时间&#xff1a;2023.08.24 在正式接入微信支付App服务前&#xff0c;你需要进行以下准备步骤&#xff1a; 选择接入模式&#xff1a;普通商户或普通服务商申请参数&#xff1a;AppID、商户号App支付页面规范 #选择接入模式 商户需要判断自己公司注册区域…

SuperMap GIS基础产品FAQ集锦(20240729)

一、SuperMap iDesktopX 问题1&#xff1a;您好&#xff0c;想请教一下&#xff0c;白模可以调整颜色吗 11.2.0 【解决办法】 右键白模图层&#xff0c;制作单值专题图&#xff0c;即可调整白模颜色。 问题2&#xff1a;这边有份矢量数据&#xff0c;导入到桌面里面要放很大…

Node.js + Axios 上传附件到 Gitee 仓库指定 Release

在软件开发过程中&#xff0c;自动化发布流程是提升效率的关键环节之一。本文将介绍如何使用 Node.js 和 Axios 库来自动化地向 Gitee 仓库的最新版本中上传发布包。通过读取项目中的 package.json 文件&#xff0c;获取版本信息&#xff0c;并自动将构建好的包文件上传到 Gite…

我们的前端开发逆天了!1 小时搞定了新网站,还跟我说 “不要钱”

大家好&#xff0c;我是程序员鱼皮。前段时间我们上线了一个新软件 剪切助手 &#xff0c;并且针对该项目做了一个官网&#xff1a; 很多同学表示官网很好看&#xff0c;还好奇是怎么做的&#xff0c;其实这个网站的背后还有个有趣的小故事。。。 鱼皮&#xff1a;我们要做个官…

【gofar远为门锁】酒店智能门锁源码 对接收银CyberWinApp-SAAS本地化-未来之窗行业应用跨平台架构

通过写房卡按钮写房卡 一、查看门锁读卡器信息 二、玄武星辰查到对应名称 如何知道自己家门锁的app&#xff0c;使用未来之窗【玄武芯辰】查询 通过上面我看出叫做gofar 在【玄武芯辰】输入gofar&#xff0c;人工智能会提示app信息 三、设置门锁控制app 在上一步找到app&a…

web服务器配置-(apache+nginx)

⼀、web基本概念和常识 Web&#xff1a;为⽤户提供的⼀种在互联⽹上浏览信息的服务&#xff0c;Web 服务是动态的、可交互的、跨平台的和图形化的。 Web 服务为⽤户提供各种互联⽹服务&#xff0c;这些服务包括信息浏览服务&#xff0c;以及各种交互式服务&#xff0c;包括聊…