python實現共軛梯度法

2021-08-09 16:37:02 字數 1153 閱讀 2906

共軛梯度法(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分別是目...