二次型优化问题 - 6 - 共轭梯度法

1,719 阅读7分钟

这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战

本文介绍二次型优化方法中比较优秀的迭代方法——共轭梯度法。

问题描述

重述我们需要优化的问题:

f(x)=12xTAxbTx+c\label1(1)f({\bf{x} }) = \frac{1}{2}{\bf{x^TAx} } - { {\bf{b} }^{\bf{T} } }{\bf{x} } + {\bf{c} } \tag{1} \label{1}
  • 矩阵A\bf{A}正定对称
  • 目标为优化x\bf{x},使得f(x)f(\bf{x})取得最小值

最速下降法的问题

  • 贪心计算局部最小值
  • 没有全局视野,没有使用真正的模型建模
  • 导致优化过程需要反复迭代才能逐步逼近最优值

轭是一个汉字,读作è,本意是指驾车时套在牲口脖子上的曲木,引申义是束缚,控制。该文字在《仪礼·既夕礼》和《荀子·正论》等文献均有记载。 ——百度百科

  • 数学中很多轭相关的内容,此处的共轭表示相互约束,在某个条件下可以相互作用的意思。

共轭梯度法思想来源

  • 为解决最速下降法来回往复的问题,人们开始思考是否有可以直接在需要优化的二次函数定义下直接对其进行优化,是否可以通过有限步计算得到真正的最优解
  • 那么假设我们使用关于该问题精确的模型而不是近似的局部最优模型,我们如果可以在某个N维空间中,分别计算出最优解的各个维度的坐标,就可以达到上述目的
  • 那么如何设计这个空间,如何可以分步计算并且可以整合成真正的结果,是共轭梯度法来解决的问题
  • 该方法的核心思想是建立一组N维空间线性无关的一组基,理论上这组基的线性组合可以表示空间中任意一点,共轭梯度法通过多次计算,精确求解目标在空间中位置在这组基空间中的各个系数分量,达到求解最优值的目的
  • 该方法和最速下降法却别在精确建模,有了上帝视角,每次迭代计算将该方向需要调整的分量值调整到极致,也就是说之后的计算再也不用考虑该方向上的运动分量了,这是一个精确求解问题的过程,不是逐步简单建模向最优值挪动的逼近过程

共轭基的定义

A\bf{A}nn阶实对称正定矩阵,如果有两个nn维列向量s1\bf{s}_1s2\bf{s}_2满足

{% raw %}

s1TAs2=0\label2(2){\bf{s}}_1^T{\bf{A}}{{\bf{s}}_2} = 0 \tag{2} \label{2}

{% endraw %}

则称向量s1\bf{s}_1s2\bf{s}_2对于矩阵A\bf{A}共轭。如果A\bf{A}为单位矩阵,则式\eqref2\eqref{2}即成为\bf{s}_1$$\bf{s}_2,这样两个向量的点积为零,此二向量在几何上是正交的,它是共轭的一种特例。

设A为对称正定矩阵,若一组非零向量s1\bf{s}_1,s2\bf{s}_2,…,sn\bf{s}_n满足 {% raw %}

siTAsj=0(ij)(3){\bf{s}}_i^T{\bf{A}}{{\bf{s}}_j} = 0 (i≠j) \tag{3}

则称向量系si(1in){{\bf{s}}_i}(1 \le i \le n)为关于矩阵A\bf{A}共轭。

si(1in){{\bf{s}}_i}(1 \le i \le n)之间线性无关,那么我们称该向量集合为nn维空间中关于矩阵A\bf{A}的一组共轭基。 {% endraw %}

共轭基的作用

  • 假设有一组关于矩阵A\bf{A}的共轭基D\bf{D}
D={d1,d2,...,dn}(4)\bf{D}=\{ {\bf{d}_1},{\bf{d}_2},...,{\bf{d}_n}\} \tag{4}
  • 设二次型函数\eqref1\eqref{1}的极值为x\bf{x}^*,用D\bf{D}表似为:

{% raw %}

x=λ1d1+λ2d2++λndn(5){ {\bf{x} }^*} = {\lambda _1}{ {\bf{d} }_1} + {\lambda _2}{ {\bf{d} }_2} + \cdots + {\lambda _n}{ {\bf{d} }_n} \tag{5}

{% endraw %}

  • 因为函数极值处在各个方向的导数为0有:

{% raw %}

f(x)=Axb=0Ax=b(6)\begin{array}{l} f'({{\bf{x}}^*}) = {\bf{A}}{{\bf{x}}^*} - {\bf{b}} = 0\\ \Rightarrow {\bf{A}}{{\bf{x}}^*} = {\bf{b}} \end{array} \tag{6}

{% endraw %}

  • {% raw %}我们计算diTAx{\bf{d}}_i^T{\bf{A}}{{\bf{x}}^*},根据不同共轭基之间相互共轭:{% endraw %}

{% raw %}

diTAx=diTA(λ0d0++λn1dn1)=λidiTAdi+0(7)\begin{array}{l} {\bf{d}}_i^T{\bf{A}}{{\bf{x}}^*} &= {\bf{d}}_i^T{\bf{A}}\left( {{\lambda _0}{{\bf{d}}_0} + \ldots + {\lambda _{n - 1}}{{\bf{d}}_{n - 1}}} \right)\\ &= {\lambda _i}{\bf{d}}_i^T{\bf{A}}{{\bf{d}}_i} + 0\\ \tag{7} \end{array}

{% endraw %}

  • 得到:

{% raw %}

λi=diTAxdiTAdi=diTbdiTAdi\label8(8){\lambda _i} = \frac{{{\bf{d}}_i^T{\bf{A}}{{\bf{x}}^*}}}{{{\bf{d}}_i^T{\bf{A}}{{\bf{d}}_i}}} = \frac{{{\bf{d}}_i^T{\bf{b}}}}{{{\bf{d}}_i^T{\bf{A}}{{\bf{d}}_i}}} \tag{8} \label{8}

{% endraw %}

  • 对于λi{\lambda _i}的求解,我们已知的变量为b\bf{b}A\bf{A},如果我们已经得到了空间中关于A\bf{A}的共轭基(任意一组),我们都可以直接解得λi{\lambda _i}
  • 这是一个令人振奋的结论,所以我们当前的工作重点转为了如何快速地求得一组关于A\bf{A}的共轭基

根据定义获取共轭基

  • 有了定义,我们不难想到暴力获取共轭基的方法:
	graph TB
		A(随机生成n个n维向量)
		B{i=1-n循环}
		C[剔除向量j=1-i的分量]
		E[收集向量1-n]
		D[得到向量i]
		
		A-->B
		C --> D
		D --> B
		B-- 循环结束 --> E --> F(输出共轭基)
		B-- 循环未结束 -->C

  • 这套方法下来,我们就可以得到根据定义计算出来的共轭基,带入\eqref8\eqref{8}计算得到极值,没有任何问题
  • 但事实上这个运算量与代数法解{% raw %}Ax=b{\bf{A}}{{\bf{x}}} = {\bf{b}}{% endraw %}的过程具有相当的运算复杂度,没有给该优化问题带来性能收益

共轭梯度法

此算法核心步骤与最速下降法相同,分别为寻找共轭方向与计算运动步长。

寻找共轭方向

由于计算梯度简单,寻找共轭梯度的过程依附于梯度方向的计算。

  • 优化目标为x\bf{x}^*,初始位置为x1\bf{x}_1,需要求得的共轭基为 D={d1,d2,...,dn}\bf{D}=\{ {\bf{d}_1},{\bf{d}_2},...,{\bf{d}_n}\}
  • 计算初始x1\bf{x}_1位置的梯度,第一个共轭基为梯度的反方向:

{% raw %}

d1=g1=(Ax1b)=bAx1(9){{\bf{d}}_1} = - {{\bf{g}}_1} = - ({\bf{A}}{{\bf{x}}_1} - {\bf{b}}) = {\bf{b}} - {\bf{A}}{{\bf{x}}_1} \tag{9}

{% endraw %}

  • ii个梯度若要剔除掉第jj个共轭基(j<i)(j<i)方向的分量,需要减去该方向的βj\beta_j 分量:

{% raw %}

djTA(giβjdj)=0djTAgi=βjdjTAdjβj=djTAgidjTAdj\label10(10)\begin{array}{l} {\bf{d}}_j^T{\bf{A}}({{\bf{g}}_i} - \beta_j {{\bf{d}}_j}) = 0\\ {\bf{d}}_j^T{\bf{A}}{{\bf{g}}_i} = \beta_j {\bf{d}}_j^T{\bf{A}}{{\bf{d}}_j}\\ \beta_j = \frac{{{\bf{d}}_j^T{\bf{A}}{{\bf{g}}_i}}}{{{\bf{d}}_j^T{\bf{A}}{{\bf{d}}_j}}} \end{array} \tag{10} \label{10}

{% endraw %}

  • 因此第kk个共轭基为:

{% raw %}

dk=gki=1k1diTAgkdiTAdididk=gki=1k1βidi\label11(11)\begin{array}{l} {{\bf{d}}_k} = {{\bf{g}}_k} - \sum\limits_{i = 1}^{k - 1} {\frac{{{\bf{d}}_i^T{\bf{A}}{{\bf{g}}_k}}}{{{\bf{d}}_i^T{\bf{A}}{{\bf{d}}_i}}}{{\bf{d}}_i}} \\ {{\bf{d}}_k}={{\bf{g}}_k} -\sum\limits_{i = 1}^{k - 1}\beta_i{{\bf{d}}_i} \end{array} \tag{11} \label{11}

{% endraw %}

  • 目前,我们如果可以确定每一次迭代移动的xi\bf{x}_i的位置,求得gi\bf{g}_i,那么就可以根据第1到第i1i-1个共轭基确定当前第ii个共轭基
  • 因此当前我们的目标是在有了共轭方向后,如何确定在该方向上的运动距离

确定运动距离

{% raw %}已经运动到了xk\bf{x}_k的位置,下一个前进方向为dk{{\bf{d}}_k},前进步长αk{\alpha _k},误差为ek=xxk\bf{e}_{k}=\bf{x}^*-x_{k},也就是说:

xk+1=xk+αkdk(12){{\bf{x}}_{k + 1}}={{\bf{x}}_k} + {\alpha _k}{{\bf{d}}_k} \tag{12}

{% endraw %}

这里介绍两种求前进步长αk{\alpha _k}的思路。

方法一

确定第kk步的运动步长αk{\alpha _k},也就是一个共轭基的系数,限制该系数的条件为:

  • {% raw %}当前共轭基的方向dk\bf{d}_{k}与误差向量ek+1=xxk+1\bf{e}_{k+1}=\bf{x}^*-x_{k+1}共轭:
dkTAek+1=dkTA(xxk+1)=dkTA(xxk+xkxk+1)=dkTA(ekαkdk)=dkTAekαkdkTAdk=0\label13(13)\begin{aligned} \bf{d}_{k}^{T^{\prime}} A e_{k+1} &=\bf{d}_{k}^{T} A\left(x^{*}-x_{k+1}\right) \\ &=\bf{d}_{k}^{T} A\left(x^{*}-x_{k}+x_{k}-x_{k+1}\right) \\ &=\bf{d}_{k}^{T} A\left(e_{k}-\alpha_{k} \bf{d}_{k}\right) \\ &=\bf{d}_{k}^{T} A e_{k}-\alpha_{k} \bf{d}_{k}^{T} A \bf{d}_{k}=0 \end{aligned} \tag{13} \label{13}

{% endraw %}

  • 有:

{% raw %}

αk=dkTAekdkTAdk=dkTA(xxk)dkTAdk=dkT(AxAxk)dkTAdk=dkT(bAxk)dkTAdk=dkTgkdkTAdk(14)\begin{aligned} \alpha_{k} &=\frac{\bf{d}_{k}^{T} A e_{k}}{\bf{d}_{k}^{T} A \bf{d}_{k}} \\ &=\frac{\bf{d}_{k}^{T} A\left(x^{*}-x_{k}\right)}{\bf{d}_{k}^{T} A \bf{d}_{k}} \\ &=\frac{\bf{d}_{k}^{T}\left(A x^{*}-A x_{k}\right)}{\bf{d}_{k}^{T} A \bf{d}_{k}} \\ &=\frac{\bf{d}_{k}^{T}\left(b-A x_{k}\right)}{\bf{d}_{k}^{T} A \bf{d}_{k}} \\ &=-\frac{\bf{d}_{k}^{T} g_{k}}{\bf{d}_{k}^{T} A \bf{d}_{k}} \end{aligned} \tag{14}

{% endraw %}

方法二

{% raw %}对f(xk+1)f({{\bf{x}}_{k + 1}})中的αk{\alpha _k}求导,使得导数为0,计算αk{\alpha _k}:{% endraw %}

  • {% raw %}用xk{{\bf{x}}_k}表示xk+1{{\bf{x}}_{k+1}}:
f(xk+1)=f(xk+αkdk)=12xk+1TAxk+1bT(xk+αkdk)+c(15)\begin{array}{l} f({{\bf{x}}_{k + 1}}) &= f({{\bf{x}}_k} + {\alpha _k}{{\bf{d}}_k})\\ &= \frac{1}{2}{\bf{x}}_{k + 1}^T{\bf{A}}{{\bf{x}}_{k + 1}} - {{\bf{b}}^T}({{\bf{x}}_k} + {\alpha _k}{{\bf{d}}_k}) + c \end{array} \tag{15}

{% endraw %}

  • {% raw %}对f(xk+1)f({{\bf{x}}_{k + 1}})αk{\alpha _k}求导:
f(xk+1αk)=f(xk+1)xk+1xk+1αk=(Axk+1b)Tdk=(Axk+αkAdkb)Tdk=(αkAdk+gk)Tdk=αkdkTAdk+gkTdk(16)\begin{array}{l} f'({{\bf{x}}_{k + 1}}|{\alpha _k}) &= \frac{{\partial f({{\bf{x}}_{k + 1}})}}{{\partial {{\bf{x}}_{k + 1}}}}\frac{{\partial {{\bf{x}}_{k + 1}}}}{{\partial {\alpha _k}}}\\ &= {({\bf{A}}{{\bf{x}}_{k + 1}} - {\bf{b}})^T}{{\bf{d}}_k}\\ &= {({\bf{A}}{{\bf{x}}_k} + {\alpha _k}{\bf{A}}{{\bf{d}}_k} - {\bf{b}})^T}{{\bf{d}}_k}\\ &= {({\alpha _k}{\bf{A}}{{\bf{d}}_k} + {{\bf{g}}_k})^T}{{\bf{d}}_k}\\ &= {\alpha _k}{\bf{d}}_k^TA{{\bf{d}}_k} + {\bf{g}}_k^T{{\bf{d}}_k} \end{array} \tag{16}

{% endraw %}

  • {% raw %}使导数为0,有:
αkdkTAdk+gkTdk=0αk=gkTdkdkTAdk=dkTgkdkTAdk(17)\begin{array}{l} {\alpha _k}{\bf{d}}_k^TA{{\bf{d}}_k} + {\bf{g}}_k^T{{\bf{d}}_k} = 0\\ {\alpha _k} = - \frac{{{\bf{g}}_k^T{{\bf{d}}_k}}}{{{\bf{d}}_k^TA{{\bf{d}}_k}}} = - \frac{{{\bf{d}}_k^T{{\bf{g}}_k}}}{{{\bf{d}}_k^TA{{\bf{d}}_k}}} \end{array} \tag{17}

{% endraw %}

此时我们已经计算得到了一系列计算共轭梯度的方法,能够依次求得一套共轭基了,但是其中有些步骤仍然可以继续简化计算。

简化计算与一些推论

推论一
  • {% raw %}第kk步计算的梯度gk\bf{g}_k和前k1k-1步的共轭向量d1,d1,...,dk1{\bf{d}_1,\bf{d}_1,...,\bf{d}_{k-1}}正交:{% endraw %}
  • {% raw %}证明,当i<ji < j时:
diTgj=diT(Axjb)=diT(AxjAx)=diT(Axxi+1+xi+1xj)=diTA(ei+1k=i+1j1αkdk)=diTAei+1+k=i+1j1αkdiTAdk\label18(18)\begin{array}{l} \bf{d}_i^T{g_j} &= \bf{d}_i^T(A{x_j} - b)\\ &= \bf{d}_i^T(A{x_j} - A{x^*})\\ &= - \bf{d}_i^T(A{x^*} - {x_{i + 1}} + {x_{i + 1}} - {x_j})\\ &= - \bf{d}_i^TA({e_{i + 1}} - \sum\limits_{k = i + 1}^{j - 1} {{\alpha _k}{d_k})} \\ &= - \bf{d}_i^TA{e_{i + 1}} + \sum\limits_{k = i + 1}^{j - 1} {{\alpha _k}d_i^TA{d_k}} \end{array} \tag{18} \label{18}

{% endraw %}

  • \eqref18\eqref{18}左边由于di\bf{d}_i计算过程\eqref13\eqref{13}为0,右边由于不同的共轭向量间两两共轭值为0,所以最终的值也为0
  • {% raw %}因此证明了:第kk步计算的梯度 gk \bf{g}_k 和前k1k-1步的共轭向量 d1,d1,...,dk1 { \bf{d}_1,\bf{d}_1,...,\bf{d}_{k-1}}正交。{% endraw %}
推论二
  • {% raw %}第kk步计算的梯度gk\bf{g}_k和前k1k-1步的梯度g1,g1,...,gk1{\bf{g}_1,\bf{g}_1,...,\bf{g}_{k-1}}正交:{% endraw %}

  • {% raw %}证明,当i<ji < j时:{% endraw %}

  • \eqref11\eqref{11}得:

{% raw %}

gi=di+k=1i1βkdk(19){{\bf{g}}_i}={{\bf{d}}_i} +\sum\limits_{k = 1}^{i - 1}\beta_k{{\bf{d}}_k} \tag{19}

{% endraw %}

  • 有:

{% raw %}

giTgj=(di+k=1i1βkdk)Tgj=k=1iβkdkTgj(βi=1)\label20(20)\begin{array}{l} {\bf{g}}_i^T{{\bf{g}}_j} &= {({{\bf{d}}_i} + \sum\limits_{k = 1}^{i - 1} {{\beta _k}} {{\bf{d}}_k})^T}{{\bf{g}}_j}\\ &= \sum\limits_{k = 1}^i {{\beta _k}} {{\bf{d}}_k}^T{{\bf{g}}_j} \qquad ({\beta _i} = 1) \tag{20} \label{20} \end{array}

{% endraw %}

  • 根据推论一,式\eqref20\eqref{20}值为0
  • {% raw %}证得结论:第kk步计算的梯度gk\bf{g}_k和前k1k-1步的梯度g1,g1,...,gk1{\bf{g}_1,\bf{g}_1,...,\bf{g}_{k-1}}正交。{% endraw %}
  • {% raw %}那么对于两个不同的梯度gi,gj(ij)\bf{g}_i, \bf{g}_j(i \ne j),那么二者必分前后,因此各个梯度之间相互正交,即G={g1,g2,...,gn}{\bf{G}} = \{ {{\bf{g}}_{1,}}{{\bf{g}}_2},...,{{\bf{g}}_n}\} 组成了nn维空间中的一组正交基{% endraw %}
推论三
  • {% raw %}计算gj+1Tgi{\bf{g}}_{j + 1}^T{{\bf{g}}_i}:
gj+1Tgi=(Axj+1b)Tgi=(A(xj+αjdj)b)Tgi=(Axjb+αjAdj)Tgi=(gj+αjAdj)Tgi=gjTgi+αjdjTAgidjTAgi=1αj(gj+1TgigjTgi)\label21(21)\begin{array}{l} {\bf{g}}_{j + 1}^T{{\bf{g}}_i} &= {({\bf{A}}{{\bf{x}}_{j + 1}} - {\bf{b}})^T}{{\bf{g}}_i}\\ &= {({\bf{A}}({{\bf{x}}_j} + {\alpha _j}{{\bf{d}}_j}) - {\bf{b}})^T}{{\bf{g}}_i}\\ &= {({\bf{A}}{{\bf{x}}_j} - {\bf{b}} + {\alpha _j}{\bf{A}}{{\bf{d}}_j})^T}{{\bf{g}}_i}\\ & = {({{\bf{g}}_j} + {\alpha _j}{\bf{A}}{{\bf{d}}_j})^T}{{\bf{g}}_i}\\ &= {\bf{g}}_j^T{{\bf{g}}_i} + {\alpha _j}{\bf{d}}_j^TA{{\bf{g}}_i}\\ {\bf{d}}_j^TA{{\bf{g}}_i}& = \frac{1}{{{\alpha _j}}}({\bf{g}}_{j + 1}^T{{\bf{g}}_i} - {\bf{g}}_j^T{{\bf{g}}_i}) \end{array} \tag{21} \label{21}

{% endraw %}

  • 根据式\eqref21\eqref{21}推论二,{% raw %}由于一般情况下αj\alpha _j不为0,因此对于所有情况为保证\eqref20\eqref{20}成立,需要当iji \ne jij+1i \ne j+1时,djTAgi=0{\bf{d}}_j^TA{{\bf{g}}_i}=0 {% endraw %}
  • 这意味着当前的梯度方向与上一个共轭方向之前的和当前之后的所有共轭方向共轭正交
简化计算
  • 对于式\eqref11\eqref{11}中,在求解dk\bf{d}_k过程中产生的系数β\beta,此处强调一下\eqref10\eqref{10}:

{% raw %}

βi=diTAgkdiTAdi{\beta _i} = \frac{{{\bf{d}}_i^T{\bf{A}}{{\bf{g}}_k}}}{{{\bf{d}}_i^T{\bf{A}}{{\bf{d}}_i}}}

{% endraw %}

  • 推论三{% raw %},\eqref10\eqref{10}中当iki\ne kik1i \ne k-1时,diTAgk{{\bf{d}}_i^T{\bf{A}}{{\bf{g}}_k}}值为0 {% endraw %}
  • {% raw %}因此式\eqref11\eqref{11}可以简化为:
dk=gki=1k1βidi=gkβk1dk1\label22(22)\begin{array}{l} {{\bf{d}}_k} &= {{\bf{g}}_k} - \sum\limits_{i = 1}^{k - 1} {{\beta _i}} {{\bf{d}}_i}\\ &= {{\bf{g}}_k} - {{\beta _{k-1}}} {{\bf{d}}_{k-1}} \end{array} \tag{22} \label{22}

{% endraw %}

  • 即在求解第kk个共轭基时,仅需要在当前梯度gk\bf{g}_k上减去第k1k-1个共轭基的共轭分量即可
推论四
  • 根据简化计算的公式\eqref22\eqref{22},有:

{% raw %}

dk=gkβk1dk1=gkβk1(gk1βk2dk2)=gk+γk1gk1+γk2gk2+γ1g1=i=1kγigi(23)\begin{array}{l} {{\bf{d}}_k} &= {{\bf{g}}_k} - {\beta _{k - 1}}{{\bf{d}}_{k - 1}}\\ &= {{\bf{g}}_k} - {\beta _{k - 1}}({{\bf{g}}_{k - 1}} - {\beta _{k - 2}}{{\bf{d}}_{k - 2}})\\ &= {{\bf{g}}_k} + {\gamma _{k - 1}}{{\bf{g}}_{k - 1}} + {\gamma _{k - 2}}{{\bf{g}}_{k - 2}} + \cdots {\gamma _1}{{\bf{g}}_1}\\ &= \sum\limits_{i = 1}^k {{\gamma _i}{{\bf{g}}_i}} \end{array} \tag{23}

{% endraw %}

  • 其中固定的常数系数用γ\gamma表示
  • 那么有:

{% raw %}

giTdj=giTk=1jγkgk=k=1jγkgiTgk\label24(24)\begin{array}{l} {\bf{g}}_i^T{{\bf{d}}_j} &= {\bf{g}}_i^T\sum\limits_{k = 1}^j {{\gamma _k}{{\bf{g}}_k}} \\ & = \sum\limits_{k = 1}^j {{\gamma _k}{\bf{g}}_i^T{{\bf{g}}_k}} \end{array} \tag{24} \label{24}

{% endraw %}

  • \eqref24\eqref{24}根据推论二的结论,值为:

{% raw %}

{\bf{g}}_i^T{{\bf{d}}_j} = \left\{ {\begin{array}{*{20}{c}} {0,i > j}\\ {\gamma_i{\bf{g}}_i^T{{\bf{g}}_i},i \le j} \end{array}} \right. \tag{25}

{% endraw %}

  • 即某个梯度与所有共轭基的投影为0或一个常数(对该方法来说不是一个有实用性的结论)

共轭梯度法实操步骤

  • 初始条件:已知A,b\bf{A}, \bf{b},初始位置x1\bf{x}_1
  • {% raw %}g1=Ax1b\bf{g}_1=\bf{A}\bf{x}_1-\bf{b} {% endraw %}
  • {% raw %}d1=g1{{\bf{d}}_1} = - {{\bf{g}}_{\bf{1}}} {% endraw %}
  • k=1k=1
  • whilekn:while \quad k \le n:
    • {% raw %}αk=dkTgkdkTAdk\alpha_{k} = - \frac{{{\bf{d}}_k^T{{\bf{g}}_k}}}{{{\bf{d}}_k^TA{{\bf{d}}_k}}} {% endraw %}
    • {% raw %}xk+1=xk+αkdk\bf{x}_{k+1}=\bf{x}_k+\alpha_{k}{\bf{d}}_k {% endraw %}
    • {% raw %}gk+1=Axk+1b\bf{g}_{k+1}=\bf{A}\bf{x}_{k+1}-\bf{b} {% endraw %}
    • {% raw %}βk=dkTAgk+1dkTAdk{\beta _k} = \frac{{{\bf{d}}_k^T{\bf{A}}{{\bf{g}}_{k+1}}}}{{{\bf{d}}_k^T{\bf{A}}{{\bf{d}}_k}}} {% endraw %}
    • {% raw %}dk+1=gk+1βkdk{{\bf{d}}_{k+1}}={{\bf{g}}_{k+1}} - {{\beta _{k}}} {{\bf{d}}_{k}} {% endraw %}
    • k=k+1k=k+1
  • returnxn+1return \quad \bf{x}_{n+1}

参考资料