# Método del gradiente biconjugado estabilizado

En álgebra lineal numérica, el método del gradiente biconjugado estabilizado, generalmente abreviado como BiCGSTAB (del inglés «biconjugate gradient stabilized method»), es un método iterativo propuesto por H. A. van der Vorst para la resolución numérica de los sistemas de ecuaciones lineales no simétricos. Es una variante del método del gradiente biconjugado (BiCG) y ofrece convergencia más rápida y suave que el original BiCG así como otras variantes como el método del gradiente conjugado cuadrado (CGS). Es un método del subespacio de Krylov.

## Pasos algorítmicos
### BiCGSTAB sin precondicionamiento

Para resolver el sistema ${\boldsymbol {Ax}}={\boldsymbol {b}}$, el BiCGSTAB comienza con una aproximación inicial ${\boldsymbol {x}}_{0}$ y procede como sigue:
* ${\boldsymbol {r}}_{0}={\boldsymbol {b}}-{\boldsymbol {Ax_{0}}}$
* Elige un vector arbitrario ${\boldsymbol {\hat {r}}}_{0}$ tal que $({\boldsymbol {\hat {r}}}_{0},{\boldsymbol {r}}_{0})\neq 0$, por ejemplo, ${\boldsymbol {\hat {r}}}_{0}={\boldsymbol {r}}_{0}$
* ${\boldsymbol {p}}_{0}={\boldsymbol {r}}_{0}$
* Para $i=0,1,2,\ldots \;$
** $\alpha _{i}=({\boldsymbol {r}}_{i},{\boldsymbol {\hat {r}}}_{0})/({\boldsymbol {Ap}}_{i},{\boldsymbol {\hat {r}}}_{0})$
** ${\boldsymbol {s}}_{i}={\boldsymbol {r}}_{i}-\alpha _{i}{\boldsymbol {Ap_{i}}}$
** $\omega _{i}=({\boldsymbol {As}}_{i},{\boldsymbol {s}}_{i})/({\boldsymbol {As}}_{i},{\boldsymbol {As}}_{i})$
** ${\boldsymbol {x}}_{i+1}={\boldsymbol {x}}_{i}+\alpha _{i}{\boldsymbol {p}}_{i}+\omega _{i}{\boldsymbol {s}}_{i}$
** Termina si ${\boldsymbol {x}}_{i+1}$ cumple el criterio de convergencia
** ${\boldsymbol {r}}_{i+1}={\boldsymbol {s}}_{i}-\omega _{i}{\boldsymbol {As}}_{i}$
** $\beta _{i}=(\alpha _{i}/\omega _{i})({\boldsymbol {r}}_{i+1},{\boldsymbol {\hat {r}}}_{0})/({\boldsymbol {r}}_{i},{\boldsymbol {\hat {r}}}_{0})\;$
** ${\boldsymbol {p}}_{i+1}={\boldsymbol {r}}_{i+1}+\beta _{i}({\boldsymbol {p}}_{i}-\omega _{i}{\boldsymbol {Ap}}_{i})$

### BiCGSTAB precondicionado

Generalmente se utiliza los precondicionadores para acelerar la convergencia de los métodos iterativos. Para resolver el sistema ${\boldsymbol {Ax}}={\boldsymbol {b}}$ con un precondicionador ${\boldsymbol {K}}={\boldsymbol {K}}_{1}{\boldsymbol {K}}_{2}\approx {\boldsymbol {A}}$, el BiCGSTAB precondicionado comienza con una aproximación inicial ${\boldsymbol {x}}_{0}$ y procede como sigue:
* ${\boldsymbol {r}}_{0}={\boldsymbol {b}}-{\boldsymbol {Ax_{0}}}$
* Elige un vector arbitrario ${\boldsymbol {\hat {r}}}_{0}$ tal que $({\boldsymbol {\hat {r}}}_{0},{\boldsymbol {r}}_{0})\neq 0$, por ejemplo, ${\boldsymbol {\hat {r}}}_{0}={\boldsymbol {r}}_{0}$
* $\rho _{0}=\alpha =\omega _{0}=1\;$
* ${\boldsymbol {v}}_{0}={\boldsymbol {p}}_{0}={\boldsymbol {0}}$
* Para $i=1,2,3,\ldots \;$
** $\rho _{i}=({\boldsymbol {\hat {r}}}_{0},{\boldsymbol {r}}_{i-1})$
** $\beta =(\rho _{i}/\rho _{i-1})(\alpha /\omega _{i-1})\;$
** ${\boldsymbol {p}}_{i}={\boldsymbol {r}}_{i-1}+\beta ({\boldsymbol {p}}_{i-1}-\omega _{i-1}{\boldsymbol {v}}_{i-1})$
** ${\boldsymbol {y}}={\boldsymbol {K}}^{-1}{\boldsymbol {p}}_{i}$
** ${\boldsymbol {v}}_{i}={\boldsymbol {Ay}}$
** $\alpha =\rho _{i}/({\boldsymbol {\hat {r}}}_{0},{\boldsymbol {v}}_{i})$
** ${\boldsymbol {s}}={\boldsymbol {r}}_{i}-\alpha {\boldsymbol {v}}_{i}$
** ${\boldsymbol {z}}={\boldsymbol {As}}$
** ${\boldsymbol {t}}={\boldsymbol {K}}^{-1}{\boldsymbol {z}}$
** $\omega _{i}=({\boldsymbol {K}}_{1}^{-1}{\boldsymbol {t}},{\boldsymbol {K}}_{1}^{-1}{\boldsymbol {s}})/({\boldsymbol {K}}_{1}^{-1}{\boldsymbol {s}},{\boldsymbol {K}}_{1}^{-1}{\boldsymbol {s}})$
** ${\boldsymbol {x}}_{i}={\boldsymbol {x}}_{i-1}+\alpha {\boldsymbol {y}}+\omega _{i}{\boldsymbol {z}}$
** Termina si ${\boldsymbol {x}}_{i}$ es lo suficientemente preciso
** ${\boldsymbol {r}}_{i}={\boldsymbol {s}}-\omega _{i}{\boldsymbol {t}}$
Esta formulación es equivalente a aplicar el BiCGSTAB sin precondicionamiento al sistema explícitamente precondicionado
    ${\boldsymbol {{\tilde {A}}{\tilde {x}}}}={\boldsymbol {\tilde {b}}}$
con ${\boldsymbol {\tilde {A}}}={\boldsymbol {K}}_{1}^{-1}{\boldsymbol {AK}}_{2}^{-1}$, ${\boldsymbol {\tilde {x}}}={\boldsymbol {K}}_{2}{\boldsymbol {x}}$, ${\boldsymbol {\tilde {b}}}={\boldsymbol {K}}_{1}^{-1}{\boldsymbol {b}}$. En otras palabras, precondicionamiento a ambas la izquierda y la derecha es posible en esta formulación.

## Generalización

BiCGSTAB puede ser visto como una combinación de BiCG y GMRES en que cada paso de BiCG se sigue por un paso de GMRES($1$) (GMRES reiniciado en cada paso) para reparar el comportamiento irregular de convergencia de CGS, de lo cual BiCGSTAB fue desarrollado como una mejora. No obstante, debido al uso de los polinomios del residuo mínimo de grado uno, la dicha reparación puede no ser eficaz si la matriz ${\boldsymbol {A}}$ tiene pares propios complejos grandes. En tales casos, es probable que BiCGSTAB se estanca como lo confirman los experimentos numéricos.
Se puede esparar que los polinomios del residuo mínimo de grado más alto pueda mejor manejar esta situación. Esto da lugar a los métodos que incluyen BiCGSTAB2 y el más general BiCGSTAB($l$). En BiCGSTAB($l$), un paso de GMRES($l$) sigue cada $l$ pasos de BiCG. BiCGSTAB2 es equivalente a BiCGSTAB($l$) con $l=2$.