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


No hay comentarios:

Publicar un comentario