matlab cg steihaug,截断共轭梯度法
截?cái)喙曹椞荻确?/p>
考慮信賴域子問(wèn)題: 其中 是目標(biāo)函數(shù),$\nabla f(x), \nabla^2 f(x)$ 表示 的梯度與海瑟矩陣。注意,當(dāng) 時(shí),信賴域子問(wèn)題就等同于求解牛頓方程。
這里,實(shí)現(xiàn)截?cái)喙曹椞荻确?(Steihaug-Toint Conjugate gradient, ST-CG 方法)來(lái)求解上述信賴域子問(wèn)題。
當(dāng)約束不存在時(shí)(即 ),共軛梯度法通過(guò)求解一系列共軛方向可以快速求解對(duì)應(yīng)的無(wú)約束二次優(yōu)化問(wèn)題。具體地,對(duì)于問(wèn)題 ,給定初始 , , ,共軛梯度法的迭代格式為:
當(dāng)信賴域約束存在時(shí),共軛梯度法得到的解不能保證落在可行域內(nèi)。因此,截?cái)喙曹椞荻确▌t在共軛梯度法增加兩條額外的終止條件,用于處理負(fù)曲率 或超過(guò)信賴域半徑 的情況。
目錄
初始化和迭代準(zhǔn)備
輸入信息:迭代點(diǎn) ,梯度 grad,海瑟矩陣 hess,信賴域半徑 , 包含算法參數(shù)的結(jié)構(gòu)體 opts 。 輸出信息:信賴域子問(wèn)題的解 (也就是迭代點(diǎn) 處的下降方向), Heta 為海瑟矩陣在點(diǎn) 作用在方向 上的結(jié)果,即 ,記錄迭代信息的結(jié)構(gòu)體 out 和記錄退出原因的標(biāo)記 stop_tCG 。function [eta, Heta, out, stop_tCG] ...
= tCG(x, grad, hess, Delta, opts)
從輸入的結(jié)構(gòu)體 opts 中讀取參數(shù)或采取默認(rèn)參數(shù)。
opts.kappa:牛頓方程求解精度的參數(shù)
theta:牛頓方程求精精度的參數(shù)
opts.maxit:最大迭代次數(shù),對(duì)于共軛梯度法而言默認(rèn)等于變量的維度
opts.minit:最小迭代次數(shù)if ~isfield(opts,'kappa'); opts.kappa = 0.1; end
if ~isfield(opts,'theta'); opts.theta = 1; end
if ~isfield(opts,'maxit'); opts.maxit = length(x); end
if ~isfield(opts,'minit'); opts.minit = 5; end
% 參數(shù)復(fù)制。
theta = opts.theta;
kappa = opts.kappa;
初始化, 為優(yōu)化變量,初始為全 0向量:$\mathbf{0}$。 初始化為目標(biāo)函數(shù)的梯度 。eta = zeros(size(x));
Heta = eta;
r = grad;
e_Pe = 0;
r_r = r'*r;
norm_r = sqrt(r_r);
norm_r0 = norm_r;
共軛梯度法初始時(shí)刻的共軛方向 并在代碼中以 mdelta 表示 (minus delta)。mdelta = r;
d_Pd = r_r;
e_Pd = 0;
共軛梯度法優(yōu)化的目標(biāo)函數(shù)。model_fun = @(eta, Heta) eta'*grad + .5*(eta'*Heta);
model_value = 0;
當(dāng)?shù)赃_(dá)到最大迭代步數(shù)停止時(shí),記 stop_tCG=5。stop_tCG = 5;
迭代主循環(huán)
最大迭代步數(shù)為 maxitfor j = 1 : opts.maxit
表示梯度, 表示海瑟矩陣。此處計(jì)算 。注意到這一步計(jì)算的耗時(shí)相對(duì)較長(zhǎng)。Hmdelta = hess(mdelta);
計(jì)算曲率 和共軛梯度法的步長(zhǎng) 。
在當(dāng)前的搜索方向和步長(zhǎng)下,我構(gòu)造新的共軛方向 。計(jì)算 ,以便進(jìn)行截?cái)喙曹椞荻确ǖ臋z查。為了簡(jiǎn)化計(jì)算這里利用了 。d_Hd = mdelta'*Hmdelta;
alpha = r_r/d_Hd;
e_Pe_new = e_Pe + 2.0*alpha*e_Pd + alpha*alpha*d_Pd;
截?cái)喙曹椞荻确ㄐ枰獙?duì)曲率進(jìn)行檢查,如果曲率滿足 , 說(shuō)明海瑟矩陣不正定(再求解下去得到的方向不一定是下降方向),則停止共軛梯度算法。當(dāng) 時(shí), 迭代點(diǎn)超出可行域邊界,則通過(guò)構(gòu)造得到一個(gè)位于邊界上的近似解并停止算法。
當(dāng)上述兩條件中的任何一個(gè)成立,計(jì)算 使得 。 以 為最終的迭代結(jié)果。更新 。if d_Hd <= 0 || e_Pe_new >= Delta^2
tau = (-e_Pd + sqrt(e_Pd*e_Pd + d_Pd*(Delta^2-e_Pe))) / d_Pd;
eta = eta - tau*mdelta;
Heta = Heta -tau*Hmdelta;
記錄共軛梯度法的退出條件,當(dāng)以非正曲率退出時(shí)記為 1,以超出邊界退出時(shí)記為 2。退出迭代。if d_Hd <= 0
stop_tCG = 1;
else
stop_tCG = 2;
end
break;
end
如果一步迭代更新的 沒(méi)有達(dá)到截?cái)喙曹椞荻确ǖ膬蓚€(gè)新增的停止條件,則更新 。e_Pe = e_Pe_new;
new_eta = eta-alpha*mdelta;
new_Heta = Heta -alpha*Hmdelta;
計(jì)算 處的目標(biāo)函數(shù)值。如果一步更新后的目標(biāo)函數(shù)值沒(méi)有下降,退出迭代,拒絕該步更新。 stop_tCG==6 表示目標(biāo)函數(shù)值非降而終止。new_model_value = model_fun(new_eta, new_Heta);
if new_model_value >= model_value
stop_tCG = 6;
break;
end
如果沒(méi)有達(dá)到上述兩種情況,接受更新的 ,利用新的 更新變量。eta = new_eta;
Heta = new_Heta;
model_value = new_model_value;
更新殘差 以及其范數(shù)。特別的,記錄上一步的 為 r_rold。r = r -alpha*Hmdelta;
r_rold = r_r;
r_r = r'*r;
norm_r = sqrt(r_r);
標(biāo)準(zhǔn)的共軛梯度法的收斂條件:當(dāng)達(dá)到最小迭代次數(shù),且 時(shí),認(rèn)為算法收斂,停止迭代。
滿足上述收斂條件時(shí),如果 ,則說(shuō)明條件 為更嚴(yán)格的條件,說(shuō)明此時(shí)外層牛頓法或者信賴域方法處于線性收斂的階段。 反之,條件 更嚴(yán)格,說(shuō)明此時(shí) 已經(jīng)較小,此時(shí)對(duì)應(yīng)外層牛頓法或者信賴域方法的超線性收斂階段。if j >= opts.minit && norm_r <= norm_r0*min(norm_r0^theta, kappa)
if kappa < norm_r0^theta
stop_tCG = 3;
else
stop_tCG = 4;
end
break;
end
計(jì)算新的搜索方向: , 。beta = r_r/r_rold;
mdelta = r + beta*mdelta;
更新 ,這是由于 且 為 的線性組合,則由 可知 。
以及 ,注意到 ,有 。e_Pd = beta*(e_Pd + alpha*d_Pd);
d_Pd = r_r + beta*beta*d_Pd;
end
退出循環(huán),記錄退出信息。out.iter = j;
out.stop_tCG = stop_tCG;end
參考頁(yè)面
此頁(yè)面實(shí)現(xiàn)了截?cái)喙曹椞荻人惴?#xff0c;該函數(shù)用于 非精確牛頓法 中的牛頓方程的近似求解以及 信賴域方法 中的信賴域子問(wèn)題的求解。
此頁(yè)面的源代碼請(qǐng)見(jiàn): tCG.m。
版權(quán)聲明
此頁(yè)面為《最優(yōu)化:建模、算法與理論》、《最優(yōu)化計(jì)算方法》配套代碼。 代碼作者:文再文、劉浩洋、戶將,代碼整理與頁(yè)面制作:楊昊桐。
著作權(quán)所有 (C) 2020 文再文、劉浩洋、戶將
總結(jié)
以上是生活随笔為你收集整理的matlab cg steihaug,截断共轭梯度法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 纽曼皮尔逊准则Matlab实现,纽曼-皮
- 下一篇: matlab计算位温,大气物理学复习资料