martes, 23 de abril de 2013

Maxima- Resolución de un sistema de ecuaciones algebraicas con los elementos de las paletas

Se puede resolver un sistema de ecuaciones algebraicas sin muchos problemas y obtener sus soluciones simbólicas usando un menú de wxMaxima denominado Resolver un sistema algebraico. Pinchando en la pestaña Álgebra de wxMaxima y seleccionando la opción Resolver sistema algebraico. Al hacerlo, aparece una ventana (de nombre Resolver sistema algebraico) que nos pide insertar el número de ecuaciones (que ha de rellenarse con un número entero; 2,3, 4, ...). Después otra ventana que nos solicita rellenar un número de campos igual al que introducimos anteriormente con las ecuaciones que componen nuestro sistema y una más en la que hemos de introducir las variables de nuestro sistema (que hemos de introducirlas una a una, separadas por comas). Al pulsar Aceptar, se genera el código de Maxima que permite su resolución, así como el valor, en forma de lista, de las soluciones del sistema.





Proceso gráfico que muestra cómo resolver un sistema algebraico usando los menús del comando Resolver sistema algebraico. Imágenes por el autor. 


Aquí se ha puesto en práctica para conseguir el mismo resultado expuesto en [1], página 29 y 30.Al finalizar el proceso, tenemos que se genera el siguiente fragmento de código, que es similar al que aparece en el texto. Las soluciones támbien coinciden con lo expuesto en [1].




Código de Maxima que se usa para resolver el sistema de ecuaciones algebraicas y las soluciones de este. Código tomado de [1] pero generado por algsys().

Referencias


[1]:Manual de uso de Maxima y wxMaxima en asignaturas de cálculo diferencial, José Antonio Vallejo Rodríguez. Facultad de Ciencias, Universidad Autónoma de San Luis Potosí (México). Texto de difusión libre.

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)