共軛梯度法(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!")