最优化方法:共轭梯度法(Conjugate Gradient)

2023-10-18 17:30

本文主要是介绍最优化方法:共轭梯度法(Conjugate Gradient),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://blog.csdn.net/pipisorry/article/details/39891197

共轭梯度法(Conjugate Gradient)

共轭梯度法(英语:Conjugate gradient method),是求解数学特定线性方程组的数值解的方法,其中那些矩阵为对称和正定。共轭梯度法是一个迭代方法,它适用于稀疏矩阵线性方程组,因为这些系统对于像Cholesky分解这样的直接方法太大了。这种方程组在数值求解偏微分方程时很常见。共轭梯度法也可以用于求解无约束的最优化问题。

在数值线性代数中,共轭梯度法是一种求解对称正定线性方程组\boldsymbol{Ax}=\boldsymbol{b}的迭代方法。共轭梯度法可以从不同的角度推导而得,包括作为求解最优化问题的共轭方向法的特例,以及作为求解特征值问题的Arnoldi/Lanczos迭代的变种。

双共轭梯度法提供了一种处理非对称矩阵情况的推广。

基础

共轭向量

显然,共轭向量是线性无关向量.

初等变分原理

最速下降算法的有关性质

范数的‖・‖A的定义为‖x‖A=(Ax,x)。

上面定理表明,最速下降法从任何一向量x(0)出发,迭代产生的数列总是收敛到原方程Ax=b的解.而收敛速度的快慢则由A的特征值分布所决定.当A的最小特征值和最大特征值相差很大时λ1<<λn,最速下降法收敛速度很慢,很少用于实际计算.

分析最速下降法收敛较慢的原因,可以发现,负梯度方向从局部来看是二次函数的最快下降方向,但是从整体来看,却并非最好.对于对称正定矩阵A,共轭梯度法考虑选择关于A共轭的向量p1,p2,...代替最速(0)下降法中的负梯度方向,使迭代法对任意给定的初始点x具有有限步收敛性,即经有限步就可以(在理论上)得到问题的准确解.

皮皮blog


共轭梯度算法

计算共轭梯度算法同时构造出关于A共轭的向量pi

求解Ax = b的算法,其中A是实对称正定矩阵。

x 0 := 0
k := 0
r 0 := b-Ax
repeat until r k is "sufficiently small":
k := k + 1
if k = 1
p 1 := r 0
else
p k := r k − 1 + r k − 1 ⊤ r k − 1 r k − 2 ⊤ r k − 2   p k − 1 {\displaystyle p_{k}:=r_{k-1}+{\frac {r_{k-1}^{\top }r_{k-1}}{r_{k-2}^{\top }r_{k-2}}}~p_{k-1}} {\displaystyle p_{k}:=r_{k-1}+{\frac {r_{k-1}^{\top }r_{k-1}}{r_{k-2}^{\top }r_{k-2}}}~p_{k-1}}
end if
α k := r k − 1 ⊤ r k − 1 p k ⊤ A p k {\displaystyle \alpha _{k}:={\frac {r_{k-1}^{\top }r_{k-1}}{p_{k}^{\top }Ap_{k}}}} {\displaystyle \alpha _{k}:={\frac {r_{k-1}^{\top }r_{k-1}}{p_{k}^{\top }Ap_{k}}}}
x k := x k-1 + α k p k
r k := r k-1 - α k A p k
end repeat
结果为 x k
或者


共轭梯度法评价

共轭梯度法是介于最速下降法与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点, 共轭梯度法不仅是解决大型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法之一。 在各种优化算法中,共轭梯度法是非常重要的一种。
其优点是所需存储量小,具有步收敛性,稳定性高,而且不需要任何外来参数。
下图为共轭梯度法和梯度下降法搜索最优解的路径对比示意图:
注:绿色为梯度下降法,红色代表共轭梯度法


from:http://blog.csdn.net/pipisorry/article/details/39891197

ref: [wiki 共轭梯度法] [wiki 共轭梯度法的推导]

[数值分析 钟尔杰]


转载于:https://my.oschina.net/u/3579120/blog/1508363

这篇关于最优化方法:共轭梯度法(Conjugate Gradient)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/234101

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

Linux云服务器手动配置DNS的方法步骤

《Linux云服务器手动配置DNS的方法步骤》在Linux云服务器上手动配置DNS(域名系统)是确保服务器能够正常解析域名的重要步骤,以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案,需要... 目录1. 为什么需要手动配置 DNS?2. 手动配置 DNS 的方法方法 1:修改 /etc/res

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

SpringBoot中ResponseEntity的使用方法举例详解

《SpringBoot中ResponseEntity的使用方法举例详解》ResponseEntity是Spring的一个用于表示HTTP响应的全功能对象,它可以包含响应的状态码、头信息及响应体内容,下... 目录一、ResponseEntity概述基本特点:二、ResponseEntity的基本用法1. 创

java中判断json key是否存在的几种方法

《java中判断jsonkey是否存在的几种方法》在使用Java处理JSON数据时,如何判断某一个key是否存在?本文就来介绍三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目http://www.chinasem.cn录第一种方法是使用 jsONObject 的 has 方法

java中ssh2执行多条命令的四种方法

《java中ssh2执行多条命令的四种方法》本文主要介绍了java中ssh2执行多条命令的四种方法,包括分号分隔、管道分隔、EOF块、脚本调用,可确保环境配置生效,提升操作效率,具有一定的参考价值,感... 目录1 使用分号隔开2 使用管道符号隔开3 使用写EOF的方式4 使用脚本的方式大家平时有没有遇到自