Вы находитесь на странице: 1из 22

13

Hans Petter
Langtangen
Una cartilla en
Programacin
Cientfica
conPython
Cuarta edicin
textosde la ciencia computacional y la ingeniera
Editorial Board TJBarth M.Griebel DEKeyes RMNieminen

D.Roose T.Schlick

6 Textos en Ciencias de
la Computacin e Ingeniera
Editores Timothy J. Michael Barth Griebel David E. Keyes Risto Nieminen Dirk
M. Roose Tamar Schlick

Hans Petter Langtangen

Una cartilla en Programacin Cientfica


con elPython
Cuarta edicin

Laboratorio de Investigacin deHans Petter Langtangen Simula Lysaker, Noruega Fornebu

en licencia del
Departamentode Informtica de la Universidad de Oslo, Noruega
ISSN 1611-0994 Textos en Ciencias de la Computacin e Ingeniera ISBN 978-3-642-54958-8 ISBN 978-3-642-54959-5
(eBook) DOI 10.1007 / 978-3-642-54959-5 Springer Heidelberg Nueva York Dordrecht Londres
Biblioteca del Congreso Nmero de Control: 2014945465
Mathematics Subject Classification (2000): 26-01, 34A05, 34A30, 34A34, 39-01, 40-01, 65D15, 65D25, 65D30, 68-01, 68N01,
68N19, 68N30, 70-01, 92D25 , 97-04, 97U50
Springer-Verlag Berlin Heidelberg 2009, 2011, 2012, 2014 Esta obra est sujeta a derechos de autor. Todos los derechos estn
reservados por el editor, si la totalidad o parte del material se refiere, en concreto los derechos de traduccin, reimpresin, la
reutilizacin de las ilustraciones, la recitacin, la radiodifusin, la reproduccin en microfilm o en cualquier otra forma fsica, y
el almacenamiento de transmisin o informacin y recuperacin, adaptacin electrnica, software, o por la metodologa similar o
no conocido actualmente o desarrollado en el futuro. Estn exentas de esta reserva legal son breves extractos en relacin con los
exmenes o anlisis acadmico o materiales suministrados especficamente con el propsito de ser introducido y ejecutado en un
sistema informtico, para su uso exclusivo por parte del comprador de la obra. La duplicacin de esta publicacin o partes de los
mismos slo se permite bajo las disposiciones de la Ley de Propiedad Intelectual de la ubicacin del Editor, en su versin actual,
y el permiso para su uso siempre debe ser obtenido de Springer. Siones permiso para su uso se pueden obtener a travs de
Rightslink al Copyright Clearance Center. Violacines deben ser procesados bajo la respectiva Ley de Propiedad Intelectual. El
uso de nombres descriptivos generales, nombres registrados, marcas comerciales, marcas de servicio, etc. en esta publicacin no
implica, incluso en ausencia de una declaracin especfica, que estos nombres estn exentos de las leyes y reglamentos de
proteccin pertinentes y, por tanto, libres para uso general usar. Mientras que el asesoramiento y la informacin en este libro se
cree que son verdaderos y exactos a la fecha de publicacin, ni los autores ni los editores ni el editor puede aceptar ninguna
responsabilidad legal por cualquier error u omisin que se pueden hacer. El editor ofrece ninguna garanta, expresa o implcita,
con respecto a los materiales contenidos en este documento.
Impreso en papel sin cido
Springer es parte de Springer Science + Business Media (www.springer.com)

Prefacio
El objetivo de este libro es ensear a la computadora programacin utilizando ejemplos de las
matemticas y las ciencias naturales. Hemos optado por utilizar el lenguaje de programacin
Python, ya que combina el poder expresivo con una sintaxis muy limpia, simple y compacto.
Python es fcil de aprender y muy adecuado para una introduccin a la programacin de
computadoras. Python tambin es bastante similar a MATLAB y un buen lenguaje para hacer
de clculo matemtico. Es fcil de combinar Python con lenguajes compilados, como Fortran, C
y C ++, que sean idiomas para clculos cientficos ampliamente utilizado.
Los ejemplos de este libro integran la programacin con aplicaciones a las matemticas, la
fsica, la biologa y las finanzas. Se espera que el lector tenga conocimiento de base de clculo
de una variable como se ensea en programas intensivos Matemticas- en las escuelas
secundarias. Sin duda, es una ventaja para tomar un curso de clculo universitario en paralelo,
que contiene preferentemente aspectos clsicos y numricos de clculo. Aunque no es
estrictamente necesario, una formacin en fsica de secundaria hace que muchos de los
ejemplos ms significativos.
Muchos libros de programacin introductorias son bastante compacto y se centran en la lista
funcionalidad de un lenguaje de programacin. Sin embargo, aprender a programar es
aprender a pensar como un programador. Este libro tiene su foco principal en el proceso de
pensamiento, o equivalente: la programacin como una tcnica de resolucin de problemas. Es
por eso que la mayora de las pginas estn dedicadas al estudio de casos en la programacin,
donde definimos un problema y explicar cmo crear el programa correspondiente. Nuevas
construcciones y estilos de programacin (lo que podramos llamar la teora) tambin se
introducen generalmente a travs de ejemplos. Se presta especial atencin a la verificacin de
los programas y para la bsqueda de errores. Estos temas son muy exigentes para el software
matemtico, porque los inevitables errores numricos de aproximacin son posiblemente
mezcladas con errores de programacin.
v

Prefaciovi

Mediante el estudio de los muchos ejemplos en el libro, espero que los lectores aprendern
cmo pensar derecho y por lo tanto escribo programas en un ms rpido y de manera ms
fiable. Recuerde, nadie puede aprender a programar con slo leer - uno tiene que resolver una
gran cantidad de ejercicios prcticos. El libro es, por tanto, lleno de ejercicios de varios tipos:.
Modificaciones de los ejemplos existentes, completamente nuevos problemas, o la depuracin
de programas impartidos
Para trabajar con este libro, le recomiendo usar Python versin 2.7. Por captulos 5-9 y
apndices AE necesita los paquetes NumPy y matplotlib, preferiblemente tambin los paquetes
IPython y SciTools, y para el Apndice G Cython se requiere. Otros paquetes utilizados
ocasionalmente en el texto son la nariz y SymPy. Seccin H.1 tiene ms informacin sobre
cmo puede obtener acceso a Python y los paquetes mencionadoshttp:.
Hay una pgina web asociado con este libro, // Hplgit. github.com/scipro-primer, que
contiene todos los programas de ejemplo del libro, as como informacin sobre la instalacin
del software en diversas plataformas. Python versin 2 o 3? Un problema comn entre los
programadores de Python es elegir entre la versin 2 o 3, que en el momento de escribir esto
significa elegir entre la versin 2.7 y 3.4. La recomendacin general es ir para Python 3, porque
esta es la versin que se va a desarrollar en el futuro. Sin embargo, todava hay un problema
que mucho software matemtico til en Python an no ha sido portado a Python 3. Por lo tanto,
la computacin cientfica con Python an contina en su mayora con la versin 2. Una
estrategia ampliamente utilizada para los desarrolladores de software que quieren escribir
cdigo Python que trabaja con ambas versiones, es el desarrollo de la versin 2.7, que est
muy cerca de lo que se encuentra la versin 3.4, y luego usar la herramienta de traduccin 2to3
para traducir automticamente de Python 2 a Python 3.
Al utilizar v2.7, usted debe emplear la ms nueva sintaxis y mdulos que conforman las
diferencias entre Python 2 y 3 muy pequeo. Esta estrategia se adopt en el presente libro.
Slo se esperan dos diferencias entre las versiones 2 y 3 para ser significativo para los
programas en el libro: a / b para enteros ayb implica flotador divisin Python 3 y divisin de
enteros en Python 2. Adems, print 'Hola' en Python 2 mosto convertirse en una llamada a la
funcin de impresin ("Hola") en Python 3. Ninguna de estas diferencias debe conducir a
problemas molestos cuando los lectores futuros estudian ejemplos v2.7 del libro, pero el
programa en Python 3. De todos modos, corriendo 2to3 en el ejemplo archivos genera el
correspondiente cdigo Python 3. Contenidos. Captulo 1 introduce variables, objetos, mdulos,
y formato de texto a travs de ejemplos relativos a la evaluacin de frmulas matemticas. El
captulo 2 presenta la programacin con tiempo y para bucles, as como listas, incluidas las
listas anidadas. El siguiente captulo trata con otros dos conceptos fundamentales en la
programacin: funciones y pruebas if-else. Lectura adicional con xito de las demandas de
libros que se digieren los captulos 1-3.

Prefacio vii

Cmo leer los datos en los programas y hacer frente a los errores de entrada son los temas
del captulo 4. El captulo 5 introduce matrices y computacin array (incluyendo vectorizacin) y
cmo esto se utiliza para el trazado y = f (x) curvas y haciendo animacin de curvas. Muchos
de los ejemplos en los primeros cinco captulos estn fuertemente relacionados. Por lo general,
las frmulas del primer captulo se utilizan para producir tablas de nmeros en el segundo
captulo. Entonces las frmulas se encapsulan en funciones en el tercer captulo. En el prximo
captulo, la entrada a las funciones se obtienen de la lnea de comandos o desde un dilogo de
preguntas y respuestas con el usuario, y se aaden controles de validez de la entrada. Las
frmulas se muestran a continuacin en forma de grficos en el captulo 5. Despus de haber
estudiado los captulos 1.5, el lector debe tener suficiente conocimiento de programacin para
resolver problemas matemticos por lo que muchos se refieren como la programacin de "estilo
MATLAB".
Captulo 6 explica cmo trabajar diccionarios y cadenas, especialmente para la interpretacin
de los datos de texto en los archivos y el almacenamiento de la informacin extrada en
estructuras de datos flexibles. Programacin de clases, incluyendo los tipos definidos por el
usuario para clculos matemticos (con operadores sobrecargados), se introduce en el captulo
7. El captulo 8 trata de nmeros aleatorios y computacin estadstica con aplicaciones a
juegos y paseos aleatorios. Programacin, en el sentido de las jerarquas de clase y herencia
orientada a objetos, es el tema del captulo 9. Los ejemplos claves aqu tratan con herramientas
de construccin para la diferenciacin numrica y la integracin, as como grficos.
Apndice A presenta la modelacin matemtica, utilizando secuencias y ecuaciones en
diferencias . Solamente los conceptos de programacin de los captulos 1-5 se utilizan en este
apndice, con el objetivo de consolidar los conocimientos bsicos de programacin y aplicarlo a
problemas matemticos. Algunos temas matemticos importantes se introducen a travs de
ecuaciones en diferencias de una manera sencilla: el mtodo de Newton, de la serie de Taylor,
funciones inversas, Sistemas Dinmicos y denumrica..
ofertas Apndice B con funciones sobre una malla, la diferenciacin numrica, y la
integracin Una simple introduccin a las ecuaciones diferenciales ordinarias y su tratamiento
numrico se proporciona en el Apndice C Apndice D muestra cmo un proyecto completo en
la fsica se puede resolver mediante la modelizacin matemtica, mtodos numricos, y
elementos de programacin de los captulos 1-5. Este proyecto es un buen ejemplo en la
resolucin de problemas en la ciencia computacional, donde es necesaria la integracin de la
fsica, las matemticas, los dgitos, y la informtica.
Cmo crear software para resolver ecuaciones diferenciales ordinarias, utilizando tanto la
funcin y basados en la programacin orientada a objetos, es el tema del Apndice E. El
material en este apndice rene a muchas partes del libro en el contexto de las aplicaciones
fsicas.
Apndice F se dedica al arte de la depuracin, y en la solucin de un problema de hecho en
general. La aceleracin de clculos numricos en Python por

Prefacio viii

migrar cdigo de C a travs Cython se ejemplifica en el Apndice G ,. Por ltimo, el Apndice H


se ocupa de diversos temas tcnicos ms avanzados.
La mayora de los ejemplos y ejercicios de este libro son bastante cortos. Sin embargo,
muchos de los ejercicios estn relacionados, y juntos forman los proyectos ms grandes, por
ejemplo, en la serie de Fourier (3,15, 4,20, 4,21, 5,39, 5,40), la integracin numrica (3.6, 3.7,
5.47, 5.48, A.12), Taylor funciones inversas de la serie (3.31, 5.30, 5.37, A.14, A.15, 7,23),
funciones a trozos constantes (3.23 a 3.27, 5.32, 5.45, 5.46, 7.19 a 7.21), (E.17-E.20), la cada
de objetos (E.8, E.9, E.38, E.39), crecimiento de la poblacin oscilatoria (A.19, A.21, A.22,
A.23), el modelado de enfermedades epidmicas (E.41-E 0,48), timizacin opcin y finanzas
(A.24, 8,39, 8,40), estadstica y probabilidad (4,23, 4,24, 8,21, 8,22), los juegos de azar (08.08
a 08.13), paseo aleatorio y fsica estadstica (8,30-8,37) , el anlisis de datos ruidoso (8,418,43), mtodos numricos (5.23 a 5.25, 7.8, 7.9, A.9, 7,22, 9.15 a 9.17, E.30-E.37), la
construccin de una calculadora clculo (7,33, 9,18, 9,19 ), y la creacin de un conjunto de
herramientas para la simulacin de vibracin sistemas de ingeniera (E.50-E.55).
Captulos 1.9 junto con los Apndices A y E tienen desde 2007 formaron el ncleo de un
primer curso de licenciatura semestre de introduccin a la programacin cientfica de la
Universidad de Oslo (INF1100, 10 crditos ECTS).
Los cambios de la tercera a la cuarta edicin. Un gran nmero de los ejercicios se han
reformulado y reorganizado. Por lo general, los ejercicios ms largos se dividen en sub-puntos
a), b), c), etc., diferentes tipo de ayuda es eliminado en prrafos separados marcados con Hint,
y la informacin que pone el ejercicio en un contexto ms amplio se coloca en el extremo bajo
las Observaciones Direccin. Bastantes algunos ejercicios relacionados se han fusionado. Otro
cambio importante es el enfoque aplicado en la prueba y verificacin. Ya tan pronto como
funciones se introducen en el Captulo 3, comenzamos verify- ing las implementaciones a
travs de funciones de prueba por escrito de acuerdo con los convenios en el marco de
pruebas de la nariz. Esto se continu durante todo el libro y, especialmente, incorporado en los
ejercicios reformulados. Exmenes impugna en programas contienen errores de aproximacin
desconocidos, por lo que las estrategias para la bsqueda de problemas de prueba apropiados
tambin se han convertido en una parte integral de la cuarta edicin.
Muchos captulos se refieren ahora a la Python tutor en lnea para visualizar el flujo del
programa. Esta es una esplndida herramienta para el aprendizaje de lo que sucede con las
variables y ejecucin de sentencias en pequeos programas. El paquete SymPy para la
computacin simblica es una herramienta poderosa en la programacin cientfica y ya
introducido en el captulo 1. Las secciones en el Captulo 4 se han reorganizado, y la
informacin bsica sobre la lectura y escritura de archivos fue trasladado desde el captulo 6
del captulo 4. La cuarta edicin caractersticas claramente tres partes bien diferenciadas:
conceptos bsicos de programacin en los captulos 1-5, los conceptos de programacin ms
avanzados en los captulos 6-9, y la programacin para la solucin de problemas cientficos en
el Apndice AEimportancia.
Secciones 4.9 y 4.10.2 se han reescrito para enfatizar la de funciones de prueba. La
informacin sobre cmo hacer animaciones y

Prefacio ix

videosen las secciones 5.3.4 y 5.3.5 se ha sometido a una revisin sustancial. Seccin 6.1.7 ha
sido completamente reescrito para reflejar mejor la forma de trabajar con los datos asociados a
fechas.
Apndice E se ha vuelto a trabajar para que la programacin basada en la funcin y la
programacin orientada a objetos aparecen en secciones separadas. Esto permite leer el
apndice y la resolucin de ecuaciones diferenciales ordinarias sin el conocimiento de las
clases y herencia. Gran parte del texto en el Apndice E se ha reescrito y ampliado, los
ejercicios son revisadas sustancialmente, y se han aadido varios ejercicios nuevos.
Seccin H.1 es nuevo y se describen las diversas opciones para obtener acceso a Python y
sus paquetes para clculos cientficos. En este tema se incluye, por ejemplo, la instalacin de
software en las computadoras porttiles personales y escribir cuadernos en servicios en la
nube.
Adems de los cambios mencionados, un gran nmero de cambios ms pequeos, mejores
explicaciones, y correccin de errores ortogrficos se han in- corporado en la nueva edicin.
Estoy muy agradecido a todos los lectores, instructores y estudiantes que han enviado
mensajes de correo electrnico con correcciones o sugerencias de mejora.
El cambio ms grande tal vez para m era pasar todo el manuscrito de LAT
E
X para Doconce1. Este movimiento permite un sicin mucho ms flexible nente de
temas para diversos fines, y el apoyo a la produccin en diferentes formatos como LAT
E
X, HTML, Esfinge, Markdown, cuadernos IPython y MediaWiki. Los
captulos se han hecho ms independiente mediante la repeticin de conocimientos clave, que
se abre para lectura significativa de slo partes del libro, incluso en las partes ms avanzadas.
Agradecimientos. Este libro naci de estimular las conversaciones con mi colega cercano Aslak
Tveito, y comenz a escribir lo que es ahora el Apndice B y C. El proyecto libro entero y el
curso universitario asociado fueron crticamente dependiente de papel entusiasta de Aslak en
2007. El apoyo continuo de Aslak respecto a mis proyectos de libros es muy apreciado y
contribuye en gran medida a mi gran motivacin. Otro factor clave en los primeros das fue
Ilmar Wilbers. Hizo grandes esfuerzos con la asistencia el proyecto del libro y el
establecimiento de la INF1100 curso universitario. Siento que sin Ilmar y sus soluciones a
numerosos problemas tcnicos no se habra completado la primera edicin del libro. Johannes
H. Anillo tambin merece un reconocimiento especial para el desarrollo de la herramienta de
grficos Easyviz y por su cuidadoso mantenimiento y soporte de software asociado con el libro
sobre los aos.
Profesor Loyce Adams estudi todo el libro, resolvi todos los ejercicios, encontr numerosos
errores, y muchas mejoras sugeridas. Sus contribuciones son tan apreciados. Ms
recientemente, Helmut Bch trabaj muy cuidadosamente a travs de todos los detalles en los
captulos 1-6, prob el software, encontr muchos errores tipogrficos, y las preguntas ms
importantes que llevaron a
1 https://github.com/hplgit/doconce

x Prefacio

lotesde mejoras significativas . Estoy muy agradecido por todos sus esfuerzos y por su
entusiasmo durante los preparativos de la cuarta edicin.
Un agradecimiento especial a Geir Kjetil Sandve por ser el autor principal de los ejemplos de
bioinformtica computacionales en los puntos 3.3, 6.5, 8.3.4 y 9.5, con contribuciones de
Sveinung Gundersen, Ksenia Khelik, Halfdan Rydbeck, y Kai Trengereid.
Varias personas han contribuido con sus sugerencias para mejorar el texto, los ejercicios, y
el software asociado. Lo har en particular mencin Ingrid Eide, Stle Zerener Haugnss,
Kristian Hiorth, Arve Knudsen, Tobias Vidarssnn Langhoff, Martin Vonheim Larsen, Kine
Veronica Lund, Solveig Masvie, Hkon Mller, Rebekka Morken, Mathias Nedreb, Marit
Sandstad, Helene Norheim Semmerud, Lars Storjord, Fredrik Heffer Valdmanis y Torkil
Vederhus. Hakon Adler se reconoce en gran medida por su cuidadosa lectura de diversos
primeras versiones del manuscrito. Muchas gracias a los profesores Fred Espen Bent, rnulf
Borgan, Geir Dahl, Knut Morken, y Geir Pedersen para la formulacin de varios ejercicios
interesantes de diversos campos de aplicacin. Tambin aprecio la imagen del libro hecha por
mi buen amigo Jan Olav Langseth.
Este libro y el curso asociada son partes de una reforma integral y exitoso en la Universidad
de Oslo, llamados Computacin en la Educacin la Ciencia. El objetivo de la reforma es la
integracin de la programacin de computadoras y simulacin en todos los cursos de
licenciatura en ciencias naturales donde se utilizan cas modelos matem-. El presente libro
sienta las bases para el problema computarizada moderna tcnica de resolucin que se
aplicar en los cursos posteriores. Ha sido muy inspirador para trabajar en estrecha
colaboracin con las fuerzas impulsoras detrs de esta reforma, especialmente los profesores
Morten Hjorth-Jensen, Anders Malthe-Sorenssen, Knut Morken y Arnt Inge Vistnes.
La excelente asistencia del sistema de Springer, en particular, Martin Peters, Thanh-Ha Thi
Le, Ruth Allewelt, Peggy Glauch-Ruge, Nadja Kroke, Thomas Schmidt, Patrick Waltemate y
Donatas Akmanavicius, es muy apreciada, y se asegur una produccin rpida y sin problemas
de todas las ediciones de este libro.
Oslo, marzo de 2014 Hans Petter Langtangen

Вам также может понравиться