python实现共轭梯度法

共轭梯度法(Conjugate Gradient)是介于最速下降法牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点,共轭梯度法不仅是解决大型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法之一。

   这里初始化A为对角线元素全为2且横纵坐标差值绝对值为1时为-1的矩阵,b为全1矩阵,求解x

  算法实现过程:

import numpy as np
A = np.zeros((100, 100))
for i in range(100): #generate A
    for j in range(100):
        if (i == j):
            A[i, j] = 2
        if (abs(i - j) == 1):
            A[i, j] = A[j, i] = -1
b = np.ones((100, 1))  #generate b
print("Conjugate Gradient x:")
x=np.zeros((100,1)) # 初始值x0

r=b-np.dot(A,x)
p=r  #p0=r0
#while np.linalg.norm(np.dot(A, x) - b) / np.linalg.norm(b) >= 10 ** -6:
for i in range(100):
    r1=r
    a=np.dot(r.T,r)/np.dot(p.T,np.dot(A,p))
    x = x + a * p    #x(k+1)=x(k)+a(k)*p(k)
    r=b-np.dot(A,x)  #r(k+1)=b-A*x(k+1)
    q = np.linalg.norm(np.dot(A, x) - b) / np.linalg.norm(b)
    if q<10**-6:
        break
    else:
        beta=np.linalg.norm(r)**2/np.linalg.norm(r1)**2
        p=r+beta*p  #p(k+1)=r(k+1)+beta(k)*p(k)

print(x)
print("done Conjugate Gradient!")

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值