首页 > 编程语言 >python版本的“共轭梯度法”算法代码

python版本的“共轭梯度法”算法代码

时间:2023-06-03 21:37:57浏览次数:57  
标签:python 梯度 gradient print np 共轭 dot

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


 


 

 

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

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

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

 

python版本的“共轭梯度法”算法代码_共轭梯度法

 

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

 

 

 

个人感觉这个共轭梯度法虽然是求近似解,但是其计算速度快,因此比较实用。不过需要注意的是这里的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_))))

 

 

python版本的“共轭梯度法”算法代码_共轭梯度法_02

 

 

 

 

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

python版本的“共轭梯度法”算法代码_杂谈_03

 

 

 

 

 

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

 

 

参考:

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

标签:python,梯度,gradient,print,np,共轭,dot
From: https://blog.51cto.com/u_15642578/6408700

相关文章

  • VSCode 如何将已编辑好的python文件中的 tab 键缩进转换成4个空格键缩进
    事情起源:使用vscode维护一个7年前的python项目,发现编辑后运行报错,提示缩进错误,原因是当时的项目使用tab做缩进,而我正在用的vscode是使用4空格做缩进,因此造成了缩进不匹配的问题。  如何解决?把自己的vscode缩进从4空格改为tab貌似是最可行的,但是考虑其他项目的匹配问题又总不能老......
  • 【python基础】复杂数据类型-列表类型(排序/长度/遍历)
    1.列表数据元素排序在创建的列表中,数据元素的排列顺序常常是无法预测的。这虽然在大多数情况下都是不可避免的,但经常需要以特定的顺序呈现信息。有时候希望保留列表数据元素最初的排列顺序,而有时候又需要调整排列顺序。python提供了很多列表数据元素排序的方式,可根据情况选用。1......
  • [转] 十分钟掌握Seaborn,进阶Python数据可视化分析
      -为什么用Seaborn-Seaborn是基于Python且非常受欢迎的图形可视化库,在Matplotlib的基础上,进行了更高级的封装,使得作图更加方便快捷。即便是没有什么基础的人,也能通过极简的代码,做出具有分析价值而又十分美观的图形。Seaborn可以实现Python环境下的绝大部分探索......
  • 02 python爬虫-bs4
    目录步骤代码结果new.csv图片步骤爬取主页面中的文章详情的url和图片地址下载图片并请求加文章详情中的页面内容爬取文章详情中的标题、作者、发布时间代码importrequestsimportcsvfrombs4importBeautifulSoup#请求的一级页面的地址q_url='http://xinfadi.com.cn/new......
  • python 操作 xlsx
    目录读取/写入:openpyxldemo1读取/写入:openpyxldemo1importopenpyxlimportos#创建exceldefwrite_excel_xlsx(path,sheet_name,value):ifnotos.path.exists(path):write_new_excel_xlsx(path,sheet_name,value)else:append_write_excel_x......
  • Python潮流周刊#5:并发一百万个任务要用多少内存?
    你好,我是猫哥。这里记录每周值得分享的Python及通用技术内容,部分为英文,已在小标题注明。(标题取自其中一则分享,不代表全部内容都是该主题,特此声明。)博客原文:https://pythoncat.top/posts/2023-06-03-weekly5文章&教程1、并发一百万个任务要用多少内存?(英文)文中测试了主流的编......
  • python内置库-email
    email库简要介绍eamil库用来创建和解析电子邮件,这些电子邮件可结合smtp协议和pop协议来发送及收取位于email包的中心的类就是EmailMessage这个类,利用它可构造一个邮件对象,利用这个邮件对象可添加正文、添加附件、设置收发件人具体的官网文档不太好懂,下面给出几个示例实例......
  • 用chartGPT学习一门语言--python(提问示范)
    1. 2. 3. 4 5. 6. ......
  • Python 的字符串内建函数
    Pythoncapitalize()方法将字符串的第一个字母变成大写,其他字母变小写print("第一个内建函数str.capitalize()")s1='a,b's2='A,B's3='a,BCD's4='a,B'#因为a前面有个空格,所以不显示大写print(s1.capitalize())print(s2.capitalize())print(s3.capi......
  • 【python】多线程
     在Python3中,通过threading模块提供线程的功能。原来的thread模块已废弃。但是threading模块中有个Thread类(大写的T,类名),是模块中最主要的线程类,一定要分清楚了,千万不要搞混了。threading模块提供了一些比较实用的方法或者属性,例如:方法与属性描述current_thread()返......