python:共轭梯度法(以希尔伯特矩阵为例)

共轭梯度法(以希尔伯特矩阵为例)

实现共轭梯度算法并且使用它解决对称矩阵——希尔伯特矩阵为系数矩阵A时,右边常数项列向量为单位列向量,初始点为零向量。展示维度分别为5,8,12,20时的迭代次数与结果。
迭代终止条件为残差的二范数小于1e-6
在这里插入图片描述

import numpy as np

def cg(x0, A, b):
    r0 = np.dot(A, x0) - b
    p0 = -r0
    rk = r0
    pk = p0
    xk = x0
    t = 0 #记录迭代次数
    while np.linalg.norm(rk) >= 1e-6:
        rr = np.dot(rk.T, rk)
        ak = rr / np.dot(np.dot(pk.T, A), pk)
        xk = xk + ak * pk
        rk = rk + ak * np.dot(A, pk)
        bk = np.dot(rk.T, rk) / rr
        pk = -rk + bk * pk
        t += 1
    return xk, t

def Hilbert(n):
    sq = np.zeros((n,n))
    for i in range(n):
        for j in range(n):
            sq[i][j] = 1 / (i + j + 1)
    return sq

if __name__=='__main__':
    sque = [5, 8, 12, 20]
    for n in sque:
        b = np.ones((n,1))
        A = Hilbert(n)
        x0 = np.zeros((n,1))
        x,t = cg(x0, A, b)
        print(n,"阶时,近似值为:",x,"    迭代次数为:",t)
  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值