Archivos Mensuales: abril 2009 - Paginas 2

Tucan 0.3.7. Para Mandriva

Hola, hace unos días os hablé de Tucan, un programa escrito en Python que nos permite hacer descargas directas desde Rapidshare, Megaupload, Mediafire y 4Shared. Ha salido una nueva versión, la 0.3.7, que trae la novedad de añadir dos servidores más: Gigasize y Sendspace.

Para los que tengáis Mandriva en la versión 2009.1 podéis probarlo si queréis con el paquete RPM que he hecho para mi y que pongo enlace para vosotros, funciona con independencia de la arquitectura de vuestro ordenador. Se que a muchos no os funciona muy bien, deciros que Tucan esta en versión alfa, por lo que a muchos puede que no os funcione bien. Por lo que respecta a mi el programa me funciona perfectamente, tanto en Mandriva como en Ubuntu.

DESCARGAR TUCAN 0.3.7 PARA MANDRIVA 2009.1

Por cierto, para los ubunteros tenéis una versión del mismo en la web de GetDeb.

Saludos :)

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 :)

Page 2 of 212