Ax = b 的迭代解法 —— 共轭梯度 (算法步骤)
线性方程组 Ax =b 除了高斯消元法以外,还有其它的迭代解法,这里我们说的是共轭梯度法。
这里只针对 A 满足 对称 (  ), 正定(即 
 ),并且是实系数的,那么我们可以用 梯度下降 和 共轭梯度 来解线性方程组 :
向量  和 
 是共轭的 (相对于A )如果满足:

下图两两向量都是针对所在梯度处的矩阵‘共轭’的:

把梯度变换一下,就可以看出‘共轭’其实也就是某种正交:

=============================================
共轭梯度法解:
算法步骤:(from wiki)

---------------------------------------------
python代码:(源于:Baselines:https://github.com/openai/baselines(强化学习算法))
import numpy as np
"""共轭梯度下降"""
def cg(f_Ax, b, cg_iters=10, callback=None, verbose=False, residual_tol=1e-10):
"""
Demmel p 312
"""
p = b.copy()
r = b.copy()
x = np.zeros_like(b)
rdotr = r.dot(r) fmtstr = "%10i %10.3g %10.3g"
titlestr = "%10s %10s %10s"
if verbose: print(titlestr % ("iter", "residual norm", "soln norm")) for i in range(cg_iters):
if callback is not None:
callback(x)
if verbose: print(fmtstr % (i, rdotr, np.linalg.norm(x)))
z = f_Ax(p)
v = rdotr / p.dot(z)
x += v*p
r -= v*z
newrdotr = r.dot(r)
mu = newrdotr/rdotr
p = r + mu*p rdotr = newrdotr
if rdotr < residual_tol:
break if callback is not None:
callback(x)
if verbose: print(fmtstr % (i+1, rdotr, np.linalg.norm(x))) # pylint: disable=W0631
return x
测试代码:
import numpy as np
from gg import cg #导入 共轭梯度函数 cg """
A = np.array([[1.0, 0.0, 0.0],
[0.0, 1.0, 0.0],
[0.0, 0.0, 1.0]])
"""
A = np.random.rand(3, 3) # 保证子行列式均为正
A = np.dot(A.T, A) # 生成对称矩阵 def f_Ax(p):
"""f_Ax: 输入变量p为列向量,返回变量为矩阵A矩阵乘以向量p"""
return np.dot(A, p) x = np.random.rand(3)
b = np.dot(A, x)
print("matrix: \n", A)
print("x: \n", x)
print("b: \n", b)
print("...........................") print("显示计算过程:")
result = cg(f_Ax, b, verbose=True)
print("matrix A 的特征值:")
print(np.linalg.eig(A)[0])
print("实际x:")
print(x)
print("求得x:")
print(result)
结果:
matrix:
[[1.33507088 0.69389736 0.579944 ]
[0.69389736 0.76303172 0.47845562]
[0.579944 0.47845562 0.41679907]]
x:
[0.40139385 0.12481318 0.38628268]
b:
[0.84651911 0.55858167 0.45350579]
...........................
显示计算过程:
iter residual norm soln norm
0 1.23 0
1 0.000553 0.523
2 0.000169 0.535
3 4.11e-28 0.571
matrix A 的特征值:
[2.12734118 0.31861571 0.06894478]
实际x:
[0.40139385 0.12481318 0.38628268]
求得x:
[0.40139385 0.12481318 0.38628268]
=============================================
参考:
图来源:
------------------------------------------------------------------------------
Ax = b 的迭代解法 —— 共轭梯度 (算法步骤)的更多相关文章
- 共轭梯度算法求最小值-scipy
		# coding=utf-8 #共轭梯度算法求最小值 import numpy as np from scipy import optimize def f(x, *args): u, v = x a ... 
- 机器学习: 共轭梯度算法(PCG)
		今天介绍数值计算和优化方法中非常有效的一种数值解法,共轭梯度法.我们知道,在解大型线性方程组的时候,很少会有一步到位的精确解析解,一般都需要通过迭代来进行逼近,而 PCG 就是这样一种迭代逼近算法. ... 
- 迭代硬阈值类算法总结||IHT/NIHT/CGIHT/HTP
		迭代硬阈值类(IHT)算法总结 斜风细雨作小寒,淡烟疏柳媚晴滩.入淮清洛渐漫漫. 雪沫乳花浮午盏,蓼茸蒿笋试春盘.人间有味是清欢. ---- 苏轼 更多精彩内容请关注微信公众号 "优化与算法 ... 
- Mahout 系列之----共轭梯度
		无预处理共轭梯度 要求解线性方程组 ,稳定双共轭梯度法从初始解 开始按以下步骤迭代: 任意选择向量 使得 ,例如, 对 若 足够精确则退出 预处理共轭梯度 预处理通常被用来加速迭代方法的收敛.要使用预 ... 
- 近端梯度算法(Proximal Gradient Descent)
		L1正则化是一种常用的获取稀疏解的手段,同时L1范数也是L0范数的松弛范数.求解L1正则化问题最常用的手段就是通过加速近端梯度算法来实现的. 考虑一个这样的问题: minx f(x)+λg(x) x ... 
- 吴裕雄 python 机器学习——半监督学习标准迭代式标记传播算法LabelPropagation模型
		import numpy as np import matplotlib.pyplot as plt from sklearn import metrics from sklearn import d ... 
- ICP(迭代最近点)算法
		图像配准是图像处理研究领域中的一个典型问题和技术难点,其目的在于比较或融合针对同一对象在不同条件下获取的图像,例如图像会来自不同的采集设备,取自不同的时间,不同的拍摄视角等等,有时也需要用到针对不同对 ... 
- flink PageRank详解(批量迭代的页面排名算法的基本实现)
		1.PageRank算法原理 2.基本数据准备 /** * numPages缺省15个测试页面 * * EDGES表示从一个pageId指向相连的另外一个pageId */ public clas ... 
- 3. OpenCV-Python——图像梯度算法、边缘检测、图像金字塔与轮廓检测、直方图与傅里叶变换
		一.图像梯度算法 1.图像梯度-Sobel算子 dst = cv2.Sobel(src, ddepth, dx, dy, ksize) ddepth:图像的深度 dx和dy分别表示水平和竖直方向 ks ... 
- MD5算法步骤详解
		转自MD5算法步骤详解 之前要写一个MD5程序,但是从网络上看到的资料基本上一样,只是讲了一个大概.经过我自己的实践,我决定写一个心得,给需要实现MD5,但又不要求很高深的编程知识的童鞋参考.不多说了 ... 
随机推荐
- shiro可以完成哪些工作?
			shiro可以帮助我们完成:认证.授权.加密.会话管理.与Web集成.缓存等 
- PI规划会,研发团队价值聚焦的一剂良方
			随着数字化建设如火如荼地推进,中大型企业的数字化建设团队规模也越来越大,团队规模的扩大一方面带来了更多产能与可能性,另一方面,不同的角色在不同的业务场景也带来了一些现实问题,例如: 作为CIO 或产品 ... 
- 时间戳,mysql 秒数,毫秒数与时间之间的相互转换
			时间戳,mysql 秒数,毫秒数与时间之间的相互转换 时间戳是指格林威治时间自1970年1月1日(00:00:00 GMT)至当前时间的总秒数.通俗的讲,时间戳是一份能够表示一份数据在一个特定时间点已 ... 
- FeignClient接口格式
			FeignClient接口格式报错信息:{"timestamp":1648015711758,"status":404,"error":&q ... 
- http请求方式-OkHttpClient
			http请求方式-OkHttpClient import com.example.core.mydemo.http.OrderReqVO; import okhttp3.*; import org.s ... 
- mysql8.0.22在centos7.6下的简单安装
			如果想把mysql安装得好一些,则严重推荐使用压缩包来安装,不推荐使用rpm方式. 一般情况下,现在大部分的服务器都是x86-64,少数是arm架构的. 选择合适的版本,下载即可. 本文中,使用的是 ... 
- .NET 个人博客-给图片添加水印
			个人博客-给图片添加水印 前言 需要用到的库 SixLabors.lmageSharp 2.1.3 SixLabors.lmageSharp.Web 2.0.2 SixLabors.Fonts 1.0 ... 
- C#的多线程UI窗体控件显示方案 - 开源研究系列文章
			上次编写了<LUAgent服务器端工具>这个应用,然后里面需要新启动一个线程去对文件进行上传到FTP服务器,但是新线程里无法对应用主线程UI的内容进行更改,所以就需要在线程里设置主UI线程 ... 
- VulnHub-Narak靶机渗透流程
			VulnHub-Narak Description Narak is the Hindu equivalent of Hell. You are in the pit with the Lord of ... 
- C#皮肤美化
			关于Winform窗体美化,目前大致了解是有两种方式:第一种方式是重写Winform本身的控件,不过这需要非常熟悉控件的各个属性和事件并且要求具有很高的GDI绘图技术.第二种方式是借助第三方Winfo ... 
