viernes, 23 de septiembre de 2016

Números de coma o punto flotante y sistemas líneales

En esta ocasión estudiaremos algunos aspectos generales de los números de punto flotante y algunas dificultades que se presentan cuando se realizan cálculos elementales en la resolución de sistemas lineales por eliminación Gaussiana y Gauss - Jordan. Esperamos que lo disfruten mucho.

Los números de coma o punto flotante son un conjunto finito de número racionales que se emplean para representar números reales empleando computadoras. Existen tipos diferentes de números de punto flotantes, todos ellos se caracterizan porque tienen un número finito de dígitos cuando se escriben en una base particular. La necesidad de estos números es precisamente porque las computadoras solo pueden representar los números reales con un conjunto finito de dígitos.

Definición. Un número racional $x$ es un número de punto flotante en base $b\in \mathbb{N}$, de precisión $p\in \mathbb{N}$, con rango de exponencial $N\in \mathbb{Z}$ si y sólo si existen enteros $d_{_i}$, para $i=1,\dots, b-1$ y $d_{_1}\neq 0$ tal que $x$ tiene la forma \begin{equation}\label{eq:01} x=\pm 0.d_{_1}\cdots d_{_p}\times b^{n},\hbox{ con } -N\leq n\leq - N. \end{equation} Se denota por $\mathbb{F}_{p, b, N}$ el conjunto de todos los números de punto flotante con precisión $p$, base $b$ y rango exponencial $N$.

Lo primero que se puede observar es que el conjunto $\mathbb{F}_{p, b, N}$ es un conjunto finito y que no hay una distribución homogénea de sus elementos. Por ejemplo si consideramos el conjunto de número flotantes de precisión $1$, base $10$ y rango exponencial $10$, como el lector podrá notar, es fácil listar los elementos positivos de este conjunto. En efecto sus elementos son, \[\{0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09\}=\{0.i\times 10^{-1}\}_{i=1}^{9},\] \[\{0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9\}=\{0.i\times 10^{0}\}_{i=1}^{9},\] \[\{1, 2, 3, 4, 5, 6, 7, 8, 9\}=\{0.i\times 10^{0}\}_{i=1}^{9}.\]

Como se puede observar los elementos de $\mathbb{F}_{1, 10, 1}$ no se encuentran homogéneamente distribuidos sobre el intervalo $[0,10]$. Esta distribución irregular afecta notablemente la posibilidad de hacer cálculos de adicción y multiplicación entre números pequeños y números grandes o entre solamente números grandes. Observe por ejemplo que cuando sumamos $0.01$ con $9$ obtenemos $9.01$, que no pertenece a $\mathbb{F}_{1, 10, 1}$, igualmente se puede verificar que el producto de $8$ por $9$ tampoco pertenece.


Figura 1. Distribución no homogénea de los elementos de $\mathbb{F}_{1, 10, 1}$.

En general los conjuntos de números flotantes $\mathbb{F}_{p, b, N}\subset\mathbb{R}$ no son cerrados bajo la suma o la multiplicación. Por lo tanto al tratar de representar números reales en algún conjunto $\mathbb{F}_{p, b, N}\subset\mathbb{R}$ habrá ciertos cálculos aritméticos que no serán permitidos. Una manera de realizar cálculos con números reales en $\mathbb{F}_{p, b, N}\subset\mathbb{R}$ es primero proyectar lo números reales en los números de punto flotante y que luego se realice el cálculo. Ya que el resultado podría no estar en el conjunto $\mathbb{F}_{_{p, b, N}}\subset\mathbb{R}$, uno debe proyectar de nuevo el resultado en $\mathbb{F}_{p, b, N}\subset\mathbb{R}$. La acción de proyectar un número real en el conjunto de números flotantes es llamada redondear un número real. Existe muchas forma de hacer esto. A continuación presentamos la forma más común de hacerlo.

Definición. Sea $X_{_N}=\max \mathbb{F}_{p, b, N}$, entonces la función de redondeo se define como una aplicación $fl:\mathbb{R}\cap [-X_{_N},X_{_N}]\to \mathbb{F}_{p, b, N}$ definida como: Dado un número real $x\in \mathbb{R}\cap [-X_{_N},X_{_N}]$, con $x=\pm 0.d_{_1}\cdots d_{_p}d_{_{p+1}}\cdots \times b^{n}$ y $-N\leq n\leq N$, se tiene que \begin{equation} fl(x)=\left\{\begin{array}{cl} \pm 0.d_{_1}\cdots d_{_p}\times b^n & \hbox{ si }d_{_{p+1}}<\frac{b}{2}, \\ \pm (0.d_{_1}\cdots d_{_p}+b^{-p})\times b^n & \hbox{ si }d_{_{p+1}}\geq \frac{b}{2}.\end{array}\right. \end{equation}

Por ejemplo si consideramos el conjunto de números flotantes $\mathbb{F}_{3,10,3}$, entonces algunas proyecciones de los números reales serían $fl(0.2103\times 10^{3})=0.210\times 10^3$, $fl(0.21037\times 10^{3})=0.210\times 10^3$, $fl(0.2105\times 10^{3})=0.211\times 10^3$ y $fl(0.2107\times 10^{3})=0.211\times 10^3$. Observe como la función $fl$ no es una función inyectiva, y por lo tanto, diferentes números reales pueden ser representados con el mismo número flotante.

Otra consecuencia que cabe mencionar, es que la aritmética de los número reales cambia notablemente. Es decir, si $x,y\in \mathbb{R}$ entonces la suma de reales sobre un conjunto $\mathbb{F}_{p, b, N}$ queda definida por \begin{equation} x+_{f}y=fl(fl(x)+fl(y)) \end{equation} y la multiplicación por \begin{equation} x\cdot_{f}y=fl(fl(x)\cdot fl(y)) \end{equation} Aquí las operaciones $+_{f}$ y $\cdot_{f}$ son la suma y la multiplicación en el conjunto de coma flotante $\mathbb{F}_{p, b, N}$. Ésta operaciones son diferentes de la suma ($+$) y la multiplicación ($\cdot$) usual de números reales. En efecto, se tiene la siguiente proposición.

Proposición. Sea $\mathbb{F}_{p, b, N}$ entonces siempre existen $x,y\in \mathbb{R}$ tales que \begin{equation} fl(fl(x)+fl(y))\neq fl(x+y),\hspace{0.5cm} fl(fl(x)\cdot fl(y))\neq fl(xy).\end{equation}

Estamos seguro que el lector puede encontrar algunos ejemplos sencillos que verifican la proposición anterior.

Como se ha visto las operaciones aritméticas usuales no son posible en general en los conjuntos $\mathbb{F}_{p, b, N}$, debido a que estos conjuntos no son cerrados bajo estas operaciones. Por lo que ha definido de una manera un poco artificial las operaciones $+_{f}$ y $\cdot_{f}$. A continuación veremos algunos efectos de estas operaciones cuando se trata de resolver sistemas de ecuaciones lineales en algún $\mathbb{F}_{p, b, N}$.

Considera el conjunto de números flotantes $\mathbb{F}_{3,10,3}$ para resolver el siguiente sistema de ecuaciones lineales, \[ \begin{array}{rcc} 5x_{_1}+x_{_2} &=& 6,\\ 9.34x_{_1}+1.57x_{_2} &=& 11. \end{array} \] Observe que al resolver este sistemas $\mathbb{R}$ sin las limitaciones de $\mathbb{F}_{3,10,3}$ encontramos que las soluciones son $x_{_1}=x_{_2}=1$. Veamos ahora que ocurre cuando empleamos $\mathbb{F}_{3,10,3}$ con las operaciones $+_{f}$ y $\cdot_{f}$ al realizar Gauss - Jordan sobre este sistema de ecuaciones. Inicialmente tenemos el sistema matricial, \[\left[\begin{array}{cc|c} 5 & 1 & 6\\ 9.43 & 1.57 & 11\end{array}\right]\] para cambiar la segunda fila podemos hacer la siguiente operación sobre la filas, empleado la suma y la multiplicación de redondeo en $\mathbb{F}_{3,10,3}$. \[\hat{a}_{_{2i}}=fl(a_{_{21}}-fl\left(fl(a_{_{1i}})\cdot fl\left(\frac{9.53}{5}\right)\right)\hbox{ con } i=1,2,3\] donde $\hat{a}_{_{2i}}$ son las entradas de la nueva fila $2$ y $a_{_{1i}}$ son las entradas de la fila $1$ en el sistema inicial. Al hacer estas operaciones se tiene que \[\left[\begin{array}{cc|c} 5 & 1 & 6\\ 9.43 & 1.57 & 11\end{array}\right]\rightarrow \left[\begin{array}{cc|c} 5 & 1 & 6\\ 0.02 & -0.32 & -0.3\end{array}\right].\] En este caso no es posible continuar con el método de Gauss - Jordan al menos que $\hat{a}_{_{21}}=0$. Pero esto no es posible. Si introducimos la modificación de que $\hat{a}_{_{21}}=0$, se tiene para nuestro ejemplo que \[\left[\begin{array}{cc|c} 5 & 1 & 6\\ 9.43 & 1.57 & 11\end{array}\right]\rightarrow \left[\begin{array}{cc|c} 5 & 1 & 6\\ 0 & -0.32 & -0.3\end{array}\right].\] Es importante notar que aquí no se ha redondeado el error, pues el valor $0.02$ pertenece a $\mathbb{F}_{3,10,3}$. Lo que se ha hecho es una modificación al sistema para poder continuar con el proceso de Gauss - Jordan. Si completamos el proceso bajo las operaciones $+_{f}$ y $\cdot_{f}$ de $\mathbb{F}_{3,10,3}$, se encuentra \[\left[\begin{array}{cc|c} 1 & 0 & 1.01\\ 0 & 1 & 0.938\end{array}\right]\rightarrow \begin{array}{l} x_{_1}=0.101\times 10,\\ x_{_2}=0.938.\end{array}\] Note que la solución bajo $\mathbb{F}_{3,10,3}$ difiere de la solución exacta $x_{_1}=x_{_2}=1$. El error se produce por los redondeos y por la modificación hecha para poder completar el procedimiento de Gauss - Jordan.

En general los errores por redondeo son muy importantes cuando se hace sumas entre números pequeños con números grandes o cuando se divide por números muy pequeños. Por ejemplo considere $x=0.100\times 10^4$ y $y=0.400\times 10$, estos números perteneces al conjunto $\mathbb{F}_{3,10,4}$, y observe que $fl(x)=x$ y $fl(y)=y$. Por lo tanto cuando se hace la suma se obtiene: \[fl(x+y)=fl(1000+4)=fl(0.1004\times 10^3)=1\times 10^3=x.\] Es decir, la información de $y$ se pierde completamente.

Hay tres estrategias conocidas como el pivoteo parcial, pivoteo parcial escalado y pivoteo completo que buscan evitar la división por números grandes, para así reducir un poco los errores por redondeo. Considere una matriz $A$ de tamaño $m\times n$ y veamos en que consisten estos dos métodos:

  • Pivoteo Parcial: En cada paso $k$ de la eliminación Gaussiana se elige en calidad de pivote a la entrada con índice $(k,p)$ tal que \begin{equation} |A_{_{kp}}|=\max_{p\leq i \leq m}|A_{_{ip}}|, \end{equation} es decir, la mayor entrada de la $p$ - ésima columna empezando con $(p,p)$ hasta $(m,p)$. Por ejemplo, supongamos que vamos a realizar el paso $p$ de la eliminación Gaussiana, entonces nuestra matriz tendrá una forma parecida a esto: \[\left[\begin{array}{cccccc|c} * & * & * & & * & & * \\ 0 & * & * & & * & & * \\ 0 & 0 & * & & * & & * \\ \vdots & \vdots & \vdots & & \vdots & & \vdots \\ 0 & 0 & 0 & & A_{_{pp}} & & * \\ \vdots & \vdots & \vdots & & \vdots & & \vdots \\ 0 & 0 & 0 & & A_{_{mp}} & & * \\ \end{array}\right]_{m\times n}\] Y suponga que nuestro máximo es $|A_{_{kp}}|=\max_{p\leq i \leq m}|A_{_{ip}}|$, luego la entrada $A_{kp}$ se usará como pivote. Esto significa que se aplicara el intercambio de la filas $R_{_p}\leftrightarrow R_{_k}$ y luego se aplican las operaciones elementales para eliminar las entradas desde $(p+1,p)$ hasta $(m,p)$.
  • Pivoteo parcial escalado: Suponga que estamos en el paso $p$. En cada renglón $i$, con $p\leq i \leq m$, se calcula el valor máximo absoluto en la parte principal de la matriz: \[s_{_i}=\max_{p\leq j\leq m} |A_{_{ij}}|.\] Suponga que $s_{_i}>0$ para todo $i\in \{k,\dots, m\}$. Si se elige el menor entero $q$ con \[\frac{|A_{_{qk}}|}{s_{_q}}=\max_{p\leq i\leq m}\frac{|A_{_{ip}}|}{s_{_i}}.\] En otras palabras, sea $q$ el menor de los índices $i$ en los cuales la expresión $\frac{|A_{_{ip}}|}{s_{_i}}$ alcanza el máximo. Si $q\neq p$, entonces se intercambian los renglones $p$ y $q$ y luego se eliminan las entradas por debajo de $(p,p)$.
  • Pivoteo completo: En el $k$ - ésimo paso de la eliminación Gaussina se buscan los índices $p,q\in \{k,\dots, m\}$ tales que \[|A_{_{rs}}|=\max_{\substack{p\leq i\leq m \\ p\leq j\leq n}}|A_{_{ij}}|.\] En otras palabras, se busca el máximo entre los números $|A_{_{ij}}|$ con $p\leq i \leq m$ y $p\leq j \leq m$. En este caso, antes de efectuar al paso $p$ de la eliminación Gaussiana, la matriz tendrá una forma como esta: \[\left[\begin{array}{ccccccc|c} * & * & * & & * & & * & *\\ 0 & * & * & & * & & * & * \\ 0 & 0 & * & & * & & * & *\\ \vdots & \vdots & \vdots & & \vdots & & \vdots & \vdots\\ 0 & 0 & 0 & & A_{_{pp}} & \cdots & A_{_{pn}} & * \\ \vdots & \vdots & \vdots & & \vdots & & \vdots & *\\ 0 & 0 & 0 & & A_{_{mp}} & \cdots & A_{_{mn}} & *\\ \end{array}\right]_{m\times n}\] Si $(r,s)\neq (p,p)$ entonces se intercambian los renglones y las columnas de tal manera que la entrada $A_{_{rs}}$ se pone en la posición $(p,p)$ y luego se aplican las operaciones elementales para anular las entradas por debajo de $(p,p)$.
Esperamos que esta entrada haya sido de su agrado, nos vemos en otra ocasión.

Referencias

0 comentarios: