Notas de Python
Notas de Python
Notas de Python
Introduccin a Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1
1.2
1.3
Mdulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.4
Control de flujo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.5
1.6
1.7
1.8
Excepciones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
1.9
Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
NumPy y SciPy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
2.1
Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
2.2
2.3
Slicing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
2.4
Operaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
2.5
Otras operaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
2.6
Lectura de ficheros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
2.7
Bsqueda de informacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
2.8
SciPy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
2.9
Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
1
NDICE GENERAL
3.1
Grficos interactivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
3.2
Aadiendo opciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
3.3
3.4
Grficos y objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
3.5
Grficos 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
3.6
Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
4.1
4.2
4.3
Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Introduccin a Python
1 Aunque es conveniente saber que existen funciones para avisarnos si alguna parte de
nuestro cdigo no es compatible con la versin 3.
Tema 1
Introduccin a Python
1 1
que nos informa de la versin que tenemos instalada y nos seala el prompt
>>> del sistema, el cual indica la situacin del terminal a la espera de rdenes.
Podemos salir con la orden exit() o pulsando las teclas Ctrl+D.
Una vez dentro del intrprete podemos ejecutar rdenes del sistema, por
ejemplo
>>> print "Hola Mundo "
Hola Mundo
>>>
1.1
donde codificacin se refiere al cdigo de caracteres que empleemos (tpicamente utf-8). El empleo de caracteres no ASCII en un script sin esta lnea
produce errores.
Cuando queremos escribir una orden de longitud mayor a una lnea debemos usar el carcter de escape \, tanto en el intrprete como en los scripts:
>>> print "esto es una orden \
... de ms de una lnea "
esto es una orden de ms de una lnea
>>> 15 - 23 + 38 \
... -20 + 10
20
1 1 1
La consola IPython
Tema 1
Introduccin a Python
Si como ocurre en este caso, nuestra entrada produce una salida Out[1]:
46, podemos usar la numeracin asignada para reutilizar el dato mediante la
variable _1,
In [2]: _1 + 15
Out [2]: 61
Adems, esta consola pone a nuestra disposicin comandos del entorno (cd,
ls, etc.) que nos permiten movernos por el rbol de directorios desde dentro
de la consola, y comandos especiales, conocidos como funciones mgicas que
proveen de funcionalidades especiales a la consola. Estos comandos comienzan
por el carcter % aunque si no interfieren con otros nombres dentro del
sistema se puede prescindir de este carcter e invocar slo el nombre del
comando. Entre los ms tiles est el comando run con el que podemos
ejecutar desde la consola un script de rdenes. Por ejemplo, para ejecutar
el creado anteriormente:
In [5]: run hola.py
Hola Mundo
1.1
Los denominados IDE (Integrated Development Environment) son programas que facilitan el desarrollo de cdigo incluyendo tpicamente un editor
de cdigo fuente acompaado de una consola o herramientas de compilacin
automticas, y en ocasiones algn complemento de depuracin, o listado de
variables presentes, etc. En el caso de Python, existen diversos entornos de
este tipo entre los que podemos citar IDLE, Stanis Python Editor, Eric IDE,
NinJa IDE, Spyder, entre otros. Son herramientas interesantes para escribir
cdigo de forma ms cmoda que el uso aislado de un editor de texto.
Tema 1
Introduccin a Python
1 2
Variables numricas
a=2
# define un
b=5. # define un
c=3+1j
# define
d= complex (3 ,2) #
entero
nmero real
un nmero complejo
define un nmero complejo
Claramente a+b calcula la suma de los valores de las variables, sin embargo
a/b parece que no calcula correctamente la divisin. En realidad la respuesta
es correcta dado que ambas variables son enteros, y por tanto se realiza la
divisin entre enteros, que corresponde a la parte entera de la divisin. Si lo
que esperamos es obtener la divisin real debemos escribir al menos uno de
los nmeros en forma real, lo que se hace con el comando float:
1.2
Objetos
10
Tema 1
Introduccin a Python
Los atributos son caractersticas de los objetos a las que se accede mediante
el operador . de la forma objeto.atributo.
Cada tipo de objeto suele tener disponible ciertos mtodos. Un mtodo es
una funcin que acta sobre un objeto con una sintaxis similar a la de un
atributo, es decir, de la forma objeto.mtodo(argumentos). Por ejemplo, la
operacin de conjugacin es un mtodo del objeto complejo:
>>> a. conjugate ()
(3 -2j)
el intrprete nos indica que se trata de un mtodo del objeto complejo, pero
no proporciona lo esperado.
Pulsando el tabulador despus de escribir objeto. en la consola IPython,
sta nos muestra los atributos y funciones accesibles al objeto:
In [1]: a= complex (3 ,2)
In [2]: a. # Pulsar <TAB >
a. conjugate a.imag
a.real
1 2 3
Listas
Las listas son colecciones de datos de cualquier tipo (inclusive listas) que
estn indexadas, comenzando desde 0:
>>> a=[1 ,2. ,3+1j]
>>> type(a)
<type 'list '>
>>> a[1]
2.0
>>> a[3]
Traceback (most recent call last):
File "<stdin >", line 1, in <module >
IndexError : list index out of range
1.2
11
Hemos definido una lista encerrando sus elementos (de tipos diversos) entre
corchetes y separndolos por comas. Podemos acceder a cada uno de los
elementos de la lista escribiendo el nombre de la lista y el ndice del elemento
entre corchetes, teniendo en cuenta que el primer elemento tiene ndice 0.
Ntese que el tercer elemento corresponde al ndice 2, y si intentamos acceder
al elemento a[3] obtenemos un error.
Si algn elemento de la lista es otra lista, podemos acceder a los elementos
de esta ltima usando el corchete dos veces, como en el siguiente ejemplo:
>>>
>>>
[3,
>>>
0
Las listas son estructuras de datos muy potentes que conviene aprender a
manejar con soltura. Podemos consultar los mtodos a los que tenemos acceso
en una lista usando el autocompletado en IPython:
In [2]: a. # Pulsar <TAB >
a. append
a. extend
a. insert
a. count
a. index
a.pop
a. remove
a. reverse
a.sort
12
Tema 1
Introduccin a Python
Por otra parte, es frecuente que Python utilice los operadores aritmticos
con diferentes tipos de datos y distintos resultados. Por ejemplo, los operadores
suma y multiplicacin pueden aplicarse a listas, con el siguiente resultado:
>>>
>>>
[1,
>>>
[1,
Ntese que el uso del mtodo hubiera sido equivalente a escribir a=a+b. En
general, el uso de mtodos proporciona mejor rendimiento que el uso de otras
acciones, pero hemos de ser conscientes de que el objeto sobre el que se aplica
puede quedar modificado al usar un mtodo.
Slicing
Como vemos, el slicing [n:m] accede a los elementos de la lista desde n hasta
m (el ltimo sin incluir). Admite un parmetro adicional, y cierta flexibilidad
en la notacin:
>>>
[8,
>>>
[9,
>>>
[3,
En las listas, y por supuesto tambin con el slicing, se pueden usar ndices
negativos que equivalen a contar desde el final:
1.2
>>>
0
>>>
[4,
>>>
[6,
1 2 4
Cadenas de caracteres
en las que se puede comprobar que da igual definirlas con comillas simples o
dobles, lo que es til si queremos cadenas que incluyan estos caracteres:
>>> a="Esto es una 'string '"
>>> print a
Esto es una 'string '
13
14
Tema 1
Introduccin a Python
En otros momentos, necesitaremos que la cadena de caracteres sea interpretada tal cual (sin caracteres de escape), para lo cual usaremos una r (por
raw string) precediendo a la cadena:
cadena = r'\LaTeX '
pero las cadenas son inmutables, esto es, no es posible alterar sus elementos
(veremos este asunto ms adelante en la seccin ??). Eso significa que cualquier transformacin que llevemos a cabo con un mtodo no alterar la cadena
original.
El slicing tambin funciona con las cadenas de caracteres
>>> a="Esto es una cadena de caracteres "
>>> a[:19]
'Esto es una cadena '
>>> a[19:]
'de caracteres '
Hay una gran cantidad de mtodos para manejar strings que permiten
cambiar la capitalizacin, encontrar caracteres dentro de una cadena o separar
cadenas en trozos en funcin de un caracter dado. Emplazamos al lector a usar
la ayuda en lnea del intrprete para aprender el funcionamiento de stos y
otros mtodos.
1.2
1 2 5
Diccionarios
En algunas ocasiones es interesante disponer de listas que no estn indexadas por nmeros naturales, sino por cualquier otro elemento (strings habitualmente, o cualquier tipo de dato inmutable). Python dispone de los diccionarios
para manejar este tipo de listas:
>>> colores ={ 'r': 'rojo ', 'g': 'verde ', 'b': 'azul '}
>>> type( colores )
<type 'dict '>
>>> colores ['r']
'rojo '
>>> colores ['k']= 'negro ' # aadimos un nuevo elemento
>>> colores
{'k': 'negro ', 'r': 'rojo ', 'b': 'azul ', 'g': 'verde '}
1 2 6
Tuplas
Para terminar con los tipos de datos principales haremos mencin a las
tuplas. Las tuplas son un tipo de dato similar a las listas (es decir, una
coleccin indexada de datos) pero que no pueden alterarse una vez definidas
(son inmutables):
>>> a=(1 ,2. ,3+1j,"hola")
>>> type(a)
<type 'tuple '>
>>> a[2]
(3+1j)
>>> a [0]=10. # error : no se puede modificar una tupla
Traceback (most recent call last):
15
16
Tema 1
Introduccin a Python
Como veremos luego, las tuplas son tiles para pasar un conjunto de datos
a una funcin. Tambin estn detrs de la asignacion mltiple de variables:
>>> a = s,t,r = 1,'dos ' ,[1 ,2 ,3]
>>> a
(1, 'dos ', [1, 2, 3])
>>> t
'dos '
MDULOS
Una de las caractersticas principales de Python es su modularidad. La
mayora de funciones accesibles en Python estn empaquetas en mdulos,
1.3
Mdulos
17
que precisan ser cargados previamente a su uso, y slo unas pocas funciones
son cargadas con el ncleo principal. Por ejemplo, no se dispone de forma
inmediata de la mayor parte de funciones matemticas comunes si no se
ha cargado antes el mdulo apropiado. Por ejemplo, la funcin seno no est
definida:
>>> sin (3.)
Traceback (most recent call last):
File "<stdin >", line 1, in <module >
NameError : name 'sin ' is not defined
Ahora tenemos a nuestra disposicin todas las funciones del mdulo matemtico. Puesto que todo en Python es un objeto (incluidos los mdulos), el lector
entender perfectamente que el acceso a las funciones del mdulo se haga de
la forma math.funcin:
>>> math.sin (3.)
0.1411200080598672
Para conocer todas las funciones a las que tenemos acceso dentro del
mdulo disponemos de la orden dir5
>>> dir(math)
['__doc__ ', '__name__ ', '__package__ ', 'acos ', 'acosh ', 'asin '
, 'asinh ', 'atan ', 'atan2 ', 'atanh ', 'ceil ', 'copysign ', '
cos ', 'cosh ', 'degrees ', 'e', 'erf ', 'erfc ', 'exp ', 'expm1
', 'fabs ', 'factorial ', 'floor ', 'fmod ', 'frexp ', 'fsum ',
'gamma ', 'hypot ', 'isinf ', 'isnan ', 'ldexp ', 'lgamma ', '
log ', 'log10 ', 'log1p ', 'modf ', 'pi ', 'pow ', 'radians ', '
sin ', 'sinh ', 'sqrt ', 'tan ', 'tanh ', 'trunc ']
math.fsum
math. gamma
math. hypot
math. isinf
math. isnan
math. ldexp
math. lgamma
math.log
math.pi
math.pow
math. radians
math.sin
math.sinh
math.sqrt
math.tan
math.tanh
18
Tema 1
Introduccin a Python
math. copysign
math.cos
math.cosh
math.floor
math.fmod
math.frexp
math.log10
math.log1p
math.modf
math. trunc
Una de las caractersticas ms apreciadas de Python es su extensa biblioteca de mdulos que nos proveen de funciones que permiten realizar las tareas
ms diversas. Adems, esta modularizacin del lenguaje hace que los programas creados puedan ser reutilizados con facilidad. Sin embargo, no suele ser
bien aceptada la necesidad de anteponer el nombre del mdulo para tener
acceso a sus funciones. Es posible evitar el tener que hacer esto si cargamos
los mdulos del siguiente modo:
>>> from math import *
2, escribimos
Como vemos, hemos cargado los mdulos math y cmath y calculado la raz
cuadrada de 1 con la funcin sqrt que posee cada mdulo. El resultado es
bien distinto: la funcin raz cuadrada del mdulo math no permite el uso de
nmeros negativos, mientras que la funcin sqrt del mdulo cmath s. Si en
lugar de cargar los mdulos como en el ltimo ejemplo los hubisemos cargado
as:
>>> from cmath import *
>>> from math import *
1.3
Mdulos
nos deja a nuestra disposicin la funcin raz cuadrada del mdulo cmath y
las funciones trigonomtricas seno y coseno del mdulo math. Es importante
sealar que con este mtodo de importacin no tenemos acceso a ninguna
otra funcin de los mdulos que no hubiera sido previamente importada. Esta
ltima opcin es de uso ms frecuente en los scripts, debido a que con ella
cargamos exclusivamente las funciones que vamos a necesitar y de esa forma
mantenemos el programa con el mnimo necesario de recursos.
En el uso de la consola interactiva es ms frecuente cargar el mdulo
al completo, y es aconsejable hacerlo sin el uso de *. De hecho, hay una
posibilidad adicional que nos evita tener que escribir el nombre del mdulo
al completo, seguido del punto para usar una funcin. Si realizamos una
importacin del mdulo como sigue.
>>> m.cos(m.pi)
-1.0
1 3 1
19
20
Tema 1
Introduccin a Python
Mdulo
Descripcin
math
Funciones matemticas
cmath
fractions
Nmeros racionales
os
sys
re
datetime
pdb
Depuracin
random
Nmeros aleatorios
ftplib
Conexiones FTP
MySQLdb
smtplib
Envo de e-mails
1 4
CONTROL DE FLUJO
1 4 1
Bucles
1.4
Control de flujo
>>> for b in a:
...
print b
...
hola
mundo
De igual modo que iteramos sobre una lista, puede hacerse sobre una tupla
o un diccionario. En este ltimo caso, es posible acceder de varias formas:
>>> colores ={ 'r': 'rojo ', 'g': 'verde ', 'b': 'azul '}
>>> for i in colores .keys ():
...
print i, colores [i]
...
r rojo
b azul
g verde
Condicionales
21
22
Tema 1
Introduccin a Python
...
print "5 no divisible ni por 2 ni por 3"
...
5 no es divisible ni por 2 ni por 3
>>>
Bucles condicionados
Es interesante analizar un poco este breve cdigo que genera unos cuantos
trminos de la sucesin de Fibonacci. En especial, hemos de prestar atencin
a cmo usamos tuplas para las asignaciones mltiples que realizamos en las
lneas 1 y 4; en la primera hacemos a=0 y b=1 y en la segunda se realiza la
asignacin a=b y b=a+b, en la que debemos notar que antes de realizar la
asignacin se evala el lado derecho (de izquierda a derecha).
Tambin disponemos de las sentencias break y continue para terminar
o continuar, respectivamente, los bucles for o while. Asimismo, la sentencia
else tiene sentido en un bucle y se ejecuta cuando ste ha terminado, en
el caso de for, o cuando es falso, en el caso de while. Veamos el siguiente
ejemplo:
1
2
3
4
5
6
7
1.5
8
9
10
11
12
13
14
15
16
...
2 es
3 es
4 es
5 es
6 es
7 es
8 es
9 es
primo
primo
igual
primo
igual
primo
igual
igual
a 2 * 2
a 2 * 3
a 2 * 4
a 3 * 3
1 5
23
24
Tema 1
Introduccin a Python
>>>
...
...
...
...
...
...
...
>>>
[1,
>>>
>>>
[1,
A diferencia de la funcin fibo definida antes, la funcin fibolist devuelve la lista creada a travs de la orden return (lnea 7). Si return no va
acompaado de ningn valor, se retorna None, al igual que si se alcanza el
final de la funcin sin encontrar return:
>>> a=fibo (50)
1 1 2 3 5 8 13 21 34
>>> print a
None
Aunque las funciones pueden ser definidas dentro del intrprete para su
uso, es ms habitual almacenarlas en un fichero, bien para poder ser ejecutadas
desde el mismo, o bien para ser importadas como si se tratara de un mdulo.
Por ejemplo, podemos definir una funcin matemtica y guardarla en un
archivo tang.py:
from math import sin ,cos ,pi
def tangente (x):
if cos(x)!=0:
return sin(x)/cos(x)
else:
print "La tangente es infinita "
return
x= tangente (pi)
print 'La tangente de pi es ',x
1.5
tendremos todas las funciones presentes en el mdulo (salvo las que comiencen
por _) sin necesidad de anteponer el nombre, pero como podemos observar
en el ejemplo, podemos alterar las variables propias que tengamos definidas,
razn por la cual no recomendamos este tipo de importacin.
Finalmente si realizamos la importacin selectiva:
>>> from tang import tangente
La tangente de pi es -1.22460635382e -16
>>> tangente (3)
-0.1425465430742778
>>> x
Traceback (most recent call last):
File "<stdin >", line 1, in <module >
NameError : name 'x' is not defined
la funcin tangente est disponible, pero nada ms. Aun as, obsrvese que
se ha ejecutado el mdulo en el momento de la importacin. Para evitar que
25
26
Tema 1
Introduccin a Python
En tal caso, la funcin help(mifuncion) o escribiendo mifuncion? en IPython nos mostrar la documentacin de la funcin.
1.5
1 5 2
Argumentos de entrada
27
28
Tema 1
Introduccin a Python
o en la funcin fibonacci,
>>>
>>>
[3,
>>>
>>>
[3,
1 5 3
Funciones lambda
Las funciones lambda son funciones annimas de una sola lnea que pueden
ser usadas en cualquier lugar en el que se requiera una funcin. Son tiles para
reducir el cdigo, admiten varios parmetros de entrada o salida y no pueden
usar la orden return:
1.5
area =10
def area_rectangulo (lado):
area=lado*lado
print area
area_rectangulo (3)
print area
29
30
Tema 1
Introduccin a Python
area =10
def area_rectangulo (lado):
global area
print area
area=lado*lado
print area
area_rectangulo (3)
print area
def fun(a,b):
a. append (0)
b=a+b
print a,b
a=[1]; b=[0]
fun(a,b)
0] [1, 0, 0]
print a,b
0] [0]
fun(a,b)
0, 0] [1, 0, 0, 0]
print a,b
0, 0] [0]
1.6
31
a=2
def pot(x,y=a):
return x**y
pot (2) , pot (2 ,3)
8)
a=4
pot (2)
1 6
# \n salta de lnea
Como vemos, sys.argv almacena en una lista todos los datos de la llamada,
de manera que es fcil manejarlos teniendo presente que son considerados
32
Tema 1
Introduccin a Python
como cadenas de caracteres, por lo que es probable que tengamos que realizar
una conversin de tipo para tratarlos correctamente.
Por ejemplo, si tenemos el archivo fibo.py con el siguiente contenido
# -*- coding : utf -8 -*import sys
def fibonacci (n,a=0,b=1):
""" Trminos de la sucesin de Fibonacci hasta orden n.
"""
sucesion =[]
while b<n:
sucesion . append (b)
a,b=b,b+a
return sucesion
if __name__ ==" __main__ ":
x=int(sys.argv [1]) # convertimos a entero la entrada
print fibonacci (x)
1.6
4
9
16
33
8
27
64
En este caso, el contenido del interior de las llaves hace referencia a los
elementos del mtodo format que le sigue, de manera que los nmeros que
van antes de los dos puntos corresponden a los ndices del objeto que sigue
a format y lo que va despus de los dos puntos define el modo en el que se
imprimirn dichos objetos. Aqu van unos ejemplos:
>>> print '{0}{1}{0} '. format ('abra ','cad ')
abracadabra
>>> print 'Coordenadas : {lat}, {long}'. format (lat='38.56 N',
long=' -3.28W')
Coordenadas : 38.56N, -3.28W
>>> print '{: <30} '. format ('alineacin a izquierda ')
alineacin a izquierda
>>> print '{: >30} '. format ('alineacin a derecha ')
alineacin a derecha
>>> print '{:^30} '. format ('alineacin centrada ')
alineacin centrada
>>> print '{:*^60} '. format ('alineacin centrada con relleno ')
************** alineacin centrada con relleno **************
>>> print '{0:d} {0:2.3 f} {0:3.2 e}'. format (2)
2 2.000 2.00e+00
1 6 1
La orden open crea un objeto tipo archivo que nos permitir la lectura y/o
escritura en el mismo. La sintaxis de la orden es
f=open('file.txt ','w') # abrimos 'file.txt ' para escritura
34
Tema 1
Introduccin a Python
El mtodo read del objeto archivo lee el archivo al que referencia el objeto
creado. Si se le proporciona un argumento numrico entonces lee un nmero
determinado de bytes del archivo;6 cuando es llamado sin argumento, lee el
archivo al completo. Cada llamada a read mueve el puntero de lectura del
archivo la ltimo lugar ledo, de manera que la llamada siguiente lee a partir
de ah. Por eso:
>>> f.read ()
''
produce una cadena vaca, pues el puntero se halla al final del archivo.
Podemos usar el mtodo seek para situarnos en cualquier posicin del archivo.
>>> f.seek (0) # Vamos al inicio del archivo
>>> f.read ()
'# coding : utf -8\ nprint " Primera l\xc3\ xadnea "\ nprint " Segunda
l\xc3\ xadnea "'
o con f.readlines() que almacena cada una de las lneas del archivo en una
lista:
>>> f.seek (0)
>>> for x in f. readlines ():
...
print x,
...
# coding : utf -8
print " Primera lnea "
print " Segunda lnea "
byte puede considerarse un carcter, aunque hay caracteres que ocupan ms de uno.
1.6
35
36
Tema 1
Introduccin a Python
Tambin disponemos del mtodo tell que nos indica con un entero la posicin
en la que se encuentra el puntero del archivo.
La escritura con write tambin se puede hacer en pantalla si la usamos
como un objeto tipo archivo con el atributo stdout del mdulo sys:
>>> import sys
>>> g=sys. stdout
>>> g. write ('Hola mundo \n')
Hola mundo
lo que puede ser til para programar las salidas por pantalla durante la
elaboracin de cdigo con write, de modo que cuando queramos direccionar
la salida a un archivo slo necesitamos cambiar la salida.
1 7
1.7
En realidad enumerate es lo que se denomina un iterador, es decir, un objeto sobre el que se pueden recorrer sus elementos. Otro iterador es reversed
que como parece lgico, crea un iterador con el orden inverso. As, el ltimo
ejemplo equivale a
[x*y for x,y in enumerate ( reversed (range (10)))]
1 7 2
Hemos mencionado anteriormente que las tuplas y las cadenas de caracteres son objetos inmutables, mientras que las listas son mutables. Debemos
aadir tambin que los diferentes tipos de nmeros son inmutables y los diccionarios son mutables. Ahora bien, qu significa exactamente que los nmeros
sean inmutables? Quiere decir que no los podemos modificar?
En realidad estas cuestiones estn relacionadas con el modo en el que
Python usa las variables. A diferencia de otros lenguajes, en los que una
variable esencialmente referencia una posicin en memoria, cuyo contenido
podemos modificar, en Python, una variable en realidad no es ms que una
referencia al objeto, no contiene su valor, sino una referencia a l. Lo podemos
ver con un sencillo ejemplo; la orden id nos muestra el identificador de un
objeto, que bsicamente es la direccin de memoria en la que se encuentra. Si
escribimos:
>>> x = 5 # x apunta al objeto 5
>>> id(x)
160714880
No hemos creado un nuevo objeto, sino una nueva referencia para el mismo
objeto, por lo que tienen el mismo identificador. Lo podemos comprobar con
la orden is:
>>> x is y
True
37
38
Tema 1
Introduccin a Python
# x apunta al objeto 7
y ahora:
>>> x is y
False
Con las listas pasa algo similar, salvo que ahora est permitido modificar
el objeto (porque son mutables), por lo que las referencias hechas al objeto
continuarn apuntado a l:
>>> a=[1 ,2]
>>> id(a) # identificador del objeto
3074955372 L
>>> a[0]=3 # modificamos el primer elemento
>>> a
[3, 2]
>>> id(a) # el identificador no cambia
3074955372 L
x= range (3)
y=x # y referencia lo mismo que x
x[:0]= x # modificamos x
y # y tambin se modifica
1, 2, 0, 1, 2]
Sin embargo,
>>> x=x+[3] # nuevo objeto
>>> y
[0, 1, 2, 0, 1, 2]
1.8
Excepciones
1 8
EXCEPCIONES
Para evitar los errores en el momento de la ejecucin Python dispone
de las secuencias de control try-except, que hacen que, en caso de que se
produzca una excepcin, sta pueda ser tratada de manera que la ejecucin
del programa no se vea interrumpida. Por ejemplo, supongamos que tenemos
la siguiente situacin:
for a in [1 ,0]:
b=1/a
print b
Para evitarla, hacemos uso de las rdenes try y except del siguiente modo:
for a in [1 ,0]:
try:
b=1/a
except :
print "Se ha producido un error "
b=0
print b
cuyo resultado es
1
Se ha producido un error
0
39
40
Tema 1
Introduccin a Python
b=1/a
except ZeroDivisionError :
print " Divisin por cero"
b=0
except TypeError :
print " Divisin invlida "
b=1
print b
produce:
Divisin por cero
0
Divisin invlida
1
1 9
EJERCICIOS
E.1
(a) a = complex(3,1)
(b) a = complex(3)+ complex(0,1)
(c) a = 3+j
(d) a = 3+(2-1)j
E.2
1.9
Ejercicios
41
(a) [10, 8, 6, 4, 2, 0]
(b) [10, 8, 6, 4, 2, 0, 2, 4, 6, 8, 10]
100
i
i=1
E.6
Calcula
E.7
E.8
s=[0]
for i in range (100):
s. append (s[i -1]+i)
print s
E.9
[0, 0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91, 105]
E.10
Utiliza la funcin randint del mdulo random para crear una lista de
100 nmeros aleatorios entre 1 y 10.
E.11
Construye el vigsimo elemento de la siguiente sucesin definida por
recurrencia:
u0 = 1, u1 = 2, u3 = 3.
E.12
Calcular la suma de todos los mltiplos de 3 o 5 que son menores que
1000. Por ejemplo, la suma de todos los mltiplos de 3 o 5 que son menores
que 10 es: 3 + 5 + 6 + 9 = 23
E.13
Escribir una funcin reverse que acepte una cadena de caracteres y
devuelva como resultado la cadena de caracteres invertida en orden, es decir,
el resultado de reverse('hola') debe ser 'aloh'.
E.14
Usando el Ejercicio E.13, escribir una funcin is_palindromo que
indentifique palndromos, (esto es, palabras que ledas en ambas direcciones
son iguales, por ejemplo radar). Es decir, is_palindromo('radar') debera
dar como resultado True.
E.15
El Documento Nacional de Identidad en Espaa es un nmero finalizado con una letra, la cual se obtiene al calcular el resto de la divisin de dicho
nmero entre 23. La letra asignada al nmero se calcula segn la siguiente
tabla:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
TRWAGMYFPD X B N J Z S Q V H L C K E
42
Tema 1
Introduccin a Python
Escribe un programa que lea el nmero por teclado y muestre la letra asignada.
Por ejemplo, al nmero 28594978 le debe corresponder la letra K. Tres lneas
de cdigo debera ser suficientes.
E.16
Usando un bucle while escribe un programa que pregunte por un
nmero por pantalla hasta que sea introducido un nmero impar mltiplo de
3 y de 7 que sea mayor que 100.
E.17
Crea una lista aleatoria de nmeros enteros (usar Ejercicio E.10) y
luego escribe un programa para que elimine los valores impares de dicha lista.
E.18
Escribir una funcin histograma que admita una lista aleatoria de
nmeros enteros entre 1 y 5 (usar Ejercicio E.10) y elabore un diagrama de
frecuencias de aparicin de cada uno de los elementos de la lista segn el
formato que sigue: por ejemplo, si la lista es
[1, 4, 2, 1, 4, 4, 5, 5, 5, 3]
entonces la funcin debe imprimir:
1
2
3
4
5
**
*
*
***
***
E.19
Escribir una funcin menorymayor que acepte un conjunto indeterminado de nmeros y obtenga el mayor y el menor de entre todos ellos. Es decir,
la funcin debera hacer lo siguiente:
menorymayor (2 ,5 ,1 ,3 ,6 ,2)
(1 ,6)
menorymayor (3 ,1 ,10 ,9 ,9 ,7 ,5 ,4)
(1 ,10)
E.20
Escribir una funcin que acepte como parmetros dos valores a y b, y
una funcin f tal que f (a)f (b) < 0 y que, mediante el mtodo de biseccin,
devuelva un cero de f . La aproximacin buscada ser controlada por un
parmetro que por defecto ha de ser 104 .
E.21
1.9
Ejercicios
43
NumPy y SciPy
ARRAYS
A diferencia de las listas, cuyos elementos pueden ser de cualquier tipo,
un array de NumPy debe tener todos sus elementos del mismo tipo. Para
definirlo, ser necesario importar el mdulo, y usar la orden array:
>>> import numpy as np
>>> a=np.array ([1. ,3 ,6])
>>> a
array ([ 1., 3., 6.])
45
46
Tema 2
NumPy y SciPy
Como el array es entero, todos los datos son convertidos a ese tipo. No
obstante, podemos cambiar de tipo todo el array,
>>> a=a. astype (float ) # cambio de tipo en nuevo array
array ([ 2., 3., 5.])
>>> a [0]=3.6
>>> a
array ([ 3.6, 3., 5.])
2.2
2 2
47
48
Tema 2
NumPy y SciPy
2.
]), 0.25)
# cambio de forma
o tambin,
>>> np. arange (15). reshape (3,5, order ='F')
array ([[ 0, 3, 6, 9, 12] ,
[ 1, 4, 7, 10, 13] ,
[ 2, 5, 8, 11, 14]])
La opcin por defecto equivale a order='C'. Las iniciales 'C' y 'F' corresponden a los lenguajes C y FORTRAN, respectivamente, y se refieren al modo
en el que estos lenguajes almacenan los datos multidimensionales.
El mtodo transpose en arrays bidimensionales es equivalente a la transposicin de matrices:
>>> a=np. arange (10). reshape (2 ,5)
>>> a. transpose () # transposicin a.T tambin es vlido
array ([[0 , 5],
[1, 6],
[2, 7],
[3, 8],
[4, 9]])
Ntese que todas estas funciones y mtodos crean nuevos objetos, es decir,
no modifican los existentes.
Las siguientes funciones son tiles para crear arrays de un tamao dado
(y reservar memoria en ese momento):
>>>
>>>
>>>
>>>
2.3
Slicing
2 3
SLICING
Por supuesto, al igual que con las listas, podemos acceder a los elementos
de un array mediante slicing, que en NumPy adems admite ms sofisticacin.
Por ejemplo, la asignacin sobre un trozo de una lista funciona de diferente
modo que en los arrays:
>>>
>>>
>>>
[0,
a= range (5)
a [1:4]=[6] # eliminamos elementos en la lista
a
6, 4]
49
50
Tema 2
NumPy y SciPy
En los arrays multidimensionales, podemos acceder a alguna de sus dimensiones de diferentes formas:
>>> a=np. arange (9). reshape (3 ,3)
>>> a
array ([[0 , 1, 2],
[3, 4, 5],
[6, 7, 8]])
>>> a[1] # segunda fila
array ([3 , 4, 5])
>>> a[2 ,:] # tercera fila
array ([6 , 7, 8])
>>> a[: ,2] # segunda columna
array ([2 , 5, 8])
2.4
Operaciones
2 4
OPERACIONES
Cuando usamos operadores matemticos con arrays, las operaciones son
llevadas a cabo elemento a elemento:
>>> a=np. arange (5.); b=np. arange (10. ,15)
>>> a
array ([ 0., 1., 2., 3., 4.])
>>> b
array ([ 10. , 11. , 12., 13., 14.])
>>> a+b
array ([ 10. , 12. , 14., 16., 18.])
>>> a*b
array ([ 0., 11. , 24. , 39. , 56.])
>>> a/b
array ([ 0.
, 0.09090909 , 0.16666667 , 0.23076923 ,
0.28571429])
>>> b**a
array ([ 1.00000000 e+00 ,
1.10000000 e+01 ,
1.44000000 e+02,
2.19700000 e+03 ,
3.84160000 e +04])
51
52
Tema 2
NumPy y SciPy
entonces, podemos usarla para trabajar sobre arrays del siguiente modo:
>>> vfunc = np. vectorize ( myfunc )
>>> a = np. arange (4)
>>> vfunc(a)
array ([ 0.
, 0.84147098 ,
0.90929743 ,
0.14112001])
2.4
Operaciones
Como podemos ver, la operacin de transposicin sobre un array unidimensional no sentido. De este modo, los productos matriciales aT a y aaT son
indistinguibles para Python:
>>> np.dot(a.T,a)
5
>>> np.dot(a,a.T)
5
Obsrvese que
>>> a[np. newaxis ]. shape
(1, 3)
No obstante, existe la funcin outer que evita tener que hacer todo esto:
>>> np.outer (a,a)
array ([[0 , 0, 0],
[0, 1, 2],
[0, 2, 4]])
53
54
Tema 2
NumPy y SciPy
lgebra Lineal
2 4 2
Concatenacin
Otra de las operaciones comunes que se realizan con arrays es la concatenacin de varios arrays. Funciona as:
2.4
Operaciones
Ntese la necesidad de aadir una dimensin extra para que se consideren los
arrays como vectores fila. Para arrays multidimensionales:
>>> a=np. arange (6). reshape (2 ,3)
>>> b=np. arange (10 ,16). reshape (2 ,3)
>>> a
array ([[0 , 1, 2],
[3, 4, 5]])
>>> b
array ([[10 , 11, 12] ,
[13 , 14, 15]])
>>> np. concatenate ((a,b)) # por defecto es por filas
array ([[ 0, 1, 2],
[ 3, 4, 5],
[10 , 11, 12] ,
[13 , 14, 15]])
>>> np. concatenate ((a,b),axis =1) # ahora por columnas
array ([[ 0, 1, 2, 10, 11, 12] ,
[ 3, 4, 5, 13, 14, 15]])
2 4 3
Broadcasting
55
56
Tema 2
NumPy y SciPy
3.] ,
3.] ,
3.]])
3.,
5.,
7.,
4.],
6.],
8.]])
2.,
6.,
10.,
4.] ,
8.],
12.]])
1.,
9.,
25.,
4.] ,
16.] ,
36.]])
2.4
Operaciones
(
)
2
4
1 3
5
A=
, B=
6
8
7 9 11
10 12
En este caso podemos calcular los productos matriciales AB y BA, con los
que obtenemos matrices 2 2 y 3 3, respectivamente:
>>> A=np.array ([i for i in range (12) if (i+1) %2==0]). reshape
(2 ,3)
>>> B=np.array ([i for i in range (1 ,13) if i %2==0]). reshape
(3 ,2)
>>> np.dot(A,B)
57
58
Tema 2
NumPy y SciPy
De este modo podemos proceder con las columnas de A y filas de B, respectivamente. Un sencillo bucle nos proporciona dicho producto:
>>> for i in range (A. shape [1]):
...
A[:,i][ np. newaxis ].T*B[i ,:]
...
array ([[ 2, 4],
[14, 28]])
array ([[18 , 24] ,
[54, 72]])
array ([[ 50, 60],
[110 , 132]])
24
72
)
,
La ventaja que nos aporta NumPy es que es posible realizar esta misma
operacin sin necesidad del bucle. Ntese que queremos multiplicar tres vectores columna, por los correspondientes tres vectores filas. Esto es, vamos a
realizar 3 operaciones de vectores 2 1 con vectores 1 2. De este modo, debemos considerar a A como 3 vectores columna (lo que corresponde a tamao
(3,2,1))
2.5
Otras operaciones
8]] ,
[[10 , 12]]])
>>> B[:,np. newaxis ]. shape
(3, 1, 2)
As,
>>> A[np. newaxis ].T*B[:,np. newaxis ]
array ([[[ 2,
4],
[ 14, 28]] ,
[[ 18,
[ 54,
24] ,
72]] ,
[[ 50, 60] ,
[110 , 132]]])
OTRAS OPERACIONES
Mostramos a continuacin algunos mtodos tiles:
>>> a=np.array ([x**2 for x in range (15) if x %3==1])
>>> a
array ([ 1, 16, 49, 100, 169])
>>> a.sum () # suma de todos los elementos
335
>>> a.prod () # producto de todos los elementos
59
60
Tema 2
NumPy y SciPy
13249600
>>> a.min () # menor elemento
1
>>> a.max () # mayor elemento
169
>>> a. argmin () # ndice del menor elemento
0
>>> a. argmax () # ndice del mayor elemento
4
>>> a.clip (10 ,50) # si a<10 , ponemos 10; si a >50 ponemos 50
array ([10 , 16, 49, 50, 50])
Para arrays multidimensionales, la opcin axis permite hacer las operaciones anteriores (excepto clip) a lo largo de ejes diferentes:
>>> a = np. arange (12). reshape (3 ,4)
>>> a
array ([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> a.sum ()
66
>>> a.sum(axis =0)
array ([12 , 15, 18, 21])
>>> a.sum(axis =1)
array ([ 6, 22, 38])
Obsrvese que se crea un nuevo array, de tipo bool (booleano), correspondiente a la comparacin de elemento con elemento. El broadcasting tambin
puede usarse en este contexto:
>>> a>2
array ([ False ,
Disponemos tambin de mtodos sobre los arrays booleanos para determinar si son ciertos todos los elementos:
>>> c=a <3 # asignamos a un array
>>> c
array ([ True , False , True], dtype =bool)
>>> c.any () # hay alguno cierto ?
True
>>> c.all () # son todos ciertos ?
False
2.5
Otras operaciones
61
Tambin existe la funcin where que crea un nuevo array a partir de una
comparacin:
>>> a
array ([ 2., 3., 0., 5.])
>>> np.where (a!=0. , 1/a, -1)
array ([ 0.5
, 0.33333333 , -1.
0.2
])
2 5 1
Indexacin sofisticada
Adems del slicing que hemos visto, los arrays de NumPy se pueden
indexar a travs de arrays con enteros o variables booleanas, denominados
mscaras. Veamos algunos ejemplos:
62
Tema 2
NumPy y SciPy
2.5
Otras operaciones
63
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> a[2 ,[0 ,3]] # tercera fila , columnas primera y cuarta
array ([ 8, 11])
>>> a[1:3 ,[0 ,3]] # mismas columnas , filas segunda y tercera
array ([[ 4, 7],
[ 8, 11]])
>>> a[[1 ,2] ,[0 ,3]] # ! igual que antes ?
array ([ 4, 11])
2 5 2
Slicing y operaciones
ui+1 ui
xi+1 xi
64
Tema 2
NumPy y SciPy
6.8333324 , -7.64735003 ,
4.43624053 , -1.2967626 ])
2 5 3
Acceso a elementos
LECTURA DE FICHEROS
El mdulo NumPy posee funciones para la lectura rpida de ficheros de
datos similar a la que ofrece MATLAB. La orden loadtxt permite leer ficheros
de datos numricos y almacenarlos en un array. Por ejemplo, si el contenido
del archivo fichero.dat es
2.7
Bsqueda de informacin
2 1
4 3
6 5
8 7
10 9
1.000000000000000000 e+00
9.000000000000000000 e+00
2.500000000000000000 e+01
4.900000000000000000 e+01
8.100000000000000000 e+01
BSQUEDA DE INFORMACIN
El mdulo NumPy es enorme y contiene gran cantidad de mtodos y
funciones para realizar todo tipo de tareas. Para buscar la funcin adecuada,
NumPy nos provee de algunas funciones para obtener dicha informacin. La
funcin info tiene el mismo efecto que el uso de ? en IPython:
>>> np.info(np.dot)
dot(a, b, out=None)
Dot product of two arrays .
For 2-D arrays it is equivalent to matrix multiplication , and
for 1-D
arrays to inner product of vectors ( without complex
conjugation ). For
N dimensions it is a sum product over the last axis of `a` and
65
66
Tema 2
NumPy y SciPy
aunque es necesario advertir que puede que dicho cdigo no est disponible
para algunas funciones.
Por ltimo, cuando no concemos el nombre exacto de la funcin, o su
posible existencia, podemos realizar una bsqueda por concepto para ver qu
funciones en NumPy estn relacionadas con ese tema. Por ejemplo, si estamos
buscando algn tipo de descomposicin matricial y queremos ver qu posee
2.7
Bsqueda de informacin
67
68
Tema 2
NumPy y SciPy
2 8
SCIPY
Una frase bastante usada en el mundo de la programacin es la de no
reinventar la rueda. Se trata de no volver a hacer algo que ya est hecho
(y posiblemente de una forma mejor). Esta situacin surge en multitud de
ocasiones cuando en el proceso de la resolucin de un problema debemos
usar algn algoritmo conocido y que con seguridad ya ha sido programado
con anterioridad. En tales circunstancias suele ser una sabia decisin el usar
la implementacin ya realizada en lugar de volverla a programar. SciPy
proporciona precisamente esto: una coleccin de algoritmos matemticos ya
programados de forma eficiente de los que nicamente necesitamos saber cmo
usarlos.
SciPy est compuesto por una serie de submdulos aplicables a una diversidad de campos. La siguiente tabla muestra los mdulos disponibles:
Submdulo
Descripcin
cluster
Algoritmos de agrupamiento
constants
fftpack
integrate
interpolate
io
linalg
lgebra lineal
ndimage
Procesamiento de imgenes
odr
Regresin ortogonal
optimize
signal
Procesamiento de seales
sparse
Matrices dispersas
spatial
special
Funciones especiales
stats
Funciones estadsticas
weave
2.8
SciPy
69
y a partir de stos veremos las ideas bsicas para aprender a usar cualquiera
de los otros.
2 8 1
El submdulo optimize
N
1
[
]
100(xi x2i1 )2 + (1 xi1 )2
i=1
Y a continuacin llamaremos al optimizador usando el nombre de la funcin como parmetro de entrada. Tpicamente, en los algoritmos de optimizacin es preciso dar un punto inicial a partir del cual poner en marcha el
procedimiento; adems, nosotros proporcionamos algunas opciones adicionales en forma de diccionario:
from scipy . optimize import minimize
x0 = np.array ([1.3 , 0.7, 3.9, 3.9 , 1.2 , 1.6 ,2.1])
opciones = {'xtol ':1.e-8, 'disp ':True}
opt = minimize (rosenbrook , x0 , method ='Powell ',options =
opciones )
siendo el resultado:
Optimization terminated successfully .
Current function value : 0.000000
70
Tema 2
NumPy y SciPy
Iterations : 26
Function evaluations : 2904
resultando:
status : 0
success : True
direc: array ([[ 1.00000000 e+00 ,
0.00000000 e+00,
0.00000000 e+00,
0.00000000 e+00 ,
0.00000000 e+00,
0.00000000 e+00,
0.00000000 e+00] ,
[ -1.16178090e-06 , -1.38844961e -06,
5.31919603e-06,
1.18135619e -05 ,
4.32066364e -06 , -1.96578047e-06,
9.91290351e -06] ,
[ 1.87511323e -08,
4.17923168e-08,
6.17959385e-07,
6.04935481e -07 ,
9.14081580e -07 ,
1.69213885e-06,
2.60044460e -06] ,
[ -1.33951405e-03 , -2.63439121e -03, -6.99973806e-03,
-9.52271263e -03, -2.15130721e-02, -4.47290037e-02,
-9.44484188e -02] ,
[ 0.00000000 e+00 ,
0.00000000 e+00,
0.00000000 e+00,
0.00000000 e+00 ,
1.00000000 e+00,
0.00000000 e+00,
0.00000000 e+00] ,
[ -1.11668317e-01 , -1.97386502e -01, -1.16436208e-01,
-6.49484932e -02, -1.82185447e-02,
2.81508404e-03,
8.48222299e -03] ,
[ -6.41674658e-10 , -1.70815040e -09, -2.51554421e-09,
-6.56574489e -09, -1.31350719e-08, -2.62921083e-08,
-5.15242505e -08]])
nfev: 2904
fun: 2.2173970636557304e -21
x: array ([ 1., 1., 1., 1., 1., 1., 1.])
message : 'Optimization terminated successfully .'
nit: 26
1.
1.
1.
1.]
2.8
SciPy
71
72
Tema 2
NumPy y SciPy
2.8
SciPy
73
0.99999898
0.99999799
0.99999602
hi (x) = 0,
1 i n,
gj (x) 0,
1 j m,
lk xk uk ,
1 k N,
x30 x1 = 0,
x1 1.
74
Tema 2
NumPy y SciPy
constr2 = {'type ':'ineq ', 'fun ': lambda x: x[1] -1, 'jac ':
lambda x: np. array ([0. ,1.])}
constr = (constr1 , constr2 )
2 8 3
])
El submdulo interpolate
2.8
SciPy
75
0.97 ,
0.68 ,
0.14])
y obtener as una interpolacin basada en splines de tercer orden. Otras opciones son 'slinear' o 'quadratic' para interpolacin por splines de primer
o segundo orden, respectivamente. La Figura 2.2a muestra la interpolacin
cbica.
Por ltimo, disponemos de la funcin lagrange para calcular el polinomio
de interpolacin de Lagrange de un conjunto de puntos. En este caso, la
funcin devuelve un objeto tipo polinomio de NumPy (que puede considerarse
una funcin), que no es ms que un polinomio dado por sus coeficientes. La
Figura 2.2b muestra un grfico de dicho polinomio.
>>> from scipy . interpolate import lagrage
>>> p = lagrange (x,y)
>>> p
poly1d ([ -1.5625
, 6.77083333 , -9.47916667 ,
2.80666667 , 0.
])
1.60416667 ,
76
Tema 2
NumPy y SciPy
2 8 4
, y(0) =
y =
y y
y0
Para resolver el sistema con Python, importamos en primer lugar la funcin
odeint:
from scipy . integrate import odeint
2.9
Ejercicios
77
2 9
EJERCICIOS
E.1
10 13
A=
11 14
12 15
16 19 22 25 28
12 18 24
17 20 23 26 29
, B = 42 48 54
18 21 24 27 30
72 78 84
(
)
0
2 3
4
6
8
9
C=
10 12 14 15 16 18 20
30
36
60
66
90
96
E.2
Escribe una funcin tenga como argumento de entrada una matriz y
devuelva 1 si es simtrica, 1 si es antisimtrica y 0 en caso contrario.
E.3
Crear una funcin para construir una matriz de tamao n con una
78
Tema 2
NumPy y SciPy
2 1
0 0
1
2 1 0
..
..
.. ..
.
.
. .
0
0 0
0
0
..
.
0
..
.
..
.
2 1
1
2
0 1
2
3
4
5
10 11 12 13 14 15
20 21 22 23 24 25
30 31 32 33 34 35
40 41 42 43 44 45
50 51 52 53 54 55
1 0 1
0 1 0
1 0 1
0 1 0
2.9
Ejercicios
79
E.8
1 2
5 6
)
,
7
B=
6
A = 3
9 16
4 9 16 25
B=
9
16
25
36
16 25 36 49
E.10
Crear una funcin para construir una matriz de tamao n con una
estructura como la siguiente:
1 2 3
1 3 3
1 2 5
. . .
. . .
. . .
1 2 3
1 2
E.11
Para valores de n entre
siguiente:
.
..
..
.
n1
n1
n1
n
..
..
.
.
2n 3
n
n 1 2n 1
2
..
.
n
..
.
..
.
..
.
80
Tema 2
E.12
NumPy y SciPy
1 1
0 1
0 0
. .
. .
. .
0 0
1
..
.
..
.
..
E.13
Construye una funcin para calcular, en funcin del tamao, los
autovalores de las matrices del tipo siguiente y comprueba que su producto
coincide con el determinante:
2 1 0 0 0
1 2 1 0 0
0 1 2 1 0
. . . . .
..
. . . .
.
. .
. . . .
0 0 0 0 2
E.14
Construye una funcin tal que, dado un array de longitud cualquiera,
construya el conocido como determinante de Vandermonde.
1
1
1
1
x1
x2
x3
xn
x2
x2n
x23
x22
1
.
..
..
..
..
.
.
.
.
.
.
xn1 xn1 xn1 xn1
n
1
2
3
(xj xi )
1i<jn
Podras escribir el cdigo para calcular esta frmula usando un solo bucle?
Y sin bucles?
E.15
Crea un array aleatorio de enteros entre 0 y 100 bidimensional, de
tamao 1000 1000. Cuenta el nmero de mltiplos de 5 que hay en cada fila
y luego calcula la media de los valores obtenidos. Repite el proceso 100 veces.
Indicacin: usa el mtodo mean.
E.16
Considera un conjunto de n puntos uniformemente espaciados en el
intervalo (0, 1), x0 < x1 < < xn1 . Dada una funcin u, sabemos que una
2.9
Ejercicios
81
Para la funcin u(x) = sin(x), calcula los valores reales de su derivada segunda
en los puntos xi interiores del intervalo y compralos con los valores obtenidos
en la aproximacin.
E.17 Considera una matriz de la forma
(
)
0 I
A=
K D
donde 0 y I son la matriz nula y la matriz identidad de tamao 2 2,
respectivamente, y K y D son matrices 2 2 con la siguiente forma:
(
)
(
)
k 0.5
d
1
K=
D=
0.5 k
1 d
siendo k y d parmetros reales.
Construye una funcin que tenga como argumentos de entrada k y d,
siendo k = 1000 el valor por defecto para k, y que tenga como salida los
autovalores de la matriz A.
E.18 Resuelve el siguiente sistema de ecuaciones:
2x y z = 4
3x + 4y 2z = 11
3x 2y + 4z = 11
E.19
Crea una funcin para resolver un sistema de ecuaciones de la forma
Ax = b mediante el mtodo iterativo de Gauss-Jacobi, que puede expresarse
de la forma:
(
)
x(i+1) = D1 (L + U )x(i) + b
x2 + y = 0
82
Tema 2
E.22
NumPy y SciPy
(x 1)2 + (y 2)2
x 2y + 2 0
x 2y + 6 0
x, y 0
E.24
Para la funcin f del Ejercicio E.23, construye la interpolacin lineal a
trozos y mediante splines cbicos en los puntos de abcisa 1, 2, 3 y 4. Cunto
valen los interpoladores en el punto 2.5? Y en 0?
E.25
Resolver el siguiente problema (ecuacin de Airy):
y xy = 0
1
y(0) =
,
3
32 ( 23 )
1
y (0) =
3
3( 13 )
GRFICOS INTERACTIVOS
Comencemos con el uso interactivo con pylab. La consola IPython est
diseada para hacer uso de este mdulo de forma inmediata, bien en el
momento de la apertura de la consola, invocndola con la opcin --pylab, o
bien desde dentro de la consola con la funcin mgica %pylab:
In [1]: %pylab
Welcome to pylab , a matplotlib -based Python environment
[ backend : GTK3Agg ].
1 Graphical
83
84
Tema 3
Interactividad
3.1
Grficos interactivos
3 1 2
Figuras y grficos
85
86
Tema 3
El resultado puede verse en la Figura 3.3. Ntese que hemos usado la funcin
arange de NumPy (recurdese que pylab importa ste mdulo) y que por
tanto, x e y son arrays. Obsrvese tambin cmo el grfico es reescalado para
poder mostrar la nueva lnea en el eje que ya estaba creado.
Podramos haber hecho que el nuevo comando plot borrara el dibujo
anterior, en lugar de aadirse al existente. La funcin hold es la encargada
de activar o desactivar el estado de concurrencia, esto es, si los sucesivos
dibujos se mostrarn junto a los anteriores, o bien stos sern borrados
y sustituidos por el ltimo. Se puede cambiar de estado invocndola sin
3.1
Grficos interactivos
Si lo que queremos es borrar los grficos de la figura activa sin cerrar la ventana
disponemos de
cla () # borra los grficos pero mantiene el eje
clf () # borra los ejes pero mantiene la ventana de la figura
3 1 3
Subplots
abre una ventana como la de la Figura 3.4a y selecciona dicho eje como el
eje activo. Ntese que la figura es dividida en dos filas de tres columnas cada
87
88
Tema 3
(a)
(b)
entonces en la misma figura se crean unos ejes en la posicin 2 (ver Figura 3.4b), que sern los nuevos ejes activos. Qu ocurrir si ahora escribimos
subplot(211)? En este caso, la estructura es sobreescrita y aparecen los ejes
en la posicin que muestra la Figura 3.5, siendo ste ltimo el nuevo eje activo.
Como puede observarse, la funcin subplot permite organizar de forma
estructurada cualquier combinacin de ejes que se desee. El comando plot dibujar el grfico correspondiente sobre el eje activo. Por ejemplo, la Figura 3.6
corresponde a las siguientes rdenes:
subplot (221)
subplot (222)
subplot (212)
x= linspace (0 ,1 ,10)
y=sin(x)
z=cos(x)
w=sqrt(x)
plot(x,w) # dibuja sobre
subplot (221) # nuevo eje
plot(x,y) # dibuja sobre
subplot (222) # cambiamos
plot(x,z) # dibuja sobre
el eje
activo
el eje
de eje
el eje
activo
(221)
activo
activo
activo
(212)
(221)
al (222)
(222)
3.1
Grficos interactivos
3 1 4
Axes
crea unos ejes por defecto, que equivale a hacer subplot(111). Si a continuacin escribimos:
89
90
Tema 3
AADIENDO OPCIONES
El comando plot admite varias secuencias de datos y una serie interminable de opciones para controlar todos los aspectos del grfico. Algunas de estas
opciones son equivalentes a las de MATLAB. La Figura 3.8 muestra un par
de ejemplos.
Como podemos ver en la Figura 3.8, podemos usar, tras los arrays que
determinan los puntos del grfico, una cadena con diversos caracteres con
los que configurar algunos aspectos de la lnea usada, como el color, el estilo
de lnea o los marcadores que sealan cada uno de los puntos del grfico.
Por ejemplo, en la Figura 3.8a, los datos x, y se dibujan segn la cadena
'r-o', que significa que se ha usado color rojo, lnea continua y crculos como
marcadores. mientras que la cadena 'g:' hace uso del color verde, con lnea
punteada para dibujar la pareja x, z. En la Figura 3.8b, 'm--s' dibuja en color
3 Ntese que el posicionaminento de los ejes por defecto corresponde a las coordenadas
normalizadas [0.125,0.1,0.775,0.8].
3.2
Aadiendo opciones
x= linspace (0 ,1 ,30)
y=sqrt(x)
z=x**2
(a) plot(x,y,'r-o',x,z,'g:')
(b) plot(x,y,'m--s',x,z,'bx')
91
92
Tema 3
Color
Carcter
Marcador
azul
punto
verde
crculo
rojo
tringulo
amarillo
estrella
magenta
cruz
negro
cuadrado
blanco
signo ms
Carcter
Estilo de lnea
lnea continua
--
lnea discontinua
lnea punteada
-.
lnea semipunteada
Tambin es posible distinguir cada uno de las lneas trazadas con plot mediante una leyenda, usando una etiqueta definida por el argumento opcional
label. La leyenda se activa con el comando legend, que entre otros argumentos permite situar la leyenda en posiciones predeterminadas con la opcin
3.3
loc, el estilo de fuente, etc. Una vez ms la ayuda del comando proporciona
todas las posibilidades. La Figura 3.9 muestra el resultado de las siguientes
rdenes:
x= linspace (0 ,1 ,20)
y=x**2
z=x**3
plot(x,y, linewidth =2, label ='$x ^2$',color =(0 ,1 ,0))
plot(x,z, linestyle ='dashed ',color =(1 ,0 ,1) ,label ='$x ^3$')
title ('Un par de funciones ',fontsize =14)
legend (loc =0)
Ntese que en las cadenas de caracteres que conforman las etiquetas para la
leyenda se ha usado notacin LATEX. Tambin se han usado otras opciones del
comando plot. La leyenda debe ser activada despus de los comandos plot y
recoger todas las etiquetas en funcin del orden.
Texto y anotaciones
La Figura 3.10 ha sido generada con el siguiente cdigo:
axes( axisbg =(0.35 ,0.25 ,0.75) )
x= linspace (0 ,1 ,20)
y=x**2
plot(x,y,'b-o')
text(x[12] -0.22 ,y[12] ,u'Texto aqu ',fontsize = 12,
horizontalalignment ='right ')
arrow (x[12] -0.2 ,y[12] ,0.2 ,0. , color ='yellow ',
length_includes_head = "True", width =0.008 , head_width
=0.02)
93
94
Tema 3
Green, Blue.
3.3
95
96
Tema 3
GRFICOS Y OBJETOS
En las secciones anteriores hemos visto cmo funciona el mdulo pylab
de forma interactiva. Esta forma de trabajar es til para probar ejemplos
sencillos, pero desde nuestro punto de vista, tenemos un mayor control de lo
que sucede en un grfico si manejamos adecuadamente los objetos de los que
est compuesto. En esencia, lo que necesitamos es almacenar los objetos con
los que construimos un grfico en variables, y usar los mtodos que provee
Python para irlos modificando.
Por otra parte, en lugar de trabajar con el mdulo pylab, en esta seccin
usaremos directamente pyplot y numpy, los cuales importaremos de la forma
estndar:
import matplotlib . pyplot as plt
import numpy as np
Crearemos una figura, la cual asignamos a una variable para acceder adecuadamente a los mtodos disponibles.
fig = plt. figure ()
Los objetos grficos tienen su propia jerarqua, por ejemplo, en una figura
podemos incluir varios ejes (tal y como hacamos con subplot):
ax1 = fig. add_subplot (211)
ax2 = fig. add_subplot (212)
3.4
Grficos y objetos
97
Ahora la variable a es una lista que contiene dos objetos grficos de tipo
Line2D, y b es un slo objeto grfico de este tipo. Obsrvese el uso de la coma
para almacenar el objeto grfico y no la lista.5 Ahora podemos acceder a las
diversas propiedades de cada uno de los objetos grficos usando mtodos:
a[0]. set_linewidth (2)
a[1]. set_color ('magenta ')
b. set_label (r'$\sin x$ ')
b. set_linestyle ('--')
ax2. legend ()
b. set_marker ('s')
b. set_markerfacecolor ('r')
b. set_markersize (3)
plt.draw ()
El resultado puede verse en la Figura 3.12. Las distintas opciones para el objeto
Line2D pueden consultarse en la ayuda. Por supuesto, tambin se pueden
emplear las opciones del mismo modo que en la secciones anteriores.
Figura 3.12
Para tratar distintos elementos de un grfico, tambin es posible usar la
funcin setp que asigna una (o varias) propiedades a un objeto. Por ejemplo,
5 Podramos haber hecho tambin a, c = ax1.plot(x,y,x,z) para almacenar los elementos de la lista en variables separadas.
98
Tema 3
hara que las dos curvas de eje superior tengan ambas grosor 3, y que el eje
inferior luzca un ttulo. Las mismas propiedades que hemos modificado en los
ejemplos anteriores pueden modificarse con esta orden.
3 4 1
Un poco ms de sofisticacin
3.5
Grficos 3D
99
Figura 3.13
3 5
GRFICOS 3D
Aunque la librera Matplotlib fue diseada en principio para trabajar con
grficos bidimensionales tambin incorpora la posibilidad de realizar grficos
3D, aunque hemos de sealar que existen otras alternativas interesantes como
MayaVi.
Para usar grficos 3D con Matplotlib precisamos realizar la siguiente
importacin
from mpl_toolkits . mplot3d import Axes3D
100
Tema 3
Podemos dibujar curvas con el mtodo plot vinculado a este tipo de ejes,
usando tres listas o arreglos que proporcionan las coordenadas de los puntos
de la curva. Por ejemplo,
t
z
r
x
y
b
=
=
=
=
=
=
3.5
Grficos 3D
101
El parmetro zdir seala el eje sobre el que se dibujan los contornos, mientras
que offset seala el nivel en el que se muestran (si este parmetro no aparece,
se dibuja cada contorno en su nivel correspondiente). Ntese la seleccin de
transparencia sobre el objeto cset con el parmetro alpha y el comando setp.
102
Tema 3
EJERCICIOS
E.1
Considera un conjunto aleatorio de 100 puntos en el rectngulo
[3, 3] [3, 3]. Dibuja de color azul aqullos que se encuentren dentro del
crculo unidad, de color rojo los que se encuentren fuera del crculo unidad y
dentro del crculo de radio 2 y dibuja en verde los que estn fuera del crculo
de radio 2 y dentro de cculo de radio 3. El resto, djalos en negro. Usando
un marcador distinto, determina el ms lejano y el ms cercano al origen.
Indicacin: para dibujar puntos aislados usa el comando scatter. El parmetro s permite modificar el tamao del marcador. Usa mscaras para evitar los
bucles.
E.2
En el Ejercicio E.17 del Tema 2 de definen unas matrices A en funcin
de los parmetros k y d. Para k = 1000, considera 100 valores de d entre 0
y 100 y dibuja en el plano complejo los autovalores de dichas matrices.
Indicacin: los nmeros complejos se pueden dibujar con scatter separando
parte real y parte imaginaria.
E.3
Considera la funcin f (x) = sin(3x) cos(5x 1) en el intervalo [0, 1].
Encuentra los mximos y mnimos usando la funcin minimize_scalar del
mdulo optimize de SciPy. Dibuja la funcin y seala los puntos obtenidos,
3.6
Ejercicios
103
y 2
en [2, 2]2 .
104
Tema 3
(a) x sen(10x2 )
(e) cos(2t)et
(f) ex en (0, 1)
105
106
Tema 4
3
1
4
2
Supongamos ahora que queremos crear una estructura de barras con una
configuracin regular como la de la Figura 4.1. No es difcil construir una
funcin para obtener los arrays de coordenadas y conexiones para una estructura de este tipo. Tpicamente se construira una funcin cuyos parmetros
de entrada fueran el nmero de nodos que vamos a tener en cada dimensin y
cuya salida fueran los arrays de coordenadas y conexiones correspondientes.
No obstante, vamos a crear esta estructura mediante objetos. Inicialmente
podr parecer que es ms complicado proceder de este modo, pero ms
adelante veremos que merece la pena disear la estructura as, pues nos
facilitar la implementacin de nuevas posibilidades.
4 1
DEFINIENDO CLASES
La Programacin Orientada a Objetos requiere de una planificacin previa
de los elementos que intervienen en el diseo de un objeto. As, nuestras
estructuras estn compuestas de nodos y barras. Cada nodo ocupa un punto
del plano y estn numerados, mientras que cada barra es esencialmente una
lista de dos nodos. La propia estructura ocupa unas dimensiones en el plano
que habr que sealar. De este modo, vamos a comenzar definiendo un objeto
4.1
Definiendo clases
Las clases se definen con la palabra clave class seguida del nombre
asignado a la clase y que define el tipo de objeto y como parmetros, los objetos
de los cuales hereda (veremos el concepto de herencia un poco ms abajo).2
Es una convencin ampliamente usada nombrar las clases definidas por el
usuario con la inicial en maysculas. Tambin es muy conveniente documentar
adecuadamente la clase.
Como es habitual en Python, la sangra marcar el fragmento de cdigo
correspondiente a la clase. A continuacin, aunque en Python no es obligatorio, aparece el denominado constructor. Se trata del mtodo __init__ que
se ejecuta cuando la clase se instancia. El proceso de instanciacin no es ms
que la definicin de un objeto perteneciente a esta clase.
Puesto que __init__ es un mtodo, esto es, una funcin, se define como ya
vimos con la palabra clave def. Los argumentos de los mtodos de una clase
son un poco peculiares pues el primero de ellos siempre es self, que se refiere
al propio objeto.3 El resto de argumentos deber aparecer en el momento de
instanciar al objeto, y los podemos entender como los argumentos de entrada
en la creacin del objeto.
De este modo, para definir un objeto punto, instanciamos su clase del
siguiente modo:
>>> p = Point (2. ,3.)
En principio no hay mucho ms que hacer con un objeto de este tipo. Podemos
acceder a sus atributos o bien modificarlos:
>>> p.x
2.0
>>> p.y
3.0
>>> p.x = 5.
3 Esto
107
108
Tema 4
>>> print p
<__main__ . Point instance at 0 x7fb7f0235128 >
Vamos ahora a construir los objetos de tipo nodo. Bsicamente este objeto
no es ms que un punto junto con un identificador. Una primera opcin podra
ser esta:
class Nodo( object ):
"""
describe un nodo mediante identificador y punto
"""
def __init__ (self ,n,a,b):
self.id = n
self.p = Point (a,b)
Entonces,
>>> a = Nodo (0 ,1. ,3.)
>>> a.id
0
>>> print a.p
(1.0 ,3.0)
>>> b.p.x
1.0
Sin embargo, dado que hay una gran similitud entre los objetos tipo punto
y los objetos tipo nodo, otra opcin consiste en apoyarse en el concepto de
herencia, que no es ms que el establecimiento de una relacin entre dos
clases, de manera que los atributos y mtodos de una puedan ser usados en
la otra. En nuestro caso es evidente que los atributos x e y de la clase Point
debern mantenerse en la nueva clase que vamos a crear, por lo que podemos
aprovecharnos del constructor de la clase Point usando el comando super:
class Node(Point ):
"""
clase que hereda de la clase Point
"""
numberNode = 0
4.1
Definiendo clases
Ntese que para la impresin del objeto Node se est usando el mtodo
__str__ de la clase Point. Si quisiramos una impresin distinta habra que
definir nuevamente el mtodo __str__ para esta clase.
Ahora no debe ser difcil para el lector entender la clase para las barras
siguiente:
class Bar( object ):
"""
define una barra soportada por dos nodos
"""
def __init__ (self ,n1 ,n2):
if n1.id == n2.id:
print "Error : no hay barra "
return
elif n1.id < n2.id:
self.orig = n1
self.fin = n2
else:
self.orig = n2
self.fin = n1
def __str__ (self):
return "Barra de extremos los nodos {0} y {1}". format (
self.orig.id ,self.fin.id)
109
110
Tema 4
4.1
Definiendo clases
# construccin de barras
for j in range (ny):
for i in range (nx):
n1 = i+ j*(nx +1)
n2 = n1 + 1
n3 = n1 + nx + 1
n4 = n3 + 1
# barras en cada elemento
b1 = Bar(self.nodos [n1],self.nodos [n2])
b2 = Bar(self.nodos [n1],self.nodos [n3])
b3 = Bar(self.nodos [n1],self.nodos [n4])
b4 = Bar(self.nodos [n2],self.nodos [n3])
self. barras . extend ([b1 ,b2 ,b3 ,b4 ])
# barras finales a la derecha
self. barras . append (Bar(self.nodos[n2],self.nodos[
n4 ]))
# barras de la lnea superior
indice =ny *(nx +1) +1
for j in range (nx):
self. barras . append (Bar(self.nodos[ indice +j-1], self
. nodos[ indice +j]))
Ntese que hemos definido un par de listas: nodos y barras en las que almacenar los elementos que nos interesan. Ponemos el contador del identificador
de nodos a cero, de manera que cada vez que tengamos una estructura, los
nodos se creen comenzando el identificador a 0. Tal y como est construido, el
identificador de cada nodo coincide con el ndice que ocupa en la lista nodos,
lo que nos simplifica la bsqueda de los nodos. Una alternativa hubiera sido
escribir:
n = Node(xx ,yy)
self.nodos[n.id] = n
en lugar de la lnea self.nodos.append(Node(xx,yy)), pero para ello hubiera sido preciso dimensionar primero la lista o hacer uso de slicing, lo que
complica innecesariamente el cdigo.
Para obtener los nodos y las barras disponemos de las listas anteriores,
pero ser ms cmodo si definimos unos mtodos que nos proporcionen directamente la informacin que realmente queramos precisar de la estructura,
esto es, las coordenadas de los nodos y los ndices correspondientes a cada
barra.
Por ello, a la clase anterior le aadimos los siguientes mtodos:
def get_coordinate (self):
coordenadas =[]
for nod in self.nodos :
coordenadas . append ([ nod.x,nod.y])
return np.array ( coordenadas )
111
112
Tema 4
Es evidente que podramos haber creado una funcin que tuviera como
entrada las coordenadas de los puntos del rectngulo y el nmero de nodos a
usar en cada dimensin, y cuya salida fuera precisamente los dos arrays que
hemos obtenido; posiblemente hubiera sido incluso ms sencillo de implementar. Sin embargo, como ahora veremos, es ms conveniente el uso de clases
porque nos va a permitir una flexibilidad aun mayor.
4 1 1
Modificando clases
Supongamos que ahora queremos dibujar la estructura obtenida. Si hubiramos implementado una funcin tendramos dos opciones: o bien modificamos la funcin creada para aadirle la parte grfica, o bien implementamos
la parte grfica en una funcin aparte, que reciba los arrays que definen la
estructura y los dibuje.
La primera opcin puede resultar un engorro, pues cada vez que ejecutemos
la funcin obtendremos los arrays y el grfico y habr ocasiones en las que
queramos crear slo la informacin de la estructura y otras en las que slo
queramos dibujar. La segunda opcin nos obliga a llamar primero a la funcin
para obtener los arrays de coordenadas y conexiones, y luego pasarlos a la
nueva funcin para dibujar.
Sin embargo, implementar un nuevo mtodo dentro de la clase para que
construya el grfico es mucho ms cmodo, pues podremos invocarlo independientemente de que construyamos o no los arrays de coordenadas y conexiones.
4.2
113
De este modo, una vez creada una estructura, nos bastar con invocar al
mtodo plotting para obtener el grfico correspondiente.
Algo similar ocurre si queremos modificar la estructura eliminando alguna
barra: bastar con implementar un mtodo adecuadamente:
def remove_bar (self ,n1 ,n2):
for bar in self. barras :
if bar.orig.id == n1 and bar.fin.id == n2:
self. barras . remove (bar)
self. nBarras -= 1
return
else:
print "No existe tal barra "
(4.1)
114
Tema 4
de la forma
A=D+L+U
donde D es una matriz diagonal, L es triangular inferior y U es triangular
superior, entonces el mtodo de Jacobi se define mediante
M = D1 (L U ),
c = D1 b,
c = (D + L)1 b.
4.2
y se imprime el nmero de
funcionamiento del cdigo en
10 1
1 11
2 1
0
3
2
0
x1
6
1
3
x2 = 25
10 1 x3 11
1
8
x4
15
A = np.array
([[10 , -1 ,2 ,0.] ,[ -1 ,11 , -1 ,3] ,[2 , -1 ,10 , -1] ,[0 ,3 , -1 ,8]])
b = np.array ([6. ,25 , -11 ,15])
>>> iterativo (A,b)
Iteraciones realizadas : 23
array ([ 1., 2., -1., 1.])
>>> iterativo (A,b, seidel )
Iteraciones realizadas : 10
array ([ 1., 2., -1., 1.])
En principio, sera un cdigo que cumple a la perfeccin con nuestros propsitos iniciales. No obstante, vamos a implementar una versin del mismo
algoritmo usando clases:
class Resolucion ( object ):
def __init__ (self ,A,b, metodo = jacobi ):
self.A = A
self.b = b
self. metodo = metodo
self.x0 = np.zeros (self.A. shape [0])
self.eps = 1.e -8
def iteracion (self):
self.k=0
M,c = self. metodo (self.A,self.b)
x0 = self.x0
x = np. ones_like (x0)
while np. linalg .norm(x-x0) > self.eps*np. linalg .norm(
x0):
x0 = x.copy ()
x = np.dot(M,x0) + c
self.k += 1
return x
115
116
Tema 4
1.])
2.00000122 , -1.00000183 ,
0.99999931])
4.3
Ejercicios
jacobi
Precisin :
Precisin :
Precisin :
Precisin :
Precisin :
Precisin :
seidel
Precisin :
Precisin :
Precisin :
Precisin :
Precisin :
Precisin :
117
1e -02
1e -04
1e -06
1e -08
1e -10
1e -12
-------------
Iteraciones :
Iteraciones :
Iteraciones :
Iteraciones :
Iteraciones :
Iteraciones :
7
12
18
23
28
34
1e -02
1e -04
1e -06
1e -08
1e -10
1e -12
-------------
Iteraciones :
Iteraciones :
Iteraciones :
Iteraciones :
Iteraciones :
Iteraciones :
3
6
8
10
11
13
EJERCICIOS
E.1
Redefine el constructor de la clase Bar de la seccin 4.1 de manera que
al instanciar un nuevo objeto se imprima la informacin del objeto creado.
Por ejemplo, debera funcionar del siguiente modo:
>>> n1 = Node (0 ,0. ,1.)
>>> n2 = Node (1 ,1. ,2.)
>>> barra = Bar(n1 ,n2)
Se ha creado una barra de extremos (0.0 ,1.0) y (1.0 ,2.0)
E.2
Para la clase Truss de la seccin 4.1, escribir un mtodo para que
el comando print proporcione informacin sobre el nmero de nodos y el
nmero de barras de la estructura.
E.3
Define una clase que contenga dos mtodos: getString con el que
obtener una cadena de texto introducida por teclado y printString que
imprima la cadena obtenida en maysculas, dejando un espacio de separacin
entre cada letra. Debera funcionar del siguiente modo:
>>> a = InputOutString ()
118
Tema 4
>>> a. getString ()
hola
>>> a. printString ()
H O L A