Biconjugate gradient stabilized method

From Wikipedia, the free encyclopedia
Jump to navigation Jump to search

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:

  1. r0 = bAx0Script error: No such module "Check for unknown parameters".
  2. Choose an arbitrary vector 0Script error: No such module "Check for unknown parameters". such that (0, r0) ≠ 0Script error: No such module "Check for unknown parameters"., e.g., 0 = r0Script error: No such module "Check for unknown parameters".
  3. ρ0 = (0, r0) Script error: No such module "Check for unknown parameters".
  4. p0 = r0Script error: No such module "Check for unknown parameters".
  5. For i = 1, 2, 3, …Script error: No such module "Check for unknown parameters".
    1. v = Api−1Script error: No such module "Check for unknown parameters".
    2. α = ρi−1/(0, v)Script error: No such module "Check for unknown parameters".
    3. h = xi−1 + αpi−1 Script error: No such module "Check for unknown parameters".
    4. s = ri−1αvScript error: No such module "Check for unknown parameters".
    5. 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
    6. t = AsScript error: No such module "Check for unknown parameters".
    7. ω = (t, s)/(t, t)Script error: No such module "Check for unknown parameters".
    8. xi = h + ωsScript error: No such module "Check for unknown parameters".
    9. ri = sωtScript error: No such module "Check for unknown parameters".
    10. 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
    11. ρi = (0, ri)Script error: No such module "Check for unknown parameters".
    12. β = (ρi/ρi−1)(α/ω)Script error: No such module "Check for unknown parameters".
    13. pi = ri + β(pi−1ωv)Script error: No such module "Check for unknown parameters".

In some cases, choosing the vector 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 = K1K2AScript 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:

  1. r0 = bAx0Script error: No such module "Check for unknown parameters".
  2. Choose an arbitrary vector 0Script error: No such module "Check for unknown parameters". such that (0, r0) ≠ 0Script error: No such module "Check for unknown parameters"., e.g., 0 = r0Script error: No such module "Check for unknown parameters".
  3. ρ0 = (0, r0) Script error: No such module "Check for unknown parameters".
  4. p0 = r0Script error: No such module "Check for unknown parameters".
  5. For i = 1, 2, 3, …Script error: No such module "Check for unknown parameters".
    1. y = K −1
      2
       
      K −1
      1
       
      pi−1
      Script error: No such module "Check for unknown parameters".
    2. v = AyScript error: No such module "Check for unknown parameters".
    3. α = ρi−1/(0, v)Script error: No such module "Check for unknown parameters".
    4. h = xi−1 + αy Script error: No such module "Check for unknown parameters".
    5. s = ri−1αvScript error: No such module "Check for unknown parameters".
    6. 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
    7. z = K −1
      2
       
      K −1
      1
       
      s
      Script error: No such module "Check for unknown parameters".
    8. t = AzScript error: No such module "Check for unknown parameters".
    9. ω = (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".
    10. xi = h + ωzScript error: No such module "Check for unknown parameters".
    11. ri = sωtScript error: No such module "Check for unknown parameters".
    12. If xiScript error: No such module "Check for unknown parameters". is accurate enough then quit
    13. ρi = (0, ri)Script error: No such module "Check for unknown parameters".
    14. β = (ρi/ρi−1)(α/ω)Script error: No such module "Check for unknown parameters".
    15. pi = ri + β(pi−1ωv)Script error: No such module "Check for unknown parameters".

This formulation is equivalent to applying unpreconditioned BiCGSTAB to the explicitly preconditioned system

Ãx̃ = 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"., = K2xScript error: No such module "Check for unknown parameters". and = K −1
1
 
b
Script 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 iScript error: No such module "Check for unknown parameters". and the residuals riScript error: No such module "Check for unknown parameters". and 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".,
i = i−1 + βii−1Script error: No such module "Check for unknown parameters".,
ri = ri−1αiApiScript error: No such module "Check for unknown parameters".,
i = i−1αiATiScript 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/(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 = (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 ijScript error: No such module "Check for unknown parameters".,

(i, rj) = 0Script error: No such module "Check for unknown parameters".,
(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".,
i = Pi(AT)0Script error: No such module "Check for unknown parameters".,
pi+1 = Ti(A)r0Script error: No such module "Check for unknown parameters".,
i+1 = Ti(AT)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

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 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 iScript error: No such module "Check for unknown parameters"., BiCGSTAB defines

i+1 = Qi(A)Ti(A)r0Script error: No such module "Check for unknown parameters"..

Written in vector form, the recurrence relations for iScript error: No such module "Check for unknown parameters". and iScript error: No such module "Check for unknown parameters". are

i = i−1 + βi(Iωi−1A)i−1Script error: No such module "Check for unknown parameters".,
i = (IωiA)(i−1αiAi)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 = i−1αiAiScript error: No such module "Check for unknown parameters"..

The recurrence relation for iScript error: No such module "Check for unknown parameters". can then be written as

i = i−1αiAiωiAsiScript error: No such module "Check for unknown parameters".,

which corresponds to

xi = xi−1 + αii + ω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 = (i−1, ri−1) = (Pi−1(AT)0, Pi−1(A)r0)Script error: No such module "Check for unknown parameters"..

Since BiCGSTAB does not explicitly keep track of 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)0, Pi−1(A)r0) = (0, Qi−1(A)Pi−1(A)r0) = (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)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)0, Pi−1(A)r0)Script error: No such module "Check for unknown parameters". and (Qi−1(AT)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/(i, Api) = (Pi−1(AT)0, Pi−1(A)r0)/(Ti−1(AT)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)0, Pi−1(A)r0)/(Qi−1(AT)0, ATi−1(A)r0) = ρ̃i/(0, AQi−1(A)Ti−1(A)r0) = ρ̃i/(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 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" />

  1. Script error: No such module "Citation/CS1".

Script error: No such module "Check for unknown parameters".

  • Script error: No such module "Citation/CS1".
  • Script error: No such module "citation/CS1".
  • <templatestyles src="Citation/styles.css"/>^ Script error: No such module "Citation/CS1".
  • <templatestyles src="Citation/styles.css"/>^ Script error: No such module "Citation/CS1".

Template:Numerical linear algebra