martes, 20 de marzo de 2012

Python

Python
Es un lenguaje de programación de alto nivel. Python fue creado a finales de los ochenta por  Guido Van Rossum en el Centro para las Matemáticas y la Informática (CWI, Centrum Wiskunde & Informatica), en los Países Bajos, como un sucesor del lenguaje de programación ABC. 


¿Por qué usar Python?
Por que es facil de usar,  es de código abierto

Ejemplos de python
 Un ejemplo sencillo de como generar números aleatorios y guardarlos en  un archivo. También un ejemplo de como trabajar con importat gnuplot en python.





#!/usr/bin/python
import random
import Gnuplot

f = open("archivo.txt","w")
for i in range(0, 10):
  a=random.uniform(1,1000)
  f.write("%fl\n" %a)
  print(a)
f.close()

b=[[1,2],[3,4],[5,6],]
gp = Gnuplot.Gnuplot(persist=1)
gp.title('Grafica sencilla ')
gp.xlabel('primera entrada')
gp.ylabel('segunda entrada')
gp.plot(b)

 Un ejemplo de como ingresar datos desde teclado  y como poner mensajes de error







valor=input('Dame un numero: ')
try:
    temp=int(valor)
    print 'el valor es: ', valor
except ValueError as variable:
    print 'Debes ingresar un numero entero'



Python y Cplex 
Es posible trabajar con Cplex desde pyhton  en el enlace 
se puede encontrar todo la información y de como trabajar con python y Cplex.

A continuación se presenta un demo

#!/usr/bin/python
# diet.py -- A diet problem
# Descripción del problema
# Minimizar el costo de la dieta sujeto a las restricciones de los nutrientes.
# To run from within the python interpreter, use
# >>> import diet


import cplex
from cplex.exceptions import CplexError
from inputdata import read_dat_file

#  Clase para los datos 
class ProbData:

    def __init__(self, filename):
        
        # lee los datos del archivo diet.dat
        self.foodCost, self.foodMin, self.foodMax, self.nutrMin, \
                       self.nutrMax, self.nutrPer = \
                       read_dat_file("../../data/diet.dat")

        # revisa si los datos no son inconsistentes
        if len(self.foodCost) != len(self.foodMin) or \
               len(self.foodCost) != len(self.foodMax) or \
               len(self.nutrMin)  != len(self.nutrMax) or \
               len(self.nutrMin)  != len(self.nutrPer):
            print "ERROR: Data file '%s' contains inconsistent data\n" % filename
            raise Exception("data file error")

        for np in self.nutrPer:
            if len(self.foodCost) != len(np):
                print "ERROR: Data file '%s' contains inconsistent data\n" % filename
                raise Exception("data file error")


def populatebyrow(prob, data):

    nFoods = len(data.foodCost)
    nNutrients = len(data.nutrMin)

    # we want to minimize costs
    prob.objective.set_sense(prob.objective.sense.minimize)

    # add variables to decide how much of each type of food to buy
    varnames = ["x"+str(j) for j in range(nFoods)]
    prob.variables.add(obj = data.foodCost,
                       lb = data.foodMin,
                       ub = data.foodMax,
                       names = varnames)

    # add constraints to specify limits for each of the nutrients
    for n in range(nNutrients):
        prob.linear_constraints.add(lin_expr = [[varnames,data.nutrPer[n]]],
                                    senses = ["R"],
                                    rhs = [data.nutrMin[n]],
                                    range_values = [data.nutrMax[n] - data.nutrMin[n]])
    
    
def populatebycolumn(prob, data):
    nFoods = len(data.foodCost)
    nNutrients = len(data.nutrMin)

    # we want to minimize costs
    prob.objective.set_sense(prob.objective.sense.minimize)

    # create empty constraints to be filled later
    rownames = ["r"+str(n) for n in range(nNutrients)]
    prob.linear_constraints.add(senses = ["R" * nNutrients],
                                rhs = data.nutrMin,
                                range_values = [data.nutrMax[n] - data.nutrMin[n]
                                                for n in range(nNutrients)],
                                names = rownames)

    # create columns
    for j in range(nFoods):
        prob.variables.add(obj = [data.foodCost[j]],
                           lb = [data.foodMin[j]],
                           ub = [data.foodMax[j]],
                           columns = [[rownames, [data.nutrPer[n][j]
                                                  for n in range(nNutrients)]]])

    
def diet(pop_method):
    try:
        # read the data in diet.dat
        data = ProbData("../../data/diet.dat")

        # create CPLEX object
        my_prob = cplex.Cplex()

        # populate problem
        if pop_method == "r":
            handle = populatebyrow(my_prob, data)
        if pop_method == "c":
            handle = populatebycolumn(my_prob, data)

        # solve problem
        my_prob.solve()
        
    except CplexError, exc:
        print exc
        return

    numrows = my_prob.linear_constraints.get_num()
    numcols = my_prob.variables.get_num()

    solution = my_prob.solution
    
    # solution.get_status() returns an integer code
    print "Solution status = " , solution.get_status(), ":",
    # the following line prints the corresponding string
    print solution.status[solution.get_status()]
    print "Objective value = " , solution.get_objective_value()
    
    x = solution.get_values(0, my_prob.variables.get_num()-1)
    for j in range(my_prob.variables.get_num()):
        print "Buy %d = %17.10g" % (j, x[j])

import sys

if __name__ == "__main__":
    if len(sys.argv) != 2 or sys.argv[1] not in  ["-r", "-c"]:
        print "Usage: diet.py -X"
        print "   where X is one of the following options:"
        print "      r          generate problem by row"
        print "      c          generate problem by column"
        print " Exiting..."
        sys.exit(-1)
    diet(sys.argv[1][1])
else:
    prompt = """Enter the letter indicating how the problem data should be populated:
    r : populate by rows
    c : populate by columns\n ? > """
    r = 'r'
    c = 'c'
    diet(input(prompt))
Referencias Introducción 
modelo_simple

lunes, 5 de marzo de 2012

Gnuplot

Gnuplot
 Es un programa gratuito que  nos permite   gráficar funciones y datos en 2D y 3D. Es compatible con los sistemas operativos linux, Unix, Mac Os X. Gnuplot puede mostrar los resultados directamente en pantalla, así como en muchos formatos como PNG, EPS, JPEG etcétera.

Gnuplot pone la escala más conveniente para los datos a gráficas, si no se le indica de antemano


Se puede usar interactivamente  con bash, sed y awk.

Ejemplos

Se pueden hacer desde gráficas muy sencillas hasta muy complicas y con animación, en colores o escalas de grises.
A continuación  algunos ejemplos de gráficas que se pueden generar en gnuplot.


  • Varias gráficas de diferente tamaño en una sola hoja
set term postscript eps color
set xrange[0:10]
set multiplot
set origin 0,0.5
set size 0.5,0.5
set grid
plot tan(x**x)

set origin 0.2,0
set size 0.4,0.4
plot sin(x)

set origin 0.5,0.5
set size 0.5,0.4
set origin 0.5,0.5
plot cos(x)
unset multiplot


Desde terminal pongo > gnuplot ejemplo1.plot > name1.jpg
  • Gráfica con animación



#!/bin/bash
for ((i=-100; i<100;i++)); 
do echo -e "set yrange[-100:100]; pl $i*sin(x)\n"; 
done | gnuplot -persist
  
Desde termina pongo  > bash ejemplo.sh 

  • Una superficie
  •  
    #set term postscript eps color
    set terminal jpeg
    reset
    unset key
    set contour base
    set pm3d at s
    #set pm3d at b
    
    set title "Superficie y contornos"
    set xrange [-2:10]
    set yrange [0:12]
    
    splot for [i=1:10:2] 'out.dat' using (-2):0:i with lines lt i, \ 
    for [i=1:10:2] 'out2.dat' u 0:(12):i w l lt i,\
    'out.dat' matrix w pm3d
    






Enlaces 
A continuación algunos enlaces que pueden ayudar cuando se usa gnuplot
Enlace1 
Enlace2
enlace 3