上次讲解了《共轭梯度法数值求解线性方程组》,本次讲解一下双共轭梯度法数值求解线性方程组。
双共轭梯度法(英语:Biconjugate gradient method)是共轭梯度梯度法的一个变种,在数值线性代数中,是一种求解任意(包括实对称正定)矩阵的线性方程组
的迭代方法。该方法将方程左右均乘以矩阵 的共轭转置 :
双共轭梯度法
求解 ,等价于最小化下面的二次函数:
双共轭梯度法的推导就不讲解了,推导方法和《共轭梯度法的推导》非常类似,下面直接写出算法。
Mathematica
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| ConjugateGradient2[A_, b_] := Module[{x, r, p, k, \[Lambda], s, \[Mu], n = Length[b]}, x[0] = Table[0., n]; r[0] = b - A . x[0]; p[0] = s[0] = ConjugateTranspose[A] . r[0]; k = 0; Print[Norm[r[k]]/n, ",", x[k]]; While[k < 100, \[Lambda][k] = ConjugateTranspose[s[k]] . p[k]/ ConjugateTranspose[A . p[k]] . (A . p[k]); x[k + 1] = x[k] + \[Lambda][k] p[k]; r[k + 1] = b - A . x[k + 1]; Print[Norm[r[k + 1]]/n, ",", x[k + 1]]; If[Norm[r[k + 1]]/n < 10^-15, Break[]]; s[k + 1] = ConjugateTranspose[A] . r[k + 1]; \[Mu][k] = -( ConjugateTranspose[ p[k]] . (ConjugateTranspose[A] . A . s[k + 1])/ ConjugateTranspose[A . p[k]] . (A . p[k])); p[k + 1] = s[k + 1] + \[Mu][k] p[k]; k++]; x[k + 1] ]
|
1 2 3 4 5
| A = {{1, 4}, {4, 1}}; b = {9, 6};
f2[x1_, x2_] = ConjugateTranspose[(A . {x1, x2} - b)] . (A . {x1, x2} - b);
|
In[]:=
1
| ConjugateGradient2[A, b]
|
(双)共轭梯度法和梯度下降法的对比
绿色的线画的是 函数的等高线,蓝色的线画的是 函数的等高线,红色箭头是共轭梯度法的路径,黑色箭头是梯度下降法的路径,蓝色箭头是双共轭梯度法的路径。
稳定双共轭梯度法(BiCGSTAB)是双共轭梯度法的一种改进版本,它在原始的双共轭梯度法的基础上增加了稳定化项,以改善迭代过程中的收敛性。这个方法不但可以处理非对称线性方程组,而且具有更快的收敛速度和更稳定的性能。双共轭梯度法及其变种,特别是稳定双共轭梯度法,在解决大规模稀疏非对称线性方程组方面非常有效。这些方法通过优化迭代方向和步长选择,提高了迭代的效率和稳定性,因而在工程、物理、经济学等众多领域得到广泛应用。
下一次讲解割线法(也叫弦线法)(英语:Secant method)数值求解方程。
请大家多多关注、点赞、收藏、转发,让更多有需要的人可以看到,以后会分享更多实用的算法。
万分感谢!🙏