Author Archives: Tobal - Paginas 30

Aprendiendo Sobre Las Librerías Ginac

Hola, bueno aquí estoy para daros la vara una vez más, esta vez voy ha hablaros sobre unas librería matemáticas escritas en C++ que se llaman GiNaC. Las descubrí el otro día en los repositorios de Mandriva, me fui a su web, las vi, me bajé el tutorial en pdf, me interesaron bastante y aquí estoy escribiendo sobre ellas en el blog ;)

Bueno, estas librerías me gustaron por muchas razones, la principal es que ya llevan implementado en su última versión un parser, y vosotros diréis: “¿Y ezo qué es quillooo?” Pues bien, el parser es una especie de librerías que nos permiten crear nuestro propio lenguaje lexicográfico, en el caso de las Ginac el lenguaje creado con parser es el matemático. Os pongo un fácil ejemplo para que lo entendáis:

Suponed que yo hago un programa para calcular las raíces de una función. Lo mejor es que el programa pida al usuario que introduzca la expresión matemática de dicha función, por ejemplo supongamos que el usuario introduce la función cos(x-5)+5*x. Pues bien, resulta que ni C ni C++ saben interpretar eso como una función, sólo podemos decirle que es una cadena (string o CString), pero el paso de que interprete dicha expresión matemática como lo que es no tiene ni idea. Una forma de solventar el problema es definir un lenguaje matemático con sus correspondientes reglas de porecedencia y demás, ahí entra en juego librerías llamadas Parser, como la conocida muParser, con la cual podríamos definir nuestro propio lenguaje. Esto conlleva mucho tiempo, pero todo ello ya viene implementado con GiNaC, así que con unas cuantas líneas de código en nuestro programa lo solventamos. Tranquilos que ahora luego os pongo ejemplos en C++ de ello.

Esto está cojonudo pero desgraciadamente está implementado en las versiones más recientes de las librerías, y claro, como siempre pasa con la programación científica y las mates, la versión más reciente de GiNaC, la 1.5.1, no  viene empaquetada ni en Mandriva ni en Ubuntu. Pero tranquilos… ya me he hecho un rpm para Mandriva de la versión 1.5.1, si la queréis pongo enlace de descarga:

DESCARGAR GINAC 1.5.1 MANDRIVA 2009.1

Para Ubuntu aún no he tenido tiempo de debianizarlas, pero si alguien las quiere para probarlas que me lo pida por aquí y lo hago.

Otra de las cosas buenas que tiene es que se apoyan sobre las librerías CLN, que son otras librerías matemáticas hechas exprofesso para definir diferentes tipos de variables numéricas, con diferentes precisiones. Con GiNaC podemos trabajar con tensores, lleva algunos definidos por sí; tanto tensores covariantes como contravariantes, y la verdad es que no es nada complicado; ya os enseñaré algo un día de estos.

También se puede trabajar con matrices, derivadas, vectores, listas, números complejos, etc… Con las integrales anda un poco flojo el tema, por ahora sólo calcula integrales polinómicas definidas, pero dicen que esperan implementarlo pronto; aunque a mi eso me da un poco lo mismo. Tiene un montón de funciones más que todavía no conozco y que podéis consultar en el manual en formato pdf o ps que os podéis descargar desde su web.

Para compilar y ejecutar nuestros programas hay que hacer lo siguiente:

g++ miprograma.cpp -o miprograma -lcln -lginac

./miprograma

Yo lo que hago es escribirlos, compilarlos y ejecutarlos desde Geany, es muy cómodo y sencillo de usar. Lo único que hay que hacer antes en Geany para que nos compile bien es ir a la opción Construir->Selecciona Inclusiones y Argumentos y rellenar la ventana que os aparece como os pongo en la siguiente imagen:

Geany

Vale, con esto creo que ya podemos pasar a ver unos cuantos ejemplos, sencillitos que acabamos de empezar con esto.

El primer código es un programa que calcula la primera y segunda derivada de una función, nos factoriza la segunda derivada y además nos calcula el mcd y el mcm de dos polinomios dados.

#include <iostream>
#include <ginac/ginac.h>

using namespace std;
using namespace GiNaC;

int main(int argc, char** argv)
{
 symbol x("x"); //Con symbol declaramos la variable en la que vamos
 // a trabajar, podemos declarar tantas como queramos
 ex mifuncion, deriv1, deriv2, polinomio1, polinomio2;
 // ex es un nuevo tipo de variable definida en GiNaC, es una
 // abeviación del inglés expression, con ella declaramos expresiones
 // matemáticas siguiendo las reglas naturales de lexicografía del
 // lenguaje matemático.

 mifuncion = 3*x*cos(x*x-x)+Pi*x-5; //Declaro la expresión de mi
 //función, siendo Pi la forma de declarar la cte. pitagórica.
 polinomio1 = pow(x,2)-2*x+1;
 polinomio2 = pow(x,2)-1;
 deriv1 = mifuncion.diff(x); //Calculo la derivada 1ª. de mi función
 deriv2 = mifuncion.diff(x,2); //Calculo la derivada 2ª.

 cout<<"Mi funcion es: "<<endl<<mifuncion<<endl;
 cout<<"Y su primera derivada es: "<<endl<<deriv1<<endl;
 cout<<"Y su segunda derivada es: "<<endl<<deriv2<<endl;
 cout<<"Su segunda derivada en factores es: "<<endl<<factor(deriv2, factor_options::all)<<endl;
 //Con factor puedo factorizar la expresión algebraica.
 cout<<"\n Mi polinomio 1 es:"<<endl<
<polinomio1<<endl;
 cout<<"\n Mi polinomio 2 es:"<<endl<<polinomio2<<endl;
 cout<<"El maximo comun divisor de los polinomios es: "<<endl<<gcd(polinomio1, polinomio2)<<endl;
 cout<<"El mminimo comun multiplo de los polinomios es: "<<endl<<lcm(polinomio1, polinomio2)<<endl;
 //Con gcd y lcm puedo calcular el mcd y el mcm tanto de expresiones algebraicas como de números.
 return 0;
}

En el código tenéis los respectivos comentarios. Sólo apuntar que los includes que hay que poner para que funcionen nuestros programas con GiNaC es lo siguiente:

#include <ginac/ginac.h>

using namespace std;
using namespace GiNaC;

Os pongo un pantallazo del resultado de nuestro código por terminal:

screenshot_003

Ahora veamos otro programita pero a diferencia del anterior pediremos que el usuario nos introduzca por terminal las expresiones algebraicas, en este caso introduciremos un polinomio por terminal y hallaremos su segunda derivada y su integral en el intervalo [0,2]. Aquí tenéis el código:

#include <iostream>
#include <ginac/ginac.h>
#include <string>

using namespace std;
using namespace GiNaC;

int main(int argc, char** argv)
{
 symbol x("x");
 ex expr1, expr2, expr3;
 parser mifuncion;
 symtab tabla;

 cout<<"Introduce tu expresion"<<endl;
 expr1 = mifuncion(cin);
 tabla = mifuncion.get_syms();
 x = tabla.find("x") != tabla.end() ?
 ex_to<symbol>(tabla["x"]) : symbol("x");

 expr2 = integral(x,0,2,expr1).eval_integ();
 expr3 = expr1.diff(x,2);

 cout<<"\nTu expresion es :"<<endl<<expr1<<endl;
 cout<<"La integral en [0,2] de "<<expr1<<" es: "<<expr2<<endl;
 cout<<"La derivada segunda de "<<expr1<<" es:"<<endl<<expr3<<endl;
 return 0;
}

Y aquí un pantallazo de los resultados del programa por terminal:

screenshot_004

Cuando acabéis de introducir la expresión por terminal debéis presionar las teclas CTRL+D en LinuX o CTRL+Z en Windows porque el código espera la señal de final de fichero, EOF.

Como veís con poco código conseguimos unos resultados  excelentes, que podemos mejorar ya que GiNaC nos brinda la posibilidad de poder hacer nuestras salidas en código LaTeX, lo cual nos hace tener una notación tipo profesional de nuestros programas con muy poco esfuerzo. Esto os lo explicaré en una próxima entrega que esta ya se esta haciendo un poco larga y seguro que os aburro :p

Saludos :)

Motor Ubuntu Looks En Mandriva

Hola, supongo que algún purista me crucificará en los tiempos que corren, pero… me da igual :p  El caso es que visitando Ubuntips he visto un tema de escritorio para Gnome que me ha gustado, me lo he instalado en mi Mandriva 2009.1 con Gnome y me he encontrado con el mensaje de que no se vería bien si no instalaba el motor UbuntuLooks basado en las librerías GTK+2. Así que a ver si sabéis qué he hecho ;)

Puuueeeeesss siiii…. me he puesto mi mono de hacker buenazo jajajajaja y me he ido a la web de Ubuntu-Packages, me he bajado el paquete debianizado lo he alienizado a rpm mandrivero, lo he instalado y ya todo va perfecto, he reiniciado el portátil para asegurarme que todo va bien. Si hay algún Mandrivero que lo quiere probar pongo enlace de descarga:

DESCARGAR MOTOR UBUNTULOOKS 32 BITS PARA MANDRIVA 2009.1

Para instalar tan sólo descargar y dar doble click izquierdo de ratón sobre el fichero recién bajado. Para probarlo lo podéis hacer instalando el tema Desintegration desde Gnome-Look, si no os sale ningún mensaje de advertencia al aplicarlo es que todo ha ido cojonudo morrocotudo :)

Bueno ahora los mandriveros gnomeros ya tendremos un fastidio menos cuando visitemos Gnome-Look y queramos probar o disfrutar de algún tema basado en Ubuntu jejejejejeje.

¿Unas foticos de mi Mandriva? UUUmmmm…. venga…. una con el tema este…

screenshot_001

Saludos :)

Método Newton-Raphson Con Python

Hola, durante las fallas Carlos Sessa me pidió si podía añadir en el código que hice en Python sobre métodos aproximativos de búsqueda de raíces de funciones el método de Newton y le dije que encantado, que no había ningún problema porque el código que hice es totalmente libre, sin ningún tipo de licencia restrictiva, para que todo el mundo aprenda de ello o mejore el código si lo desea. También le prometí publicarlo en el blog, así que eso es lo que voy ha hacer ahora, aunque con algo de retraso ;)

Bueno al meollo. El método de Newton parte de la idea de calcular la raíz (o cero) de una función en un intervalo mediante aproximaciones a la raíz mediante el cálculo de la recta tangente en esas aproximaciones. Para ello utilizamos la ecuación de la recta a la curva de la forma punto-pendiente.

Así pues partiendo de la curva (función) f:[a,b]\longrightarrow\mathbb{R} derivable en un punto incial x_0 cercano a la raíz que buscamos, sabemos que la ecuación punto-pendiente de la curva f tiene la expresión:

y-y_0 = f\prime (x_0)(x-x_0)

Al ser x_0 y todas sus aproximaciones las aproximaciones de la raíz que buscamos, tenemos que y_0=0 , ya que las raíces de cualquier curva, son gráficamente hablando, los puntos de la gráfica de f que cortan en el eje de abcisas, por lo que su ordenada es cero. Así pues tenemos:

y = f\prime (x_0)(x-x_0)

Si ahora consideramos que y=f(x) , podemos considerar la expresión anterior en términos de sucesiones. Así pues, sea x_{n} la sucesión  infinita de términos reales que representan a las distintas aproximaciones de la raíz que buscamos. Como f es derivable en ]a,b[ tenemos que f es continua en [a,b], así pues por el Teorema del Límite Vinculante podemos considerar que existen las sucesiones f(x_n )\quad y\quad f\prime (x_n ) . Así pues, sustituyendo en la expresión anterior obtenemos:

f(x_n ) = f\prime (x_n)(x_{n+1}-x_n)

Si despejamos x_{n+1} obtenemos:

x_{n+1}=x_{n}-\frac{f(x_n)}{f\prime (x_n)}

Que es la expresión propia del algoritmo de Newton-Raphson si hacemos iterar el número natural “n” desde 0 hasta un número determinado de iteraciones, que vendrá determinado principalmente por la precisión que queramos que tenga la aproximación de nuestra raíz, que es lo que se viene a llamar por el palabro de tolerancia.

Antes es bueno aclarar que una demostración rigurosa de éste método debería hacerse mediante el desarrollo del Polinomio de Taylor de la curva f centrado en el x_0 y hasta orden 2, para así obtener una cota del error, pero la omito porque me parece más fácil de entender mediante la ecuación punto-pendiente, que es la que conocen muchos estudiantes de 2º de bachiller.

Hay que recalcar que el método de Newton falla cuando la curva f no es derivable en un entorno pequeño del valor inicial, también falla si en algún punto del entorno del valor inicial su derivada es nula, o próxima a cero hablando desde el punto de vista computacional.

Si queremos buscar entornos del punto inicial para buscar raíces sin dibujar la gráfica de la curva se pueden usar los teoremas de Bolzano y de Rolle. El primero nos da la existencia de la raíz en un intervalo o entorno, y el segundo nos da su unicidad.

Sin más os dejo el código del método de Newton-Raphson escrito en código Python:

#!/usr/bin/python
 # coding: latin-1

import Evaluar
 from pylab import *
 from Numeric import *

def newton(df, po, TOL, N):

i = 1
 vectorx = zeros(N, Float64)
 vectory = zeros(N, Float64)

while i<=N:

vectorx[i-1] = po
 Evaluar.dicc_seguro['x'] = po
 f  = eval(Evaluar.funcion, {"__builtins__":None}, Evaluar.dicc_seguro)
 df_val = eval(df, {"__builtins__":None}, Evaluar.dicc_seguro)

vectory[i-1] = f

if df_val == 0.0:
 print "La evaluacion de la derivada de la funcion dio 0"
 break

p1 = po - (f/df_val)

if fabs(po-p1) < TOL:
 print "La raiz buscada es: ",po, "con", i-1,"iteraciones"
 break

i += 1
 po = p1

return [vectorx, vectory]

def dibujar(df, po, TOL, N):

x = arange(po-2,po+2,0.1)
 vectores = newton(df, po, TOL, N)

subplot(211)
 plot(x, eval(Evaluar.funcion), linewidth=1.0)
 xlabel('Abcisa')
 ylabel('Ordenada')
 title('Metodo Newton con f(x)=' + Evaluar.funcion)
 grid(True)
 axhline(linewidth=1, color='r')
 axvline(linewidth=1, color='r')

subplot(212)
 plot(vectores[0], vectores[1], 'k.')
 xlabel('Abcisa')
 ylabel('Ordenada')
 grid(True)
 axhline(linewidth=1, color='r')
 axvline(linewidth=1, color='r')

show()

Os pongo un pantallazo del método usando la función f(x)=x^2-\pi
Newton Raphson

Bueno os dejo un zip comprimido con la totalidad del código, con todos los métodos que hay hechos hasta ahora.

DESCARGAR CODIGO

Yo el código lo ejecuto y edito con Geany (lo tenéis en los repositorios de cualquier distro linuxera importante.
En la Wikipedia tenéis más información sobre éste método->Enlace a la Wikipedia
Cuando tenga algo de tiempo haré el método de Müller, para poder aproximar raíces en el campo de los números complejos.

¡Muchas gracias a Carlos Sessa por su colaboración! :-)
Saludos :-)

Tucan Para Mandriva

Hola, Tucan es un programa que sirve para descargar ficheros de servidores como rapidshare o megaupload. Es un programa mucho más sencillo que JDownloader, pero para mis exigencias cumple con su cometido. La ventaja respecto a otros programas de su mismo corte es que al estar programado con Python es mucho más ligero que muchos otros que están basados en Java, lo cual es de agradecer si nuestro PC es algo antiguo. Siempre Java chupa más recursos que Python debido a que siempre se carga en segundo plano la máquina virtual de Java.

El caso es que no encontraba este programa en ningún sitio empaquetado en formato rpm, así que tomé prestado el deb de la web de Getdeb y con alien y fakeroot lo he convertido desde mi Mandriva a rpm. El programa funciona para cualquier arquitectura, yo lo tengo instalado en mi Mandriva2009.1 One y me funciona perfectamente. Si alguien quiere probarlo os pongo un enlace de descarga:

DESCARGAR TUCAN PARA MANDRIVA 2009.1

Para instalarlo es suficiente con dar doble click de ratón al fichero recién descargado y seguir instrucciones.

Saludos :)

Sigo Con Trabajo

horrorpopsHola peññaa!! Bueno contaros que sigo trabajando de profe en un Instituto. No os he contado nada por no ser un pesado  jejeje. La verdad es que desde hace 2 semanas empecé otra sustitución por baja de enfermedad. Esta vez me ha tocado más cerca, en Mislata, un pueblo de la provincia de Valencia, casi pegado en la misma capital. No he de madrugar tanto como en la de Castellón y el instituto es bastante tranquilo.

En principio parece ser que seguiré trabajando hasta final de curso, así que examinaré, iré a reuniones de evaluación y de claustro; a ver si me entero de qué va eso. Lo de poner examenes y corregirlos ya esta controlado el tema, la primera vez impone respeto pero luego ya es pan comido. Lo malo de todo esto es que no tengo mucho tiempo para estudiar la Oposición y he tenido que pringar las Fallas y pringaré las Pascuas, pero no me quejo; con los tiempos que corren me siento afortunado de tener un trabajo de lo que me gusta. Eso sí, nadie me ha regalado nada, he sacrificado mucho para llegar ahí, ¡políticos mal nacidos de mierda!!! A ver si la palmáis de una vez y dejáis al ciudadano de a pie trabajar y disfrutar de su vida en paz. (Mi cuñita apolítica jejejeje )

Bueno, deciros que el blog sigue en marcha, para mi ya es como una jodida droga, como una via de escape a un escritor frustrado jejejeje. Así que a ratos libres iré escribiendo cosas, ya se que tengo pendiente publicar lo de Carlos Sessa sobre Newton con Python, cuando tenga un ratito lo publico tio.

He de decir que hay algo que me ha chocado estos días, es que ha habido bastante gente, por e-mail, que me ha pedido que escriba más sobre matemáticas, como ya he dicho alguna vez, hacerlo da mucho trabajo, porque lo hago con LateX, así que prometo escribir de ello pero con paciencia ;)

Bueno para no aburriros más os dejo con un grupo de estilo psychobilly-punk-pop muy pintas, bastante lokos, lascivos, rebeldes y descarados, son los Horrorpops. Se lo dedico al que me ha comentado sobre el artículo de IE8 que soy un maleducado y que no debo insultar a Microsoft, nada chavalín ahí va el vídeo, ¡cuidado tio no te rasgues las vestiduras de franciscano!!!

Saludos :)

Page 30 of 110« First...1020...2829303132...405060...Last »