共軛梯度法(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!")
python實現共軛梯度法
共軛梯度法是介於最速下降法與牛頓法之間的乙個方法,它僅需利用一階導數資訊,但克服了最速下降法收斂慢的缺點,又避免了牛頓法需要儲存和計算hesse矩陣並求逆的缺點,共軛梯度法不僅是解決大型線性方程組最www.cppcns.com有用的方法之一,也是解大型非線性最優化最有效的演算法之一。在各種優化演算法...
21 梯度法及共軛梯度法
coding utf 8 created on wed mar 20 21 56 21 2019 author zhangchaoyu 當離最優值較遠時,利用梯度法,接近極小點時用收斂較快的其他方法 import math import copy 1 f x,y x x 25 y y 2 f x,y...
用MATLAB實現FR共軛梯度法求解例項
問題 編寫fr共軛梯度法用於求解min x2 1 x1 x2 x 22 2 x1 4 x2初始點取為 x0 2,2 t frcg.m function x,val,k frcg fun,funs,x0 功能 用fr共軛梯度法求解無約束問題 min f x 輸入 x0是初始點,fun,gfun分別是目...