在看代码的过程中遇到了共轭梯度法这个概念,对这个算法的数学解释看过几遍,推导看过了,感觉懂了,然后过上一些日子就又忘记了,然后又看了一遍推导,然后过了一些日子也就又忘记了,最后想想这个算法的数学解释就不要再取深究了,毕竟平时也不太会用到,偶尔用到了只要保证代码会写也就OK了。

相关资料推荐:

https://jonathan-hui.medium.com/rl-conjugate-gradient-5a644459137a

==========================================

共轭梯度法(英语:Conjugate gradient method),是求解系数矩阵为对称正定矩阵线性方程组数值解的方法。共轭梯度法是一个迭代方法,它适用于系数矩阵为稀疏矩阵的线性方程组,因为使用像Cholesky分解这样的直接方法求解这些系统所需的计算量太大了。这种方程组在数值求解偏微分方程时很常见。

共轭梯度法也可以用于求解无约束的最优化问题。

双共轭梯度法(英语:BiConjugate gradient method)提供了一种处理非对称矩阵情况的推广。

------------------------------------------------------------------------------

个人感觉这个共轭梯度法虽然是求近似解,但是其计算速度快,因此比较实用。不过需要注意的是这里的A是实对称正定矩阵。

给出python代码:

import numpy as np

def conjugate_gradient(A, b, cg_iters=10, residual_tol=1e-10):
assert isinstance(A, np.ndarray)
assert isinstance(b, np.ndarray) r = np.copy(b)
p = np.copy(b) x = np.zeros_like(b)
rdotr = np.dot(r, r) for i in range(cg_iters):
z = np.dot(A, p)
v = rdotr / np.dot(p, z)
x += v * p
r -= v * z
newrdotr = np.dot(r, r)
mu = newrdotr / rdotr
p = r + mu * p rdotr = newrdotr
if rdotr < residual_tol:
break return x if __name__ == '__main__':
M = np.random.rand(9).reshape((3, 3))
A = np.dot(M.T, M) b = np.random.rand(3) x = conjugate_gradient(A, b) x_ = np.dot(np.linalg.inv(A), b) print("conjugate_gradient:")
print(x) print() print("np.linalg.inv:")
print(x_)
print(np.sqrt(np.mean(np.square(x - x_))))

------------------------------------------------------------------------------

----------------------------------------------------------------------------

参考:

https://zh.wikipedia.org/wiki/%E5%85%B1%E8%BD%AD%E6%A2%AF%E5%BA%A6%E6%B3%95

python版本的“共轭梯度法”算法代码的更多相关文章

  1. Python实现各种排序算法的代码示例总结

    Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示 ...

  2. Python实现常用排序算法

    Python实现常用排序算法 冒泡排序 思路: 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完 ...

  3. 【PYTHON】a-start寻路算法

    本文章适合黄金段位的LOL大神,同样更适合出门在外没有导航,就找不到家的孩子. 在英雄联盟之中,当你和你的队友都苦苦修炼到十八级的时候,仍然与敌方阵营不分胜负,就在你刚买好装备已经神装的时候,你看见信 ...

  4. 二叉树的python可视化和常用操作代码

    二叉树是一个重要的数据结构, 本文基于"二叉查找树"的python可视化 pybst 包, 做了一些改造, 可以支持更一般的"二叉树"可视化. 关于二叉树和二叉 ...

  5. 2017-2018-2 20179204《网络攻防实践》第十三周学习总结 python实现国密算法

    国密商用算法是指国密SM系列算法,包括基于椭圆曲线的非对称公钥密码SM2算法.密码杂凑SM3算法.分组密码SM4算法,还有只以IP核形式提供的非公开算法流程的对称密码SM1算法等. 第1节 SM2非对 ...

  6. 机器学习三 -- 用Python实现K-近邻算法

    Python语言实现机器学习的K-近邻算法 写在前面 额...最近开始学习机器学习嘛,网上找到一本关于机器学习的书籍,名字叫做<机器学习实战>.很巧的是,这本书里的算法是用Python语言 ...

  7. python版本及ML库

    一:关于Python版本的选择问题 关于Python的选择问题:要看学术界能不能把科学库迁移到Python3. 1:多个版本共用: 最近发现SciPy的最高版本是3.2,只能是退而求其次,不使用最新版 ...

  8. 提取bmp图片的颜色信息,可直接framebuffer显示(c版本与python版本)

    稍微了解了下linux的framebuffer,这是一种很简单的显示接口,直接写入像素信息即可 配置好的内核,会有/dev/fbn 的接口,于是想能否提前生成一个文件,比如logo.fb,里面仅包含像 ...

  9. KMP算法代码

    以下是本人根据上一篇博客随笔http://www.cnblogs.com/jiayouwyhit/p/3251832.html,所写的KMP算法代码(暂未优化),个人认为在基于上一篇博客的基础上,代码 ...

  10. Linux安装多个Python版本

    服务器上的Python版本太老了,需要安装一个新的Python版本,才能跑我的代码.因为环境的需要,但是又不能卸载老的版本,所以安装一个新的,使用软链来进行升级. 使用系统自带的yum,apt-get ...

随机推荐

  1. org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available es端口号及集群名称

    org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are availa ...

  2. aspose word与pdf互转

    aspose word与pdf互转 package com.example.core.mydemo.aspose; import com.aspose.words.Document; import c ...

  3. 异步任务处理注解方法@Async实现异步多线程

    异步任务处理注解方法@Async实现异步多线程 1.定义配置类,设置参数2.定义任务执行类3.执行Spring 中的ThreadPoolExecutor是借助JDK并发包中的java.util.con ...

  4. Ceph提供nfs服务

    目录 Ceph提供nfs服务 1. 前期准备 1.1 检查模块 1.2 检查是否有nfs-ganesha集群 2. 创建nfs服务 2.1 ceph提供的nfs的架构 3. nfs导出 3.1 创建c ...

  5. c++引用(REFERENCES)

    一个例子 void add(int value) { value++; } int main() { int a = 5; LOG(a); add(a); LOG( a); } 在这种情况下,变量a在 ...

  6. (四)Redis 缓存应用、淘汰机制

    1.缓存应用 一个系统中不同层面数据访问速度不一样,以计算机为例,CPU.内存和磁盘这三层的访问速度从几十 ns 到 100ns,再到几 ms,性能的差异很大,如果每次 CPU 处理数据时都要到磁盘读 ...

  7. spring使用jdk17运行出现编码问题

    遇到一个比较奇怪的问题. 这个问题别人也遇到过. https://blog.csdn.net/gao_chuan_g/article/details/115117712 一.情况简介 使用jdk17+ ...

  8. 《DNK210使用指南 -CanMV版 V1.0》第六章 Kendryte K210固件烧录

    第六章 Kendryte K210固件烧录 1)实验平台:正点原子DNK210开发板 章节摘自[正点原子]DNK210使用指南 - CanMV版 V1.0 3)购买链接:https://detail. ...

  9. SpringBoot 整合 Sharding-JDBC 分库分表

    导读 分库分表的技术有:数据库中间件Mycat(点我直达),当当网开源的Sharding-JDBC:我们公司用的也是sharding-jdbc,自己也搭建一个完整的项目,直接可以拿来用.下面附源码(C ...

  10. Docker下安装Nginx代理服务器【工作实操版】

    一.Nginx下载 使用命令拉取nginx镜像到本地,此处我们获取排名第一的是官方最新镜像,其它版本可以去DockerHub查询 docker pull nginx 二.先启动一个nginx容器用于c ...