第四章 共轭梯度法
內容來自馬昌鳳編著的《最優化方法及其Matlab程序設計》,文章僅為個人的學習筆記,感興趣的朋友詳見原書。
共軛梯度法是介于最速下降法與牛頓法之間的一種無約束優化算法,具有超線性收斂速度,算法結構簡單。同時,與前一章的最速下降法類似,共軛梯度法只用了目標函數及其梯度值,避免了求二階導數,從而降低了計算和儲存量。
共軛方向法
共軛的定義
設G是n階對稱正定矩陣,若n維向量組d1,d2,...,dm(m<=n)d_1,d_2,...,d_m(m<=n)d1?,d2?,...,dm?(m<=n)滿足:
diTGdj=0,i≠jd_i^T G d_j=0, i≠jdiT?Gdj?=0,i?=j
則稱d1,d2,...,dmd_1,d_2,...,d_md1?,d2?,...,dm?為G共軛的。
對稱正定矩陣GGG的共軛向量組必然是線性無關的
算法
共軛梯度法
算法
程序
function [x,val,k]=frcg(fun,gfun,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<maxk)g=feval(gfun,x0); %計算梯度itern=k-(n+1)*floor(k/(n+1));itern=itern+1;%計算搜索方向if(itern==1) d=-g; elsebeta=(g'*g)/(g0'*g0);d=-g+beta*d0; gd=g'*d;if(gd>=0.0)d=-g; endendif(norm(g)<epsilon), break; end %檢驗終止條件m=0; mk=0;while(m<20) %Armijo搜索if(feval(fun,x0+rho^m*d)<feval(fun,x0)+sigma*rho^m*g'*d)mk=m; break;endm=m+1;endx0=x0+rho^mk*d;val=feval(fun,x0);g0=g; d0=d; k=k+1; end x=x0; val=feval(fun,x);示例1
示例2
總結
- 上一篇: java spring jdbc_Spr
- 下一篇: C语言趣味程序百例精解