ST0256 - Análisis Numérico

Capítulo 3: Sistemas de Ecuaciones Lineales

2021/01

MEDELLÍN - COLOMBIA

 Text provided under a Creative Commons Attribution license, CC-BY. All code is made available under the FSF-approved MIT license.(c) Carlos Alberto Alvarez Henao

***

***Docente:*** Carlos Alberto Álvarez Henao, I.C. D.Sc.

***e-mail:*** calvar52@eafit.edu.co

***skype:*** carlos.alberto.alvarez.henao

***Herramienta:*** [Jupyter notebook](http://jupyter.org/)

***Kernel:*** Python 3.8

***

Tabla de Contenidos

1  Sistema de Ecuaciones Lineales

1.1  Introducción

1.2  Singularidad y No Singularidad

1.3  Existencia y Unicidad

1.4  Interpretación geométrica

2  Métodos directos o de eliminación

2.1  Eliminación de Gauss Simple

2.1.1  Introducción

2.1.2  Algoritmo general

2.1.3  Etapas en el procesos de eliminación

2.1.4  Algoritmo proceso de Eliminación

2.1.5  Resultado del proceso de Eliminación

2.1.6  Implementación computacional proceso de Eliminación

2.1.7  Sustitución regresiva (o despeje)

2.1.8  Algoritmo proceso de sustitución regresiva

2.1.9  Implementación computacional

2.1.10  Ejemplo teórico algoritmo Eliminación de Gauss simple

2.1.11  Ejemplo numérico algoritmo Eliminación de Gauss Simple

2.1.12  Ejemplo computacional algoritmo de Eliminación de Gauss Simple

2.2  Método de Gauss - Jordan

2.3  Aspectos computacionales, inconvenitentes de los métodos de eliminación

2.3.1  Análisis de desempeño algoritmo de Eliminación de Gauss Simple

2.3.2  División entre cero

2.3.3  Errores de redondeo

2.3.4  Condicionamiento del sistema

2.3.5  Escalamiento

2.4  Técnicas para mejorar la solución en los métodos de Eliminación

2.4.1  Escalamiento

2.4.2  Pivoteo

2.5  Factoriación LU

2.5.1  Introducción

2.5.2  Determinación de la descomposición LU

2.5.3  Estrategia de solución

2.5.4  Obtención de las matrices L y U

2.5.5  Ejemplo LU

2.5.6  Implementación computacional del algoritmo LU

2.5.7  Ejemplo computacional algoritmo LU: Cálculo de la Inversa

3  Análisis de Error y condición del Sistema

3.1  Condicionamiento del sistema

3.2  Normas vectoriales

3.2.1  Norma-1

3.2.2  Norma-2

3.2.3  Norma-$\infty$

3.2.4  Conclusión

3.3  Normas matriciales

3.3.1  Norma-1

3.3.2  Norma-2

3.3.3  Norma-$\infty$

3.3.4  Conclusión

3.4  Número de condición de una matriz

3.4.1  Definición

3.4.2  Propiedades

3.4.3  Cálculo del número de condición

3.5  Precisión de las soluciones

3.5.1  Residual de una solución

3.5.2  Ejemplo numérico

3.5.3  Estimación de la precisión

3.5.4  Interpretación geométrica

3.5.5  Conclusión

3.5.6  Ejemplo numérico - Matriz de Hilbert

3.6  Tipos especiales de sistemas lineales

3.6.1  Simétrica

3.6.2  Dispersa

3.6.3  Definida positiva

3.6.3.1  Ejemplo: Factorización de Cholesky

3.6.3.2  Implementación computacional algoritmo de cholesky

3.6.4  Matriz de banda

4  Métodos Iterativos

4.1  Introducción

4.2  Método de Jacobi

4.2.1  Algoritmo del método de Jacobi

4.3  Método de Gauss - Seidel

4.4  Forma matricial de los métodos iterativos

4.5  Convergencia de los métodos iterativos

4.6  Método SOR

4.6.1  Algoritmo método SOR

## Sistema de Ecuaciones Lineales

### Introducción

Un [Sistema de Ecuaciones Lineales](https://en.wikipedia.org/wiki/System_of_linear_equations), *SEL*, es un conjunto de $m$ ecuaciones lineales con $n$ incógnitas, cuya solución es un conjunto de valores para las incógnitas con el que se satisfacen todas las ecuaciones.

Asumamos que los elementos que componen las ecuaciones están definidos en los $\mathbb{R}$ y que siempre tendremos la misma cantidad de ecuaciones que de incógnitas, es decir $m=n$.

$$a_{11}x_1 + a_{12}x_2 + a_{13}x_3 + \ldots + a_{1n}x_n = b_1 \hspace{1 cm} (ec. 1)$$

$$a_{21}x_1 + a_{22}x_2 + a_{23}x_3 + \ldots + a_{2n}x_n = b_2 \hspace{1 cm} (ec. 2)$$

$$a_{31}x_1 + a_{32}x_2 + a_{33}x_3 + \ldots + a_{3n}x_n = b_3 \hspace{1 cm} (ec. 3)$$

$$\vdots$$

$$a_{n1}x_1 + a_{n2}x_2 + a_{n3}x_3 + \ldots + a_{nn}x_n = b_n \hspace{1 cm} (ec. n)$$

En notación matricial, un sistema de ecuaciones algebraicas lineal tiene la forma:

$$\mathbf{Ax=b}$$

donde

- $\mathbf{A}$: Matriz de coeficientes $[n \times n]$

- $\mathbf{b}$: vector de términos independientes $[n \times 1]$

- $\mathbf{x}$: Vector de incógnitas $[n \times 1]$

\begin{align*}
\left[\begin{array}{cccc}
  a_{11} & a_{12} & \ldots &a_{1n} \\
  a_{21} & a_{22} & \ldots &a_{2n} \\
  a_{31} & a_{32} & \ldots &a_{3n} \\
  \vdots & \vdots & \ddots &\vdots \\
  a_{n1} & a_{n2} & \ldots &a_{nn} \\
\end{array}\right]
\begin{Bmatrix}
  x_{1}  \\
  x_{2}  \\
  x_{3}  \\
  \vdots \\
  x_{n}
\end{Bmatrix}
= \begin{Bmatrix}
  b_{1}  \\
  b_{2}  \\
  b_{3}  \\
  \vdots \\
  b_{n}
\end{Bmatrix}
\end{align*}

Lo siguiente conduce a la pregunta *¿Puede el vector $\mathbf{b}$ ser expresado como una combinación lineal de las columnas de la matriz $\mathbf{A}$?*

- Los coeficientes de esta combinación lineal están dados por las componentes del vector solución $\mathbf{x}$.

- Puede o no tener solución.

- Puede no ser única.

[Volver a la Tabla de Contenido](#TOC)

### Singularidad y No Singularidad

Una matriz $\mathbf{A}_{[n,n]}$ se dice que es singular si presenta una de las siguientes propiedades:

- $\mathbf{A}$ No tiene inversa: No existe una matriz $\mathbf{M}$ tal que $\mathbf{AM = MA = I}$.

- $\text{det}(\mathbf{A}) = 0$

- $\text{Rango}(\mathbf{A}) < n$: El rango de una matriz es el máximo número de filas o columnas linealmente independientes.

- $\mathbf{Az = 0}$, para cualquier vector $\mathbf{z} \neq \mathbf{0}$.

La solubilidad de un sistema de ecuaciones lineales está determinado si la matriz $\mathbf{A}$ es, o no, singular.

- ***No Singular:*** Tiene solución y es única

- ***Singular:*** No tiene solución o tiene infinitas soluciones

[Volver a la Tabla de Contenido](#TOC)

### Existencia y Unicidad

- La Existencia y la Unicidad de la solución de $\mathbf{Ax=b}$ depende de si $\mathbf{A}$ es singular o no singular.

- Puede también depender de $\mathbf{b}$, pero únicamente en el caso singular

- Si $\mathbf{b} \in \text{span}(\mathbf{A})$, el sistema se dice que es consistente

|$\mathbf{A}$ | $\mathbf{b}$           | #soluciones|
|-----------|:------------------------:|-----------|
|No singular| puede ser arbitrario     |única      |
|singular   | $\mathbf{b} \in \text{span}(\mathbf{A})$   |infinitas  |
|singular   | $\mathbf{b} \notin \text{span}(\mathbf{A})$|ninguna    |

[Volver a la Tabla de Contenido](#TOC)

### Interpretación geométrica

En $2D$, cada ecuación determina una línea recta en el plano. Si dos líneas rectas son no paralelas (no singular), entonces el punto de intersección es único. La solución es el punto de intersección de las dos líneas

Si las dos líneas son paralelas (singular), entonces o las líneas no se intersectan (no hay solución)

o coinciden en todos los puntos a lo largo de las líneas (infinitas soluciones)

En mayores dimensiones, cada ecuación determina un hiperplano; si la matriz es no singular, la intersección de los hiperplanos es la única solución.

[Volver a la Tabla de Contenido](#TOC)

- ***Ejemplo: No singularidad***

Dado el Sistema $2 \times 2$

$$2x_1 + 3x_2 = b_1 $$
$$5x_1 + 4x_2 = b_2 $$

en notación matricial se tiene:

\begin{align*}
\left[\begin{array}{cc}
  2 & 3 & \\
  5 & 4 & \\
 \end{array}\right]
\begin{Bmatrix}
  x_{1}  \\
  x_{2}  \\
\end{Bmatrix}
= \begin{Bmatrix}
  b_{1}  \\
  b_{2}  \\
\end{Bmatrix}
\end{align*}

- Es no singular, independientemente del valor de $\mathbf{b}$

- Por ejemplo, si $\mathbf{b}=\{ 8 \hspace{.25cm} 13\}^T$, entonces $\mathbf{x}=\{ 1 \hspace{0.25cm} 2 \}^T$ es la solución única del sistema.

[Volver a la Tabla de Contenido](#TOC)

- ***Ejemplo: Singularidad***

Dado el Sistema $2 \times 2$

$$2x_1 + 3x_2 = b_1 $$
$$4x_1 + 6x_2 = b_2 $$

en notación matricial se tiene:

\begin{align*}
\left[\begin{array}{cc}
  2 & 3 & \\
  4 & 6 & \\
 \end{array}\right]
\begin{Bmatrix}
  x_{1}  \\
  x_{2}  \\
\end{Bmatrix}
= \begin{Bmatrix}
  b_{1}  \\
  b_{2}  \\
\end{Bmatrix}
\end{align*}

- Es singular, independientemente del valor de $\mathbf{b}$

- Por ejemplo, si $\mathbf{b}=\{ 4 \hspace{.25cm} 7\}^T$, entonces no existe solución.

- Si $\mathbf{b}=\{ 4 \hspace{0.25cm} 8 \}^T$ , $\mathbf{x}=\{ \gamma \hspace{0.25cm} (4-2\gamma)/3 \}^T$ es solución para cualquier número real $\gamma$, entonces tiene infinitas soluciones

[Volver a la Tabla de Contenido](#TOC)

***Ejemplo: mal condicionamiento***

Adicionalmente a esto, los sistemas muy próximos a ser singulares, pueden ocasionar muchos problemas para su solución.

Dado el Sistema $2 \times 2$

$$-\frac{2.3}{5}x_1 + x_2 = 1.1 $$
$$-\frac{1}{2}x_1 + x_2 = 1 $$

en notación matricial se tiene:

\begin{align*}
\left[\begin{array}{cc}
  -\frac{2.3}{5} & 1 & \\
  -\frac{1}{2} & 1 & \\
 \end{array}\right]
\begin{Bmatrix}
  x_{1}  \\
  x_{2}  \\
\end{Bmatrix}
= \begin{Bmatrix}
  1.1  \\
  1  \\
\end{Bmatrix}
\end{align*}

 Fuente: Chapra, S., Canale, R. Métodos Numéricos para ingenieros, 5a Ed. Mc. Graw Hill. 2007

Se observa que, visualmente, no es posible determinar cuál es la solución del sistema. Igual inconveniente podría tener el computador, al no poder determinar (aproximar) cuál es el valor de la solución.

[Volver a la Tabla de Contenido](#TOC)

## Métodos directos o de eliminación

Un método para la solución de *SEL* es directo si se define como un conjunto finito de operaciones y de pasos para hallar la solución. El método genera una solución que sería exacta si no fuese por los errores de redondeo al efectuar las operaciones aritméticas (sumas, restas, multiplicaciones y divisiones).

Dado un SEL de la forma $\mathbf{Ax=b}$, se aplican *“operaciones elementales de fila”* para transformar el sistema de ecuaciones en uno equivalente y más simple de resolver.

***Operaciones Elementales de Fila:*** Dada una matriz $\mathbf{A}$, se dice que se realiza una operación elemental de fila si se hace una de las siguientes operaciones:

- Intercambio de dos filas;

- Sumar a una fila un múltiplo de otra fila;

- Multiplicar una fila por un escalar no nulo.

[Volver a la Tabla de Contenido](#TOC)

### Eliminación de Gauss Simple

#### Introducción

El método de [Eliminación de Gauss Simple](https://en.wikipedia.org/wiki/Gaussian_elimination#:~:text=In%20mathematics%2C%20Gaussian%20elimination%2C%20also,the%20corresponding%20matrix%20of%20coefficients.) se descompone en:

- ***Eliminación:*** Dado el sistema $\mathbf{Ax=b}$, se realizan operaciones fundamentales de fila hasta obtener un sistema triangular superior equivalente $\mathbf{Ux=B}$

- ***Despeje:*** Del sistema triangular superior, se halla primero el valor de $x_n$, con este valor se halla $x_{n-1}$, con estos dos valores se halla $x_{n-2}$ y así sucesivamente hasta obtener el valor de $x_{1}$

[Volver a la Tabla de Contenido](#TOC)

#### Algoritmo general

Lea A, b

     U, B $\leftarrow$ Eliminación(A,b)

     x $\leftarrow$ Despeje(U,B)

Imprima x

[Volver a la Tabla de Contenido](#TOC)

#### Etapas en el procesos de eliminación

- ***Eliminación Etapa 1:*** Convertir todos los elementos $a_{i1}=0$ seleccionando un multiplicador de forma adecuada, en este caso $M_{i1}=a_{i1}/a_{11}$, y calcular la nueva $i–\text{ésima}$ fila como: $F_i^{\text{new}}=F_i - M_{i1}F_1$, con $2 \leq i \leq n$. Para todo $1 \leq j \leq n+1$ se cumple: $a_{ij}^{(new)}=a_{ij}-M_{i1}a_{1j}$.

- ***Eliminación Etapa 2:*** Convertir todos los elementos $a_{i2}=0$ seleccionando un multiplicador de forma adecuada, en este caso $M_{i2}=a_{i2}/a_{22}$, y calcular la nueva $i–\text{ésima}$ fila como: $F_i^{\text{new}}=F_i - M_{i2}F_2$, con $3 \leq i \leq n$. Para todo $2 \leq j \leq n+1$ se cumple: $a_{ij}^{(new)}=a_{ij}-M_{i2}a_{2j}$.

$$\vdots$$

- ***Eliminación Etapa k:*** Convertir todos los elementos $a_{ik}=0$ seleccionando un multiplicador de forma adecuada, en este caso $M_{ik}=a_{ik}/a_{kk}$, y calcular la nueva $i–\text{ésima}$ fila como: $F_i^{\text{new}}=F_i - M_{ik}F_k$, con $1 \leq k \leq n-1$ y $k-1 \leq i \leq n$. Para todo $k \leq j \leq n+1$ se cumple: $a_{ij}^{(new)}=a_{ij}-M_{ik}a_{kj}$.

[Volver a la Tabla de Contenido](#TOC)

#### Algoritmo proceso de Eliminación

El presente seudocódigo muestra el algoritmo en el proceso de eliminación, empleando la matriz amentada $[\mathbf{A}|\mathbf{b}]$.

[Volver a la Tabla de Contenido](#TOC)

#### Resultado del proceso de Eliminación

El resultado del proceso de eliminación sobre la matriz aumentada es el siguiente

\begin{align*}
\left[\begin{array}{ccccccc}
  a_{11} & a_{12} & a_{13} & \ldots & a_{1n} & \vdots & a_{1,n+1} \\
  0      & a_{22} & a_{23} & \ldots & a_{2n} & \vdots & a_{2,n+1} \\
  0      & 0      & a_{33} & \ldots & a_{3n} & \vdots & a_{3,n+1} \\
  \vdots & \vdots & \vdots & \ddots & \vdots & \vdots & \vdots     \\
  0      & 0      & 0      & \vdots & a_{nn} & \vdots & a_{n,n+1} \\
\end{array}\right]
\end{align*}

[Volver a la Tabla de Contenido](#TOC)

#### Implementación computacional proceso de Eliminación

A continuación se presenta una implementación en `Python` del algoritmo de eliminación

```python
def eliminacion(Ab):
    """
    función en Python 3.8 que realiza el proceso de eliminación (encontrar la triangular superior)
    en un Sistema de Ecuaciones Lineales (SEL)

    input: Se ingresa la matriz ampliada Ab[n x n+1]

    output: devuelve la matriz ampliada Ab[n x n+1] triangular superior
    """
    n = Ab.shape[0]
    for k in range(0,n-1):
        print("\n\nEtapa", k+1, "Eliminación columna: ", k+1, "\n")
        for i in range(k+1, n):
            multiplicador = Ab[i][k]/Ab[k][k]
            for j in range(k, n+1):
                Ab[i][j] = Ab[i][j] - multiplicador * Ab[k][j]
            print("\n",Ab)
    return Ab

```

[Volver a la Tabla de Contenido](#TOC)

#### Sustitución regresiva (o despeje)

Una vez se obtiene la matriz triangular superior, se procede a realizar el procedimiento de sustitución regresiva, que consiste en despejar la última incógnita de la última ecuación (observe que es una ecuación con una sola incógnita) quedando

$$x_n = \frac{a_{n,n+1}}{a_{n,n}}$$

después se pasa a la penúltima ecuación y se despeja la penúltima incógnita, que también es una ecuación con una sola incógnita, ya que se conoce el valor de $x_n$ dado en el paso anterior, quedando:

$$x_{n-1} = \frac{a_{n-1,n+1}-a_{n,n+1} \times x_n}{a_{n,n}}$$

se sigue este procedimiento hasta que se llega a la primera ecuación, resulta la siguiente fórmula recursiva:

$$x_i=\frac{a_{i,n+1}-\sum\limits_{j=i+1}^{n}a_{ij}x_j}{a_{ii}}, i=n, n-1, n-2, \ldots, 1.$$

[Volver a la Tabla de Contenido](#TOC)

#### Algoritmo proceso de sustitución regresiva

[Volver a la Tabla de Contenido](#TOC)

#### Implementación computacional

A continuación se presenta una implementación en `Python` del algoritmo de sustitución regresiva

```python
def sustitucionReg(Ab):
    """
    función en Python 3.8 que realiza el proceso de sustitución regresiva

    input: Se ingresa la matriz triangular superior ampliada Ab[n * n+1]

    output: devuelve el vector solución x[n * 1]
    """

    n = Ab.shape[0]
    x = np.zeros(n)
    x[n-1] = Ab[n-1][n] / Ab[n-1][n-1]
    for i in range(n-2,-1,-1):
        suma = 0
        for j in range(i+1, n):
            suma = suma + Ab[i][j] * x[j]
        x[i] = (Ab[i][n] - suma) / Ab[i][i]
    [print("x[{0}] = {1:6.4f}".format(i,x[i])) for i in range(n)]
    return x
```

[Volver a la Tabla de Contenido](#TOC)

#### Ejemplo teórico algoritmo Eliminación de Gauss simple

A manera de ejemplo paso-a-paso, vamos a construir un sistema de $5$ ecuaciones con $5$ incógnitas:

$$a_{11}x_1 + a_{12}x_2 + a_{13}x_3 + a_{14}x_4 + a_{15}x_5 = b_1 \hspace{1 cm} (ec. 1)$$

$$a_{21}x_1 + a_{22}x_2 + a_{23}x_3 + a_{24}x_4 + a_{25}x_5 = b_2 \hspace{1 cm} (ec. 2)$$

$$a_{31}x_1 + a_{32}x_2 + a_{33}x_3 + a_{34}x_4 + a_{35}x_5 = b_3 \hspace{1 cm} (ec. 3)$$

$$a_{41}x_1 + a_{42}x_2 + a_{43}x_3 + a_{44}x_4 + a_{45}x_5 = b_4 \hspace{1 cm} (ec. 4)$$

$$a_{51}x_1 + a_{52}x_2 + a_{53}x_3 + a_{54}x_4 + a_{55}x_5 = b_5 \hspace{1 cm} (ec. 5)$$

- ***Eliminación:*** Dado el sistema $\mathbf{Ax=b}$ se realizan operaciones fundamentales de fila hasta obtener un sistema triangular superior equivalente $\mathbf{Ux=B}$.

> ***Etapa $1$:*** Convertir todos los elementos $a_{i1}=0$ seleccionando un multiplicador de forma adecuada, en este caso $M_{i1}=a_{i1}/a_{11}$ , y calcular la nueva $i$–ésima fila como: $F_i^{(nueva)}=F_{i}−M_{i1} \times F_1$, con $2\leq i \leq n$.

> ***Etapa $2$:*** Convertir todos los elementos $a_{i2}=0$ seleccionando un multiplicador de forma adecuada, en este caso $M_{i2}=a_{i2}/a_{22}$ , y calcular la nueva $i$–ésima fila como: $F_i^{(nueva)}=F_{i}−M_{i2} \times F_2$, con $3\leq i \leq n$.

> ***Etapa $3$:*** Convertir todos los elementos $a_{i3}=0$ seleccionando un multiplicador de forma adecuada, en este caso $M_{i3}=a_{i3}/a_{33}$ , y calcular la nueva $i$–ésima fila como: $F_i^{(nueva)}=F_{i}−M_{i3} \times F_3$, con $4\leq i \leq n$.

> $\vdots$

resultando

$$\begin{matrix}
a_{11}x_1 &+& a_{12}x_2 &+& a_{13}x_3 &+& a_{14}x_4 &+& a_{15}x_5 &=& b_1 \\
          & & a_{22}^{(1)}x_2 &+& a_{23}^{(1)}x_3 &+& a_{24}^{(1)}x_4 &+& a_{25}^{(1)}x_5 &=& b_2^{(1)} \\
          & &           & & a_{33}^{(2)}x_3 &+& a_{34}^{(2)}x_4 &+& a_{35}^{(2)}x_5 &=& b_3^{(2)} \\
          & &           & &           & & a_{44}^{(3)}x_4 &+& a_{45}^{(3)}x_5 &=& b_4^{(3)} \\
          & &           & &           & &           & & a_{55}^{(4)}x_5 &=& b_5^{(4)} \\
  \end{matrix}$$

Los superíndices entre paréntesis indican la cantidad de veecs que fue transformado ese término, debido a las operaciones de fila.

- ***Sustitución Regresiva*** del sistema triangular superior: se halla primero el valor de $𝑥_5$, con este valor se halla $𝑥_4$, con estos dos valores se halla $𝑥_3$ y así sucesivamente hasta obtener el valor de $𝑥_1$.

$$\begin{matrix}
x_5 &=& \frac{b_5^{(4)}}{a_{55}^{(4)}}\\
x_4 &=& \frac{b_4^{(3)}-a_{45}^{(3)}x_5}{a_{44}^{(3)}} \\
x_3 &=& \frac{b_3^{(2)}-a_{34}^{(2)}x_4 - a_{35}^{(2)}x_5}{a_{33}^{(2)}} \\
x_2 &=& \frac{b_2^{(1)}-a_{23}^{(1)}x_3 - a_{24}^{(1)}x_4 - a_{25}^{(1)}x_5 }{a_{22}^{(1)}} \\
x_1 &=& \frac{b_1 - a_{12}x_2 - a_{13}x_3 - a_{14}x_4 - a_{15}x_5 }{a_{11}} \\
  \end{matrix}$$

[Volver a la Tabla de Contenido](#TOC)

#### Ejemplo numérico algoritmo Eliminación de Gauss Simple

Resolver el sistema $4 \times 4$:

$$6x_1  - 2x_2  + 2x_3 +  4x_4 = 12$$

$$12x_1 - 8x_2  + 6x_3 + 10x_4 = 34$$

$$3x_1  - 13x_2 + 9x_3 + 3x_4  = 27$$

$$-6x_1 + 4x_2  +  x_3 - 18x_4 = -38$$

- ***Eliminación:***
> ***Etapa $1$:*** Convertir en ceros todos los elementos de la columna $1$ debajo del elemento pivote $(a_{11}=6)$, seleccionando un multiplicador para cada fila, de forma adecuada. En este caso:

$$M_{21}=a_{21}/a_{11}=12/6 = 2$$

$$M_{31}=a_{31}/a_{11}=3/6 = 1/2$$

$$M_{41}=a_{41}/a_{11}=-6/6 = -1$$

y calcular:

> la nueva $2$a fila como: $F_2^{(nueva)}=F_{2}− M_{21} F_1 = F_{2}− 2 F_1$.

> la nueva $3$a fila como: $F_3^{(nueva)}=F_{3}− M_{31} F_1 = F_{3}− F_1/2$.

> la nueva $4$a fila como: $F_4^{(nueva)}=F_{4}- M_{41} F_1 = F_{4}- (-1)F_1 = F_{4} + F_1$.

$$\begin{matrix}
6x_1 &-&  2x_2 &+& 2x_3 &+&  4x_4 &=& 12 \\
  0  &-&  4x_2 &+& 2x_3 &+&  2x_4 &=& 10 \\
  0  &-& 12x_2 &+& 8x_3 &+&   x_4 &=& 21 \\
  0  & &  2x_2 &+& 3x_3 &-& 14x_4 &=& -26\\
  \end{matrix}$$

> ***Etapa $2$:*** Convertir en ceros todos los elementos de la columna $2$ debajo del elemento pivote $(a_{22}=-4)$, seleccionando un multiplicador para cada fila, de forma adecuada. En este caso:

$$M_{32}=a_{32}/a_{22}=-12/-4 = 3$$

$$M_{42}=a_{42}/a_{22}= 2/-4 = -1/2$$

y calcular

> la nueva $3$a fila como: $F_3^{(nueva)}=F_{3}−3 F_2$.

> la nueva $4$a fila como: $F_4^{(nueva)}=F_{4}+ F_2/2$.

$$\begin{matrix}
6x_1 &-&  2x_2 &+& 2x_3 &+&  4x_4 &=& 12 \\
  0  &-&  4x_2 &+& 2x_3 &+&  2x_4 &=& 10 \\
  0  & &    0  & & 2x_3 &-&  5x_4 &=& -9 \\
  0  & &    0  & & 4x_3 &-& 13x_4 &=& -21\\
  \end{matrix}$$

> ***Etapa $3$:*** Convertir en ceros todos los elementos de la columna $3$ debajo del elemento pivote $(a_{33}=2)$, seleccionando un multiplicador de forma adecuada. En este caso:

$$M_{43}=a_{43}/a_{33}=4/2 = 2$$

y calcular la nueva $4$a fila como: $F_4^{(nueva)}=F_{4}−2 F_3$.

$$\begin{matrix}
6x_1 &-&  2x_2 &+& 2x_3 &+&  4x_4 &=& 12 \\
  0  &-&  4x_2 &+& 2x_3 &+&  2x_4 &=& 10 \\
  0  & &    0  & & 2x_3 &-&  5x_4 &=& -9 \\
  0  & &    0  & &  0   &-&  3x_4 &=& -3 \\
  \end{matrix}$$

Se observa que el sistema resultante es triangular superior.

Por último, aplicando el algoritmo de la *sustitución regresiva*:

$$\begin{matrix}
x_4 &=& \frac{-3}{-3}= 1\\
x_3 &=& \frac{-9+5 \times 1}{2} = -2 \\
x_2 &=& \frac{10-2(2)-2(1)}{-4} = -3\\
x_1 &=& \frac{12+2(-3)-2(-2)-4(1)}{6}=1\\
\end{matrix}$$

[Volver a la Tabla de Contenido](#TOC)

#### Ejemplo computacional algoritmo de Eliminación de Gauss Simple

Vamos a resolver el problema usando programación en el lenguaje `Python`. Se importarán algunas bibliotecas matemáticas para trabajar con arreglos en vez de listas.

```python
import numpy as np
import matplotlib.pyplot as plt
```

usando los algoritmos vistos:

- Lea la matriz de coeficientes $\mathbf{A}$ y el vector de términos independientes $\mathbf{b}$

- Realice el proceso de eliminación para obtener la matríz triangular superior

- Realice el proceso de sustitución regresiva para obtener el vector solución

Generando la matriz de coeficientes $\mathbf{A}$ y el vector de términos independientes $\mathbf{b}$:

```python
#Ingreso de la matriz de coeficientes A, de forma manual

A = np.array([[ 6., - 2, 2,   4],
              [12, - 8, 6,  10],
              [ 3, -13, 9,   3],
              [-6,   4, 1, -18]])
print(A)
```

    [[  6.  -2.   2.   4.]
     [ 12.  -8.   6.  10.]
     [  3. -13.   9.   3.]
     [ -6.   4.   1. -18.]]

```python
# Ingreso del vector de términos independientes b, de forma manual
b = np.array([12., 34, 27, -38])
print(b)
```

    [ 12.  34.  27. -38.]

Creando la matriza aumentada $[\mathbf{A}|\mathbf{b}]$

```python
Ab = np.c_[A,b]
print(Ab)
print(np.shape(Ab))
```

[Volver a la Tabla de Contenido](#TOC)

- ***Proceso de Eliminación***

```python
Ab = eliminacion(Ab)
```

[Volver a la Tabla de Contenido](#TOC)

- ***Proceso de Sustitución regresiva***

```python
x = sustitucionReg(Ab)
```

Resolviendo el *SEL* por el método que incorpora `Python` por defecto:

```python
x = np.linalg.solve(A,b)
print(x)
```

Comprobando que la solución es correcta, multiplicando el vector solución por la matriz de coeficientes para obtener el vector de términos independientes, es decir:

$$\mathbf{Ax=b}$$

```python
A.dot(x) == b
```

```python
print(A.dot(x))
```

```python
print(b)
```

[Volver a la Tabla de Contenido](#TOC)

### Método de Gauss - Jordan

El método de eliminación de [*Gauss - Jordan*](https://es.wikipedia.org/wiki/Eliminaci%C3%B3n_de_Gauss-Jordan) consiste básicamente en continuar con el proceso de eliminación dado en el algoritmo de eliminación simple de Gauss, hasta obtener una matriz diagonal (únicamente tiene elementos diferentes de cero en la diagonal principal) o identidad (únicamente contiene los elementos de la diagonal principal diferentes a 0 e iguales a 1)

$$\begin{matrix}
a_{11}^{(7)}x_1 & &    0       & &   0       & &  0         &=& b_{1}^{(7)}  \\
  0       & &  a_{22}^{(6)}x_2 & &   0       & &  0         &=& b_{2}^{(6)} \\
  0       & &    0       & & a_{33}^{(5)}x_3 & &  0         &=& b_{3}^{(5)} \\
  0       & &    0       & &   0       & &  a_{44}^{(4)}x_4 &=& b_{4}^{(4)} \\
  \end{matrix}$$

La solución del sistema es "inmediata":

$$\begin{matrix}
x_1 &=& \frac{b_{1}^{(7)}}{a_{11}^{(7)}}  \\
x_2 &=& \frac{b_{2}^{(7)}}{a_{22}^{(6)}}  \\
x_3 &=& \frac{b_{3}^{(7)}}{a_{33}^{(5)}}  \\
x_4 &=& \frac{b_{4}^{(7)}}{a_{44}^{(4)}}  \\
\end{matrix}$$

Continuando con el ejemplo anterior:

$$\begin{matrix}
6x_1 &-&  2x_2 &+& 2x_3 &+&  4x_4 &=& 12 \\
  0  &-&  4x_2 &+& 2x_3 &+&  2x_4 &=& 10 \\
  0  & &    0  & & 2x_3 &-&  5x_4 &=& -9 \\
  0  & &    0  & &  0   &-&  3x_4 &=& -3 \\
  \end{matrix}$$

Se emplea el mismo algoritmo que se venía utilizando, pero ahora se empezará desde la columna $4$, fila $1$, y se eliminan todos los elementos hasta el elemento que está encima del elemento pivote. Una vez eliminados todos los elementos encima del pivote, se continua con la columna $3$ y así sucesivamente hasta la columna $2$.

- *Etapa $4$*: Convertir en ceros todos los elementos de la columna $4$ encima del elemento pivote $(a_{44}=-3)$, seleccionando un multiplicador para cada fila, de forma adecuada. En este caso:

> $M_{14} = a_{14}/a_{44} =  4/(-3)$

> $M_{24} = a_{24}/a_{44} =  2/(-3)$

> $M_{34} = a_{34}/a_{44} = -5/(-3)$

y calcular:

> la nueva $1$a fila como: $F_1^{(nueva)}=F_{1}− M_{14} F_4 = F_{1} + 4/3 F_4$.

> la nueva $2$a fila como: $F_2^{(nueva)}=F_{2}− M_{24} F_4 = F_{2} + 2/3 F_4$.

> la nueva $3$a fila como: $F_3^{(nueva)}=F_{3}- M_{34} F_4 = F_{3} - 5/3 F_4 $.

$$\begin{matrix}
6x_1 &-&  2x_2 &+& 2x_3 & &     0 &=&  8 \\
  0  &-&  4x_2 &+& 2x_3 & &     0 &=&  8 \\
  0  & &    0  & & 2x_3 & &     0 &=& -4 \\
  0  & &    0  & &  0   &-&  3x_4 &=& -3 \\
  \end{matrix}$$

- *Etapa $5$*: Convertir en ceros todos los elementos de la columna $3$ encima del elemento pivote $(a_{33}=2)$, seleccionando un multiplicador para cada fila, de forma adecuada. En este caso:

> $M_{13} = a_{13}/a_{33} = 2/2 = 1$

> $M_{23} = a_{23}/a_{33} = 2/2 = 1$

y calcular

> la nueva $1$a fila como: $F_1^{(nueva)} = F_{1} − F_3$.

> la nueva $2$a fila como: $F_2^{(nueva)} = F_{2} - F_3$.

$$\begin{matrix}
6x_1 &-&  2x_2 & & 0    & &     0 &=&  12 \\
  0  &-&  4x_2 & & 0    & &     0 &=&  12 \\
  0  & &    0  & & 2x_3 & &     0 &=& -4 \\
  0  & &    0  & &  0   &-&  3x_4 &=& -3 \\
  \end{matrix}$$

- *Etapa $6$*: Convertir en ceros todos los elementos de la columna $2$ encima del elemento pivote $(a_{22}=-4)$, seleccionando un multiplicador de forma adecuada. En este caso:

> $M_{12} = a_{12}/a_{22} = -2/-4 = 1/2$

y calcular la nueva $1$a fila como: $F_1^{(nueva)}=F_{1}− F_2/2$.

$$\begin{matrix}
6x_1 & &     0 & & 0    & &     0 &=&  6 \\
  0  &-&  4x_2 & & 0    & &     0 &=&  12 \\
  0  & &    0  & & 2x_3 & &     0 &=& -4 \\
  0  & &    0  & &  0   &-&  3x_4 &=& -3 \\
  \end{matrix}$$

La solución es inmediata:

$$\begin{matrix}
x_1 &=& \frac{6}{6} &=& 1 \\
x_2 &=& \frac{12}{-4} &=& -3  \\
x_3 &=& \frac{-4}{-2} &=& -2  \\
x_4 &=& \frac{-3}{-3} &=& 1  \\
\end{matrix}$$

$\color{red}{\textbf{Laboratorio computacional:}}$

- Implemente el algoritmo del método de eliminación de Gauss - Jordan (Emplee el algoritmo de eliminación dado como punto de partida).

- Realice un análisis comparativo de la cantidad de operaciones necesarias en cada uno de ellos. ¿Cuál considera qué es mejor? ¿Por qué? ¿Qué criterios tuvo en cuenta para dicho análisis.

- ¿En qué casos emplearía un método u otro? ¿Por qué?

[Volver a la Tabla de Contenido](#TOC)

### Aspectos computacionales, inconvenitentes de los métodos de eliminación

#### Análisis de desempeño algoritmo de Eliminación de Gauss Simple

La cantidad de operaciones (sumas, restas, multiplicaciones y/o divisiones) que hay qué realizar para alcanzar el sistema triangular superior (eliminación) de $n$ ecuaciones, es de

$$\frac{3(n-1)n}{2}+\frac{(n-1)n(2n-1)}{3}$$

y para efectuar el proceso de sustitución regresiva (solución del sistema) se requieren de $n^2$ operaciones aritméticas.

En total, para resolver un *SEL* empleando el método de Eliminación de Gauss simple (sin contabilizar las operaciones de pivoteo) es de:

$$\frac{4n^3+9n^2-7n}{6}$$

Esta expresión se puede escribir de forma mas compacta como:

$$ \frac{2n^3}{3}+O(n^2)$$

La anterior ecuación indica que el número de [operaciones de punto flotante por segundo](https://en.wikipedia.org/wiki/FLOPS "flops") (flops, en inglés) es del orden de $n^3$ más una componente de orden $n^2$ y menores. Es decir, para resolver un sistema de 10 ecuaciones con 10 incógnitas por el método de Eliminacion de Gauss se requieren del orden de 800 operaciones aritméticas. En la siguiente tabla se observa un resumen de las magnitudes de operaciones dependiendo del orden de $n$.

|  n   | Eliminación | Sust. atrás | flops | 2$n^3$/3 | % elim. |
|-----:|------------:|------------:|-----:|----------------:|-------:|
| 10   |      375    |     55      |   430 |    333           |  87.21% |
| 100  |   338250    |   5050      | 343300 |   333333           |  98.53% |
| 1000 | 3.34$\times 10^8$ | 500500| 3.34 $\times 10^8$ | 3.33$\times 10^8$|  99.85% |

 Fuente: Chapra, S., Canale, R. Métodos Numéricos para ingenieros, 5a Ed. Mc. Graw Hill. 2007

[Volver a la Tabla de Contenido](#TOC)

#### División entre cero

Se presenta cuando un elemento de la diagonal principal es cero, $a_{ii}=0$ ($i=1,2,3,\ldots, n$). Se evita realizando un procedimiento de pivoteo, parcial o total, de filas y/o columnas. Esta técnica se verá en otro apartado más adelante.

[Volver a la Tabla de Contenido](#TOC)

#### Errores de redondeo

Observando la respuesta del ejemplo anterior y haciendo la comparación $\mathbf{Ax=b}$, se observa que uno puede llegar a pensar que efectivamente la solución encontrada es la solución del sistema en custión. Pero realizando una comprobación computacional, evaluando la igualdad dada por el sistema, se tiene:

```python
A.dot(x) == b
```

```python
print(A.dot(x))
```

```python
print(b)
```

Se observa que hay dos componentes que no cumplen con la igualdad.

```python
bGS = A.dot(x)
[print("bGS[{0}] = {1:6.20f}".format(i,bGS[i])) for i in range(len(x))];
```

```python
# Error relativo %
[print("error[{0}] = {1:6.20f}".format(i,abs(bGS[i]-b[i])/abs(b[i])*100)) for i in range(len(x))];
```

La discrepancia, aunque pequeña en este simple ejemplo, es debida al redondeo realizado en las diferentes operaciones aplicadas. Si se hubiera trabajado con fraccionarios en lugar de decimales, evitando los errores de redondeo, la respuesta hubiera sido exacta.

[Volver a la Tabla de Contenido](#TOC)

#### Condicionamiento del sistema

Los sistemas bien condicionados son aquellos en los que un pequeño cambio en alguno de los coeficientes de la matriz $\mathbf{A}$ provoca un cambio pequeño en la solución. Lo contrario serían los sistemas mal condicionados. Una interpretación alternativa puede ser que un amplio rango de resultados puede satisfacer las ecuaciones en forma aproximada, como es el caso cuando se emplean computadores para la solución.

- ***Ejemplo:*** Resolver el siguiente SEL

$$x_1 + 2x_2 = 10 $$
$$1.1 x_1 + 2x_2 = 10.4 $$

La solución es inmediata:

$$x_1=\frac{2(10)-2(10.4)}{1(2)-2(1.1)}=4$$
$$x_2=\frac{1(10.4)-1.1(10)}{1(2)-2(1.1)}=3$$

Ahora realizando un pequeño cambio en el coeficiente $a_{21}$ de $1.1$ a $1.05$, el resultado es:

$$x_1=\frac{2(10)-2(10.4)}{1(2)-2(1.0.5)}=8$$
$$x_2=\frac{1(10.4)-1.1(10)}{1(2)-2(1.0.5)}=1$$

La diferencia en los resultados se da porque en el denominador se tiene la resta de dos números casi iguales, este tipo de diferencia es muy sensible a pequeños cambios en las cantidades empleadas.

En un sistema mal condicionado, las pendientes de las rectas son casi iguales, y visualmente es difícil percibir el punto exacto donde se cruzan. Revisemos matemáticamente esta situación. Escribiendo un sistema $2\times2$ de forma general, se tiene:

$$a_{11}x_1 + a_{12}x_2 = b_1 $$
$$a_{21}x_1 + a_{22}x_2 = b_2 $$

Reescribiendo estas ecuaciones en la forma alternativa:

$$x_2=-\frac{a_{11}}{a_{12}}x_1+\frac{b_1}{a_{12}}$$
$$x_2=-\frac{a_{21}}{a_{22}}x_1+\frac{b_2}{a_{22}}$$

y si las pendientes son casi iguales,

$$\frac{a_{11}}{a_{12}}\approx \frac{a_{21}}{a_{22}}$$

llegando finalmente a

$$a_{11}a_{22}-a_{12}a_{21}\approx 0$$

Recordando del curso de Algebra Lineal, el [determinante](https://en.wikipedia.org/wiki/Determinant) de un sistema $2\times2$ es justamente $a_{11}a_{22}-a_{12}a_{21}$, por lo que se concluye que ***un sistema mal condicionado es aquel cuyo determinante es cercano a cero***.

[Volver a la Tabla de Contenido](#TOC)

#### Escalamiento

La gran pregunta a ser resuelta del ítem anterior es: "***qué es estar cerca al cero***". Esto es más complicado aún porque el valor del determinante puede variar al multiplicar las ecuaciones involucradas por algún factor de escalamiento sin alterar la solución del sistema.

- ***Ejemplo:***

Tomando como ejemplo el mismo sistema $2\times2$ del ejemplo anterior, se encuentra que su determinante es:

$$D=|1(2)-2(1.1)|=0.2$$

Se corrobora que su determinante al ser relativamente cercano a cero se tiene un sistema mal condicionado. Ahora si multiplicamos todo el sistema por un factor de $10$, se tiene:

$$10x_1 + 20x_2 = 100 $$
$$11x_1 + 20x_2 = 104 $$

y su determinante es:

$$D=|10(20)-20(11)|=20 \gg 0$$

que efectivamente podemos afirmar es mucho mayor que cero, pero aún persiste el problema del mal condicionamiento, pues la solución es la misma.

[Volver a la Tabla de Contenido](#TOC)

### Técnicas para mejorar la solución en los métodos de Eliminación

#### Escalamiento

Como se observó en el numeral anterior, el efecto del escalamiento esconde lo que realmente puede suceder en un sistema mal condicionado. Para evitar dicho inconveniente, se puede escalar cada una de las ecuaciones de tal manera que el máximo valor de cualquiera de los coeficientes de dicha ecuación sea igual a $1$. Esto se hace simplemente dividiendo por el valor del mayor coeficiente presente en cada ecuación.

- ***Ejemplo:***

Realizando el escalamiento en el sistema de ecuaciones

$$x_1 + 2x_2 = 10 $$
$$1.1 x_1 + 2x_2 = 10.4 $$

dividiendo por $2$ ambas ecuaciones, para que el mayor coeficiente sea $1.0$ en cada una de las dos ecuaciones, resultado en

$$0.5x_1 + x_2 = 5 $$
$$0.55 x_1 + x_2 = 5.2 $$

cuyo determinante es

$$D=|0.5(1)-1(0.55)|=0.05$$

y ahora realizando el cálculo del determinante sobre las ecuaciones afectadas por un factor de $10$, se llega al mismo resultado: $0.05$ y se evidencia claramente la dificultad del mal condicionamiento del sistema.

[Volver a la Tabla de Contenido](#TOC)

#### Pivoteo

El [pivote](https://en.wikipedia.org/wiki/Pivot_element "pivote") es el elemento de una matriz que se selecciona primero mediante un algoritmo (por ejemplo, eliminación gaussiana, algoritmo simplex, etc.), para realizar ciertos cálculos. En este tema, el elemento pivote será el elemento que se encuentra en la posición $a_{ii}$, correspondiente a la diagonal principal.

Antes de empezar con el proceso de eliminación, es conveniente determinar si existe algún elemento igual, o cercano, a cero en los elementos de la diagonal principal ($a_{ii}\approx 0$), ya que esto ocasionará grandes errores de redondeo, afectando por lo tanto la solución. En caso afirmativo, la solución a este problema es casi obvia: si el elemento de la diagonal principal, $a_{ii}=0$ en la etapa $k$, entonces intercambie la fila $k$ del sistema con alguna fila posterior cuya entrada $a_{ii} \neq0$. Tal intercambio no altera la solución del sistema. Con una entrada diagonal distinta de cero como pivote, el proceso puede continuar como de costumbre.

En principio, cualquier valor distinto de cero servirá como pivote para calcular los multiplicadores, pero en la práctica la elección debe hacerse con cierto cuidado para minimizar el error. Cuando la porción restante de la matriz se multiplica por la matriz de eliminación elemental resultante, debemos intentar limitar el crecimiento de las entradas de la matriz transformada para no amplificar los errores de redondeo. Por esta razón, es deseable que los multiplicadores no excedan de $1$ en magnitud. Este requisito se puede cumplir eligiendo la entrada de mayor magnitud en o debajo de la diagonal como pivote, tal como se explicó en el apartado de [escalamiento](#Escalamiento). Esta política se denomina pivoteo parcial y es esencial en la práctica para una implementación numéricamente estable de la eliminación gaussiana para sistemas lineales generales.

- ***Ejemplo:*** Revise el ejemplo 9.9 propuesto en el libro de Chapra y Canale.

[Volver a la Tabla de Contenido](#TOC)

$\color{red}{\textbf{Laboratorio computacional:}}$

- Complemente los algoritmos computacionales vistos en la primera parte del capítulo con la rutina de Pivoteo. (***Ayuda:*** Ver la figura 9.6 del libro de Chapra y Canale, p. 272)

[Volver a la Tabla de Contenido](#TOC)

### Factoriación LU

#### Introducción

Como se indicó al comienzo de este capítulo, el método de [Eliminación de Gauss simple](#EGS) se emplea para resolver sistemas de ecuaciones lineales de la forma $\mathbf{Ax=b}$. A pesar de ser un método bastante simple para ser aplicado, no está exento de inconvenientes. A la ineficiencia en el desempeño computacional y posibilidades de errores numéricos debido al redondeo, se le suma lo poco práctico al momento de resolver sistemas en los que el vector de términos independientes $\mathbf{b}$ es diferente en cada problema a desarrollar, manteniendo la matriz de coeficientes $\mathbf{A}$ la misma. Este es un típico problema que se presenta cuando se quiere evaluar el comportamiento de un sistema físico al cambiar únicamente las condiciones de frontera y/o iniciales.

[Volver a la Tabla de Contenido](#TOC)

#### Determinación de la descomposición LU

Este proceso de eliminación también es conocido como factorización, o descomposición, $\mathbf{LU}$ porque descompone la matriz $\mathbf{A}$ en un producto de una matriz triangular inferior unitaria, $\mathbf{L}$, y una matriz triangular superior, $\mathbf{U}$.

En forma matricial, al sistema $\mathbf{Ax=b}$ lo podemos reordenar como

$$[\mathbf{A}]\{\mathbf{x}\}-\{\mathbf{b}\}=\{\mathbf{0}\}$$

Ahora supongamos que podemos expresar el proceso de eliminación de la forma

$$[\mathbf{U}]\{\mathbf{x}\}-\{\mathbf{d}\}=\{\mathbf{0}\}$$

donde $\mathbf{U}$ es una matriz triangular superior, quedando el sistema

\begin{align*}
\left[\begin{array}{ccc}
  u_{11} & u_{12} & u_{13} \\
  0      & u_{22} & u_{23} \\
  0      & 0      & u_{33} \\
 \end{array}\right]
\begin{Bmatrix}
  x_{1}  \\
  x_{2}  \\
  x_{3}  \\
\end{Bmatrix}
= \begin{Bmatrix}
  d_{1}  \\
  d_{2}  \\
  d_{3}  \\
\end{Bmatrix}
\end{align*}

Igualmente supongamos que existe una matriz diagonal inferior con diagonal unitaria, $\mathbf{L}$

\begin{align*}L=
\left[\begin{array}{ccc}
  1      & 0      & 0 \\
  l_{21} & 1      & 0 \\
  l_{31} & l_{32} & 1 \\
 \end{array}\right]
\end{align*}

cuya propiedad es que al posmultiplicarla por $[\mathbf{U}]\{\mathbf{x}\}-\{\mathbf{d}\}$, obtenemos el sistema matricial inicia, es decir:

$$[\mathbf{L}]\{[\mathbf{U}]\{\mathbf{x}\}-\{\mathbf{d}\}\}=[\mathbf{A}]\{\mathbf{x}\}-\{\mathbf{b}\}$$

de aquí se obtiene

$$[\mathbf{L}][\mathbf{U}]=[\mathbf{A}]$$

y

$$[\mathbf{L}][\mathbf{d}]=[\mathbf{b}]$$

[Volver a la Tabla de Contenido](#TOC)

#### Estrategia de solución

El anterior procedimiento determina una estrategia de dos pasos para llegar a la solución:

1. ***Descomposición $\mathbf{LU}$:*** $\mathbf{A}$ se factoriza en las matrices triangulares inferior $\mathbf{L}$ y superior $\mathbf{U}$.

2. ***Sustitución:*** $\mathbf{L}$ y $\mathbf{U}$ se emplean para obtener $\mathbf{x}$ para un valor del vector de términos independientes $\mathbf{b}$.

Resumiendo, veámos el siguiente gráfico:

 Fuente: Chapra, S., Canale, R. Métodos Numéricos para ingenieros, 5a Ed. Mc. Graw Hill. 2007

[Volver a la Tabla de Contenido](#TOC)

#### Obtención de las matrices *L* y *U*

La obtención de las matrices $\mathbf{L}$ y $\mathbf{U}$ es inmediata, resultantes de la descomposición realizada en el método de la [Eliminación de Gauss simple](#EGS).

- $\mathbf{U}$, es la misma resultante del proceso de eliminación, donde se obtiene la matriz triangular superior.

onde $\mathbf{U}$ es una matriz triangular superior, quedando el sistema

\begin{align*}U=
\left[\begin{array}{ccc}
  a_{11} & a_{12} & a_{13} \\
  0      & a'_{22} & a'_{23} \\
  0      & 0      & a''_{33} \\
 \end{array}\right]
\end{align*}

donde cada apóstrofe indica la cantidad de variaciones que ha sufrido cada coeficiente $a_{ij}$ durante el proceso de eliminación.

- $\mathbf{L}$, resulta de almacenar los multiplicadores $M_{ik}=a_{ik}/a_{kk}$ que se emplearon en las [etapas de eliminación](#Etapaseliminacion), con la diagonal principal unitaria (el subindice $k$ corresponde a la $k$-ésima etapa de eliminación, que coincide con el número de la columna en la matriz de coeficientes).

\begin{align*}L=
\left[\begin{array}{ccc}
  1      & 0      & 0 \\
  M_{21} & 1      & 0 \\
  M_{31} & M_{32} & 1 \\
 \end{array}\right]
\end{align*}

entonces,

$$M_{21}=\frac{a_{21}}{a_{11}}$$

$$M_{31}=\frac{a_{31}}{a_{11}}$$

$$M_{32}=\frac{a'_{32}}{a'_{22}}$$

$$\vdots$$

[Volver a la Tabla de Contenido](#TOC)

#### Ejemplo *LU*

Del [Ejemplo numérico](#EjemploNumerico) de Eliminación de Gauss simple, se tiene el siguiente sistema de ecuaciones lineales

$$6x_1  - 2x_2  + 2x_3 +  4x_4 = 12$$

$$12x_1 - 8x_2  + 6x_3 + 10x_4 = 34$$

$$3x_1  - 13x_2 + 9x_3 + 3x_4  = 27$$

$$-6x_1 + 4x_2  +  x_3 - 18x_4 = -38$$

la matriz $\mathbf{U}$ es la [matriz de eliminación](#MEliminada), dada por:

\begin{align*}U=
\left[\begin{array}{cccc}
  6 & -2 & 2 &  4 \\
  0 & -4 & 2 &  2 \\
  0 &  0 & 2 & -5 \\
  0 &  0 & 0 & -3 \\
  \end{array}\right]
\end{align*}

y la matriz $\mathbf{L}$ está dada por cada uno de los elementos de los [multiplicadores](#Multiplicadores) $M_{ik}$:

$$M_{21}=a_{21}/a_{11}=12/6 = 2$$

$$M_{31}=a_{31}/a_{11}=3/6 = 1/2$$

$$M_{41}=a_{41}/a_{11}=-6/6 = -1$$

$$M_{32}=a_{32}/a_{22}=-12/-4 = 3$$

$$M_{42}=a_{42}/a_{22}= 2/-4 = -1/2$$

$$M_{43}=a_{43}/a_{33}=4/2 = 2$$

\begin{align*}L=
\left[\begin{array}{cccc}
    1  &  0 & 0 & 0 \\
    2  & 1 & 0 & 0 \\
   1/2 & 3 & 1 & 0 \\
   -1  & -1/2 & 2 & 1 \\
  \end{array}\right]
\end{align*}

Verificando que $\mathbf{LU=A}$

\begin{align*}
\begin{bmatrix}
    1  &  0 & 0 & 0 \\
    2  & 1 & 0 & 0 \\
   1/2 & 3 & 1 & 0 \\
   -1  & -1/2 & 2 & 1 \\
\end{bmatrix}
\begin{bmatrix}
  6 & -2 & 2 &  4 \\
  0 & -4 & 2 &  2 \\
  0 &  0 & 2 & -5 \\
  0 &  0 & 0 & -3 \\
\end{bmatrix}
= \begin{bmatrix}
   6 & - 2 & 2 &   4 \\
  12 & - 8 & 6 &  10 \\
   3 & -13 & 9 &   3 \\
  -6 &   4 & 1 & -18 \\
\end{bmatrix}
\end{align*}

Comprobando computacionalmente la factorización $\mathbf{LU=A}$:

```python
import numpy as np
#Ingreso de la matriz de coeficientes A, de forma manual

L = np.array([[ 1,  0, 0, 0],
              [ 2,  1, 0, 0],
              [.5,  3, 1, 0],
              [-1,-.5, 2, 1]])
print(L)
```

```python
#Ingreso de la matriz de coeficientes A, de forma manual

U = np.array([[ 6, -2, 2,  4],
              [ 0, -4, 2,  2],
              [ 0,  0, 2, -5],
              [ 0,  0, 0, -3]])
print(U)
```

```python
print(L.dot(U))
```

```python
L.dot(U) == A
```

[Volver a la Tabla de Contenido](#TOC)

#### Implementación computacional del algoritmo LU

La implementación computacional se realizará modificando la función que se creó para el proceso de [eliminación](#Algoritmoeliminacion) para determinar la matriz $\mathbf{L}$, pero esta teniendo en cuenta únicamente la matriz de coeficientes $\mathbf{A}$ (no la ampliada), ya que la idea es poder emplear diferentes valores del vector de términos independientes $\mathbf{b}$.

Una forma de hacerlo es empleando el algoritmo de eliminación del método de eliminación de Gauss simple visto y almacenar los valores de los multiplicadores en las respectivas componentes de la nueva matriz $\mathbf{L}$. Para ello, se usa una matriz identidad y se reemplazan los ceros por los valores de los multiplicadores en cada una de las posiciones indicadas.

```python
def eliminacionLU(U):
    """
    función en Python 3.8 que realiza el proceso de eliminación LU
    en un Sistema de Ecuaciones Lineales (SEL)

    input: ingresa la matriz A[n x n]

    output: devuelve las matrices triangular inferior, L, y triangular superior,
            U, de [n x n].
    """
    n = U.shape[0]
    L = np.identity(n)

    for k in range(0,n-1):
        for i in range(k+1, n):
            m = U[i][k]/U[k][k]
            L[i,k] = m
            for j in range(k, n):
                U[i][j] = U[i][j] - m * U[k][j]
    return (L, U)
```

Esta aproximación es simple, pero computacionalmente costosa, ya que se crea una matriz con casi el 50% de los elementos iguales a cero. Una alternativa podría ser emplear la estructura de datos tipo [diccionario](https://docs.python.org/3/tutorial/datastructures.html#dictionaries) de Python, que facilita almacenar tanto el valor como las "coordenadas" matriciales (fila/columna) diferentes de cero y así no almacenar ceros innecesariamente. Se deja como actividad a ser realizada por el estudiante.

Veamos ahora los resultados obtenidos tras ejecutar este algoritmo y la comprobación $\mathbf{LU=A}$

```python
U = A.copy()
L,U = eliminacionLU(U)
print(L)
print(U)
```

```python
print(L.dot(U))
```

```python
L.dot(U) == A
```

***Actividad para el estudiante:*** A qué considera que no todos los valores en esta comprobación son `True`?

[Volver a la Tabla de Contenido](#TOC)

#### Ejemplo computacional algoritmo LU: Cálculo de la Inversa

Determinar la inversa de la matriz $\mathbf{A}$ del ejemplo que hemos venido trabajando.

La inversa de una matriz empleando la factorización $\mathbf{LU}$ se puede obtener mediante el cálculo sucesivo del procedimiento descrito, cambiando cada vez el vector del lado derecho por un vector columna que tiene todos sus elementos iguales a cero,excepto por el valor de uno en la posición que corresponde a la columna de la matriz inversa a ser calculada. Este proceso generará cada vez como respuesta la columna correspondiente a la matriz inversa. Veamos.

En el ejemplo anterior ya se obtuvo la factorización $\mathbf{LU}$, ahora realicemos el procedimiento para cada vector $\mathbf{b}$, y cada una de las respuestas $\mathbf{x}$ serán las columnas de la matriz inversa.

Primero, obtengamos la primera columna de la matriz inversa. Para ello, creamos un vector:

\begin{align}
  b_1 &= \begin{bmatrix}
         1 \\
         0 \\
         0 \\
         0
       \end{bmatrix}
\end{align}

```python
b1 = np.array([1, 0, 0, 0])
```

Ahora vamos a resolver el sistema $\mathbf{Ld=b_1}$ por sustitución hacia adelante. El algoritmo que tenemos de sustitución es hacia atrás. Toca modificarlo para que resuelva hacia adelante (progresiva).

```python
def sustitucionProg(A,b):
    """
    función en Python 3.8 que realiza el proceso de sustitución progresiva

    input: Se ingresa la matriz triangular inferior L[n * n]

    output: devuelve el vector solución b[n * 1]
    """

    n = A.shape[0]
    d = np.zeros(n)
    d[0] = b[0]
    for i in range(1,n):
        suma = 0
        for j in range(n):
            suma = suma + A[i][j] * d[j]
        d[i] = b[i] - suma
    return d
```

```python
d1 = sustitucionProg(L,b1)
print(d1)
```

Este resultado preliminar se emplea al lado derecho para resolver el sistema  $\mathbf{Ux=d}$ mediante sustitución regresiva, donde el vector $\mathbf{x}$ será la solución que corresponderá a la primera columna de la matriz inversa.

Observe que el algoritmo de sustitución regresiva que se tienen implementado es con la matriz aumentada, por lo que toca antes aumentar la matriz $\mathbf{U}$ con el vector de términos independientes, $\mathbf{d}$.

```python
Ud1 = np.c_[U,d1]
print(Ud1)
print(np.shape(Ud1))
```

```python
x1 = sustitucionReg(Ud1)
print(x1)
```

El vector x1 calculado corresponde a la primera columna de la matriz inversa. Repitiendo este procedimiento, cambiando cada vez el vector de términos independientes, para el cálculo de la segunda columna, sería:

\begin{align}
  b_2 &= \begin{bmatrix}
         0 \\
         1 \\
         0 \\
         0
       \end{bmatrix}
\end{align}

```python
b2 = np.array([0, 1, 0, 0])
d2 = sustitucionProg(L,b2)
Ud2 = np.c_[U,d2]
x2 = sustitucionReg(Ud2)
print(x2)
```

Para el siguiente término se emplea el vector de términos independientes

\begin{align}
  b_3 &= \begin{bmatrix}
         0 \\
         0 \\
         1 \\
         0
       \end{bmatrix}
\end{align}

```python
b3 = np.array([0, 0, 1, 0])
d3 = sustitucionProg(L,b3)
Ud3 = np.c_[U,d3]
x3 = sustitucionReg(Ud3)
print(x3)
```

Para el último término, se emplea el vector de términos independientes

\begin{align}
  b_4 &= \begin{bmatrix}
         0 \\
         0 \\
         0 \\
         1
       \end{bmatrix}
\end{align}

```python
b4 = np.array([0, 0, 0, 1])
d4 = sustitucionProg(L,b4)
Ud4 = np.c_[U,d4]
x4 = sustitucionReg(Ud4)
print(x4)
```

Por último, montando la matriz inversa con cada uno de los vectores obtenidos anteriormente. Debe tener presente que los vectores obtenidos son en forma de vector fila, por lo que hay que realizar la transposición de la misma.

```python
Ainv = np.matrix([x1, x2, x3, x4]).T
print(Ainv)
```

Comprobando que efectivamente se obtuvo la matriz inversa, realizamos el cálculo:

$$\mathbf{A^{-1}A=I}$$

```python
Identity = Ainv.dot(A)
print(Identity)
```

[Volver a la Tabla de Contenido](#TOC)

## Análisis de Error y condición del Sistema

### Condicionamiento del sistema

La inversa de una matriz proporciona una forma para determinar si el sistema está mal condicionado. Se tienen tres métodos para esto:

- Escalar la matriz de coeficientes.

- Multplicar la inversa por la matriz de coeficientes original y estimar si el resultado es lo suficientemente cercano a la matriz identidad, es decir: $\mathbf{A^{-1}A \approx I}$

- Invertir la matriz inversa y estimar si el resultado está lo suficientemente cerca a la matriz de coeficientes original, es decir, $\mathbf{[A^{-1}]^{-1}\approx A}$

[Volver a la Tabla de Contenido](#TOC)

### Normas vectoriales

 Fuente: Wikipedia

Para medir errores y sensibilidad en la resolución de sistemas lineales, necesitamos alguna noción del "*tamaño*" de vectores y matrices. El concepto escalar de magnitud, módulo o valor absoluto se puede generalizar al concepto de normas para vectores y matrices.

- ***[Norma](https://en.wikipedia.org/wiki/Norm_(mathematics)):*** *es una función que toma valores reales y que proporciona una medida del tamaño o "longitud" de entidades matemáticas multicomponentes, como los vectores y las matrices*.

Aunque es posible una definición más general, todas las normas vectoriales que usaremos son instancias de $p-normas$, que para un entero $p>0$ y un vector $\mathbf{x}$ de dimensión $n$ se definen por:

$$\|\mathbf{x}\|_p=\left(\sum_{i=1}^n |x_i|^p \right)^{1/p}$$

Algunos casos especiales de normas son:

#### Norma-1

También conocida como *Distancia Manhattan* o *Geometría del taxista* ([Taxicab geometry](https://en.wikipedia.org/wiki/Taxicab_geometry)). Es la distancia entre dos puntos como la suma de las diferencias (absolutas) de sus coordenadas. El nombre *Manhattan* alude al diseño en cuadrícula de la mayoría de las calles de la isla de *[Manhattan](http://www.mappery.com/map-of/Manhattan-Tourist-Map)*, lo que causa que el camino más corto que un auto puede tomar entre dos puntos de la ciudad tengan la misma distancia que dos puntos en la geometría del taxista. Fue presentado por [Hermann Minkowski](https://en.wikipedia.org/wiki/Hermann_Minkowski).

 Fuente: Wikipedia

***Definición:***

$$\|\mathbf{x}\|_1=\sum_{i=1}^n |x_i|$$

En un espacio de dimensión 2 (2D), un punto es representado por $(x,y)$. Considere dos puntos $P1: (x_1,y_1)$ y $P2: (x_2,y_2)$, la $Norma-1$, o distancia Manhattan, entre $P1$ y $P2$ está dada por:

$$\|\mathbf{x}\|_1=\{|x_1-x_2|\ +\ |y_1-y_2|\}$$

***Propiedades:***

Algunas propiedades de esta norma son:

- Hay varios caminos (finitos) entre dos puntos cuya longitud es igual a la distancia de *Manhattan*

- Un camino recto con una longitud igual a la distancia de *Manhattan* tiene dos movimientos permitidos:

  - Vertical (una dirección)
  - Horizontal (una dirección)

- Para un punto dado, el otro punto a una distancia de *Manhattan* determinada se encuentra en un cuadrado:

 Fuente: Medium

***Aplicaciones:***

- ***Análisis de regresión:*** se utiliza en regresión lineal para encontrar una línea recta que se ajuste a un conjunto dado de puntos.

- ***Detección comprimida:*** al resolver un sistema indeterminado de ecuaciones lineales, el término de regularización para el vector de parámetros se expresa en términos de la distancia de Manhattan. Este enfoque aparece en el marco de recuperación de señales llamado detección comprimida

- ***Distribución de frecuencia:*** se utiliza para evaluar las diferencias en distribuciones de frecuencia discretas.

- ***[Regularización](https://towardsdatascience.com/regularization-in-machine-learning-76441ddcf99a):*** en modelos de Machine Learning para evitar el overfitting.

[Volver a la Tabla de Contenido](#TOC)

#### Norma-2

También llamada *[norma Euclideana](https://en.wikipedia.org/wiki/Euclidean_distance)* (o *distancia euclideana*). La *distancia euclidiana* es la distancia más corta entre dos puntos en un espacio de dimensión $N$, también conocido como *[espacio euclidiano](https://en.wikipedia.org/wiki/Euclidean_space)*. Se usa como una métrica común para medir la similitud entre dos puntos de datos y se usa en varios campos como geometría, minería de datos, aprendizaje profundo y otros.

 Fuente: Wikipedia

***Definición***

$$\|\mathbf{x}\|_2=\sqrt{\sum_{i=1}^n |x_i|^2}$$

En un espacio de dimensión 2 (2D), un punto es representado por $(x,y)$. Considere dos puntos $p: (x_1,y_1)$ y $q: (x_2,y_2)$, la $Norma-2$, o *distancia euclideana*, entre $p$ y $q$ está dada por:

$$\|\mathbf{x}\|_2=\sqrt{(x_1-x_2)^2 + (y_1-y_2)^2}$$

***Propiedades:***

- Hay un camino único entre dos puntos cuya longitud es igual a la distancia euclidiana.

- Para un punto dado, el otro punto se encuentra en un círculo tal que la distancia euclidiana es fija. El radio del círculo es la distancia euclidiana fija.

 Fuente: Medium

***Aplicaciones:***

- ***Geometría euclidiana:*** para encontrar la distancia más corta entre dos puntos en un espacio euclidiano y la longitud de una línea recta entre dos puntos.

- ***Análisis de clústeres:*** esta métrica se usa comúnmente en algoritmos de clústeres como [K-means](https://en.wikipedia.org/wiki/K-means_clustering)

- ***Ciencia de datos:*** se utiliza como una métrica simple para medir la [similitud](https://en.wikipedia.org/wiki/Similarity_measure) entre dos puntos de datos

[Volver a la Tabla de Contenido](#TOC)

#### Norma-$\infty$

También conocida como *[distancia de Chebyshev](https://en.wikipedia.org/wiki/Chebyshev_distance)*. Es una métrica que es la distancia absoluta máxima entre dos pntos $N-dimensionales$. Tiene aplicaciones del mundo real en ajedrez, logística de almacén y muchos otros campos. También se conoce como distancia de Tchebychev, métrica máxima, distancia del tablero de ajedrez y métrica $L_{\infty}$. Lleva el nombre de *[Pafnuty Chebyshev](https://en.wikipedia.org/wiki/Pafnuty_Chebyshev)*, matemático ruso que recibió conocido por su trabajo sobre probabilidad, estadística, mecánica, geometría analítica y teoría de números.

 Fuente: Wikipedia

***Definición***

$$\|\mathbf{x}\|_{\infty}=\underset{1 \leq i \leq n}{max}|x_i|$$

En un espacio de dimensión 2 (2D), un punto es representado por $(x,y)$. Considere dos puntos $P1: (x_1,y_1)$ y $P2: (x_2,y_2)$, la $Norma-\infty$, entre $P1$ y $P2$ está dada por:

$$\|\mathbf{x}\|_{\infty}=max\{|x_1-x_2| ,|y_1-y_2|\}$$

***Propiedades***

Las propiedades de la distancia de Chebyshev son:

- La distancia bidimensional de Manhattan también tiene círculos en forma de cuadrados, con lados de longitud $\sqrt{2}r$, orientados en un ángulo de $\pi/4$ $(45°)$ con respecto a los ejes de coordenadas, por lo que la distancia plana de Chebyshev puede verse como equivalente por rotación y escalado a la distancia plana de Manhattan.

- Una esfera formada usando la distancia de Chebyshev como métrica es un cubo con cada cara perpendicular a uno de los ejes de coordenadas, pero una esfera formada usando la distancia de Manhattan es un octaedro: estos son poliedros duales, pero entre cubos, solo el cuadrado (y un segmento de línea 1-dimensional) son politopos auto-duales.

 Fuente: Medium

***Aplicaciones***

Algunas aplicaciones de la distancia de Chebyshev son:

- ***Ajedrez:*** el número mínimo de movimientos que necesita un rey para ir de un cuadrado a otro en un tablero de ajedrez es igual a la distancia de Chebyshev entre los centros de los cuadrados.

- ***Logística de almacenaje:*** la distancia de Chebyshev se utiliza a veces en la logística de almacenaje (o bodegaje), ya que mide de forma eficaz el tiempo que tarda una grúa puente en mover un objeto.

[Volver a la Tabla de Contenido](#TOC)

#### Conclusión

Todas estas normas dan los mismos resultados cualitativamente, pero en ciertas circunstancias puede ser más fácil trabajar con una norma particular analítica o computacionalmente. La $norma-1$ o la $norma-\infty$ se usan generalmente para analizar la sensibilidad de las soluciones a los sistemas lineales. También usaremos la $norma-2$ más adelante en otros contextos. Las diferencias entre estas normas se ilustran en la siguiente figura, que muestra la esfera unitaria, $\{\mathbf{x}: \|\mathbf{x}\| = 1\}$, en dos dimensiones para cada norma.

 Fuente: Heath, Michael. Scientific Computing. An introductory survey

La norma de un vector es simplemente el factor por el cual la esfera unitaria correspondiente debe expandirse o encogerse para abarcar el vector. Por ejemplo, las normas tienen los siguientes valores para el vector:

$$\|\mathbf{x}\|_1=|(-1.6,1.2)|=2.8$$
$$\|\mathbf{x}\|_2=|(-1.6,1.2)|=2.0$$
$$\|\mathbf{x}\|_{\infty}=|(-1.6,1.2)|=1.6$$

en general, para cualquier vector $\mathbf{x} \in \mathbb{R}^n$, tenemos que:

$$\|\mathbf{x}\|_1 \ge \|\mathbf{x}\|_2 \ge \|\mathbf{x}\|_{\infty}$$

Para cualquier norma vectorial, se cumplen las siguientes propiedades importantes, donde $\mathbf{x}$ e $\mathbf{y}$ son cualquier vector:

- $\|\mathbf{x}\|>0 \text{ si } \mathbf{x} \ne 0$

- $\|\gamma \mathbf{x}\|=|\gamma| \cdot \|\mathbf{x}\| \text{ para cualquier escalar } \gamma$

- $\|\mathbf{x+y}\| \le \|\mathbf{x}\|+\|\mathbf{y}\| \text{ (desigualdad triangular)}$

[Volver a la Tabla de Contenido](#TOC)

### Normas matriciales

También se necesita alguna forma de medir el tamaño o la magnitud de las matrices. Todas las normas matriciales que se usarran en este capítulo se definen en términos de una norma vectorial subyacente. Específicamente, dada una norma vectorial, definimos la [norma matricial](https://en.wikipedia.org/wiki/Matrix_norm) correspondiente de una matriz $\mathbf{A}$ de la siguiente manera:

$$\|\mathbf{A}\|=\underset{x \ne 0}{max} \frac{\|\mathbf{Ax}\|}{\|\mathbf{x}\|}$$

Se dice que dicha norma matricial está subordinada a la norma vectorial. Intuitivamente, la norma de una matriz mide el estiramiento máximo que la matriz hace a cualquier vector, medido en la norma de vector dada.

[Volver a la Tabla de Contenido](#TOC)

#### Norma-1

Se realiza una sumatoria de los valores absolutos de los coeficientes para cada columna, y la mayor de estas sumatorias se toma como la norma. Esto se conoce como la norma columna-suma.

$$\|\mathbf{A}\|_1=\underset{1 \leq j \leq n}{max}\sum_{i=1}^n |a_{ij}|$$

[Volver a la Tabla de Contenido](#TOC)

#### Norma-2

Una forma útil de recordar es que las normas de la matriz concuerdan con las normas vectoriales correspondientes para una matriz $n \times 1$. la $norma-2$ también es llamada *norma de Frobenius* o de *Hilbert-Shmidt*. Desafortunadamente, la norma matricial correspondiente a la $norma-2$ vectorial no es tan simple de calcular; resulta ser igual a la raíz cuadrada del valor propio más grande de la matriz $\mathbf{A}$ ([traza](https://en.wikipedia.org/wiki/Trace_(linear_algebra))) o como el [valor singular](https://en.wikipedia.org/wiki/Singular_value) más grande de $\mathbf{A}$.

$$\|\mathbf{A}\|_2=\sqrt{\sum_{i=1}^n \sum_{j=1}^n |a_{ij}|^2} = \sqrt{traza(\mathbf{A}^T\mathbf{A})} = \sqrt{\sum_{i=1}^n \sigma_i^2(\mathbf{A})}$$

[Volver a la Tabla de Contenido](#TOC)

#### Norma-$\infty$

Similar a la $norma-1$ para matrices, se puede hacer para los renglones y resulta una matriz-uniforme o norma renglón-suma

$$\|\mathbf{A}\|_{\infty}=\underset{1 \leq i \leq n}{max}\sum_{j=1}^n |a_{ij}|$$

[Volver a la Tabla de Contenido](#TOC)

#### Conclusión

Las normas matriciales que se han definido satisfacen las siguientes propiedades importantes, donde $\mathbf{A}$ y $\mathbf{B}$ son matrices cualesquiera:

- $\|\mathbf{A}\|>0 \text{ si } \mathbf{A} \ne 0$

- $\|\gamma \mathbf{A}\|=|\gamma| \cdot \|\mathbf{A}\| \text{ para cualquier escalar } \gamma$

- $\|\mathbf{A+B}\| \le \|\mathbf{A}\|+\|\mathbf{B}\|$

- $\|\mathbf{AB}\| \leq \|\mathbf{A}\| \cdot \|\mathbf{B}\|$

- $\|\mathbf{Ax}\| \leq \|\mathbf{A}\| \cdot \|\mathbf{x}\| \text{ para cualquier vector } \mathbf{x}$

En un tratamiento más general, las tres primeras propiedades pueden tomarse como la definición de una norma matricial. Las dos propiedades restantes, conocidas como condiciones submultiplicativas o de consistencia, pueden o no ser válidas para estas normas matriciales más generales, pero siempre son válidas para las normas matriciales subordinadas a las $p-normas$ vectoriales.

[Volver a la Tabla de Contenido](#TOC)

### Número de condición de una matriz

#### Definición

El [número de condición](https://en.wikipedia.org/wiki/Condition_number) de una matriz cuadrada no singular $\mathbf{A}$ con respecto a una norma dada se define como:

$$cond(\mathbf{A})=\|\mathbf{A}\| \cdot \|\mathbf{A^{-1}}\|$$

por convención, $cond(\mathbf{A})=\infty$, si $\mathbf{A}$ es singular. Ya que

$$\|\mathbf{A}\| \cdot \|\mathbf{A^{-1}}\|=\left(\underset{x \ne 0}{max} \frac{\|\mathbf{Ax}\|}{\|\mathbf{x}\|}\right)\cdot \left(\underset{x \ne 0}{min} \frac{\|\mathbf{Ax}\|}{\|\mathbf{x}\|}\right)^{-1}$$

El número de condición de una matriz mide la relación entre el estiramiento máximo que hace la matriz a cualquier vector distinto de cero y el encogimiento máximo. Este concepto es consistente con la noción general de número de condición definido en el capítulo 1 - Teoría de errores. el número de condición de la matriz limita la razón del cambio relativo en la solución de un sistema lineal a un cambio relativo en los datos de entrada.

El número de condición es una medida de qué tan cerca está una matriz de ser singular: una matriz con un número de condición grande es casi singular, mientras que una matriz con un número de condición cercano a $1$ está lejos de ser singular. Tenga en cuenta que el determinante de una matriz no es un buen indicador de la singularidad cercana: aunque una matriz $\mathbf{A}$ es singular si $det(\mathbf{A})=0$, la magnitud de un determinante distinto de cero, grande o pequeño, no da información sobre qué tan cerca del singular es la matriz puede ser. Por ejemplo, $det(\alpha\mathbf{I}n)= \alpha^n$, que puede ser arbitrariamente pequeño para $|\alpha|<1$, pero la matriz está perfectamente acondicionada para cualquier valor de $\alpha$ distinto de cero, con un número de condición cercano a $1$.

[Volver a la Tabla de Contenido](#TOC)

#### Propiedades

Algunas propiedades importantes del número de condición son:

- Para cualquier matriz $\mathbf{A}$, $cond(\mathbf{A}) \ge 1$.

- Para la matriz identidad, $cond(\mathbf{I}) = 1$.

- Para cualquier matriz de permutacion $\mathbf{P}$, $cond(\mathbf{P}) = 1$.

- Para cualquier matriz $\mathbf{A}$ y un escalar $\gamma$ diferente de cero, $cond(\gamma \mathbf{A}) = cond(\mathbf{A})$.

- Para cualquier matriz diagonal $\mathbf{D}=diag(d_i)$, $cond(\mathbf{D}) = (max|d_i|) / (min|d_i|)$.

[Volver a la Tabla de Contenido](#TOC)

#### Cálculo del número de condición

La utilidad del número de condición radica en evaluar la precisión de las soluciones de los sistemas lineales. Dado que la definición del número de condición implica el cálculo de la inversa de la matriz, que es obviamente una tarea no trivial. De hecho, calcular el número de condición literalmente requeriría mucho más trabajo que resolver el sistema lineal cuya precisión debe evaluarse utilizando el número de condición. En la práctica, por lo tanto, el número de condición se estima simplemente, quizás dentro de un orden de magnitud, como un subproducto relativamente económico del proceso de solución.

La norma matricial $\|\mathbf{A}\|$ se calcula fácilmente como la máxima suma absoluta de columnas (o suma de filas, según la norma utilizada). Es la estimación de $\|\mathbf{A}^{-1}\|$ a bajo costo lo que presenta un desafío. De las propiedades de las normas, sabemos que si $\mathbf{z}$ es la solución de $\mathbf{Az=y}$, entonces

$$\frac{\|\mathbf{z}\|}{\|\mathbf{y}\|} \leq \|\mathbf{A}^{-1}\|$$

y el límite se logra para algún vector $\mathbf{y}$ elegido de manera "óptima". Por lo tanto, deseamos elegir un vector $\mathbf{y}$ de modo que la relación $\|\mathbf{z}\|/\|\mathbf{y}\|$ sea lo más grande posible y, por lo tanto, sea una estimación razonable de $\|\mathbf{A}^{-1}\|$. Encontrar la $\mathbf{y}$ óptima sería prohibitivamente caro, pero se puede obtener una aproximación útil mucho más barata. Una heurística es elegir $\mathbf{y}$ como la solución del sistema $\mathbf{A}^T\mathbf{c}=\mathbf{c}$, donde $\mathbf{c}$ es un vector cuyas componentes son $1$, con los signos elegidos sucesivamente para hacer que la $\mathbf{y}$ resultante sea lo más grande posible.

[Volver a la Tabla de Contenido](#TOC)

### Precisión de las soluciones

#### Residual de una solución

Intuitivamente, la forma más obvia de verificar la validez de una solución es sustituirla en la ecuación para ver qué tan cerca coinciden los dos lados. El vector residual de una solución aproximada $\mathbf{\hat{x}}$ al sistema lineal $\mathbf{Ax=b}$ de $n\times n$ se define como

$$\mathbf{r=b-A\hat{x}}$$

En teoría, si $\mathbf{A}$ no es singular, entonces el error $\|\mathbf{\hat{x}}-\mathbf{b}\|=\mathbf{0}$ si y solo si $\|\mathbf{r}\|=\mathbf{0}$. En la práctica, sin embargo, estas cantidades no son necesariamente pequeñas simultáneamente. Si la solución calculada $\mathbf{\hat{x}}$ satisface exactamente

$$(\mathbf{A+E})\mathbf{\hat{x}}=\mathbf{b}$$

entonces

$$\|\mathbf{r}\|=\|\mathbf{b-A\hat{x}}\|=\|\mathbf{E\hat{x}}\| \le \|\mathbf{E}\|\cdot\|\mathbf{\hat{x}}\|$$

llegando a la siguiente desigualdad

$$\frac{\|\mathbf{r}\|}{\|\mathbf{A}\|\cdot\|\mathbf{\hat{x}}\|} \le \frac{\|\mathbf{E}\|}{\|\mathbf{A}\|}$$

relacionando el residuo relativo con el cambio relativo en la matriz. Por lo tanto, un residuo relativo grande implica un gran error hacia atrás en la matriz, lo que significa que el algoritmo utilizado para calcular la solución es inestable.

pero cuán grande debería ser $\|\mathbf{E}\|$ en la práctica? Se puede demostrar que para la factorización $\mathbf{LU}$ en la *eliminación de Gauss simple*, un valor límite es de la forma:

$$\frac{\|\mathbf{E}\|}{\|\mathbf{A}\|} \le \rho n \epsilon_{mach}$$

donde, $\rho$ es llamado *factor de crecimiento*, que es la relación entre la entrada más grande de $\mathbf{U}$ y la entrada más grande de $\mathbf{A}$. Sin pivotar, $\rho$ puede ser arbitrariamente grande y, por lo tanto, la eliminación gaussiana sin pivotar es inestable, como ya se ha visto. Con pivotamiento parcial, el factor de crecimiento aún puede ser tan grande como $2^{n-1}$ (ya que en el peor de los casos el tamaño de las entradas puede duplicarse en cada etapa de eliminación), pero tal comportamiento es extremadamente raro. En la práctica, hay poco o ningún crecimiento en el tamaño de las entradas, por lo que

$$\frac{\|\mathbf{E}\|}{\|\mathbf{A}\|} \approx n \epsilon_{mach}$$

Esta relación significa que resolver un sistema lineal por eliminación gaussiana con pivoteo parcial seguido de sustitución hacia atrás casi siempre produce un residuo relativo muy pequeño, independientemente de cuán mal condicionado pueda estar el sistema. Por lo tanto, un residuo relativo pequeño no es necesariamente un buen indicador de que una solución calculada está cerca de la solución "verdadera" a menos que el sistema esté bien acondicionado.

El pivote completo produce un factor de crecimiento aún menor, tanto en la teoría como en la práctica, pero el margen adicional de estabilidad que proporciona generalmente no vale la pena el gasto adicional.

[Volver a la Tabla de Contenido](#TOC)

#### Ejemplo numérico

Usando aritmética de tres decimales, resolver el sistema

\begin{align*}
\left[\begin{array}{cc}
  0.641 & 0.242 \\
  0.321 & 0.121 \\
 \end{array}\right]
\begin{Bmatrix}
  x_{1}  \\
  x_{2}  \\
\end{Bmatrix}
= \begin{Bmatrix}
  0.883  \\
  0.442  \\
\end{Bmatrix}
\end{align*}

El proceso de eliminación con pivoteo parcial conduce a un sistema triangular de la forma

\begin{align*}
\left[\begin{array}{cc}
  0.641 & 0.242 \\
  0 & -0.000242 \\
 \end{array}\right]
\begin{Bmatrix}
  x_{1}  \\
  x_{2}  \\
\end{Bmatrix}
= \begin{Bmatrix}
  0.883  \\
  -0.000383  \\
\end{Bmatrix}
\end{align*}

y el proceso de sustitución regresiva da la respuesta

\begin{align*}
x = \begin{Bmatrix}
  0.782  \\
  1.58  \\
\end{Bmatrix}
\end{align*}

El residuo para esta solución es

\begin{align*}
r=b-Ax = \begin{Bmatrix}
  -0.000622  \\
  -0.000202  \\
\end{Bmatrix}
\end{align*}

que es lo suficientemente pequeño, como era lo esperado, usando solo aritmética de tres dígitos. Sin embargo, se ve fácilmente que la solución exacta para este sistema es

\begin{align*}
x = \begin{Bmatrix}
  1.00  \\
  1.00  \\
\end{Bmatrix}
\end{align*}

de modo que el error es casi tan grande como la solución. La causa de este fenómeno es que la matriz es casi singular (su número de condición es > 4000). La división que determina $x_2$ es entre dos cantidades que están en el orden del error de redondeo y, por lo tanto, el resultado es esencialmente arbitrario. Sin embargo, por diseño, cuando este valor arbitrario para $x_2$ se sustituye en la primera ecuación, se calcula un valor para $x_1$ de modo que se satisfaga la primera ecuación. Por lo tanto, obtenemos un pequeño residuo, pero una mala solución.

[Volver a la Tabla de Contenido](#TOC)

#### Estimación de la precisión

Además de ser un indicador confiable de casi singularidad, el número de condición también proporciona una estimación cuantitativa del error en la solución calculada para un sistema lineal. Sea $\mathbf{x}$ la solución del sistema lineal no singular $\mathbf{Ax=b}$, y sea $\mathbf{\hat{x}}$ la solución del sistema $\mathbf{A\hat{x}}=\mathbf{b}+\Delta\mathbf{b}$ con un lado derecho alterado. Si definimos $\Delta \mathbf{x}=\mathbf{\hat{x}}-\mathbf{x}$, entonces tenemos

$$\mathbf{b}+\Delta\mathbf{b}=\mathbf{A\hat{x}}=\mathbf{A}(\mathbf{x}+\Delta\mathbf{x})=\mathbf{Ax}+\mathbf{A}\Delta\mathbf{x}$$

Como $\mathbf{Ax=b}$, debemos tener $\mathbf{A}\Delta\mathbf{x}=\Delta\mathbf{b}$, y por lo tanto $\Delta\mathbf{x}=\mathbf{A}^{-1}\Delta\mathbf{b}$, entonces

$$\mathbf{b}=\mathbf{Ax} \Rightarrow \|\mathbf{b}\| \le \|\mathbf{A}\| \cdot \|\mathbf{x}\|$$

y

$$\Delta \mathbf{x}=\mathbf{A}^{-1}\Delta\mathbf{b} \Rightarrow \|\Delta \mathbf{x}\| \le \|\mathbf{A}^{-1}\| \cdot \|\Delta \mathbf{b}\|$$

usando la definición del número de condición de una matriz $\mathbf{A}$, se llega a la estimación

$$\frac{\|\Delta \mathbf{x}\|}{\|\mathbf{x}\|} \le cond(\mathbf{A})\frac{\|\Delta\mathbf{b}\|}{\|\mathbf{b}\|}$$

Por lo tanto, el número de condición de la matriz determina el posible cambio relativo en la solución debido a un cambio relativo dado en el vector del lado derecho, independientemente del algoritmo utilizado para calcular la solución. Un resultado similar es válido para cambios relativos en las entradas de la matriz $\mathbf{A}$. Si $\mathbf{Ax=b}$ y

$$(\mathbf{A}+\mathbf{E})\mathbf{\hat{x}}=\mathbf{b}$$

entonces

$$\mathbf{x}-\mathbf{\hat{x}}=\mathbf{A}^{-1}(\mathbf{b}-\mathbf{A}\mathbf{\hat{x}})=\mathbf{A}^{-1}\mathbf{E}\mathbf{\hat{x}}$$

así que

$$\|\Delta \mathbf{x}\| \le \|\mathbf{A}^{-1}\| \cdot \|\mathbf{E}\| \cdot \|\mathbf{\hat{x}}\|$$

que conduce al estimado

$$\frac{\|\Delta \mathbf{x}\|}{\|\mathbf{\hat{x}}\|} \le cond(\mathbf{A})\frac{\|\mathbf{E}\|}{\|\mathbf{A}\|}$$

[Volver a la Tabla de Contenido](#TOC)

#### Interpretación geométrica

Una interpretación geométrica en dos dimensiones de estos resultados de sensibilidad es que si las dos líneas rectas definidas por las dos ecuaciones son casi paralelas, entonces su punto de intersección no se define claramente si las líneas son un poco borrosas debido a errores de redondeo u otros fuentes de error. Si, por otro lado, las líneas están lejos de ser paralelas, digamos casi perpendiculares, entonces su intersección está relativamente definida. Estos dos casos se ilustran en la siguiente figura, donde las líneas punteadas indican la región de incertidumbre para cada línea continua, de modo que el punto de intersección en cada caso podría estar en cualquier lugar dentro del paralelogramo sombreado. Por lo tanto, un gran número de condiciones se asocia con una gran incertidumbre en la solución.

 Fuente: Heath, Michael. Scientific Computing. An introductory survey

[Volver a la Tabla de Contenido](#TOC)

#### Conclusión

En resumen, si los datos de entrada son exactos a la precisión de la máquina, entonces una estimación razonable del error relativo en la solución calculada para un sistema lineal viene dada por

$$\frac{\|\mathbf{\hat{x}}-\mathbf{x}\|}{\|\mathbf{x}\|}\approx cond(\mathbf{A})\epsilon_{mach}$$

Una forma sencilla de interpretar estos resultados es que la solución calculada pierde aproximadamente $log_{10} (cond(\mathbf{A}))$ dígitos decimales de precisión en relación con la precisión de la entrada. En el ejemplo visto, con un número de condición mayor que $10^3$, perdimos toda la precisión de tres dígitos disponible y obtuvimos una solución arbitraria.

El análisis anterior estima el error relativo en los componentes más grandes del vector solución. El error relativo en los componentes más pequeños puede ser mucho mayor, porque una norma vectorial está dominada por los componentes más grandes de un vector. Se pueden obtener límites de error por componentes, pero son algo más complicados de calcular. Los límites por componentes son de particular interés cuando el sistema está mal escalado.

El número de condición de una matriz se ve afectado por la escala de la matriz. Un número de condición elevado puede deberse simplemente a un escalado deficiente, así como a una singularidad cercana. Cambiar la escala de la matriz puede ayudar a lo primero, pero no a lo segundo.

[Volver a la Tabla de Contenido](#TOC)

#### Ejemplo numérico - Matriz de Hilbert

Se desea evaluar el condicionamiento de una matriz de [$Hilbert$](https://en.wikipedia.org/wiki/Hilbert_matrix). Emplearemos los métodos que trae el lenguaje de programación `python` para realizar la mayoría de los cálculos.

Lo primero es cargar las bibliotecas numéricas y científicas

```python
from scipy.linalg import hilbert, norm
import numpy as np
```

Seguidamente montamos una matriz de $Hilbert$ de dimensión $n$

```python
n = 3
H = hilbert(n)
print(H)
```

    [[1.         0.5        0.33333333]
     [0.5        0.33333333 0.25      ]
     [0.33333333 0.25       0.2       ]]

Normalizando la matriz $H$, de tal forma que el mayor elemento en cada fila sea de valor unitario

```python
H = np.array([H[i,:]/H[i,0] for i in range(n)])
print(H)
```

    [[1.         0.5        0.33333333]
     [1.         0.66666667 0.5       ]
     [1.         0.75       0.6       ]]

Empleamos una de la normas vistas, en este caso usaremos la norma $L_{\infty}$

```python
Hinf = norm(H, np.inf)
print(Hinf)
```

    2.35

Ahora determinamos la inversa de dicha matriz y calculamos su respectiva norma

```python
Hinv = np.linalg.inv(H)
print(Hinv)
Hinv_inf = norm(Hinv, np.inf)
print(Hinv_inf)
```

    [[  9. -18.  10.]
     [-36.  96. -60.]
     [ 30. -90.  60.]]
    191.99999999999983

Por último, calculamos el [número de condición](#NCOND):

```python
ncondH = Hinf * Hinv_inf
print(ncondH)
```

    451.1999999999996

Qué análisis hace acerca de este resultado?

[Volver a la Tabla de Contenido](#TOC)

### Tipos especiales de sistemas lineales

Hasta el momento solo hemos tratado un tipo de matriz llamada *llena* (*dense matrix*), es decir, que la mayoría de sus elementos son diferentes de cero ($a_{ij}\neq 0; i, j = 1, 2, 3, \ldots, n$). Un ahorro considerable en recurso computacional (tiempo, almacenamiento, etc) se puede obtener si se tiene en cuenta el tipo de matriz de coeficientes resultante. Algunos ejemplos de tipos especiales son:

[Volver a la Tabla de Contenido](#TOC)

#### Simétrica

Una matriz se dice que es [simétrica](https://en.wikipedia.org/wiki/Symmetric_matrix), respecto a su diagonal principal, si los elementos $a_{i,j}=a_{j,i} \text{ para todo } i,j = 1,2,3,\ldots, n$, entonces se cumple que $\mathbf{A}=\mathbf{A}^T$, es decir, la matriz y su transpuesta son la misma.

\begin{bmatrix}
a_{11} & a_{12} & a_{13} & \ldots & a_{1n}\\
a_{12} & a_{22} & a_{23} & \ldots & a_{2n}\\
a_{13} & a_{23} & a_{33} & \ldots & a_{3n}\\
\vdots & \vdots & \vdots & \ddots & \vdots\\
a_{1n} & a_{2n} & a_{3n} & \ldots & a_{nn}\\
\end{bmatrix}

En este caso, solo sería necesario almacenar una de las dos triangulares (superior o inferior), reduciendo casi a la mitad el tamaño del almacenamiento.

[Volver a la Tabla de Contenido](#TOC)

#### Dispersa

Una matriz dispersa ([sparse](https://en.wikipedia.org/wiki/Sparse_matrix) en inglés), es una matriz en la que la mayoría de sus elementos son cero. De forma contraria, una matriz en la que la mayoría de sus elementos son diferentes de cero se denomina *densa*.

 Fuente: Wikipedia

En este tipo de matrices es importante emplear algoritmos y estructuras de datos que permitan tomar ventaja de la estructura dispersa de la matriz, esto para optimizar almacenamiento en memoria y manipulación al realizar operaciones sin necesidad de considerar la gran cantidad de elementos cero, que no aportan información al problema.

La cantidad de memoria requerida para almacenar una matriz es proporcional a su tamaño ($n\times\ n$, en el caso de matrices cuadradas). Es por esto que, en el caso de una matriz dispersa, se pueden realizar reducciones sustanciales de los requisitos de memoria almacenando solo las entradas distintas de cero. Dependiendo del número y la distribución de las entradas distintas de cero, se pueden usar diferentes estructuras de datos y producir grandes ahorros de memoria en comparación con el enfoque básico. La compensación es que acceder a los elementos individuales se vuelve más complejo y se necesitan estructuras adicionales para poder recuperar la matriz original sin ambigüedades.

Los formatos se pueden dividir en dos grupos:

- Aquellos que soportan modificaciones eficientes, como DOK (Diccionario de claves), LIL (Lista de listas) o COO (Lista de coordenadas). Estos se utilizan normalmente para construir las matrices.

- Aquellos que admiten operaciones matriciales y de acceso eficientes, como CSR (Compressed Sparse Row) o CSC (Compressed Sparse Column).

A continuación se presentan algunas referencias bibliográficas donde podrá profundizar en este tipo de estructuras de almacenamiento:

- En la página de la [netlib.org](https://www.netlib.org/) encuentra el libro en formato virtual de *[Jack Dongarra](http://www.netlib.org/utk/people/JackDongarra/)* - [Templates for Solution of Algebraic Eigenvalues Problems: A practical Guide](http://www.netlib.org/utk/people/JackDongarra/etemplates/book.html) y un capítulo dedicado a [algoritmos de almacenamiento para matrices dispersas](http://www.netlib.org/utk/people/JackDongarra/etemplates/node372.html).

- También podrá encontrar información relevante acerca de estos métodos en el libro [Numerical Recipes - The Art of Scientific Computing](http://numerical.recipes/), editado por la Universidad de Cambridge.

- La biblioteca matemática [Scipy.org](https://docs.scipy.org/doc/scipy/reference/sparse.html) cuenta con un paquete de funciones para tratar este tipo de matrices.

- En la página [machinelearningmastery.com](https://machinelearningmastery.com/sparse-matrices-for-machine-learning/) podrá encontrar una breve introducción a las matrices dispersas aplicada a ML.

- En la página [SuiteSparse Matrix Collection](https://sparse.tamu.edu/) encontrará un conjunto de matrices dispersas recopilados de una amplia gama de aplicaciones y que podrá descargar y usar para realizar sus propias evaluaciones.

[Volver a la Tabla de Contenido](#TOC)

#### Definida positiva

Una matriz [definida positiva](https://en.wikipedia.org/wiki/Definite_symmetric_matrix) es una matriz para la que se cumple que el producto $\mathbf{x}^T\mathbf{Ax}>0$ para todo vector $\mathbf{x} \neq \mathbf{0}$. Este tipo de matrices permite tener una factorización $A=\mathbf{LU}=\mathbf{LL}^T$, también es llamada como *[Factorización de cholesky](https://en.wikipedia.org/wiki/Cholesky_decomposition)*. El proceso de eliminación para la $k$-ésima fila es:

- elementos diferentes a la diagonal principal:

$$l_{ki}=\frac{a_{ki}-\sum \limits_{j=1}^{i-1}l_{ij}l_{kj}}{l_{ii}}, \text{ para } i = 1,2, \ldots, k-1$$

- elemento de la diagonal principal:
$$l_{kk}=\sqrt{a_{kk}-\sum \limits_{j=1}^{k-1}l_{kj}^2}$$

[Volver a la Tabla de Contenido](#TOC)

##### Ejemplo: Factorización de Cholesky

Dada la siguiente matriz

\begin{bmatrix}
 6 &  15 &  55 \\
15 &  55 & 225 \\
55 & 225 & 979 \\
\end{bmatrix}

Encontrar su descomposición $\mathbf{LL}^T$ (factorización de Cholesky)

- para $k=1$: (primera fila)

$$l_{11}=\sqrt{a_{11}}=\sqrt{6}=2.4495$$

- para $k=2$
$$l_{21}=\frac{a_{21}}{l_{11}}=\frac{15}{2.4495}=6.1237$$

$$l_{22}=\sqrt{a_{22}-l_{21}^2}=\sqrt{55-(6.1237)^2}=4.1833$$

- para $k=3$

$$l_{31}=\frac{a_{31}}{l_{11}}=\frac{55}{2.4495}=22.454$$

$$l_{32}=\frac{a_{32}-l_{21}l{31}}{l_{22}}=\frac{225-6.1237(22.454)}{4.1833}=20.916$$

$$l_{33}=\sqrt{a_{33}-l_{31}^2-l_{32}^2}=\sqrt{979-(22.454)^2-(20.916)^2}=6.1106$$

con esto, la descomposición de Chlesky queda:

\begin{align*}L=
\left[\begin{array}{cccc}
 2.4495 &   &   \\
6.1237 &  4.1833 &  \\
22.454 & 20.916 & 6.1106 \\
  \end{array}\right]
\end{align*}

[Volver a la Tabla de Contenido](#TOC)

##### Implementación computacional algoritmo de cholesky

```python
# Chapra

def cholesky(A):
    n = A.shape[0]
    for k in range(n):
        print("k:", k)
        for i in range(k-1):
            print("i: ", i)
            suma = 0
            print ("suma: ", suma)
            for j in range(i-1):
                print("k:", k)
                print("i: ", i)
                print("j: ", j)
                suma += A[i,j] * A[k,j]
            A[k,i] = (A[k,i] - suma) / A[i,i]
        suma = 0
        for j in range(k-1):
            suma += A[k,j]**2
        A[k,k] = np.sqrt(A[k,k] - suma)
    return A
```

```python
import numpy as np

A = np.array([[ 6, 15, 55],
              [15, 55, 225],
              [55, 225, 979]])
print(A)
```

    [[  6  15  55]
     [ 15  55 225]
     [ 55 225 979]]

```python
L = cholesky(A)
print(L)

```

    k: 0
    k: 1
    k: 2
    i:  0
    suma:  0
    [[  2  15  55]
     [ 15   7 225]
     [ 27 225  15]]

```python
    for k in range(0,n-1):
        for i in range(k+1, n):
            m = U[i][k]/U[k][k]
            L[i,k] = m
            for j in range(k, n):
                U[i][j] = U[i][j] - m * U[k][j]
    return (L, U)
```

```python
# Heath

def choleskyH(A):
    n = A.shape[0]
    print("n: ", n)
    for j in range(0,n):
        print("columna j: ", j)
        for k in range(0,j-1):
            print("columnas anteriores a j: ", k)
            for i in range(j, n):
                print("resta multiplo col k de col j: ", i)
                A[i,j] = A[i,j] - A[i,k] * A[j,k]
        A[j,j] = np.sqrt(A[j,j])
        for k in range(j+1, n):
            A[k,j] = A[k,j] / A[j,j]
    return A
```

[Volver a la Tabla de Contenido](#TOC)

#### Matriz de banda

Se defina una [matriz de banda](https://en.wikipedia.org/wiki/Band_matrix) es una matriz dispersa cuyos elementos en las posiciones $a_{ij}=0$, para todo $|i-j|>\beta$, donde $\beta$ es llamada el *ancho de banda* de la matriz $\mathbf{A}$.

 Fuente: Chapra & Canale, 5a ed.

casos especiales de estas matrices serían:

- $\beta=0$: matriz diagonal

- $\beta=1$: matriz tridiagonal, para su resolución es empleado el [algoritmo de Thomas](https://en.wikipedia.org/wiki/Tridiagonal_matrix_algorithm).

[Volver a la Tabla de Contenido](#TOC)

## Métodos Iterativos

### Introducción

A diferencia de los métodos directos, los [métodos iterativos](https://en.wikipedia.org/wiki/Iterative_method) intentan determinar una solución mediante aproximaciones sucesivas hasta alcanzar una tolerancia determinada.

Sea un sistema de $n$ ecuaciones lineales con $n$ incógnitas dado por

$$a_{1,1}x_1 + a_{1,2}x_2 + a_{1,3}x_3 +\ldots +  a_{1,j}x_j + \ldots + a_{1,n-1}x_{n-1} + a_{1,n}x_n = b_1$$

$$a_{2,1}x_1 + a_{2,2}x_2 + a_{2,3}x_3 +\ldots +  a_{2,j}x_j + \ldots + a_{2,n-1}x_{n-1} + a_{2,n}x_n  = b_2$$

$$a_{3,1}x_1 + a_{3,2}x_2 + a_{3,3}x_3 +\ldots +  a_{3,j}x_j + \ldots + a_{3,n-1}x_{n-1} + a_{3,n}x_n  = b_3 $$

$$\vdots$$

$$a_{i,1}x_1 + a_{i,2}x_2 + a_{i,3}x_3 +\ldots +  a_{i,j}x_j + \ldots + a_{i,n-1}x_{n-1} + a_{i,n}x_n  = b_i$$

$$\vdots$$

$$a_{n,1}x_1 + a_{n,2}x_2 + a_{n,3}x_3 +\ldots +  a_{n,j}x_j + \ldots + a_{n,n-1}x_{n-1} + a_{n,n}x_n  = b_n$$

despejando $x_1$ de la primera ecuación, $x_2$ de la segunda, y así sucesivamente, hasta despejar la variable $x_n$ en la última ecuación, pero presentada de dos formas diferentes:

[Volver a la Tabla de Contenido](#TOC)

### Método de *Jacobi*

El método de [*Jacobi*](https://en.wikipedia.org/wiki/Jacobi_method) es un método iterativo para resolver sistemas de ecuaciones lineales en los que la matriz $\mathbf{A}$ es [estrictamente diagonalmente dominate](https://en.wikipedia.org/wiki/Diagonally_dominant_matrix). En cada ecuación se despeja la variable $x_i$ que corresponde a la $i$-ésima ecuación, de la siguiente forma:

$$x_1 = \frac{b_1 - (a_{1,2}x_2 + a_{1,3}x_3 +\ldots +  a_{1,j}x_j + \ldots + a_{1,n-1}x_{n-1} + a_{1,n}x_n)}{a_{11}}$$

$$x_2 = \frac{b_2 - (a_{2,1}x_1 + a_{2,3}x_3 +\ldots +  a_{2,j}x_j + \ldots + a_{2,n-1}x_{n-1} + a_{2,n}x_n)}{a_{22}}$$

$$x_3 = \frac{b_3 - (a_{3,1}x_1 + a_{3,2}x_2 +\ldots +  a_{3,j}x_j + \ldots + a_{3,n-1}x_{n-1} + a_{3,n}x_n)}{a_{33}}$$

$$\vdots$$

$$x_i = \frac{b_i - (a_{i,1}x_1 + a_{i,2}x_2 +\ldots + a_{i,n-1}x_{n-1} + a_{i,n}x_n)}{a_{ii}}$$

$$\vdots$$

$$x_n = \frac{b_n - (a_{n,1}x_1 + a_{n,2}x_2 +\ldots + a_{n,j}x_j + \ldots + a_{n,n-1}x_{n-1} + a_{n,n}x_n)}{a_{nn}}$$

Genaralizando, el anterior despeje nos conduce al esquema:

$$x_i^{(k)}=\frac{1}{a_{ii}} \left(b_i-\sum \limits_{\substack{j=1 \\ j\ne i}}^n a_{i,j}x_j^{(k-1)} \right) \text{, con } i=1,2,3,..., n$$

donde el superíndice $k$ indica la iteración.

En el método de *Jacobi*, para encontrar el valor de cada $x_i^{k}$ se usan los valores de $x$ calculados en la iteración anterior, $k-1$.

[Volver a la Tabla de Contenido](#TOC)

#### Algoritmo del método de Jacobi

- ***Pseudocódigo***

dados un vector inicial $x^{(0)}$ y un número máximo de iteraciones, $kmax$

$k=1$

mientras $\|x\|>tol$  o $k<kmax$ haga:

     desde $i=1$ hasta $n$ haga:

         $suma = 0$

         desde $j=1$ hasta $n$ haga:

             si $j \neq i$ entonces:

                 $suma = suma + a_{i,j}x_j^{(k)}$

             fin si

         fin desde

         $x_i^{(k+1)} = \frac{1}{a_{i,i}}(b_i - suma)$

     fin desde

     $k=k+1$

fin mientras

```python
from scipy.linalg import norm
import numpy as np
```

```python
def jacobi(a, b, tol, kmax):

    n = a.shape[0]
    x = np.zeros(n)
    k = 1

    while k < kmax:
        for i in range(n):
            suma = 0
            for j in range(n):
                if j != i:
                    suma += a[i,j]*x[j]
            x[i] = (b[i] - suma) / a[i,i]
        k += 1
    print("Número de iteraciones: ", k)
    return x
```

```python
x = jacobi(A, b, 0.000001, 500)
print(x)
```

    Número de iteraciones:  500
    [ 0.99999759 -2.9999948  -1.99999249  1.00000238]

$\color{red}{\textbf{Actividad para ser realizada por el estudiante:}}$ Implementar la parte de código correspondiente a la convergencia del método.

### Método de Gauss - Seidel

Otra forma de presentar el despeje descrito anteriormente es escribir por separado el bloque de los elementos a la izquierda y a la derecha del elemento de la diagonal principal. Esto conduce al esquema iterativo llamado [*Gauss-Seidel*](https://en.wikipedia.org/wiki/Gauss%E2%80%93Seidel_method):

$$x_1 = \frac{b_1}{a_{1,1}}-\frac{1}{a_{1,1}}\left[a_{1,2}x_2 + a_{1,3}x_3 +\ldots +  a_{1,j}x_j + \ldots + a_{1,n-1}x_{n-1} + a_{1,n}x_n \right]$$

$$x_2 = -\frac{1}{a_{2,2}}\left[a_{2,1}x_1 \right]+\frac{b_2}{a_{2,2}}-\frac{1}{a_{2,2}}\left[a_{2,3}x_3 +\ldots +  a_{2,j}x_j + \ldots + a_{2,n-1}x_{n-1} + a_{2,n}x_n \right]$$

$$x_3 = -\frac{1}{a_{3,3}}\left[a_{3,1}x_1 + a_{3,2}x_2 \right]+\frac{b_3}{a_{3,3}}-\frac{1}{a_{3,3}}\left[\ldots + a_{3,j}x_j + \ldots + a_{3,n-1}x_{n-1} + a_{3,n}x_n \right]$$

$$\vdots$$

$$x_i = -\frac{1}{a_{i,i}}\left[a_{i,1}x_1 + a_{i,2}x_2 + \ldots \right]+\frac{b_i}{a_{i,i}}-\frac{1}{a_{i,i}}\left[\ldots + a_{i,n-1}x_{n-1} + a_{i,n}x_n \right]$$

$$\vdots$$

$$x_n = -\frac{1}{a_{n,n}}\left[a_{n,1}x_1 + a_{n,2}x_2 + \ldots + a_{i,n-1}x_{n-1}\right]+\frac{b_n}{a_{n,n}}$$

Genaralizando, el anterior despeje nos conduce al siguiente esquema:

$$x_i^{(k)}=-\frac{1}{a_{ii}} \left[\sum \limits_{j=1}^{i-1} a_{i,j}x_j^{(k)} \right]+\frac{b_i}{a_{i,i}}-\frac{1}{a_{ii}} \left[\sum \limits_{j=i+1}^{n} a_{i,j}x_j^{(k-1)} \right] \text{, con } i=1,2,3,..., n$$

En el método de *Gauss-Seidel* se usan los valores ya calculados en la iteración actual. Esto, en principio, representa una mejora la método de *Jacobi*.

El método de *Gauss-Seidel* no requiere que la matriz de coeficientes, $\mathbf{A}$, sea estrictamente diagonal dominante para convergir.

[Volver a la Tabla de Contenido](#TOC)

### Forma matricial de los métodos iterativos

la matriz de coeficientes $\mathbf{A}$ se puede expresar como:

$$\mathbf{A=D-L-U}$$

donde,

- $\mathbf{D}$: es una matriz que contiene únicamente los elementos de la diagonal principal $\mathbf{A}$

- $\mathbf{L}$: contiene los inversos aditivos de los elementos que están por debajo de la diagonal principal de $\mathbf{A}$, y los demás elementos cero, $0$.

- $\mathbf{U}$: contiene los inversos aditivos de los elementos que están por encima de la diagonal principal de $\mathbf{A}$, y los demás elementos cero, $0$.

Para una matriz de $4 \times 4$, por ejemplo:

\begin{align*}D=
\left[\begin{array}{cccc}
  a_{1,1} & 0       & 0       & 0\\
  0       & a_{2,2} & 0       & 0\\
  0       & 0       & a_{3,3} & 0\\
  0       & 0       & 0       & a_{4,4} \\
  \end{array}\right]
\end{align*}

\begin{align*}L=
\left[\begin{array}{cccc}
  0        & 0        & 0       & 0\\
  -a_{2,1} & 0        & 0       & 0\\
  -a_{3,1} & -a_{3,2} & 0       & 0\\
  -a_{4,1} & -a_{4,2} & -a_{4,3}& 0\\
  \end{array}\right]
\end{align*}

\begin{align*}U=
\left[\begin{array}{cccc}
  0 & -a_{1,2}& -a_{1,3} & -a_{1,4}\\
  0 & 0       & -a_{2,3} & -a_{2,4}\\
  0 & 0       & 0        & -a_{3,4}\\
  0 & 0       & 0       & 0\\
  \end{array}\right]
\end{align*}

Se debe cumplir que todos los elementos en diagonal principal de $\mathbf{A}$ deben ser diferentes de 0. Con esta condición, $\mathbf{D}$ es no  singular y por lo tanto $\mathbf{D}^{−1}$ existe. El sistema de ecuaciones $\mathbf{Ax=b}$ puede transformarse de la siguiente manera:

Ambas expresiones presentan la forma $\mathbf{x=Tx+C}$. Se puede observar que esta expresión asemeja a la iteración de punto fijo, con:

$$\mathbf{x}^{(0)} \hspace{3.5cm} \text{aproximación inicial}$$
$$\mathbf{x}^{(k)}=\mathbf{Tx}^{(k-1)}+\mathbf{C} \hspace{4.5cm} \text{ }$$

donde,

- $\mathbf{T}$: Matriz de iteración

- $\mathbf{C}$: vector constante

- $\mathbf{x}^{(k)}$: $k$-ésima aproximación del vector solución $\mathbf{x}$

[Volver a la Tabla de Contenido](#TOC)

### Convergencia de los métodos iterativos

La convergencia de los métodos iterativos dependen del tipo de matriz de coeficientes. A continuación se presentarán algunos teoremos que se tienen qué cumplir para garantizar la convergencia:

- ***Teorema:*** Para cualquier $𝒙^{(0)} \in \mathbb{R}$, la sucesión $\left \{ \mathbf{x}^{(𝑘)} \right \}_{𝑘=0}^{\infty}$ generada por la aplicación de la ecuación de iteración $𝒙^{(𝑘)}=\mathbf{tx}+\mathbf{c} \forall k \ge 1$, converge a la solución única de $𝒙=\mathbf{tx}+\mathbf{c}$ si y solo si $\rho(\mathbf{T})<1$.

- ***Teorema:***  Si $\mathbf{A}$ es [estrictamente Diagonalmente Dominante](https://en.wikipedia.org/wiki/Diagonally_dominant_matrix), entonces tanto el método iterativo de Jacobi como el de Gauss – Seidel, generan sucesiones $\left \{ \mathbf{x}^{(𝑘)} \right \}_{𝑘=0}^{\infty}$ que convergen a la única solución del sistema $\mathbf{Ax=b}$ para cualquier aproximación inicial $\mathbf{x}^{(0)}$.

- ***Teorema:***  Si $\|\mathbf{T}\|<1$ para alguna norma matricial y $\mathbf{C}$ es un vector cualquiera, entonces para cualquier $\mathbf{x}^{(0)}$ la sucesión $\left \{ \mathbf{x}^{(𝑘)} \right \}_{𝑘=0}^{\infty}$ generada por $\mathbf{x}^{(𝑘)}=\mathbf{tx}+\mathbf{C}$ converge a un $\mathbf{x}_v \in \mathbb{R}^n$, que es la solución única de la ecuación $\mathbf{x=Tx+c}$.

Además se cumplen los siguientes estimadores (cotas) para el error de la aproximación actual con respecto a la solución del sistema:

$$\|\mathbf{x}_v-\mathbf{x}^{(k)}\| \leq \|\mathbf{T}\|^{(k)} \|\mathbf{x}_v-\mathbf{x}^{(0)}\| \hspace{1.5cm} \|\mathbf{x}_v-\mathbf{x}^{(k)}\| \leq \frac{\|\mathbf{T}\|^{(k)} \|}{1-\|\mathbf{T}\| \|} \mathbf{x}^{(1)}-\mathbf{x}^{(0)}\|$$

### Método SOR

Una variación del método de *G-S* es el método de [sobre-relajación sucesiva (SOR)](https://en.wikipedia.org/wiki/Successive_over-relaxation). Después de que se calcula un nuevo valor de $\mathbf{x}$ por medio del esquema de *G–S*, ese valor se modifica por un promedio ponderado de los resultados de las iteraciones anterior y actual:

$$\mathbf{x}_i^{(nuevo)}=\lambda \mathbf{x}_i^{(nuevo)}+(1-\lambda)\mathbf{x}_i^{(anterior)}$$

donde $\lambda$ es un factor de ponderación, $0\leq \lambda \leq 2$

- si $\lambda =1$, se obtiene el método de *G-S*

- si $0 \leq \lambda < 1$, se tiene el promedio ponderado de los resultados actuales y previos, llamado subrelajación

- Si $1 < \lambda \leq 2$, ponderación extra sobre el valor actual. Suposición implícita de que el nuevo valor se mueve en la dirección correcta, pero con una velocidad demasiado lenta.

[Volver a la Tabla de Contenido](#TOC)

#### Algoritmo método SOR

- ***Pseudocódigo***

dados un vector inicial $x^{(0)}$, un número máximo de iteraciones, $kmax$, una tolerancia, tol, y un valor adecuado del parámetro $\lambda$

$k=1$

mientras $\|x\|>tol$  o $k<kmax$ haga:

     desde $i=1$ hasta $n$ haga:

         $suma = 0$

         desde $j=1$ hasta $n$ haga:

             si $j \neq i$ entonces:

                 $suma = suma + a_{i,j}x_j^{(k)}$

             fin si

         fin desde

         $x_i^{(k+1)} = (1-\lambda)x_i+\frac{\lambda}{a_{i,i}}(b_i - suma)$

     fin desde

     $k=k+1$

fin mientras

[Volver a la Tabla de Contenido](#TOC)