用MATLAB實現FR共軛梯度法求解例項

2021-08-09 13:48:31 字數 1546 閱讀 4868

問題:編寫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分別是目標函式和梯度

%輸出: x, val分別是近似最優點和最優值, k是迭代次數.

maxk=5000; %最大迭代次數

rho=0.6;sigma=0.4;

k=0; epsilon=1e-4;

n=length(x0);

while(k%計算梯度

itern=k-(n+1)*floor(k/(n+1));

itern=itern+1;

%計算搜尋方向

if(itern==1)

d=-g;

else

beta=(g'*g)/(g0'*g0);

d=-g+beta*d0; gd=g'*d;

if(gd>=0.0)

d=-g;

endendif(norm(g)break; end

%檢驗終止條件

m=0; mk=0;

while(m<20) %armijo搜尋

if(feval(fun,x0+rho^m*d)g'*d)

mk=m; break;

endm=m+1;

endx0=x0+rho^mk*d;

val=feval(fun,x0);

g0=g; d0=d;

k=k+1;

endx=x0;

val=feval(fun,x);

fun.m

function

f=fun

(x)f=x

(1)^2-x

(1)*x

(2)+x

(2)^2+2*x

(1)-4*x

(2);

funs.m

function

fs=funs

(x)fs=[2*x

(1)-x

(2)+2,2*x

(2)-x

(1)-4]';

命令列視窗

x0=[2,2]';

[x,val,k]=frcg('

fun','funs',x0)

執行結果:

x =

-0.0000

2.0000

val =

-4.0000

k = 8

即x1

=0,x

2=2 時,最優值va

l=−4

,迭代次數為8.

python實現共軛梯度法

共軛梯度法 conjugate gradient 是介於最速下降法與牛頓法之間的乙個方法,它僅需利用一階導數資訊,但克服了最速下降法收斂慢的缺點,又避免了牛頓法需要儲存和計算hesse矩陣並求逆的缺點,共軛梯度法不僅是解決大型線性方程組最有用的方法之一,也是解大型非線性最優化最有效的演算法之一。這裡...

python實現共軛梯度法

共軛梯度法是介於最速下降法與牛頓法之間的乙個方法,它僅需利用一階導數資訊,但克服了最速下降法收斂慢的缺點,又避免了牛頓法需要儲存和計算hesse矩陣並求逆的缺點,共軛梯度法不僅是解決大型線性方程組最www.cppcns.com有用的方法之一,也是解大型非線性最優化最有效的演算法之一。在各種優化演算法...

Matlab實現 最速下降法 共軛梯度法

盲人下山法 在山頂上,小盲人拿著小拐棍,先確定方向,再確定步長,尋找下山的最優辦法 即最短路徑 上圖偽碼來自某 數值線性代數 教科書,非原創 下述 是原創 最速下降法 function er,k fastdown a 定義最速下降法函式檔案 er 表示停機時實際絕對誤差 k 表示停機時實際迭代次數 ...