Mostrando entradas con la etiqueta matriz. Mostrar todas las entradas
Mostrando entradas con la etiqueta matriz. Mostrar todas las entradas

miércoles, 3 de abril de 2013

Álgebra- Matriz de transformación de Householder

En muchas aplicaciones de geometría analítica y cálculo numérico, en especial en las secciones correspondientes a los métodos de factorización QR para hallar la solución de sistemas lineales numéricos, encontramos la definición de transformación de Householder y la matriz asociada a una transformación de Householder.


Existen comandos que nos ofrecen el resultante de una transformación de Householder sobre un vector ( householder() el cual me imagino que se podrá sobrecargar para operaciones matriciales).

Aquí ,sin ninguna pretensión, se define un pequeño pseudo código, muy sencillo y breve, para crear esta matriz usando un bucle if-then-else que excluya situaciones imposibles ( aquellas en los que los vectores a transformar no tengan la misma dimensión ) y la función eye(), que devuelve la matriz identidad de orden n y el comando definido en Scilab norm() que calcula la norma euclidea de un vector. Aplicando la definición de transformación de Householder( http://es.wikipedia.org/wiki/Transformaci%C3%B3n_de_Householder ) ya tenemos nuestra función.


El objetivo es obtener una visualización de la matriz de Householder y analizar sus coeficientes ( útil para la corrección de ejercicios, aplicación y descripción de métodos de factorización matricial QR, etc. ), mostrando las buenas capacidades algorítmicas y de cálculo que presenta Scilab. Para ello, como se ve en el siguiente bloque de código:




Función mathouse() que calcula, a partir de dos vectores, la matriz asociada a la transformación de Householder. Aquí se ha guardado en un archivo .sci con el fin de emplearse en otras ocasiones ( un trabajo para la materia del grado de Matemáticas Introducción al análisis numérico, matricial e interpolación ). Imagen capturada desde Scinotes y código elaborado por el autor.


se define una función de, cuyas variables son los vectores x ( a transformar) e y (vector en el que se transforma x). Ojo; aquí hay que introducir los vectores como matrices columnas:



x=[x_1; x_2; ... ;x_n]




y un pequeño código con  algunas pruebas para demostrar su funcionamiento.



Código de Scilab en las que se muestra algunos casos de ejecución de la función mathouse() que se definió. Código e imagen por el autor.

-1->x1=[3;2;1]
 x1  =


    3.

    2.
    1.


-1->y1=[4;0.5;9]

 y1  =


    4.  

    0.5
    9.  


-1->d1=mathouse(x1,y1)



    0.9702602    0.0446097  - 0.2379182

    0.0446097    0.9330855    0.3568773
  - 0.2379182    0.3568773  - 0.9033457


-2->x2=[1;3]

 x2  =


    1.

    3.


-2->y2=[1;9;01;192;0.9991;10D+14]

 y2  =


    1.        

    9.        
    1.        
    192.      
    0.9991    
    1.000D+15


-2->d2=mathouse(x2,y2)  



 Vectores con dimensión distinta  



 Imposible factorización Householder


Álgebra- Normas matriciales subordinadas con Scilab

En contextos matemáticos como el cálculo numérico o la introducción a la topología , aparece el concepto de norma matricial subordinada a una norma vectorial (véase [1], páginas 16-17 y [2], páginas 23-24 .Nuestro interés es usar Scilab para calcularlas, luego omitiremos definirlas) 

En esta entrada se presenta una imagen de Scinotes mostrando algunos comandos que están predefinidos en Scilab, cuya estructura es siempre la misma:

d_i=norm(a,'info')

los cuales representan las normas más comunes en los planes de estudio ;la norma subordinada 1, la norma subordinada "infinito", las cuales consiste en sumar los valores absolutos de los elementos de una matriz por columnas ( respectivamente por filas ) y elegir el máximo; la norma subordinada euclidiana ( o norma subordinada 2, que se trata de elegir el autovalor de la matriz producto de A y su transpuesta de mayor tamaño; ojo, en la definición original, hemos de hallar además su raíz cuadrada) y la norma de Frobenius (se halla la matriz producto de una matriz A y su transpuesta y su traza, aquí sí se halla la raíz cuadrada de la traza).




Captura de la pantalla de Scinotes que contiene en las lineas de código los comandos que ilustran las normas matriciales subordinadas a las que nos referimos en el párrafo anterior. Código e imagen por el autor.

Para ilustrar su funcionamiento, si aplicamos estas normas a la matriz a que aparece arriba definida, obtenemos en la consola los siguientes resultados:

Ejecucion de inicio:
  cargando entorno inicial

-->a=[1 2 3;4 5 6;7 8 9]
 a  =

    1.    2.    3.  
    4.    5.    6.  
    7.    8.    9.  

-->n=norm(a,1)
 n  =

    18.  

-->n1=norm(a,'inf')
 n1  =

    24.  

-->n2=norm(a,2)
 n2  =

    16.848103  

-->n3=norm(a,'frob')
 n3  =

    16.881943 

Nada más recordar que como el contenido de este blog, no se ha tratado en toda su totatlidad este tema. Si nos vamos al menú de ayuda de Scilab ( el botón en forma de círculo azul de la consola) encontramos más información.

Referencias

[1]: Introducción al cálculo numérico, Carlos Moreno Gónzales, ed. UNED (2011)
[2]: Numerical Mathematics, A.Quarteroni, R. Sacco y F. Saleri, ed. Springer (2000)