上次讲解了《共轭梯度法数值求解线性方程组》,本次讲解一下双共轭梯度法数值求解线性方程组。

双共轭梯度法(英语: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]
Out[]:=

(双)共轭梯度法和梯度下降法的对比

绿色的线画的是 函数的等高线,蓝色的线画的是 函数的等高线,红色箭头是共轭梯度法的路径,黑色箭头是梯度下降法的路径,蓝色箭头是双共轭梯度法的路径。


稳定双共轭梯度法(BiCGSTAB)是双共轭梯度法的一种改进版本,它在原始的双共轭梯度法的基础上增加了稳定化项,以改善迭代过程中的收敛性。这个方法不但可以处理非对称线性方程组,而且具有更快的收敛速度和更稳定的性能。双共轭梯度法及其变种,特别是稳定双共轭梯度法,在解决大规模稀疏非对称线性方程组方面非常有效。这些方法通过优化迭代方向和步长选择,提高了迭代的效率和稳定性,因而在工程、物理、经济学等众多领域得到广泛应用。

下一次讲解割线法(也叫弦线法)(英语:Secant method)数值求解方程。

请大家多多关注、点赞、收藏、转发,让更多有需要的人可以看到,以后会分享更多实用的算法。

万分感谢!🙏