Biconjugate gradient stabilized method
Template:Short description Script error: No such module "Unsubst".
In numerical linear algebra, the biconjugate gradient stabilized method, often abbreviated as BiCGSTAB, is an iterative method developed by H. A. van der Vorst for the numerical solution of nonsymmetric linear systems. It is a variant of the biconjugate gradient method (BiCG) and has faster and smoother convergence than the original BiCG as well as other variants such as the conjugate gradient squared method (CGS). It is a Krylov subspace method. Unlike the original BiCG method, it doesn't require multiplication by the transpose of the system matrix.
Algorithmic steps
Unpreconditioned BiCGSTAB
In the following sections, (x,y) = xT yScript error: No such module "Check for unknown parameters". denotes the dot product of vectors. To solve a linear system Ax = bScript error: No such module "Check for unknown parameters"., BiCGSTAB starts with an initial guess x0Script error: No such module "Check for unknown parameters". and proceeds as follows:
- r0 = b − Ax0Script error: No such module "Check for unknown parameters".
- Choose an arbitrary vector r̂0Script error: No such module "Check for unknown parameters". such that (r̂0, r0) ≠ 0Script error: No such module "Check for unknown parameters"., e.g., r̂0 = r0Script error: No such module "Check for unknown parameters".
- ρ0 = (r̂0, r0) Script error: No such module "Check for unknown parameters".
- p0 = r0Script error: No such module "Check for unknown parameters".
- For i = 1, 2, 3, …Script error: No such module "Check for unknown parameters".
- v = Api−1Script error: No such module "Check for unknown parameters".
- α = ρi−1/(r̂0, v)Script error: No such module "Check for unknown parameters".
- h = xi−1 + αpi−1 Script error: No such module "Check for unknown parameters".
- s = ri−1 − αvScript error: No such module "Check for unknown parameters".
- If hScript error: No such module "Check for unknown parameters". is accurate enough, i.e., if s is small enough, then set xi = hScript error: No such module "Check for unknown parameters". and quit
- t = AsScript error: No such module "Check for unknown parameters".
- ω = (t, s)/(t, t)Script error: No such module "Check for unknown parameters".
- xi = h + ωsScript error: No such module "Check for unknown parameters".
- ri = s − ωtScript error: No such module "Check for unknown parameters".
- If xiScript error: No such module "Check for unknown parameters". is accurate enough, i.e., if riScript error: No such module "Check for unknown parameters". is small enough, then quit
- ρi = (r̂0, ri)Script error: No such module "Check for unknown parameters".
- β = (ρi/ρi−1)(α/ω)Script error: No such module "Check for unknown parameters".
- pi = ri + β(pi−1 − ωv)Script error: No such module "Check for unknown parameters".
In some cases, choosing the vector r̂0Script error: No such module "Check for unknown parameters". randomly improves numerical stability.[1]
Preconditioned BiCGSTAB
Preconditioners are usually used to accelerate convergence of iterative methods. To solve a linear system Ax = bScript error: No such module "Check for unknown parameters". with a preconditioner K = K1K2 ≈ AScript error: No such module "Check for unknown parameters"., preconditioned BiCGSTAB starts with an initial guess x0Script error: No such module "Check for unknown parameters". and proceeds as follows:
- r0 = b − Ax0Script error: No such module "Check for unknown parameters".
- Choose an arbitrary vector r̂0Script error: No such module "Check for unknown parameters". such that (r̂0, r0) ≠ 0Script error: No such module "Check for unknown parameters"., e.g., r̂0 = r0Script error: No such module "Check for unknown parameters".
- ρ0 = (r̂0, r0) Script error: No such module "Check for unknown parameters".
- p0 = r0Script error: No such module "Check for unknown parameters".
- For i = 1, 2, 3, …Script error: No such module "Check for unknown parameters".
- y = K −1
2 K −1
1 pi−1Script error: No such module "Check for unknown parameters". - v = AyScript error: No such module "Check for unknown parameters".
- α = ρi−1/(r̂0, v)Script error: No such module "Check for unknown parameters".
- h = xi−1 + αy Script error: No such module "Check for unknown parameters".
- s = ri−1 − αvScript error: No such module "Check for unknown parameters".
- If hScript error: No such module "Check for unknown parameters". is accurate enough then xi = hScript error: No such module "Check for unknown parameters". and quit
- z = K −1
2 K −1
1 sScript error: No such module "Check for unknown parameters". - t = AzScript error: No such module "Check for unknown parameters".
- ω = (K −1
1 t, K −1
1 s)/(K −1
1 t, K −1
1 t)Script error: No such module "Check for unknown parameters". - xi = h + ωzScript error: No such module "Check for unknown parameters".
- ri = s − ωtScript error: No such module "Check for unknown parameters".
- If xiScript error: No such module "Check for unknown parameters". is accurate enough then quit
- ρi = (r̂0, ri)Script error: No such module "Check for unknown parameters".
- β = (ρi/ρi−1)(α/ω)Script error: No such module "Check for unknown parameters".
- pi = ri + β(pi−1 − ωv)Script error: No such module "Check for unknown parameters".
- y = K −1
This formulation is equivalent to applying unpreconditioned BiCGSTAB to the explicitly preconditioned system
- Ãx̃ = b̃Script error: No such module "Check for unknown parameters".
with à = K −1
1 AK −1
2 Script error: No such module "Check for unknown parameters"., x̃ = K2xScript error: No such module "Check for unknown parameters". and b̃ = K −1
1 bScript error: No such module "Check for unknown parameters".. In other words, both left- and right-preconditioning are possible with this formulation.
Derivation
BiCG in polynomial form
In BiCG, the search directions piScript error: No such module "Check for unknown parameters". and p̂iScript error: No such module "Check for unknown parameters". and the residuals riScript error: No such module "Check for unknown parameters". and r̂iScript error: No such module "Check for unknown parameters". are updated using the following recurrence relations:
- pi = ri−1 + βipi−1Script error: No such module "Check for unknown parameters".,
- p̂i = r̂i−1 + βip̂i−1Script error: No such module "Check for unknown parameters".,
- ri = ri−1 − αiApiScript error: No such module "Check for unknown parameters".,
- r̂i = r̂i−1 − αiATp̂iScript error: No such module "Check for unknown parameters"..
The constants αiScript error: No such module "Check for unknown parameters". and βiScript error: No such module "Check for unknown parameters". are chosen to be
- αi = ρi/(p̂i, Api)Script error: No such module "Check for unknown parameters".,
- βi = ρi/ρi−1Script error: No such module "Check for unknown parameters".
where ρi = (r̂i−1, ri−1)Script error: No such module "Check for unknown parameters". so that the residuals and the search directions satisfy biorthogonality and biconjugacy, respectively, i.e., for i ≠ jScript error: No such module "Check for unknown parameters".,
- (r̂i, rj) = 0Script error: No such module "Check for unknown parameters".,
- (p̂i, Apj) = 0Script error: No such module "Check for unknown parameters"..
It is straightforward to show that
- ri = Pi(A)r0Script error: No such module "Check for unknown parameters".,
- r̂i = Pi(AT)r̂0Script error: No such module "Check for unknown parameters".,
- pi+1 = Ti(A)r0Script error: No such module "Check for unknown parameters".,
- p̂i+1 = Ti(AT)r̂0Script error: No such module "Check for unknown parameters".
where Pi(A)Script error: No such module "Check for unknown parameters". and Ti(A)Script error: No such module "Check for unknown parameters". are iScript error: No such module "Check for unknown parameters".th-degree polynomials in AScript error: No such module "Check for unknown parameters".. These polynomials satisfy the following recurrence relations:
- Pi(A) = Pi−1(A) − αiATi−1(A)Script error: No such module "Check for unknown parameters".,
- Ti(A) = Pi(A) + βi+1Ti−1(A)Script error: No such module "Check for unknown parameters"..
Derivation of BiCGSTAB from BiCG
It is unnecessary to explicitly keep track of the residuals and search directions of BiCG. In other words, the BiCG iterations can be performed implicitly. In BiCGSTAB, one wishes to have recurrence relations for
- r̃i = Qi(A)Pi(A)r0Script error: No such module "Check for unknown parameters".
where Qi(A) = (I − ω1A)(I − ω2A)⋯(I − ωiA)Script error: No such module "Check for unknown parameters". with suitable constants ωjScript error: No such module "Check for unknown parameters". instead of ri = Pi(A)r0Script error: No such module "Check for unknown parameters". in the hope that Qi(A)Script error: No such module "Check for unknown parameters". will enable faster and smoother convergence in r̃iScript error: No such module "Check for unknown parameters". than riScript error: No such module "Check for unknown parameters"..
It follows from the recurrence relations for Pi(A)Script error: No such module "Check for unknown parameters". and Ti(A)Script error: No such module "Check for unknown parameters". and the definition of Qi(A)Script error: No such module "Check for unknown parameters". that
- Qi(A)Pi(A)r0 = (I − ωiA)(Qi−1(A)Pi−1(A)r0 − αiAQi−1(A)Ti−1(A)r0)Script error: No such module "Check for unknown parameters".,
which entails the necessity of a recurrence relation for Qi(A)Ti(A)r0Script error: No such module "Check for unknown parameters".. This can also be derived from the BiCG relations:
- Qi(A)Ti(A)r0 = Qi(A)Pi(A)r0 + βi+1(I − ωiA)Qi−1(A)Ti−1(A)r0Script error: No such module "Check for unknown parameters"..
Similarly to defining r̃iScript error: No such module "Check for unknown parameters"., BiCGSTAB defines
- p̃i+1 = Qi(A)Ti(A)r0Script error: No such module "Check for unknown parameters"..
Written in vector form, the recurrence relations for p̃iScript error: No such module "Check for unknown parameters". and r̃iScript error: No such module "Check for unknown parameters". are
- p̃i = r̃i−1 + βi(I − ωi−1A)p̃i−1Script error: No such module "Check for unknown parameters".,
- r̃i = (I − ωiA)(r̃i−1 − αiAp̃i)Script error: No such module "Check for unknown parameters"..
To derive a recurrence relation for xiScript error: No such module "Check for unknown parameters"., define
- si = r̃i−1 − αiAp̃iScript error: No such module "Check for unknown parameters"..
The recurrence relation for r̃iScript error: No such module "Check for unknown parameters". can then be written as
- r̃i = r̃i−1 − αiAp̃i − ωiAsiScript error: No such module "Check for unknown parameters".,
which corresponds to
- xi = xi−1 + αip̃i + ωisiScript error: No such module "Check for unknown parameters"..
Determination of BiCGSTAB constants
Now it remains to determine the BiCG constants αiScript error: No such module "Check for unknown parameters". and βiScript error: No such module "Check for unknown parameters". and choose a suitable ωiScript error: No such module "Check for unknown parameters"..
In BiCG, βi = ρi/ρi−1Script error: No such module "Check for unknown parameters". with
- ρi = (r̂i−1, ri−1) = (Pi−1(AT)r̂0, Pi−1(A)r0)Script error: No such module "Check for unknown parameters"..
Since BiCGSTAB does not explicitly keep track of r̂iScript error: No such module "Check for unknown parameters". or riScript error: No such module "Check for unknown parameters"., ρiScript error: No such module "Check for unknown parameters". is not immediately computable from this formula. However, it can be related to the scalar
- ρ̃i = (Qi−1(AT)r̂0, Pi−1(A)r0) = (r̂0, Qi−1(A)Pi−1(A)r0) = (r̂0, ri−1)Script error: No such module "Check for unknown parameters"..
Due to biorthogonality, ri−1 = Pi−1(A)r0Script error: No such module "Check for unknown parameters". is orthogonal to Ui−2(AT)r̂0Script error: No such module "Check for unknown parameters". where Ui−2(AT)Script error: No such module "Check for unknown parameters". is any polynomial of degree i − 2Script error: No such module "Check for unknown parameters". in ATScript error: No such module "Check for unknown parameters".. Hence, only the highest-order terms of Pi−1(AT)Script error: No such module "Check for unknown parameters". and Qi−1(AT)Script error: No such module "Check for unknown parameters". matter in the dot products (Pi−1(AT)r̂0, Pi−1(A)r0)Script error: No such module "Check for unknown parameters". and (Qi−1(AT)r̂0, Pi−1(A)r0)Script error: No such module "Check for unknown parameters".. The leading coefficients of Pi−1(AT)Script error: No such module "Check for unknown parameters". and Qi−1(AT)Script error: No such module "Check for unknown parameters". are (−1)i−1α1α2⋯αi−1Script error: No such module "Check for unknown parameters". and (−1)i−1ω1ω2⋯ωi−1Script error: No such module "Check for unknown parameters"., respectively. It follows that
- ρi = (α1/ω1)(α2/ω2)⋯(αi−1/ωi−1)ρ̃iScript error: No such module "Check for unknown parameters".,
and thus
- βi = ρi/ρi−1 = (ρ̃i/ρ̃i−1)(αi−1/ωi−1)Script error: No such module "Check for unknown parameters"..
A simple formula for αiScript error: No such module "Check for unknown parameters". can be similarly derived. In BiCG,
- αi = ρi/(p̂i, Api) = (Pi−1(AT)r̂0, Pi−1(A)r0)/(Ti−1(AT)r̂0, ATi−1(A)r0)Script error: No such module "Check for unknown parameters"..
Similarly to the case above, only the highest-order terms of Pi−1(AT)Script error: No such module "Check for unknown parameters". and Ti−1(AT)Script error: No such module "Check for unknown parameters". matter in the dot products thanks to biorthogonality and biconjugacy. It happens that Pi−1(AT)Script error: No such module "Check for unknown parameters". and Ti−1(AT)Script error: No such module "Check for unknown parameters". have the same leading coefficient. Thus, they can be replaced simultaneously with Qi−1(AT)Script error: No such module "Check for unknown parameters". in the formula, which leads to
- αi = (Qi−1(AT)r̂0, Pi−1(A)r0)/(Qi−1(AT)r̂0, ATi−1(A)r0) = ρ̃i/(r̂0, AQi−1(A)Ti−1(A)r0) = ρ̃i/(r̂0, Ap̃i)Script error: No such module "Check for unknown parameters"..
Finally, BiCGSTAB selects ωiScript error: No such module "Check for unknown parameters". to minimize r̃i = (I − ωiA)siScript error: No such module "Check for unknown parameters". in 2Script error: No such module "Check for unknown parameters".-norm as a function of ωiScript error: No such module "Check for unknown parameters".. This is achieved when
- ((I − ωiA)si, Asi) = 0Script error: No such module "Check for unknown parameters".,
giving the optimal value
- ωi = (Asi, si)/(Asi, Asi)Script error: No such module "Check for unknown parameters"..
Generalization
BiCGSTAB can be viewed as a combination of BiCG and GMRES where each BiCG step is followed by a GMRES(1Script error: No such module "Check for unknown parameters".) (i.e., GMRES restarted at each step) step to repair the irregular convergence behavior of CGS, as an improvement of which BiCGSTAB was developed. However, due to the use of degree-one minimum residual polynomials, such repair may not be effective if the matrix AScript error: No such module "Check for unknown parameters". has large complex eigenpairs. In such cases, BiCGSTAB is likely to stagnate, as confirmed by numerical experiments.
One may expect that higher-degree minimum residual polynomials may better handle this situation. This gives rise to algorithms including BiCGSTAB2[1] and the more general BiCGSTAB(lScript error: No such module "Check for unknown parameters".)[2]. In BiCGSTAB(lScript error: No such module "Check for unknown parameters".), a GMRES(lScript error: No such module "Check for unknown parameters".) step follows every lScript error: No such module "Check for unknown parameters". BiCG steps. BiCGSTAB2 is equivalent to BiCGSTAB(lScript error: No such module "Check for unknown parameters".) with l = 2Script error: No such module "Check for unknown parameters"..
See also
References
<templatestyles src="Reflist/styles.css" />
- ↑ Script error: No such module "Citation/CS1".
Script error: No such module "Check for unknown parameters".