最优化共轭梯度法matlab代码实现

FR共轭梯度法实际上是利用梯度和上一次的搜索方向来构造本次搜索方向:

dk=-gk+βk-1dk-1
即:用上一次的搜索方向修正最速下降法的负梯度方向,不仅避免了锯齿现象,与牛顿法相比也节约了计算量。运用共轭,线性无关的同时,也适应大条件数。

共轭梯度法克服了最速下降法收敛慢,只需要利用一阶导数信息,避免了牛顿法存储和计算hesse矩阵的空间
对大型线性或非线性方程组都非常有效

共轭

首先,什么是共轭

设 d1,d2 … dm 是Rn 中任意一组非零向量,若
di TG di = 0 ( i ≠ j )
则称d1,d2 … dm是 G-共轭的。显然 d1,d2 … dm 线性无关,若G = I, 则是正交关系。

推导


代码实现

function [x,iter] = FR(G,b,x0,max_iter)
%conjugate gradient method for the following positive definite quadratic
%function f(x)=x'Gx/2-b'x
%=========================================================================
%x0 :starting point
%max_iter :maximum number of iterations
%---------------------------------------
x=x0;%初始点
tolerance=1.0e-6;%停止条件:调整的步长小于e*10^6
fprintf('\n  x0=');
fprintf('  %10.6f',x0);%10的六次浮点
r=G*x-b;d=-r;%r=g=G*x-b 残量等于梯度  d=-r 初始下降方向为负梯度方向
for k=1:max_iter % 1~最大迭代次数
    if norm(r,2)<=tolerance %找到
        iter=k-1;%迭代次数
        fprintf('\n Algorithm finds a solution!');
        return
    end
    alpha=(r'*r)/(d'*G*d); %步长迭代 α=(r'*r)/(d'*G*d)
    xx=x+alpha*d;%x迭代 后x=前x+α*d(步长乘以方向)
    rr=r+alpha*G*d;%残量r迭代 后r=前r+α*G*d(由残量=梯度的公式得到)
    beta=(rr'*rr)/(r'*r);%β迭代 
    d=-rr+beta*d;%下降方向d迭代
    x=xx; r=rr; %更新x和r
    fprintf('\n x%d= ',k);
    fprintf('  %10.6f',x);
end
iter=max_iter; %迭代到极限
return

    
    

输入 G,b,x0,max_iter
调用函数

[x,iter]=FR(G,b,x0,max_iter);

  x0=    0.000000    0.000000    0.000000    0.000000    0.000000
 x1=     1.073560   -2.415510    1.252487   -1.520877    1.073560
 x2=     1.305605   -2.627981    2.146636   -1.694270    0.442393
 x3=     1.446618   -2.225384    2.448048   -1.970691    0.620722
 x4=     1.086550   -2.063574    2.792911   -2.101645    0.836386
 x5=     1.000000   -2.000000    3.000000   -2.000000    1.000000
 Algorithm finds a solution!>> 

可以自行更换初始点进行计算
注意:b和x0 都是nx1的向量,搞错了就会一堆NaN(搞了一下午哭唧唧)

你可能感兴趣的:(matlab,最优化,算法,线性代数,开发语言,matlab)