共轭梯度下降及matlab简单实现

考虑问题:

min f(x)=12xTAx+bTx+c

具体求解的方法如下:
首先,任意给定一个初始点 x(1),计算出目标函数 f(x)在这个点的梯度,若 ||g1||=0,则停止计算,否则,令
d(1)=(x(1))=g1

沿着 d(1)的搜索,得到 x(2),计算 x(2)处的梯度,若 ||g2||=0,则停止计算,否则利用若 g2 d(1)构造第二个搜索方向 d(2),再沿着 d(2)搜索。
一般地,若已知 x(k) d(k),则从 x(k)出发,沿 d(k)进行搜索,可得:
x(k+1)=x(k)+λkd(k)

令:
ϕ(λ)=f(x(k)+λd(k))

ϕ(λ)的极小值点:
ϕ(λ)=f(x(k+1))Td(k)=0

f(x(k+1))=Ax(k+1)+b
(Ax(k+1)+b)Td(k)=0

x(k+1)=x(k)+λkd(k),并展开得:
(gk+λkAd(k))Td(k)=0

求得:
λk=gTkd(k)d(k)TAd(k)

如果还没有满足终止条件:
d(k+1)=gk+1+βkd(k)

左乘 d(k)TA
d(k)TAd(k+1)=d(k)TAgk+1+βkd(k)TAd(k)=0

得:
βk=d(k)TAgk+1d(k)TAd(k)

min x21+12x22+12x23

A = [2 0 0; 0 1 0; 0 0 1];
x(:,1) = [1;1;1];
g(:,1)=A*x(:,1);
d(:,1) = [-1;-2;0];
n = 1;

lambda = [];
beta = [];

while norm(g(:,n)) > 0.01
    lambda(n) = -(g(:,n)'*d(:,n))/(d(:,n)'*A*d(:,n));
    x(:,n+1) = x(:,n)+lambda(n)*d(:,n);
    g(:,n+1) = A*x(:,n+1);
    beta(n) = (d(:,n)'*A*g(:,n+1))/(d(:,n)'*A*d(:,n));
    d(:,n+1) = -g(:,n+1)+beta(n)*d(:,n);
    n = n+1;
end

版权声明:本文为u012235274原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。