viernes, 5 de julio de 2013

Cálculo-Gráfica de una esfera irregular utilizando Maxima

Una familia muy interesantes de funciones son aquellas que se denominan esferas irregulares (véase [1], página 900) cuyo uso abarca desde la modelización e tumores o bien la representación de partículas de polen  Desde el punto de vista matemático, son un buen ejemplo de cómo hacer uso de las transformaciones de coordenadas dado un sistema a otro. En este caso de coordenadas cartesianas a esféricas. El siguiente código de Maxima:

/* Representación de una esfera irregular con Maxima*/
/* Tomando las expresiones de J. Stewart Cálculo: conceptos y contextos */
n:5$
m:6$
/*Definimos la superificie esférica usando las coordenadas esféricas*/
rho:1+0.2*sin(m*theta)*sin(n*phi)$
load(draw)$
/* Definimos el dominio y el tipo de coordenadas para su gráfica */
irr_sphere: spherical(rho,theta,0,2*%pi,phi,0,%pi)$
/* Dibujamos la superfice sin colorear*/
draw3d(surface_hide=true,
       color=blue,
       irr_sphere,
       nticks=400,
       title="Esfera irregular. m=6,n=5")$
/* Dibujamos la superficie con una paleta de tonos grises*/
draw3d(surface_hide=false,
       enhanced3d = [1+0.2*sin(m*theta)*sin(n*phi),theta,phi],
       nticks=400,irr_sphere,
       palette=gray,
       title="Esfera irregular. m=6,n=5")$

Código de Maxima a usar en esta entrada. Código por el autor.

Nuestro objetivo es representar una esfera irregular usando la expresión que aparece en la referencia a la obra de Stewart anterior, en la que nos hemos hecho uso del paquete draw y de la definición de una función a partir de su definición: explicita (explicit) implícita (implicit), en coordenadas polares (polar), cilíndricas (cylindrical) o esféricas (spherical), siendo una cómoda forma de trabajar, pudiéndonos centra en el estudio teórico y por lo tanto apasionante de las matemáticas, muy en especial del cálculo. 

Volviendo a lo que nos atañe, utilizando la expresión en coordenadas esféricas ( spherical(condiciones) ) definimos la expresión de la esfera y su dominio. Después, con el paquete draw3d la  podemos dibujar, usando el programa Gnuplot, para los casos en los que n=5 y m=6, que son las condiciones que aparecen en la obra (para ello se ha tenido en cuenta [2], páginas 16-34). después, hacemos uso de enhaced3d=expresion, para obtener una superficie coloreada en tonos grises. Ambos resultados se exponen a continuación.




Imágenes obtenidas tras ejecutar el código. Imagen y código por el autor.

Tener en cuenta que se ha modificado la pantalla gráfica para evitar el achatamiento de la figura. Podemos ver el resultado original si las graficamos directamente desde la interfaz WxMaxima, adjuntado a continuación.




Código ejecutado en WxMaxima y resultados. Imagen y código por el autor.

Referencias

[1] Stewart, James, Cálculo: conceptos y contextos, 1999.  Editorial Thompson.
[2]: Haager, Wilhem, Graphics with Maxima (Version 5.23 and above), 2011. HTL St. Pölten, ET Elektrotechnik 

viernes, 21 de junio de 2013

Scilab- Comando colormap(), mesh y meshgrid para gráficas de dos variables.

Un atractivo de Scilab es la posibilidad de hacer gráficos de funciones de dos variables y poder usar una paleta de colores predeterminadas, haciendo muy atractiva su salida por pantalla. Para ello se puede usar una simple combinación de las funciones meshgrid, que creea una matriz con los datos de dos variables previamente definidas, mesh, que realiza una gráfica de la función con Z=f(X,Y), con X e Y variables definidas por la función meshgrid, y con la función xset("colormap",mapa_elegido(n)), siendo n un número, correspondiéndose con el número de colores de la paleta, y mapa_elegido() una función de Scilab que permite usar una selección determinada de colores (asignándose estos en función de la posición de cada proporción de superficie dada por mesh()). Algunas de estos mapas son coppercolormap(), oceancolormap(), bonecolormap(), springcolormap(), etc. Estos pueden consultarse en el Navegador de ayuda. Se ha usado las referencias de [1] sobre este tema en las páginas 

// pruebacolormap().sce

// Prueba de gráficos con colormap()
// Definimos la función a usar f:R^2 -->R
// [sin(x.*y)] y el dominio de esta (x,y) 
x=-3:.1:3;
y=-3:.1:3;
//empleamos el comando
//meshgrid(x,y), para crear dos matrices con todos
//los valores necesarios para dibujarla 
[X,Y]=meshgrid(x,y);
// y dibujamos la función (sin colores)
Z=sin(X.*Y);
mesh(X,Y,Z);
// Empleamos xset("colormap",mapa_de_colores(n)) 
// y el comando surf para dibujar la gráfica de la función f con colores.
n=34 //numeros de colores a usar
// Usamos oceancolormap()
// y obtenemos la superficie de la función en tonos azules.
scf(1)
clf(1)
xset("colormap",oceancolormap(n))
surf(X,Y,Z)
// Usamos coppercolormap()
// y obtenemos la superficie en tonos marrones
scf(2)
xset("colormap",coppercolormap(n))
surf(X,Y,Z)

Código de Scilab descrito anteriormente. Código por el autor.


Así pues, si ejecutamos el programa anterior en Scilab, obtenemos las siguientes imágenes. 







Resultados del programa anterior. Códigos e imágenes por el autor.

Referencias

[1]: Venturin, Manolo. Plotting with Scilab, Openeering Totorials. Openeering.

R- Ejecutar un script redactado con Notepad++

La potencia de R lo hace un programa muy atractivo. Uno de sus inconvenientes, provocado por su implantación de tipo lenguaje interpretado o interpretación pura, que, como JavaScript o PHP, no requiere de un compilador para crear su ejecutable, sino que cada comando es evaluado, y si es correcto, ejecutado. Sino, lanza un mensaje de error y se interrumpe el programa
Esto resulta especialmente molesto en caso de tener un programa de tamaño elevado (por ejemplo, con más de 60 lineas de código. Una experiencia personal, bastante funesta, fue el redactar un trabajo de clase para la materia Estadística Básica en la que nos introducían al uso de R con 70 lineas de código R para resolver seis problemas relacionados con métodos estadísticos, cuya depuración se hizo instrucción a instrucción,volviendo a repetir cada comando en caso de error). Si bien es cierto que la memoria del programa permite repetir tantas veces una función o volver a editarla pulsando repetidamente la flecha “arriba” de teclado, en ocasiones se vuelve tedioso. Un forma agradable de trabajar es usar Notepad++. 

Este programa es en principio similar al Bloc de notas de Windows; es un generador de texto plano, pero permite la posibilidad de redactar un archivo con código fuente de un lenguaje de programación determinado, marcando las funciones especiales, las palabras reservadas, las cifras y valores numéricos y las sangrías. En [1] se puede obtener información sobre Notepad++ y su enlace para descargarlo.

Podemos redactar el programa con Notepad++. Una vez abierto, se selecciona en la opción de Lenguajes la etiqueta R. Redactamos un pequeño programa, que se basará en la definición de asociación de un valor a una variable, y posteriormente obtenerlo por pantalla. Vemos cómo aparecen señaladas en colores, si están bien redactadas, las palabras reservadas del lenguaje. Después lo modificaremos para obtener otro string con la función sub(cadena_original, cadena_nueva, string).



Programa a usar desde Notepad++. Código e imagen por el autor.

Una vez hecho, lo guardamos con extensión .r y lo ejecutamos en la GUI de R. Una vez abierto R, en la barra de herramientas, pinchamos en la pestaña Archivo y hacemos clic en Abrir script... (para los usuarios de habla hispana, File y Open script en las versiones originales, donde las etiquetas estaban en inglés) Se abre un cómodo buscador que nos permitirá localizar el código fuente recientemente hecho y al seleccionarlo, se mostrará este en el programa R desde su editor, cómodamente ejecutable.



El programa en el editor de R GUI. Imagen y código por el autor.

Así pues, si se sigue estos pasos con el ejemplo propuesto, un programa que saca por consola el mensaje Hola mundo desde R GUI! Lo modifica y saca este por pantalla (las funciones usadas y el tratamiento de los strings han sido elaborados a través de las conclusiones expuestas en [2]), obtenemos en la consola el siguiente resultado:

R version 3.0.0 (2013-04-03) -- "Masked Marvel"
Copyright (C) 2013 The R Foundation for Statistical Computing
Platform: x86_64-w64-mingw32/x64 (64-bit)

R es un software libre y viene sin GARANTIA ALGUNA.
Usted puede redistribuirlo bajo ciertas circunstancias.
Escriba 'license()' o 'licence()' para detalles de distribucion.

R es un proyecto colaborativo con muchos contribuyentes.
Escriba 'contributors()' para obtener más información y
'citation()' para saber cómo citar R o paquetes de R en publicaciones.

Escriba 'demo()' para demostraciones, 'help()' para el sistema on-line de ayuda,
o 'help.start()' para abrir el sistema de ayuda HTML con su navegador.
Escriba 'q()' para salir de R.

[Previously saved workspace restored]

> #--------------------------------------------------
> # Programa HolamundoR
> # Entrada (Teclado): Un string con la frase
> # "Holamundo desde R!"
> # Salida (Pantalla): el string y uno obtenido con 
> # sub(), que modifica el primero
> #--------------------------------------------------- 
> first <-"Hola mundo desde R GUI!"
> first
[1] "Hola mundo desde R GUI!"
> class(first)
[1] "character"
> second <-sub("R GUI","R con Notepad++",first)
> second
[1] "Hola mundo desde R con Notepad++!"

Aspecto de la consola tras las ejecución del programa usado (en azul las instrucciones). 


Referencias

[1]: Notepad++, disponible (con información) desde http://notepad-plus-plus.org/
[2]: R para Principiantes, Emmanuel Paradis. Traducción por Jorge A. Ahumada. Texto de difusión libre, extraído de http://cran.r-project.org/doc/contrib/rdebuts_es.pdf

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)

martes, 26 de marzo de 2013

Scilab-Openeering

El uso de Scilab transciende cada vez más desde el campo de la educación al mundo empresarial e industrial. En el sitio web encontramos numerosos ejemplos de cómo se emplea Scilab en diversas ramas de la ingeniería. Además, contiene muchísima información sobre el uso de Scilab para enfrentarnos a problemas usuales en el campo de acción de dicha ciencia (realización de gráficas, análisis numérico,  interpolación de datos, elaboración de GUI's empleando Scilab, etc) en forma de pdf, video, texto, presentación...todo ello distribuido bajo licencia libre. 

Algunos contenidos de esta página son bastante interesantes para dominar algunos aspectos de Scilab que, desde el punto de vista matemático, son muy útiles.


Aspecto de la página principal de la web Openeering. Imagen del autor.

Se puede consultar desde el siguiente enlace: