Documentos de Académico
Documentos de Profesional
Documentos de Cultura
UNED, 2021
Tema 1
1-1
1-2 TEMA 1. INTRODUCCIÓN A LA FÍSICA COMPUTACIONAL
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
d2 r
F =m (1.1)
dt2
1.1. MATEMÁTICAS EN FÍSICA 1-3
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
cuya solución queda determinada de manera única cuando se conocen las dos condi-
ciones iniciales dadas par la velocidad y posición inicial del móvil
dr
= v0, r(t = 0) = r 0 (1.2)
dt t=0
Es muy probable que muchos alumnos de esta asignatura sean aficionados (pro-
bablemente muy expertos) a los ordenadores y la programación, para ellos esta asig-
natura será, sin duda alguna, muy sencilla. Este apartado está dirigido principalmente
a los que todavía no lo son. Para aquellos alumnos que no estén demasiado fami-
liarizados con la programación vamos a incluir a continuación algunas indicaciones
generales.
Como es sabido, los ordenadores son máquinas capaces de almacenar y manipu-
lar información, almacenada en su interior en código binario. Para la manipulación de
la información los ordenadores disponen de un procesador, que puede ser programado
para realizar distintas operaciones. En última instancia, el procesador de un ordena-
dor maneja información en código binario. Esto significa que a nivel del procesador la
información está codificada en una inmensa secuencia de ceros y unos, asignados a
unas variables elementales, dadas por las direcciones de memoria sobre las que ope-
ra el procesador, de modo que la actividad del procesador se reduce a mover estos
ceros y unos de unas direcciones de memoria a otras, y a intercambiar sus valores.
Resulta obvio que este nivel fundamental de funcionamiento (denominado bajo nivel)
queda muy lejos del nivel que a nosotros nos resulta inteligible, basado no en ceros y
unos, sino en archivos de texto, de audio, de video, programas ejecutables, gráficas,
comunicaciones, etc. (este nivel se denomina alto nivel).
El programa que permite al usuario comunicarse con el procesador es el Sistema
Operativo (generalmente programado en lenguaje C). El funcionamiento de un ordena-
dor, el tipo de cosas que podremos hacer con él y la forma de hacerlas, está totalmente
condicionado por el sistema operativo que tenga instalado.
1.2. USO EFICIENTE DE ORDENADORES PARA TRABAJO CIENTÍFICO. SO LINUX1-7
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
Figura 1.2: Elección del tipo de instalación y particionado del disco para instalar Linux.
para que la aplicación funcione, pero no instrucciones que sean comunes con otras
aplicaciones o datos de ésta. Las instrucciones comunes entre aplicaciones forman
bibliotecas de funciones. Los datos, forman los archivos compartidos de datos. Las
aplicaciones que realizan tareas especializadas que son útiles a las demás aplicacio-
nes, se instalan como servicios (el caso del servidor X o el caso de un servidor web).
Esta filosofía explica dónde se guardan los ficheros destinados a cada tarea, como se
muestra en la siguiente tabla.
1.3. MANTENIMIENTO E INSTALACIÓN DE PAQUETES INFORMÁTICOS ADICIONALES1-13
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
axiom - A general purpose computer algebra system: main binary and modules
Para instalar una aplicación, emplearemos también los “dnf” y “apt”. Así, por ejemplo,
si queremos instalar un programa para hacer gráficas (“plot” en Inglés), lo buscaremos
primero con
dnf search plot (Fedora)
apt search plot (Debian/Ubuntu)
lo que nos encontrará (entre muchos otros), el paquete “gnuplot”:
gnuplot - A command-line driven interactive plotting program
Para instalarlo ordenaremos
dnf install gnuplot (Fedora)
apt install gnuplot (Debian/Ubuntu)
En ese momento se nos informará de todas las dependencias que tiene este pa-
quete con otros, que se instalarán esos otros además del gnuplot, que se recomiendan
otros paquetes (como el gnuplot-doc, que contiene la ayuda de la aplicación), etc. He-
cho esto, se tendrá la aplicación instalada. Además la búsqueda nos habrá sugerido
paquetes ayudantes, como
plotdrop - A minimal GNOME frontend to GNUPlot
que podremos instalar también para facilitarnos el uso de Gnuplot. Cuando seamos
usuarios avanzados, sin embargo, eliminaremos esta aplicacioncita con
dnf remove plotdrop (Fedora)
apt remove plotdrop (Debian/Ubuntu)
En esa acción, el gestor de paquetes se encargará de no eliminar nada que pueda
afectar a otras aplicaciones (y en caso de que alguna aplicación utilizara “plotdrop”
como auxiliar para crear gráficas, nos prohibiría desinstalarlo. . . sin antes haber des-
instalado la otra aplicación dependiente).
Durante los estudios universitarios tendrá que realizar diversos documentos para
su posterior presentación y en muchos casos evaluación. Por otra parte también es
cierto que en la actualidad se da por hecho que cualquier persona que haya superado
unos estudios universitarios (o incluso que esté realizando los últimos cursos de di-
chos estudios) debe ser capaz de realizar documentos impresos, o electrónicos, con
una calidad de presentación profesional. En un pasado no demasiado lejano, y por
tanto familiar a muchos estudiantes de esta universidad, se consideraba como algo
normal realizar estos documentos “a máquina” o incluso “a mano”, pero (algunos dirán
que lamentablemente) aquellos tiempos ya pasaron. . . . En la actualidad el estándar
comúnmente aceptado es que (casi) cualquier documento que vayamos a presentar
debe haber sido realizado con un ordenador por medio de un procesador de texto.
Aparece entonces la cuestión fundamental siguiente:
No es que sea muy complicado escribir documentos en LATEX, pero hay que dedicar
un poco de tiempo a aprender cómo funciona, al menos a nivel básico. Por otra parte,
en LATEX no se puede empezar a escribir un documento (una hoja en blanco) sin más,
sino que debemos saber de antemano qué tipo de documento queremos escribir, a
fin de cargar la hoja de estilos adecuada, la cual define de manera bastante rígida
la estructura del documento. Los tipos de documento más habituales son “artículo” o
“libro” (hay más, pero esos dos son los que más se usan). En cada uno de estos casos
comenzaríamos el documento LATEX con una instrucción del estilo de:
\documentclass[11pt,twoside,a4paper]{article}
\documentclass[11pt,twoside,a4paper]{book}
Al hacer esto estamos diciendo al procesador LATEX que vamos a escribir un documento
con una determinada estructura (posiblemente con un título y autor, capítulos, seccio-
nes, etc.) y en LATEX sucede que introducir variaciones que se salgan de la norma en
esa estructura seleccionada es complicado, por eso comentábamos antes que LATEX
“es más rígido” en su funcionamiento que los procesadores de texto tradicionales. Si
el documento que quiere realizar no tiene ninguna estructura, es decir, si lo que está
buscando es la versión electrónica de una verdadera “hoja en blanco”, entonces LATEX
no es la mejor elección (a menos que sea un usuario experto). En ese caso la mejor
elección sería un procesador de textos tradicional, como el LibreOffice, que es gratuito
y funciona extraordinariamente bien en cualquier sistema operativo. Por el contrario,
si lo que quiere escribir es un libro o un artículo, lo más probable (lo más lógico y lo
más sensato) es que quiera ceñirse al estilo y formato que le diga su editorial, el cual
especifica cosas como márgenes, tipos de letra, espaciados, etc. En LATEX todos estos
detalles de formato quedan definidos al cargar la hoja de estilos correspondiente (arti-
cle, book, etc.) de modo que el autor del documento puede centrarse en el contenido
del documento, no en su forma. En ese caso LATEX, cuya filosofía de funcionamiento
puede resumirse en la conocida frase:
http://www.ctan.org/tex-archive/info/lshort/english/lshort.pdf
donde de forma bastante breve se presenta todo lo que uno necesita en la práctica
para saber usar este sistema9 . La página central del programa LATEX está en
http://www.latex-project.org
pdflatex miarchivo.tex
que genera directamente el archivo pdf sin pasar por el dvi.
En la web existen multitud de páginas con información útil sobre LATEX a cualquier
nivel, desde simplemente saber un poco qué es todo eso hasta el nivel de experto más
avanzado y todos los niveles intermedios. Al final de esta sección se incluyen algunos
enlaces que completan esta presentación. La primera referencia que citamos es la
página de LATEX en wikipedia, muy recomendable para tener una visión global sobre
LATEX y su funcionamiento. La segunda referencia es el clásico “The Not So Short
Introduction to LATEX” de T. Oetiker y cols., que incluye un curso práctico acelerado
sobre el lenguaje LATEX. Por medio de este curso en poco más de dos horas de trabajo
(en 157 minutos para ser exactos) sabrá todo lo necesario para escribir documentos
en LaTeX incluyendo figuras, tablas, ecuaciones, bibliografía, etc. Nuestra impresión
personal es que la inmensa mayoría de los usuarios de este lenguaje hemos aprendido
con “The Not So Short Introduction to LATEX”.
Ejemplo de artículo
Creamos un archivo de texto plano con el siguiente código (tomado de wikipedia):
\documentclass[12pt]{article}
\usepackage{amsmath}
\title{\LaTeX}
\date{}
\begin{document}
\maketitle
\LaTeX{} is a document preparation system for the \TeX{}
typesetting program. It offers programmable desktop publishing
features and extensive facilities for automating most aspects of
typesetting and desktop publishing, including numbering and
cross-referencing, tables and figures, page layout,
bibliographies, and much more. \LaTeX{} was originally written
in 1984 by Leslie Lamport and has become the dominant method for
using \TeX; few people write in plain \TeX{} anymore.
The current version is \LaTeXe.
% This is a comment, not shown in final output.
% The following shows typesetting power of LaTeX:
\begin{align}
E_0 &= mc^2 \\
E &= \frac{mc^2}{\sqrt{1-\frac{v^2}{c^2}}}
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
\end{align}
\end{document}
Como puede verse, el significado de los comandos que aparecen es muy sencillo
y fácil de recordar. Como en cualquier lenguaje de programación, en el archivo
donde escribimos el código también se pueden escribir comentarios, frases que
el compilador sencillamente ignora, pero que son útiles para el programador (pa-
ra el autor en este caso); para ello en LATEX se emplea el carácter %.
Ejemplo de libro
Creamos un archivo de texto plano con el siguiente código (tomado de http:
//www.rpi.edu/dept/arc/training/latex/Examples/exbook.tex):
\documentclass[11pt]{book} % Book class in 11 points
\parindent0pt \parskip10pt % make block paragraphs
\raggedright % do not right justify
%\usepackage[size=custom,width=200,height=120,scale=2,debug]{
beamerposter}
% e.g. for custom size poster
%\usepackage[orientation=portrait,size=a0,scale=1.0,printer=rwth-
glossy-uv.df]{beamerposter}
1-24 TEMA 1. INTRODUCCIÓN A LA FÍSICA COMPUTACIONAL
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
Para ver el ejemplo de presentación creamos un archivo de texto plano con el si-
guiente código (tomado de http://en.wikibooks.org/wiki/LaTeX/Presentations):
\documentclass[mathserif,serif]{beamer}
\begin{document}
\begin{frame}
\frametitle{This is the first slide}
%Content goes here
\end{frame}
\begin{frame}
\frametitle{This is the second slide}
\framesubtitle{A bit more information about this}
%More content goes here
\end{frame}
% etc
\end{document}
Documentación general
http://www.latex-project.org/
http://en.wikipedia.org/wiki/LaTeX
http://en.wikibooks.org/wiki/LaTeX
https://tobi.oetiker.ch/lshort/lshort.pdf
Ejemplos
http://en.wikibooks.org/wiki/LaTeX/Sample_LaTeX_documents
http://denethor.wlu.ca/latex
http://pangea.stanford.edu/computerinfo/unix/formatting/latexexample.
html
http://www.cs.technion.ac.il/~yogi/Courses/CS-Scientific-Writing/
examples/simple/simple.htm
http://www.bibtex.org/
http://en.wikipedia.org/wiki/BibTeX
http://en.wikipedia.org/wiki/Beamer_(LaTeX)
http://miktex.org/
Documentación general
https://en.wikipedia.org/wiki/Text_editor
https://en.wikipedia.org/wiki/List_of_text_editors
https://en.wikipedia.org/wiki/Comparison_of_text_editors
estructurada en ellas la información. Los alumnos que, finalizado el primer ciclo de fí-
sicas, deseen continuar con el segundo ciclo y, especialmente, los que pasen al tercer
ciclo, encontrarán útil esta información. Aunque la investigación y la docencia son las
salidas profesionales más conocidas para los titulados en física, no son en absolu-
to las únicas actividades profesionales que realizan los físicos. Además de éstas hay
otras muchas profesiones relacionadas con el mundo de la tecnología donde trabajan
físicos, junto con titulados de otras carreras (incluyendo, informática, ingeniería, me-
teorología, medicina, economía, . . . ). De todas formas en una carrera como físicas la
investigación es un referente que constantemente aparece. En particular, aparte de
los físicos que se dedican a la investigación, es muy frecuente que los profesionales
del mundo de la tecnología (y también de la docencia) que deseen mantenerse más o
menos al día en su tema de trabajo, se vean obligados a leer periódicamente diversas
publicaciones científicas, de modo que esperamos que este breve vistazo global al
tema de las publicaciones en física sea de interés, a largo plazo, para todos.
Siguiendo los pasos establecidos en el método científico, el objetivo último de la
investigación es transmitir los resultados obtenidos, de modo que otros investigadores
puedan:
a. reproducirlos y de esta forma verificarlos y
b. tomarlos como punto de partida en su trabajo.
Esto se realiza por medio de una serie de publicaciones periódicas, de ámbito inter-
nacional, en las cuales se publica el trabajo realizado por los investigadores en forma
de artículos de investigación. En la actualidad el lenguaje que se ha impuesto en el
mundo de la investigación científica es el inglés (análogamente a como sucede en el
mundo de la economía, la tecnología, la industria, las comunicaciones, . . . ), de modo
que para el científico es imprescindible ser capaz de manejar esta lengua.
Actualmente existen multitud de publicaciones científicas. Algunas de ellas son muy
generales (como las prestigiosas revistas Nature o Science), donde se publican artícu-
los que pueden ser de interés para muchos campos científicos distintos (física, biolo-
gía, medicina, . . . ). En un siguiente nivel de especificidad nos encontramos con revis-
tas todavía de carácter general, pero que ya afectan a un único campo científico (p. ej.
en física son especialmente conocidas las publicaciones Reviews of Modern Physics
y Physical Review Letters, editadas por la American Physical Society). A continuación
nos encontramos con revistas especializadas en un tema en particular (p. ej. Journal
of Fluid Mechanics) e incluso altamente especializadas en temas muy específicos (p.
ej. Journal of Non-Newtonian Fluid Mechanics).
Normalmente los artículos publicados en revistas muy especializadas están dirigi-
dos a un público experto en esa materia. En estas publicaciones se da por sentado que
el lector posee un conocimiento profundo de los detalles particulares del tema de que
se trate, de modo que el autor suele centrarse en los aspectos más relevantes de lo
que ha sido su aportación al estado del conocimiento del tema (denominado habitual-
mente estado del arte). Si a esto sumamos que los editores de estas revistas suelen
imponer límites más o menos estrictos en la extensión de cada artículo, encontramos
que al final estas publicaciones sólo están al alcance de los que trabajan en ese tema.
En las revistas más generalistas, en cambio, las publicaciones están dirigidas a un
público más amplio, centrándose los trabajos en las implicaciones y consecuencias de
la investigación realizada desde un punto de vista amplio, dejando de lado los detalles
técnicos.
1-30 TEMA 1. INTRODUCCIÓN A LA FÍSICA COMPUTACIONAL
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
Una vez dentro de un tema de investigación específico existen dos tipos de artícu-
los de investigación. Por un lado están los artículos, digamos normales, en los que un
grupo publica una aportación puntual concreta y por otro los artículos de revisión del
estado del arte en los que un autor de reconocido prestigio (con una larga trayectoria
de investigación a sus espaldas) realiza una puesta al día sobre la investigación en un
tema en concreto. Los artículos de investigación normales suelen tener una extensión
que va desde unas pocas páginas a unas pocas decenas de páginas, normalmente
son extremadamente especializados y la cuestión que explican o resuelven es tremen-
damente específica, siendo de lectura muy difícil para los no expertos. En cuanto a los
artículos de puesta al día o revisión del estado del arte de una materia en concre-
to, denominados Reviews, suelen ser muy extensos (entre 100 y 200 páginas es lo
normal) y normalmente incluyen un número muy elevado de referencias bibliográficas,
lógicamente. Cuando uno se introduce en el mundo de la investigación lo primero que
debe hacer es localizar los artículos de Review del tema de que se trate y asimilar
toda la información proporcionada por estas publicaciones sobre el estado del arte
del tema considerado. Esto nos permitirá aprender qué cuestiones de nuestro tema
de investigación han sido ya resueltas (y qué métodos se han empleado para ello) y
qué problemas siguen todavía sin solución. Es muy importante estudiar a fondo los
Reviews disponibles sobre el tema de investigación en el que uno empieza a trabajar,
ya que de lo contrario es fácil caer en el error de hacer algo que ya está hecho, o peor
aún, repetir errores ya cometidos por otros.
Dentro de los artículos normales, en los que uno publica sus resultados según
los va obteniendo, un tipo particular de éstos son las letters (a veces llamadas fast
communications o short communications), en ellos se publica de manera muy rápida
y breve aquellos resultados que se consideran especialmente relevantes, para cuya
consecución compiten diversos grupos de investigación. Cuando un grupo publica una
letter es frecuente que posteriormente publique otro artículo más extenso, explicando
sus resultados de una manera más amplia y detallada, analizando en profundidad las
consecuencias de la investigación realizada no incluidas en la letter.
En la mayoría de los temas de investigación es muy frecuente que las revistas es-
pecializadas publiquen sólo un tipo determinado de artículos (o bien reviews, o bien let-
ters, o bien artículos normales). Por ejemplo, las cerca de 50 revistas publicadas anual-
mente por la organización Annual Reviews (especializadas en sus correspondien-
tes campos científicos y disponibles en la página http://www.annualreviews.org)
contienen solamente artículos de revisión, algo parecido sucede en la prestigiosa
Reviews of Modern Physics, donde se publican revisiones de temas pertenecien-
tes a diversos campos de la física, mientras que la revista Physical Review Letters
sólo publica letters (estas dos últimas publicaciones están disponibles en la pági-
na de la American Physical Society, http://www.aps.org, concretamente en http:
//publish.aps.org/browse.html).
Antiguamente mantenerse al día con la literatura de un tema de investigación era
una tarea muy ardua. Uno a veces tenía grandes dificultades para acceder a publica-
ciones a las que su propia universidad no estaba suscrita (las suscripciones institu-
cionales a estas publicaciones científicas suelen ser muy costosas). Hoy en día con
internet el acceso a la documentación científica es considerablemente más sencillo,
y existen acuerdos entre distintas universidades que permiten el intercambio de este
tipo de información de una manera muy rápida y eficiente. Aparte de los buscadores
habituales (Google) existe un portal de internet especialmente orientado para esto
1.6. DOCUMENTACIÓN CIENTÍFICA 1-31
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
http://isiwebofknowledge.com
perteneciente a la agencia Thomson Scientific’s Institute for Scientific Information. Para
acceder a los servicios ofrecidos por esta agencia desde una institución suscrita (re-
quisito indispensable) a este servicio en España (universidades, p. ej. UNED, centros
de investigación públicos o privados, etc.) hay que ir a
http://www.accesowok.fecyt.es/login/
En este portal uno puede realizar todo tipo de búsquedas bibliográficas (por temas, por
autores, por revistas, etc.). Así mismo cada publicación mostrada por este portal con-
tiene enlaces virtuales a las publicaciones a las que cita y también a las publicaciones
posteriores que citan a ésta, lo cual es extremadamente útil. Gracias a las herramien-
tas de búsqueda que este portal de internet proporciona es muy sencillo mantenerse
al día con lo que se publica en un tema y, cuando uno sabe qué es lo que busca, es
muy sencillo encontrarlo.
Resumen (Abstract)
Introducción (Introduction)
Conclusiones (Conclusions)
Bibliografía (Bibliography)
En todas las publicaciones científicas se hace énfasis en que el lenguaje debe ser tan
claro y conciso como sea posible. El título sebe ser escueto y representativo del conte-
nido del trabajo y la lista de palabras clave, que indica los temas de investigación con
los que está relacionado el trabajo, debe ser tan precisa como sea posible. Todos los
artículos de investigación comienzan con un breve resumen (el Abstract), del orden de
unas 500 palabras a lo sumo (con frecuencia mucho menos), en él se debe escribir de
la manera más sucinta y clara posible cuál es la aportación concreta de este artículo al
tema de que se trate. La mayoría de los investigadores seleccionan los artículos que
les parecen relevantes, o bien porque aparecen citados en otra publicación, o bien por
la información contenida en el Abstract, por este motivo es de vital importancia que
el Abstract describa de forma muy precisa (y escueta) la aportación realizada. El si-
guiente elemento más importante del artículo es la sección de conclusiones (siempre
al final del artículo), en ella se realiza un resumen, más extenso que el que figura en el
Abstract, de las aportaciones del trabajo realizado, situándolas en el contexto del tema
de investigación de que se trate, es decir, relacionando la aportación realizada con el
Part I TEMA 1. INTRODUCCIÓN A LA FÍSICA COMPUTACIONAL
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
estado del arte antes de esta publicación y con las cuestiones que todavía permane-
cen abiertas. En la actualidad el número de trabajos de investigación publicados cada
mes es tan grande que en la práctica resulta imposible leer todo el material publicado
sobre un tema en concreto, de modo que de estos tres elementos, el título, el abs-
tract y las conclusiones, depende en gran medida que nuestro trabajo sea revisado o
descartado directamente por los demás investigadores del área, esto también estará
condicionado por el prestigio de la revista en la que publiquemos nuestro trabajo y por
el hecho de que sea citado posteriormente por otros investigadores.
En cuanto a las secciones restantes del artículo, en la introducción suele hacerse
un breve resumen del estado del arte del tema de que se trate, citando las referen-
cias bibliográficas que contengan los avances realizados previamente, junto con una
descripción de la motivación del presente estudio y los objetivos buscados. Para ha-
cer énfasis en la relevancia del trabajo realizado es muy frecuente mencionar, en esta
sección, las conexiones de nuestro trabajo con otros temas de investigación y sus
posibles aplicaciones prácticas. Después de la introducción viene un número varia-
ble de secciones en el que se describe el trabajo realizado propiamente dicho. En
estas secciones es donde se describirá con todo detalle los experimentos realizados
(incluyendo materiales, métodos, detalles técnicos del dispositivo experimental, difi-
cultades encontradas, resultados, tratamiento estadístico de los resultados obtenidos,
. . . ), los cálculos numéricos realizados (incluyendo información sobre los algoritmos
empleados, criterios de convergencia, tiempo de cálculo, resultados) o los desarrollos
matemáticos teóricos realizados (incluyendo información sobre la notación empleada,
aproximaciones realizadas, resultados). Todo el trabajo debe estar redactado de una
forma clara y concisa, casi esquemática, al mismo tiempo que precisa y lo suficien-
temente completa como para que otro equipo de investigación sea capaz de repro-
ducir totalmente nuestros resultados, incluyendo los desarrollos matemáticos teóricos,
cálculos numéricos y resultados experimentales, a partir de la información contenida
en nuestro trabajo junto con las publicaciones previas que allí se citan.
Finalmente, los artículos de revisión Reviews tienen una estructura similar, aunque
debido a su extensión es muy frecuente que incorporen un índice (como el de un
libro) entre el Abstract y la Introducción. En cuanto a los artículos de tipo letter, al ser
muy cortos tienen una estructura más sencilla, de hecho con mucha frecuencia no
están divididos en secciones, sino que sólo tienen el Abstract y una única sección a
continuación, como si se tratara de una carta.
Con esto terminamos este breve resumen sobre los tipos más habituales de publi-
caciones científicas. Por supuesto que este resumen está muy lejos de ser exhaustivo,
hay otros tipos de publicaciones, de acceso más restringido (y uso menos frecuente),
que no hemos mencionado, como p. ej. las Tesis Doctorales, las memorias de Pro-
yectos de Investigación (financiados por organismos públicos o privados), los informes
anuales que realizan algunos centros de investigación, algunos registros de patentes,
informes internos de empresas relacionadas con la tecnología, o las actas (procee-
dings) de congresos de investigación.
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
Tema 2
Introducción al Maxima
2-1
2-2 TEMA 2. INTRODUCCIÓN AL MAXIMA
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
http://maxima.sourceforge.net/
2.1. ¿POR QUÉ MAXIMA? 2-3
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
http://andrejv.github.io/wxmaxima/
http://andrejv.github.io/wxmaxima/help.html
https://en.wikipedia.org/wiki/Maxima_(software)
https://en.wikipedia.org/wiki/Computer_algebra_system
https://en.wikipedia.org/wiki/List_of_computer_algebra_systems
En lo sucesivo, salvo que se diga lo contrario se da por entendido que estamos traba-
jando con WX M AXIMA, que es la interfaz de trabajo más habitual.
2-4 TEMA 2. INTRODUCCIÓN AL MAXIMA
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
( %i2) 2,5+4;
Improper argument to ev:9
an error. To debug this try: debugmode(true);
El programa numera el input recibido, independientemente de que exista o no, un out-
put. Como se ve en este ejemplo, los mensajes de advertencia y error no son conside-
rados como verdaderos resultados de cálculo (output). El punto y coma actúa también
como un separador cuando escribimos varias instrucciones en un misma línea. Nues-
tra siguiente operación consistirá en asignar el valor 125 a la variable x y 46 a la y,
solicitando luego su producto,
( %i3) x:125; y:46; x*y;
( %o3) 125
( %o4) 46
( %o5) 5750
Conviene prestar atención al hecho de que la asignación de un valor a una variable
se hace con los dos puntos (:), no con el signo de igualdad (=), que en M AXIMA se re-
serva para definir ecuaciones. Como vemos, el M AXIMA va notificando al usuario cada
uno de los cálculos que realiza, en este caso, la asignación del valor 125 a x, con el
correspondiente output ( %o3), la asignación del valor 46 a y, con el correspondiente
( %o4), y el producto xy con valor 5750, y correspondiente ( %o5). En general no ne-
cesitamos que nos confirme todos los pasos intermedios de cálculo realizados; para
eso puede usarse el separador “$” en lugar de “;” al final de una expresión, indicando
a M AXIMA que no debe mostrar el output correspondiente. Como ejemplo, el producto
anterior tiene la expresión más directa
( %i3) x:125$ y:46$ x*y;
( %o3) 5750
Obsérvese que el número de inputs necesarios para realizar la operación es el mismo
que antes, aunque no todos sean explícitos. Analicemos ahora brevemente el uso del
comando “=” en este ejemplo. Si hubiéramos cometido el error de utilizar “=”, en lugar
de la asignación “:” en y, el resultado es el siguiente
( %i3) x:125; y=46; x*y;
( %o3) 125
( %o4) y=46
( %o5) 125 y
Esto quiere decir que M AXIMA admite la instrucción y = 46 como una ecuación ge-
nérica, pero no tiene orden de asignar ningún valor a y, por lo que en este caso el
producto xy para M AXIMA es el producto de 125 por la variable y.
Reiniciemos ahora el M AXIMA por medio de la instrucción kill(all);, con esto
limpiamos la memoria (eliminamos todas las asignaciones a variables realizadas) y el
programa se reinicia solicitando el primer input. Retomemos entonces al caso anterior
con la asignación de 125 a x y 46 a y. Las asignaciones a variables se mantienen
activas mientras dure la sesión con M AXIMA, por lo que podemos restar las variables
x e y, con el resultado
( %i1) x:125$ y:46$
( %i3) x-y;
( %o3) 79
Es importante puntualizar aquí que M AXIMA no admite la expresión xy, como el pro-
ducto de x por y, sino que considera la expresión xy como una sola variable. Por eso,
un input del tipo 2y daría un mensaje de error, ya que debemos escribir 2*y.
2-6 TEMA 2. INTRODUCCIÓN AL MAXIMA
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
Uno de los errores más comunes que se comenten con los programas de cálcu-
lo simbólico es evaluar una expresión o proceso dependiente de una variable (p. ej.
x) cuando ya existe una asignación previa para ese nombre (x) (este error es es-
pecialmente habitual en sesiones de trabajo largas, para evitarlo se puede usar el
menú: Maxima/Reiniciar Maxima). Por ejemplo, supongamos √ que queremos resolver
2
la ecuación algebraica x = 2, con soluciones x = ± 2. Para ello debemos escri-
bir la ecuación x^2=2 empleando como variable un símbolo para el que no se haya
asignado antes un valor. Aunque no se haya estudiado todavía, la función de M AXI -
MA que resuelve ecuaciones algebraicas es solve, y su sintaxis es fácil de entender:
solve(ecuación, variable). Ejecutando esta acción, encontramos que
( %i4) solve(x^2=2,x);
A number was found where a variable was expected - 'solve'
an error. To debug this try: debugmode(true);
nos da un error, ya que en la sesión de trabajo actual la variable x no es tal variable,
sino que es un número (en este caso 125). Para resolver este problema sin necesidad
de reiniciar el programa basta eliminar de la memoria la asignación a x. El comando a
utilizar para eliminar una asignación es kill, en la forma
( %i5) kill(x);
( %o5) done
y de nuevo, al ejecutar solve, obtenemos la respuesta correcta
( %i6) solve(x^2=2,x);
( %o6) [x = -sqrt(2), x = sqrt(2)]
En este caso, la resolución de la ecuación desde el punto de vista del M AXIMA simple-
mente consiste en dar ecuaciones más sencillas, equivalentes a la original, donde la
variable x está despejada. Es importante destacar que esta solución no es una asig-
nación, no tiene el signo de puntuación “:”, por tanto la variable x sigue siendo una
variable, lo cual puede comprobarse pidiendo a M AXIMA que nos muestre su valor
( %i7) x;
( %o7) x
este resultado nos indica que el símbolo x no tiene asignado ningún valor.
La ecuación anterior nos permite también introducir el símbolo empleado en M A -
XIMA para denotar√ la operación “elevar a una potencia”: ^ (por ejemplo, 2^10 es 1024,
2^(-1/2) es 1/ 2). Es muy importante darse cuenta de que (al menos en la mayoría
de los sistemas operativos) para que aparezca el operador ^ debemos pulsar la tecla
^ seguida de un espacio, de lo contrario el siguiente número aparecerá en WX M AXIMA
como un superíndice que no se interpreta como una potencia. Hay que tener espe-
cial cuidado al usar el comando ^ en el frontend WX M AXIMA, a fin de evitar confusión
entre exponentes y superíndices. En este sentido es bastante desafortunado el modo
en que el WX M AXIMA interpreta el resultado de teclear ^. Generalmente, cuando se
introduce ^ tecleando este símbolo “una sola vez” WX M AXIMA interpreta lo que va a
continuación como un superíndice; posteriormente, dependiendo del valor de dicho
superindice, WX M AXIMA lo interpreta bien como un exponente o bien sencillamente
como un superíndice. Por ejemplo, en la versión (15.08.2) de WX M AXIMA y con un sis-
tema operativo Linux Fedora 23 obtenemos estos resultados tecleando “una sola vez”
el símbolo ^:
( %i1) 22 ;
( %o1) 4
( %i1) 23 ;
2.2. SINTAXIS DE MAXIMA 2-7
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
( %o1) 8
( %i1) 24 ;
incorrect syntax: 4 is not an infix operator
24 ;
(dependiendo de la versión del WX M AXIMA empleada y del sistema operativo estos
resultados pueden variar). Todas las expresiones anteriores darían como resultado un
“error” en M AXIMA en línea de comandos, y el hecho de que WX M AXIMA las evalúe de
forma distinta dependiendo del valor del superíndice genera mucha confusión cuan-
do se está aprendiendo. Evidentemente este comportamiento del WX M AXIMA es muy
desafortunado. La manera de evitar esta confusión entre superíndices y exponentes
es la siguiente:
sistema de menús con la mayoría de las funciones del M AXIMA ordenadas por
secciones y aplicaciones,
2.3. TRABAJANDO CON WXMAXIMA 2-9
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
menú de ayuda con mucha información sobre comandos del M AXIMA, inclu-
yendo ejemplos de uso.
los outputs no son grabados, de forma que al cargar el archivo que contiene la sesión
debemos evaluar todas las celdas para volver a obtener los resultados esperados. Por
el contrario, en el formato más avanzado wxmx (disponible en versiones nuevas) se
grabará la sesión de trabajo completa (inputs y outputs).
( %i1) (x^2-1)/(x-1)+log(x);
( %o1) (x^2-1)/(x-1)+log(x)
P. ej. si quisiéramos simplificar la primera parte de la fórmula anterior, bastaría resal-
tar la expresión (x2 − 1)/(x + 1), y aplicar desde el menú la simplificación racional.
Entonces, se abre una celda nueva con este resultado parcial,
( %i2) ratsimp((x^2-1)/(x-1));
( %o2) x+1
resultado de la simplificación realizada.
debemos introducir enter tras cada línea de texto para acceder a la siguiente,
Las instrucciones necesarias para este cálculo pueden escribirse en la celda activa
como
> (R : 2, H : 3)$ A : 2* %pi*R*(R + H); V : %pi*R^2*H;
Hasta ahora no hemos enviado la celda activa al M AXIMA, observamos que el corchete
de la celda (a la izquierda de las líneas de texto) está en negro, que es el color por
defecto, y a continuación aparece una flecha en rojo tras la cual tenemos el cursor
parpadeando en algún espacio de línea en el interior de la celda. Si ahora pulsamos
shift + enter , todos los comandos se ejecutan y se muestran los outputs a medida
que M AXIMA los obtiene, en el mismo orden que se encuentran los inputs (es decir, de
manera secuencial). Además en la salida de inputs sólo aparecerá numerado el input
primero de la secuencia. En el caso anterior la respuesta sería
2-12 TEMA 2. INTRODUCCIÓN AL MAXIMA
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
( %i1) (R : 2, H : 3)$
A : 2* %pi*R*(R + H); /*área total*/
V : %pi*R^2*H; /*volumen*/
( %o2) 20 π
( %o3) 12 π
En el input anterior hemos introducido unos comentarios (es decir, texto no ejecu-
table) mediante la sintaxis /* texto */. Cuando se escriben programas o funciones
extensos estos comentarios son importantes, ya que facilitan la descripción del códi-
go. Una observación, la primera línea del ( %i1) contiene varias instrucciones en un
solo paréntesis, separadas por comas (,), por eso el M AXIMA lo considera como un
único input.
Aunque también tiene capacidad para cálculo numérico, el M AXIMA está pensado
para ser un programa de cálculo simbólico. Por este motivo, siempre que sea posible
mantendrá la notación para las constantes predefinidas sin evaluarlas numéricamente,
de esta forma en las expresiones anteriores el número π aparece como un símbolo,
en lugar de aparecer un valor numérico con precisión finita. Si deseamos obtener el
valor numérico del área y volumen podemos utilizar el comando numer de la siguiente
forma:
> %pi, numer; [A, V], numer;
con el resultado
( %i4) %pi, numer; [A, V], numer;
( %o4) 3.141592653589793
( %o5) [62.83185307179586, 37.69911184307752]
Otra posibilidad para forzar la evaluación numérica de un resultado es por medio del
comando float, en la forma float(A); float(V);, que produce los mismos resulta-
dos numéricos para A y V mostrados en ( %o5).
El número de decimales empleado en las evaluaciones numéricas depende de la
precisión del cálculo (por defecto es de 16 dígitos), que puede establecerse por el
usuario de manera arbitraria en el menú: Numérico/Establecer precisión.
La forma en que hemos calculado el área y volumen de un cilindro más arriba tiene
el inconveniente de dejar las variables R y H evaluadas a los valores numéricos de R y
H correspondientes a un cilindro concreto (en este caso R = 2 y H = 3). Esto es poco
conveniente si, p. ej., queremos considerar diferentes valores para estas variables en
una misma sesión, o si posteriormente a este cálculo queremos resolver una ecuación
para la variable R, en cuyo caso deberíamos eliminar la asignación realizada por medio
de kill(R);.
Una forma sencilla de evitar esto, sin necesidad de emplear kill, es por medio
del comando de sustitución subst. La instrucción subst(a, b, c) sustituye en la ex-
presión que hayamos introducido en c, la variable b por lo que hayamos introducido
en a (a podrá ser un valor concreto, el nombre de otra variable, una expresión, etc.).
Así, podemos definir el área y volumen del cilindro por medio de las expresiones que
hemos empleado mas arriba
( %i1) A : 2* %pi*R*(R + H); /*área total*/
V : %pi*R^2*H; /*volumen*/
2.3. TRABAJANDO CON WXMAXIMA 2-13
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
pero conservando las variables R y H como símbolos (no evaluados a valores numéri-
cos), de esta forma A y V quedan evaluadas a las correspondientes expresiones sim-
bólicas:
( %o1) 2 π R (R + H)
π H R2
A continuación, si queremos calcular los valores de A y V correspondientes a los
valores concretos de R y H de antes, pero sin asignar estas variables a ningún valor,
basta con emplear subst para que sustituya estos valores en las variables y muestre
el resultado
( %i2) subst(3, H, subst(2, R, A));
( %i3) subst(3, H, subst(2, R, V));
lo cual genera los valores de A y V correspondientes a los valores de R y H indicados
(2 y 3 respectivamente).
Como veremos en este curso hay multitud de ocasiones en las que resulta muy
práctico emplear el comando de sustitución subst, pero en el caso que nos ocupa
es más práctico definir una función para el área y otra para el volumen. Para definir
funciones en M AXIMA se emplea el símbolo “:=”, en el caso de funciones sencillas la
sintaxis es la siguiente:
lista de argumentos expresión que
“nombre de la función” := ;
separados por comas define la función
Siguiendo esta sintaxis, para definir las funciones A(R, H) y V(R, H) (respectivamen-
te: “área y volumen, dependientes de las variables radio, R, y altura, H”), escribimos
(después de eliminar las posibles asignaciones previas a A, V, R y H):
( %i1) A(R, H) := 2* %pi*R*(R + H); /*área total*/
V(R, H) := %pi*R^2*H; /*volumen*/
Pulsando shift + enter obtenemos el output
( %o1) A(R, H) := 2 π R (R + H);
( %o2) V(R, H) := π R2 H;
por medio del cual M AXIMA nos informa que ha incorporado a la memoria de la sesión
actual las definiciones de estas dos nuevas funciones, de acuerdo a las expresiones
que aparecen en ( %o1) y ( %o2). Si no queremos visualizar la expresión que define la
función introducida basta con emplear el carácter “$”, en lugar de “;”, para finalizar la
instrucción de definición de la función.
Una vez hemos definido estas dos nuevas funciones, para visualizar el área y vo-
lumen del cilindro del ejemplo anterior, sin asignar valores fijos a las variables R o H,
basta con hacer
( %i3) A(2, 3);
( %i4) V(2, 3);
Pulsando shift + enter M AXIMA devuelve el valor que se obtiene al sustituir R y H
por los valores suministrados como argumentos de las funciones A(R, H) y V(R, H)
en ( %i3) e ( %i4).
Como comentábamos más arriba, la sintaxis de definición de funciones que hemos
mostrado es válida para definir funciones sencillas, es decir, “funciones que pueden
definirse por medio de una única expresión”. El trabajo a realizar a lo largo de este
curso consiste no obstante, en la inmensa mayoría de los casos, en definir funciones
complicadas, es decir, funciones para cuya definición es necesario evaluar no una,
2-14 TEMA 2. INTRODUCCIÓN AL MAXIMA
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
Por ejemplo, la función anterior para calcular el área del cilindro puede definirse
también como
( %o1) A(R, H) := block( [Atapa, Alado],
Atapa : %pi*R^2,
Alado : 2* %pi*R*H,
return(2*Atapa + Alado) )$
que nos sirve como ejemplo de uso de la función block. Igual que antes, podemos
comprobar el resultado de esta función mediante la instrucción A(2, 3);. Evidente-
mente, para una función tan sencilla como esta basta con la definición que habíamos
dado antes, pero como veremos a lo largo de este curso, en M AXIMA pueden progra-
marse funciones considerablemente más complicadas, para las que la función block
resulta más que recomendable.
La definición de funciones usando el comando block será un tema central en esta
asignatura. En particular, la Prueba de Evaluación Continua (PEC) de M AXIMA consis-
tirá en la programación de diversas funciones más o menos complicadas empleando
la sintaxis que acabamos de mostrar. A lo largo de los siguiente temas veremos nu-
merosos ejemplos de definiciones de funciones por medio de block, de modo que en
este capítulo de introducción al M AXIMA no adelantaremos más información a este
respecto.
Las variables empleadas en expresiones (p. ej. x, area) deben tener un nombre
que no coincida con palabras reservadas u operadores predefinidos del lenguaje
M AXIMA (p. ej.: if, then, else, for, thru, sin, cos, exp, etc.), y no necesita decla-
rarse su tipo (los tipos habituales son: entero, real, complejo, de cadena (string),
etc.).
2.4. EXPRESIONES EN MAXIMA 2-15
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
Los operadores son los comandos o funciones del M AXIMA, o cualquier otra fun-
ción definida por el usuario.
Las constantes predefinidas en M AXIMA son las constantes matemáticas habi-
tuales, que incluyen, entre otras, la base de los logaritmos √ naturales e (definida
en M AXIMA como %e), la unidad compleja imaginaria i = −1 ( %i), el número π
( %pi), el infinito real positivo +∞ ( %inf) y el infinito real negativo −∞ ( %minf).
En general M AXIMA tiende a tratar estas constantes matemáticas como símbo-
los, para obtener sus valores numéricos puede emplearse el operador float, o
numer:
( %i2) float([ %pi, %e, %i]);
( %o2) [3.141592653589793, 2.718281828459045, %i]
La constante %i, al ser compleja no es evaluada numéricamente. El producto %i* %i
daría el valor numérico -1.0, en coma flotante.
En cuanto a las palabras reservadas, una forma rápida y sencilla de evitar estos con-
flictos en la definición es comprobar su posible existencia en el índice del manual de
M AXIMA en el momento de seleccionar un nombre de variable nuevo. Como hemos
comentado antes el M AXIMA diferencia entre mayúsculas y minúsculas, de modo que,
dado que los comandos del M AXIMA siempre van en minúsculas, una buena práctica
es definir las funciones del usuario, y en su caso las variables, con mayúsculas.
en forma exacta
( %i1) (2^5/(1+1/((2/3)^3+(3/2)^2))))^(-3);
( %o1) 681472000000
56181887
Para evaluar este número en coma flotante basta aplicar el operador numer, float o
equivalentemente bfloat
( %i2) %, numer;
( %o2) 8.2441959464218638 10−5
Recordamos que la precisión de esta operación puede variarse por el usuario desde
el menú: Numérico/Establecer precisión.
Maxima puede trabajar con precisión arbitraria. Por ejemplo, para calcular la poten-
cia π e con 50 cifras decimales tenemos dos opciones: modificar la precisión desde el
menú anterior asignando 50 dígitos, con lo cual cada cálculo posterior se realizará con
esa precisión (lo cual puede ser muy lento), o directamente desde la línea de código,
asignando a la variable interna de precisión fpprec para grandes flotantes (bfloat) el
valor 50, con lo cual sólo será válida esa precisión para la celda activa. De esta forma
obtenemos:
2-16 TEMA 2. INTRODUCCIÓN AL MAXIMA
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
ya que este comando solo trabaja con expresiones reales, en este caso es preciso
emplear el comando para factorización compleja rectform
2-18 TEMA 2. INTRODUCCIÓN AL MAXIMA
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
es correcta. Dado que todos los argumentos que aparecen son múltiplos enteros de
x, una opción es realizar las expansiones trigonométricas de seno y coseno de 2x y
3x, verificando que resultan expresiones idénticas en ambos miembros de la igualdad
(matemáticamente basta con verificar que su resta es nula). Realizamos los cálculos
en distintas celdas y a cada uno de los output le asignamos un nombre de variable
relacionado con lo que se calcula. Para el sin 2x, obtenemos el resultado conocido del
ángulo doble
( %i1) sen2x: trigexpand(sin(2*x));
( %o1) 2 sin(x) cos(x)
y para el ángulo triple obtenemos
( %i2) sen3x: trigexpand(sin(3*x)); cos3x: trigexpand(cos(3*x));
( %o2) 3 cos2 (x) sin(x) − sin3 (x)
( %o3) cos3 (x) − 3 cos(x) sin2 (x)
Una vez hemos realizado estos cálculos verificamos la veracidad de la fórmula pro-
puesta, utilizando para ello las variables que acabamos de definir:
( %i4) 2*sen2x*(cos(x)^2 - sin(x)^2) - (sen3x*cos(x) + cos3x*sin(x));
( %o4) − cos(x) sin(3x) − sin(x) cos(3x) + 2 (cos(x)2 − sin(x)2 ) sin(2x)
Como era de esperar M AXIMA no da un resultado simplificado, ya que no se lo hemos
pedido. Las únicas acciones que ha realizado es asignar los ordenes de aparición
de los términos entre paréntesis. Por tanto, debemos aplicar una simplificación poste-
rior para poder confirmar que la fórmula trigonométrica es correcta. Para que M AXIMA
simplifique esta fórmula necesitaríamos pedirle primero que expanda las razones trigo-
nométricas de ángulos dobles que hemos introducido, para posteriormente simplificar
el resultado por medio de factor, al hacer esto M AXIMA encontrará un factor 0, de
modo que la diferencia “lado izquierdo − lado derecho” es nula. Esto mismo puede
hacerse con el comando directo de simplificación ratsimp o con el de simplificación
trigonométrica trigsimp, el resultado es
( %i5) trigsimp(trigexpand( %));
( %o4) 0
que confirma que la fórmula era correcta, puesto que tenemos un desarrollo de sin 4x
en cada término.
Analizamos ahora un ejemplo de fracciones continuas, uno de los casos más típi-
cos es
1
1+
1 + 1+ 1 1
1+...
( %i1) x;
( %o1) x
Lógicamente como x no tiene valor asignado, M AXIMA lo reconoce como tal. Aplicamos
ahora la primera asignación
( %i2) fraccion:1+1/ %;
( %o2) 1 + x1
y ya tenemos el desarrollo de la fracción continua en su primer término, al tomar como
input el output ( %o1). Aplicando de nuevo esta asignación obtenemos
( %i3) fraccion:1+1/ %;
( %o3) 1 + 1+1 1
x
y así sucesivamente (recordar que % es una variable reservada del M AXIMA, cuyo valor
es la última expresión evaluada). Vemos entonces que podemos construir la fracción
continua mediante la sucesiva aplicación de una asignación muy simple. Esto mismo
puede resolverse también fácilmente con el uso de funciones. Para ello basta definir
una función sobre los enteros n, en la forma f (n) = 1 + 1/f (n − 1) y exigir que el
término correspondiente a n = 0 sea igual a la semilla inicial x. Así, la fracción con
n términos está dada por f (n). Retomemos nuestro cálculo, suponiendo que hemos
aplicado la asignación 15 veces, si queremos determinar el valor de la suma (por ahora
en términos de x) le pedimos a M AXIMA que simplifique la fracción, con el resultado
( %i17) ratsimp( %);
( %o17) 610x+377
610+987x
2.4.4. Sustituciones
Ya hemos mostrado el comando de sustitución dependiente de tres argumentos
subst(variable y, variable x, expresión), que aplica la sustitución x → y sobre el ar-
gumento que aparezca en “expresión”. Una posible aplicación de este comando es la
creación de funciones compuestas, f [g(x)]. Como ejemplo de uso de subst vamos a
verificar si una función de dos variables dada es homogénea de grado p. Para ello com-
probaremos si f (λx, λy) = λp f (x, y) para un determinado exponente p que dependerá
de la función escogida. Consideremos la expresión dependiente de x e y:
( %i1) (x3 + y3)/(x2*y2) + 2*x2*y/(2*y4 - x3*y - 3*x2*y2);
2 3 3
( %o1) 2 y4 −32xx2 yy2 −x3 y + xx2+y y2
Para analizar si esta expresión define una función homogénea realizamos las sustitu-
ciones sucesivas x → λx, y → λy, y verificamos si la expresión final cumple la relación
f (λx, λy) = λp f (x, y) para algún valor de p. Primero realizamos la sustitución en x
( %i2) subst(lambda * x,x, %o1);
2 2 3 3 3
( %o2) −x3 y λ32−3x xy2 λy2 λ2 +2 y4 + xx2λy2+y
λ2
2-20 TEMA 2. INTRODUCCIÓN AL MAXIMA
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
En M AXIMA existen dos tipos de asignaciones: el comando “:” se usa para asignar
valores fijos a variables o parámetros (p. ej. x: %pi), mientras que para definir funciones
se emplea la sintaxis “función(variables) := expresión”, tal y como hemos comentado
más arriba. Por ejemplo, la instrucción empleada para definir la función f (x) = x2 es:
( %i1) f(x) := x2;
( %o1) f (x) := x2
Para comprobar que realmente hemos definido la función f (x) de la forma indicada
podemos verificar que f (a) devuelve a2 , sea cual sea el valor de a y sea también cual
sea el tipo de variable (número real, entero, complejo, . . . ).
( %i1) f(a);
( %o1) a2
Para definir funciones sencillas dependientes de varias variables lo único que de-
bemos hacer es introducir en el lado izquierdo de la asignación la lista de variables
independientes separadas por comas, de acuerdo a la sintaxis que ya hemos comen-
tado anteriormente
lista de argumentos expresión que
“nombre de la función” := ;
separados por comas define la función
donde con sencillas nos referimos a funciones que pueden definirse por medio de una
única expresión (o instrucción) no demasiado larga. Por ejemplo, con
( %i1) f(x, y, z) := sqrt(x2 + y2 + z2);
definimos una función que nos da la distancia euclídea entre el origen y el punto con
coordenadas (x, y, z).
Por el contrario, cuando es necesario evaluar una secuencia de instrucciones (o
expresiones) previas antes de poder evaluar la instrucción (o expresión) que define la
2.5. DEFINICIÓN DE FUNCIONES CON MAXIMA 2-21
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
A lo largo del curso veremos muchos ejemplos de definición de funciones por me-
dio del comando block ya que, como también comentábamos antes, el objetivo prin-
cipal de esta parte de la asignatura es aprender a programar funciones no triviales en
M AXIMA.
Antes de continuar conviene aclarar que las funciones que pueden programarse en
M AXIMA (o en cualquier otro entorno de álgebra computacional) no se restringen a fun-
ciones matemáticas, consistentes en realizar un cierto cálculo simbólico o numérico.
como p. ej. f(x) := x2;, sino que también pueden programarse en forma de funcio-
nes cualquier secuencia de instrucciones que opere sobre una serie de argumentos,
esto también incluye operaciones como “abrir un archivo y leer su contenido”, “escribir
el resultado de una cierta operación en un archivo”, “consultar un dato en una página
web”, “generar una gráfica derivada de un cálculo”, etc.
Por ejemplo, la función graficaderivadaEPS(f, x, a, b, filename) calcula la
primera (0 ) y segunda (00 ) derivada del primer argumento, f, respecto del segundo,
x, a continuación muestra la gráfica de f , f 0 y f 00 para valores de la variable x entre a y
b, guarda dicha gráfica en formato eps en un archivo con nombre indicado en el último
argumento filename (de tipo “cadena” o string), y finalmente devuelve como output
una lista con los resultados obtenidos para f 0 y f 00 :
( %i1) graficaderivadaEPS(f, x, a, b, filename) := block( [aux],
aux : [f, diff(f, x, 1), diff(f, x, 2)],
plot2d( aux, [x, a, b],
[gnuplot_term, ps], [gnuplot_out_file, filename] ),
wxplot2d( aux, [x, a, b] ),
return( [aux[2], aux[3]] )
)$
para ver lo que hace esta función evaluamos, p. ej.
( %i2) graficaderivadaEPS(x3, x, -1, 1, "mi-grafica.eps");
al presionar shift + enter la función ejecuta de manera secuencial la lista de ins-
trucciones anterior: en primer lugar calculamos la primera y segunda derivada de
x3 por medio de diff(f, x, 1) y diff(f, x, 2) respectivamente, y asignamos a
la variable local aux una lista cuyos elementos son f , f 0 y f 00 . En la siguiente ins-
trucción la función plot2d genera la gráfica de esta lista de funciones (contenida
en la variable local aux) para valores de x en el intervalo [a, b] indicado, en este ca-
so: [−1, 1]. En esta instrucción el argumento [gnuplot_term, ps] de plot2d indica
2-22 TEMA 2. INTRODUCCIÓN AL MAXIMA
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
que en lugar de ver la gráfica en pantalla (resultado “por defecto”) lo que queremos
es generar el código postscript (ps) de dicha figura, y por medio de la instrucción
[gnuplot_out_file, filename] indicamos que queremos guardar dicho código post-
script en el archivo indicado en el argumento filename. En este caso el nombre del
archivo es mi-grafica.eps, para indicar este nombre de archivo el último argumento
va entre comillas dobles, "mi-grafica.eps", esto es necesario para que WX M AXIMA
interprete este argumento no como el nombre de una variable matemática, sino co-
mo una cadena de caracteres, es decir, una variable de tipo string, que es lo que
necesitamos para generar el nombre de un archivo en el disco. En la siguiente ins-
trucción wxplot2d( aux, [x, a, b] ) genera la misma gráfica de antes, pero esta
vez la muestra por pantalla dentro de la sesión de trabajo de WX M AXIMA. Finalmen-
te, por medio de return( [aux[2], aux[3]] ) la función “retorna” una lista con las
expresiones simbólicas obtenidas para f 0 y f 00 , en este caso [3x2 , 6x].
Con este ejemplo también hemos aprovechado para introducir los temas de repre-
sentaciones gráficas y escritura de archivos, sobre los que volveremos en capítulos
posteriores.
dentro de dicha función, como variables “auxiliares” para pasos intermedios de cálculo
u otras operaciones intermedias que sean precisas. La principal característica de las
variables locales es que solo son visibles desde dentro de la propia función donde se
han definido, pero no son visibles desde otras funciones o desde la sesión de traba-
jo. En el ejemplo anterior, al escribir el argumento aux dentro de los corchetes en el
comando block indicamos a M AXIMA que la variable aux es una variable local de esta
función. Esto implica que esta variable existe dentro de la función graficaderivadaEPS
mientras se ejecuta dicha función, y una vez ejecutada la función y obtenido el output
correspondiente la variable local desaparece.
De esta forma ya no hay que preocuparse de buscar nombres de variables nuevos
para las variables auxiliares que con frecuencia es necesario definir dentro de las
funciones, ya que aunque dichos nombres de variables estén en uso en la sesión de
trabajo (como variables globales) o en otras funciones (como variables locales) estas
definiciones no entrarán en conflicto unas con otras.
En el caso de la función graficaderivadaEPS, si en la sesión de trabajo desde
donde llamamos a esta función no existe una variable con el nombre aux, después de
llamar a esta función la variable aux seguirá sin estar asignada. De la misma manera,
si en la sesión de trabajo desde donde llamamos a graficaderivadaEPS existiese una
variable aux con un cierto valor asignado, dicha asignación no se modificará al llamar
a graficaderivadaEPS.
En todos los lenguajes de programación en los que se pueden definir funciones
existe la posibilidad de definir variables locales, con la finalidad que acabamos de
indicar. Aprender a programar funciones usando correctamente las variables locales
que sean necesarias es uno de los ingredientes fundamentales de esta parte de la
asignatura.
Hay un detalle importante que conviene poner de manifiesto. Si nos fijamos aten-
tamente en el código que define la función graficaderivadaEPS vemos que todas las
variables que entran en juego en dicha función, o bien se reciben como argumentos
(caso de: f, x, a, b y filename), o bien son variables locales (caso de: aux). Es decir,
en esta función no se hace uso de ninguna variable global que pudiera estar defini-
da en la sesión de trabajo en WX M AXIMA en curso. Esta es la forma correcta en que
deben escribirse las funciones, ya que así es como garantizamos su correcto funciona-
miento en cualquier sesión de trabajo, independientemente de las variables globales
que podamos haber definido en una sesión de trabajo en concreto. Por ejemplo, si
eliminásemos la f de la lista de argumentos de graficaderivadaEPS, el correcto fun-
cionamiento de esta función estaría condicionado a que exista en la sesión de trabajo
una variable global, llamada f, cuyo valor sea la expresión matemática f (x) sobre la
que queremos operar, pero no funcionará correctamente en caso contrario. Al fin y al
cabo cuando escribimos una función y la guardamos en un archivo, lo hacemos con la
finalidad de poder emplear dicha función posteriormente, en otras sesiones de traba-
jo, que posiblemente serán muy distintas de la sesión de trabajo en curso, y por tanto
tendrán variables globales totalmente distintas.
Veamos otro ejemplo de programación de funciones con el comando block. En es-
te capítulo hemos estudiado el uso de next_prime(n) para calcular cuántos números
primos existen con valores menores que un número dado; para ello comenzábamos
definiendo una variable global i:1;, cuyo valor posteriormente íbamos asignando a
los sucesivos números primos por medio de i:next_prime(i), contando el número de
veces que es necesario realizar esta asignación para superar el valor del número da-
2-24 TEMA 2. INTRODUCCIÓN AL MAXIMA
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
usuarios básicos cuando hemos empezado a usar este lenguaje, no hay nada malo
en ello.
El siguiente nivel, que podríamos denominar de usuario medio, consiste en no limi-
tarse a manipular expresiones por medio de los comandos disponibles en los menús
del WX M AXIMA, sino en emplear comandos o funciones adicionales del lenguaje M A -
XIMA no disponibles en estos menús. Al cabo de unas pocas sesiones de trabajo,
cualquier usuario básico con un poco de curiosidad se convierte sin darse cuenta, de
manera natural, en un usuario medio. Para ello basta con explorar un poco el menú
Ayuda del WX M AXIMA. Una forma muy práctica de ir aprendiendo es la siguiente:
Sin necesidad de tener conocimientos previos de M AXIMA seleccionamos al-
guna función que nos interese de las disponibles en los menús del WX M AXI -
MA . Por ejemplo, si nos interesa factorizar polinomios seleccionamos el menú:
Ecuaciones/Raices de un polinomio. Al hacer esto aparece una celda con el
comando allroots( %).
Lo primero que podemos hacer para ver cómo se usa este comando es visua-
lizar un ejemplo de uso. Para ello seleccionamos con un doble click la función
allroots y nos vamos al menú: Ayuda/Ejemplo. Esto nos genera una celda en
la sesión de trabajo con la instrucción example(allroots);, que nos ofrece un
ejemplo sencillo de uso de esta función.
Para aprender un poco más sobre la función allroots la seleccionamos con un
doble click y posteriormente nos vamos al menú: Ayuda/Ayuda de Maxima. Esto
nos lleva al correspondiente capítulo de la documentación del M AXIMA, donde
está toda la información sobre el tema seleccionado. Pulsando el botón “Buscar”,
en la barra lateral izquierda de la ventana de ayuda, accedemos directamente a la
información específica sobre la función seleccionada (allroots). Leyendo esta
información específica aprenderemos exactamente qué es lo que hace dicha
función, qué limitaciones tiene, qué opciones de uso existen, etc.
Además, explorando un poco el capítulo de ayuda localizaremos inmediatamente
otros comandos o funciones del M AXIMA, no disponibles en los menús del WX -
M AXIMA, relacionados con el comando que habíamos seleccionado al principio.
De esta forma aprenderemos rápidamente, en unas pocas sesiones de trabajo,
a usar otras muchas funciones del M AXIMA y opciones de uso de estas, aparte
de las que vienen en los menús.
Evidentemente la forma de aprender M AXIMA es usándolo, y para que esta tarea
no nos resulte demasiado ardua lo que debemos hacer es usarlo para resol-
ver problemas que nos parezcan interesantes, explorando en la documentación
(menú: Ayuda/Ayuda de Maxima) qué herramientas nos ofrece este lenguaje de
programación para resolver el problema en que estemos trabajando.
También hay que recordar que además de la ayuda del M AXIMA existe una canti-
dad muy considerable de documentación adicional en la web, sobre todo en len-
gua inglesa, incluyendo foros de usuarios avanzados, documentos, vídeos con
tutoriales, etc. todos ellos fácilmente localizables por medio de cualquier busca-
dor.
Estos son los pasos que hemos seguido todos para pasar de usuarios básicos a usua-
rios medios.
2-26 TEMA 2. INTRODUCCIÓN AL MAXIMA
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
Listas
Con mucha frecuencia trabajaremos con listas de objetos, que podrán ser
números, matrices, ecuaciones, vectores, cadenas de texto, gráficas, otras
listas, etc. La instrucción para definir una lista es:
makelist( elemento, índice, valor inicial, valor final, incremento );
Por ejemplo, esta instrucción genera una lista que contiene los números
pares de 0 a 10:
makelist(i, i, 0, 10, 2);
Equivalentemente lo mismo se consigue con
makelist(2*i, i, 0, 5, 1);
Ponemos en uso estas funciones en una sesión de trabajo y de esta forma vemos
cómo funcionan.
2-28 TEMA 2. INTRODUCCIÓN AL MAXIMA
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
En las funciones que aparecen como ejemplos en estos apuntes se usan diver-
sos comandos o funciones propios del lenguaje M AXIMA:
• Es fundamental estudiar en la documentación del M AXIMA la información
disponible sobre estas funciones, no para aprendérselas de memoria, sino
para entender qué es lo que hace cada línea de código de las funciones
que ponemos como ejemplo y también para aprender qué otras opciones
nos ofrece este lenguaje de programación.
Para adquirir experiencia suficiente es fundamental recorrer todos los ejemplos
disponibles en todos los apuntes, independientemente de que estén relaciona-
dos, o no, con los problemas propuestos en la PEC del curso actual. No es reco-
mendable esperar a que se publique la PEC y posteriormente intentar resolverla
consultando solo el capítulo relacionado con la PEC del año en curso.
Es muy importante no olvidarse de trabajar también los ejemplos disponibles en
el capítulo de “Exámenes resueltos de cursos anteriores”.
Esto último nos lleva al tema de la evaluación de la asignatura. Aunque toda la
información que ponemos a continuación viene en la Guía del Curso, lo cierto es que
todos los años se pregunta también en los foros de la asignatura (con respuesta: “lea
la Guía del Curso”). La evaluación de esta asignatura se basa en una PEC para cada
parte (programación en M AXIMA y en C) más un examen presencial.
Aunque la mayor parte de la nota se basa en las dos PECs, para aprobar la asig-
natura es imprescindible tener aprobadas las dos PECs y el examen presencial.
En cada curso hay dos convocatorias, junio y septiembre, tanto para las PECs
como para el examen presencial.
Se guarda para septiembre la calificación obtenida en junio en cualquiera de es-
tas tres pruebas (PEC de M AXIMA, PEC de C y examen presencial), de forma que
en septiembre solo hay que presentarse a la parte (o partes) no aprobadas
en junio.
Si después de las dos convocatorias (junio y septiembre) aún queda alguna prue-
ba sin aprobar, entonces es necesario repetir la asignatura completa. Es decir,
los aprobados de las PECs y examen presencial se guardan de junio para sep-
tiembre, pero no se guardan de un curso para el siguiente.
Obviamente, a todos los efectos las PEC de M AXIMA y C tienen categoría de
examen, por tanto deben realizarse de manera individual.
En caso de localizarse intentos de plagio entre compañeros se opera de manera
similar a como se hace en un examen presencial, es decir, se notifica al servicio
de inspección y se aplican las sanciones correspondientes (que incluyen suspen-
der la asignatura y en algunos casos pérdida de matrícula u otras sanciones).
En el caso particular de La PEC de M AXIMA:
• La PEC de M AXIMA consiste en la programación de varias funciones cuya
finalidad se explica con todo detalle en el enunciado (ver capítulo de “Exá-
menes resueltos de cursos anteriores”).
2.6. APRENDIENDO MAXIMA 2-29
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
Para calificar esta PEC el equipo docente procederá a cargar en una sesión de
M AXIMA el código aportado por cada estudiante, verificando el correcto funciona-
miento de las funciones que se pedían. Posteriormente el equipo docente abrirá,
por medio de un editor de textos, el archivo de texto plano subido al curso vir-
tual, y se examinará el código aportado. En este sentido se tendrá en cuenta la
claridad del código y los comentarios introducidos por el estudiante en el mismo
para facilitar su lectura.
En cualquier caso, a modo de resumen, las PECs de M AXIMA de cada año son si-
milares, en contenido y dificultad, a las de años precedentes. Lo que se pide es algo
similar a los archivos de código (*.mc) disponibles en la carpeta “PECS de Maxima”
del curso virtual. Una aclaración más, cada uno de estos archivos *.mc es un archivo
de texto plano; al bajarlos de la carpeta del curso virtual donde están alojados, algu-
nos navegadores les añaden la extensión .bin, esto no afecta de ninguna manera al
contenido del archivo. Si al bajar del curso virtual un archivo .mc obtiene un archivo
con la extensión adicional .bin, sencillamente, acceda al menú de “cambiar nombre
de archivo” de su SO y elimine dicha extensión adicional.
https://en.wikipedia.org/wiki/KWrite
https://kate-editor.org/
https://www.geany.org/
pero en cualquier caso hay total libertad para que cada uno emplee el que considere
más conveniente.
Cuando se trabaja en WX M AXIMA una posibilidad es usar la propia ventana del
WX M AXIMA como editor de texto. Para ello escribimos la función que queremos guar-
dar en una celda del WX M AXIMA y posteriormente vamos al menú: Archivo/Exportar,
seleccionamos en el menú desplegable de la esquina inferior derecha la opción “maxi-
ma batch file (*.mac)”, escogemos el directorio y nombre de archivo donde queremos
guardar nuestro código y pulsamos el botón “Guardar”. Al hacer esto hemos generado
un archivo de texto plano en el directorio seleccionado, con el nombre de archivo que
hayamos escrito y con la extensión .mac. El contenido de dicho archivo es el input de
todas las celdas de la sesión de trabajo en WX M AXIMA desde donde lo hayamos sal-
vado. Si en la sesión de trabajo en uso tenemos multitud de celdas y solo queremos
guardar el código de una de ellas una posibilidad es copiar la celda a guardar, pegarla
en una sesión nueva de WX M AXIMA (menú: Archivo/Nuevo), y exportarla desde es-
ta sesión nueva (hay que recordar evaluar esta celda antes de exportarla, para que
WX M AXIMA interprete la celda como input y la exporte correctamente).
La anterior forma de trabajar es una posibilidad que desaconsejamos. Es infinita-
mente más cómodo, más práctico y más sencillo usar un editor de texto de verdad para
escribir el código, y usar la ventana de WX M AXIMA solo para las sesiones de trabajo.
Aparece entonces la cuestión
append(file_search_maxima, ["mi-directorio"]);
Para que la instrucción anterior funcione correctamente la cadena de caracteres "mi-directorio"
debe contener la dirección completa del directorio indicado en el disco.
De todas formas, en lugar de modificar el contenido de file_search_maxima la
forma de trabajar que nos parece más recomendable es indicar a batchload la ruta
completa del archivo a cargar.
Por ejemplo, supongamos que estamos resolviendo problemas para la asignatura
de mecánica. Para un problema concreto necesitamos trabajar con la ecuación de
Newton
F = ma
y con las ecuaciones de Euler-Lagrange
d
Lv (t, q(t), q 0 (t)) − Lx (t, q(t), q 0 (t)) = 0
dt
para las cuales hemos programado diversas funciones guardadas en los archivos
ec-Newton.mc y ecs-Euler-Lagrange.mc. Si trabajamos de una manera más o me-
nos organizada, tendremos definido un cierto directorio (p. ej. bib) dentro de nuestro
directorio personal (/home/usuario o C:/Users/usuario, en Windows), donde aloja-
remos nuestra biblioteca de funciones, de forma que la localización de los archivos
anteriores en el disco será algo parecido a (p. ej.):
/home/usuario/bib/Maxima/mecanica/ec-Newton.mc
/home/usuario/bib/Maxima/mecanica/ecs-Euler-Lagrange.mc
Además, con toda probabilidad el directorio /home/usuario/bib/Maxima/mecanica/
será también el depositario de cualquier otro archivo con funciones de interés para
mecánica programadas en M AXIMA. En este caso una forma cómoda de trabajar para
cargar estos archivos desde una sesión de WX M AXIMA es asignar una variable de tipo
string al directorio donde están las funciones que queremos cargar. Para ello, dentro
de la sesión de trabajo de WX M AXIMA hacemos
path_mec : "/home/usuario/bib/Maxima/mecanica/";
(obsérvese el uso de comillas dobles, a fin de que la variable path_mec sea de tipo
string) y posteriormente empleamos la función de concatenación concat para generar
el path completo de los archivos a cargar
batchload( concat( path_mec, "/ec-Newton.mc") );
batchload( concat( path_mec, "/ecs-Euler-Lagrange.mc") );
operando de manera similar con otros archivos que queramos cargar.
• letra “ñ”,
• etc.
Aunque el sistema operativo nos permita generar nombres de archivo y/o di-
rectorios empleando caracteres no estándar, luego es una fuente de problemas
para muchos programas. Por ejemplo, la instrucción batchload que acabamos
de mostrar no funcionará si en el nombre del archivo o en el path existe algún
carácter no estándar. Véase la información a este respecto en el capítulo de
introducción.
• Paréntesis sin cerrar o mal cerrados (por ejemplo, cerramos con “]” un pa-
réntesis abierto con “(”, en cualquier lenguaje de programación estos ca-
racteres tienen significados y finalidades distintos).
• Falta una coma “,”, o se ha sustituido por otro signo de puntuación (., ;,
. . . ). Igual que antes, en cualquier lenguaje de programación los distintos
signos de puntuación son caracteres reservados con significados y finalida-
des distintos.
• “Hay una errota (falta una ltra, se ha sustituido una letri por utra, . . . ).”
Aunque los seres humanos somos capaces de darnos cuenta instantánea-
mente de este tipo de errores, y podemos comprender sin dificultad el signi-
ficado de una señal con ruido, como un texto lleno de errores, las máquinas
no son tan flexibles. Un ordenador lee y ejecuta exactamente lo que pone
en el código, si el código tiene un error el programa o bien no funcionará o,
peor aún, funcionará haciendo algo diferente de lo que creemos que hace.
Todos estos errores son sencillos de cometer si se trabaja demasiado deprisa, y tam-
bién es fácil localizarlos si se examina el código con atención. La claridad y limpieza
del código es fundamental en este sentido.
Como regla general, cuando algo que hayamos programado no funcione, o WX -
M AXIMA se demore demasiado en generar una respuesta, lo primero que debemos
sospechar es que quizá hay un error sintáctico en alguna parte.
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
2-34
TEMA 2. INTRODUCCIÓN AL MAXIMA
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
Tema 3
En esta sección aprenderemos a utilizar M AXIMA para operar con vectores y ma-
trices, veremos algunos ejemplos con matrices de rotaciones y cálculo de autovalores
y autovectores, y finalmente nos centraremos en el tema de la aplicación de cambios
de base sobre vectores y matrices, lo cual es una operación muy habitual en álgebra
especialmente cuando se estudia el tema de diagonalización de matrices.
3-1
3-2 TEMA 3. APLICACIONES DE MAXIMA EN ÁLGEBRA
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
3 −1 0
( %o1) 2 −3 1
4 4 −2
M AXIMA almacena las entradas Mij de la matriz en la forma M[i, j], p. ej. podemos
comprobar que M[2, 3] = 1.
Por medio de matrix podemos definir cualquier matriz a partir de sus filas, si la in-
formación que tenemos sobre una matriz está dada por columnas, lo más sencillo es
introducir esta matriz por filas y posteriormente calcular la traspuesta por medio de
transpose. Por ejemplo, vamos a definir la matriz MT = M T
( %i2) MT
: transpose( matrix([3, -1, 0], [2, -3, 1], [4, 4, -2]) );
3 2 4
( %o2) −1 −3 4
0 1 −2
El mismo operador que hemos usado antes para calcular el producto escalar de
dos vectores (“.”) es el que se usa para el producto de matrices y para el producto
de matrices por vectores (que es un caso particular del producto de matrices). Por
ejemplo, para calcular el resultado de aplicar M sobre el vector (x, y, z) hacemos
( %i3) M. [x, y, z];
3x − y
( %io3) z − 3 y + 2 x
−2 z + 4 y + 4 x
Por supuesto, para poder aplicar el operador de producto matricial “.” es necesario que
las matrices o vectores sobre los que actúa tengan las dimensiones adecuadas, de
lo contrario M AXIMA nos informará sobre un error al intentar multiplicar matrices con
dimensiones incompatibles.
M AXIMA también ofrece otras formas de introducir matrices. Por ejemplo, es posible
definir la matriz M de forma interactiva con el comando entermatrix de M AXIMA, a
medida que nos vaya pidiendo los datos de entrada, una vez que queda definida la
dimensión de M ,
( %i4) M : entermatrix(3,3);
Para facilitar la entrada de datos, M AXIMA nos pregunta sobre el tipo de matriz que
queremos definir; por ejemplo, si nuestra matriz es simétrica, M AXIMA sólo nos pre-
guntará por los elementos por encima y sobre la diagonal, ya que los restantes que-
darán fijados por simetría. El enunciado exacto nos pide introducir un número para
caracterizar la matriz, 1 si es diagonal, 2 si es simétrica, 3 si es antisimétrica, y 4 si
es general, como nuestro ejemplo. Seguidamente, incluimos los datos celda a celda.
Existe un tercer método que es útil si los elementos de la matriz siguen una forma fun-
cional de su posición por filas y columnas, esto es, si conocemos una función f (i, j)
tal que asigne a cada entrada Mij de la matriz su valor correspondiente. Para poder
construir matrices por este método empleamos un tipo especial de función llamado
function array, que se define igual que las funciones normales pero con los argumen-
tos entre corchetes, en lugar de paréntesis, y posteriormente empleamos el comando
genmatrix. Por ejemplo, la matriz de Hilbert de dimensión n está dada por los valores
Hij = (i + j − 1)−1 ,
con i y j entre 1 y la dimensión de la matriz, n, por tanto definimos
( %i1) componentesH[i,j] := (i + j - 1)(-1)$
Construyamos ahora la matriz de Hilbert 4 × 4, utilizamos el comando genmatrix(
elementos, número de filas, número de columnas). Con este comando M AXIMA aplica
3.1. OPERACIONES ELEMENTALES CON VECTORES Y MATRICES 3-3
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
0 2 0
y con el comando addcol(matriz, columna nueva) podemos añadirle una columna
nueva
( %i2) M2:
addcol(M, [-1, 2, 2] );
3 −1 0 −1
( %o2) 2 −3 1 2
4 4 −2 2
Podemos multiplicar matrices recordando que la regla de multiplicación matricial
de dos matrices A y B determina que el número de columnas de A debe ser igual al
número de filas de B, esto es A(n × k) · B(k × m) = matriz(n × m). Esto confirma que
siempre se pueden multiplicar matrices cuadradas de la misma dimensión. En el caso
anterior, entonces, podemos realizar la multiplicación de M1 por M2 y también M1 por M,
o la potencia M · M ≡ M 2 , mientras que la multiplicación M2 por M no está definida, y
en ese caso el M AXIMA nos daría el mensaje de error:
MULTIPLYMATRICES: attempt to multiply nonconformable matrices.
-- an error. To debug this try: debugmode(true);
Para la potencia de matrices aparte del operador de multiplicación matricial (p. ej.
M 2 = M.M), puede usarse el operador de potencia matricial, dado por: “”. Es decir, el
operador de potencia matricial es el operador de potencia escrito de manera explícita
“dos veces” (recordar que para obtener este símbolo dos veces en la mayoría de los
sistemas operativos será preciso pulsar el símbolo del teclado 4 veces, o 2 veces
seguida cada una de un espacio). Por ejemplo veamos M 2 :
( %i5) M2;
3-4 TEMA 3. APLICACIONES DE MAXIMA EN ÁLGEBRA
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
7 0 −1
( %o5) 4 11 −5
12 −24 8
Si aplicamos el operador de potencia normal sobre una matriz lo que obtenemos es
la matriz original con todos sus elementos elevados a la potencia indicada elemento a
elemento:
( %i6) M2;
9 1 0
( %o6) 4 9 1
16 16 4
Aunque esta operación puede resultar práctica para elevar a una potencia dada ca-
da elemento de una “lista de listas”, está claro que esta operación es distinta de la
operación elevar una matriz a una potencia.
Una de las operaciones más habituales con matrices es calcular la matriz inversa.
En M AXIMA esto se puede hacer o bien elevando la matriz a la potencia −1 o bien por
medio del comando invert:
( %i7) invert(M);
−1 1 21
( %o7) −4 3 32
−10 8 72
y se puede comprobar que M(-1); produce el mismo resultado.
Un ejercicio que puede hacerse con las operaciones definidas hasta ahora es com-
probar el teorema de los determinantes
cos α cos β cos γ − sin α sin γ cos α sin γ + sin α cos β cos γ − sin β cos γ
− cos α cos β sin γ − sin α cos γ cos α cos γ − sin α cos β sin γ sin β sin γ
cos α sin β sin α sin β cos β
En la anterior línea sólo hemos indicado la forma final de la matriz R(α, β, γ), realizan-
do el producto matricial Az (γ)Ay (β)Az (α), pero no hemos introducido una definición.
Con la definición de una función por medio de :=
( %i10) R(alpha, beta, gamma) := A(gamma) . Ay(beta) . A(alpha)$;
M AXIMA responde indicando que R(α, β, γ) está dado por el producto de las tres ma-
trices, que queda sin evaluar hasta que realicemos una llamada a la función R(α, β, γ).
Como punto final de este apartado queremos verificar algunas propiedades de la ma-
triz de rotación basada en los ángulos de Euler, en primer lugar es inmediato confirmar
de nuevo que esta matriz es ortogonal y que mantiene invariante la norma del vector
r. Aparte de esto es interesante verificar las dos propiedades siguientes:
det(A − λI) = 0
(A − λI) · v λ = 0
I = v −1 v T−1 + v 1 v T1 + v 0 v T0
3.2. CAMBIOS DE BASE 3-11
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
es la matriz identidad 3 × 3. Por tanto, para cualquier vector r del espacio euclídeo,
tenemos
r = I · r = v −1 v T−1 · r + v 1 v T1 · r + v 0 v T0 · r
que podemos escribir como el desarrollo del vector r en la base formada por los tres
autovectores normalizados
r = x−1 v −1 + x1 v 1 + x0 v 0
resolver los ejercicios recomendamos comenzar con cosas más sencillas, resolviendo
primero casos con n = 2, o n = 3 y, cuando eso ya esté superado, generalizándolos a
dimensión arbitraria.
• Producto escalar
n
X
u·v = ui vi = ui vi
i=1
• El índice que aparece repetido se llama índice mudo, mientras que los
demás índices que aparezcan en la expresión se llaman índices libres.
Como la expresión con un índice mudo realmente representa la suma
para todos los valores posibles del índice mudo, está claro que el resul-
tado será el mismo independientemente de la letra con que designemos
al índice mudo (y que no debe coincidir con ninguna de las empleadas
para los índices libres). P. ej. u · v = ui vi = uj vj = uα vα = . . . .
3.2. CAMBIOS DE BASE 3-13
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
3. La matriz del cambio de base (C) es la matriz cuadrada formada por los vectores
columna ti (con i = 1, . . . , n) expresados en términos de la base antigua
C = t1 t2 t3 . . . tn
Es muy fácil comprobar que cada uno de los vectores ti se obtiene al aplicar la
matriz del cambio sobre la base de partida en la forma
tj = ei Cij , i, j = 1, . . . , n
v = vi ei = v̂i ti
1. Supongamos una aplicación lineal A, tal que aplicada sobre el vector u nos da
el vector v
Au = v
Aij uj = vi
3. La matriz de A en la base nueva (vamos a denotarla por Âij ) cumplirá una expre-
sión análoga a la anterior pero con los vectores u y v referidos a la base nueva,
es decir
Âij ûj = v̂i
Producto de matrices .
Hacer las cosas de esta manera tiene muchísimas ventajas, en particular evita
muchos posibles errores, mejora el uso de la memoria y hace que los programas
sean más claros.
Para ver cómo funcionan estos comandos se puede consultar la guía de WX M AXI -
MA .
3.3. Problemas
3.3.1. Problemas propuestos
1. Escriba una función que aplique cambios de base sobre vectores.
3. Invierta las anteriores relaciones para escribir una función que genere las com-
ponentes de vectores y matrices respecto de la base estándar a partir de sus
componentes respecto a una base arbitraria.
Soluciones
Realmente más que las soluciones lo que vamos a exponer en estas notas son
unas posibles soluciones. En programación suele haber muchas formas posibles de
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
Nota: El procesador de textos empleado para escribir este documento es LATEX, para
incluir el código en M AXIMA que figura a continuación se ha empleado el paquete
listings, la instrucción en LATEX para incluir el contenido del archivo
UD-1Fisica-Computacional-1/Maxima/Problemas/Algebra/cambio_base_vector.mc
es:
\lstinputlisting[language=Maxima]{Maxima/lst/cambio_base_vector.mc}
Ejercicio 1
Dada una aplicación lineal calcule sus autovalores y autovectores. Aplique las
funciones que ha definido en el apartado anterior para calcular la matriz corres-
pondiente a esa aplicación lineal en la base formada por sus autovectores. ¿Se
encuentra el resultado que se esperaba?
En primer lugar vamos a definir una función (cambiobasevector) que aplica cam-
bios de base sobre vectores. A continuación incluimos el contenido del archivo
cambio_base_vector.mc que contiene dicha función :
/* FUNCION "cambiobasevector".
Aplica cambios de base sobre vectores, dimensiones arbitrarias.
Input:
1: "basenueva" = lista de vectores que forman la nueva base
2: "vector" = vector sobre el que vamos a aplicar el cambio de
base
Output:
componentes del vector en la nueva base */
A : matrix(basenueva[1]),
A : transpose(A),
A : invert(A),
A . vector
)$
/* fin */
Como puede verse, en este listado hemos omitido la instrucción return al final
del conjunto de instrucciones que forman el contenido del comando block. Cuan-
do en una función definida por medio de block se omite la instrucción return,
la función retorna el output de la última instrucción contenida en el block. En
general es una buena idea incluir la instrucción return al final, pero en funciones
sencillas como esta puede omitirse.
Para ver el funcionamiento de esta función se puede evaluar la instrucción
cambiobasevector([[0, 1, 0], [1, 0, 0],[0, 0, 1]], [x, y, z]);, que de-
vuelve las coordenadas de un vector genérico (x, y, z) en términos de la base
{j, i, k}, es decir: (y, x, z).
En este ejemplo también vemos una característica interesante de los programas
de alto nivel como el Maxima: como puede verse la función que hemos definido
funciona para un número de dimensiones arbitrario y en ninguna parte hemos
tenido que decirle explícitamente cuál es la dimensión del espacio vectorial en
el que estamos trabajado, sino que el propio programa deduce este valor del
número de elementos que forman la base del espacio vectorial, que es una de
las variables que pasamos como input.
Los programas de cálculo de alto nivel son muy fáciles de usar porque mane-
jan objetos matemáticos similares a los conceptos que manejamos nosotros,
por ejemplo, este programa admite como input una lista de vectores base y un
vector, independientemente de las dimensiones que tengan. Por supuesto, aun-
que la función admite como input cualquier lista de vectores que le pasemos, el
programa sólo funcionará correctamente cuando los datos que le demos sean
coherentes, es decir, si la lista de vectores base tiene n vectores todos ellos
deberán tener n componentes y deberán ser linealmente independientes, y el
vector al que le aplicamos el cambio también deberá ser de n componentes, de
lo contrario el programa dará un error.
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
Los programas de bajo nivel (como el C) son mucho más potentes, pero son algo
más complicados de usar ya que no manejan este tipo de objetos, sino que ma-
nejan objetos más próximos a los que maneja el procesador (en última instancia
direcciones de memoria que tienen asignados valores binarios), de todas formas
ése es el tema de la segunda parte de la asignatura.
Respecto al tema de la optimización es importante darse cuenta de que esta fun-
ción construye e invierte la matriz del cambio de base cada vez que se ejecuta.
Invertir una matriz es computacionalmente costoso si la dimensión es alta, por
tanto esta función está bien si queremos aplicar el cambio sólo a un vector, pero
si lo que queremos se aplicar el cambio de base sobre muchos vectores, en lugar
de aplicar muchas veces esta función lo que habría que hacer es modificarla de
tal forma que acepte como segundo argumento no a un único vector, sino a toda
la colección de vectores a los que queremos aplicar el cambio de base.
A : matrix(basenueva[1]),
A : transpose(A),
B : invert(A),
B . (M . A)
)$
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
/* fin */
Igual que antes, esta función construye la matriz del cambio y la invierte cada vez
que se ejecuta, de modo que no es práctico para emplearlo sobre una colección
de matrices.
Una vez hecho esto es muy fácil hacer un programa que deshaga el cambio
de base. Listado del archivo cambio_base_invertir.mc que contiene dicha las
funciones cambiobasevectorm1 y cambiobasematrizm1:
/* FUNCION "cambiobasevectorm1"
Deshace cambios de base sobre vectores
Input:
1: "basenueva" = lista de vectores que forman la nueva base
2: "VN" = coordenadas del vector en la base nueva
Output:
coordenadas del vector en la base vieja */
A : matrix(basenueva[1]),
A : transpose(A),
A . vector
)$
/* FUNCION "cambiobasematrizm1"
Deshace cambios de base sobre matrices
Input:
1: "basenueva" = lista de vectores que forman la nueva base
2: "MN" = coordenadas de la matriz en la base nueva
Output:
coordenadas de la matriz en la base vieja */
A : matrix(basenueva[1]),
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
A : transpose(A),
B : invert(A),
A . (MN . B)
)$
/* fin */
Para terminar el ejercicio 1 sólo nos queda escribir un programa que extraiga la
lista de autovectores de una matriz. La función eigenvectors del maxima pro-
porciona como segundo argumento del output una lista cuyos elementos son la
lista de los autovectores correspondientes a cada uno de los autovalores de la
matriz. Lo que necesitamos es sencillamente una lista de autovectores, y una
posible forma de construirla a partir del output generado por eigenvectors es la
siguiente función eigenvectorlist:
/* FUNCION "eigenvectorlist"
Proporciona la lista de autovectores de una matriz
Input:
"M" = matriz
Output:
"EL" lista de autovectores */
dimM : length(M),
A : eigenvectors(M)[2],
A : flatten(A),
makelist(
makelist(
A[ dimM * i + j ]
, j, 1, dimM)
, i, 0, numV - 1)
)$
/* fin */
Una vez que hemos programado estas funciones, para hacer el ejercicio 1 basta
con cargarlas desde una sesión de wxMaxima y llamarlas en el orden adecuado:
kill(all);
path : ".../Fisica-Computacional-1/Maxima/Problemas/";
batchload(concat(path,"Algebra/cambio_base_vector.mc"));
batchload(concat(path,"Algebra/cambio_base_matriz.mc"));
batchload(concat(path,"Algebra/cambio_base_invertir.mc"));
batchload(concat(path,"Algebra/eigenvector_list.mc"));
Ejercicio 2
A partir de la función para cambios de base realice un programa que calcule
el producto escalar de dos vectores expresados por medio de sus componentes
respecto de una base cualquiera.
Ejercicio 1
Escriba una función en Maxima que rote objetos tridimensionales
Programe esta función de forma eciente, intentando que realice el mínimo número de opera-
ciones posibles.
La operación que debemos hacer con cada uno de los puntos x que forman el objeto es
C + R(α, β, γ). (x − C)
/∗
Guardamos e l r e s u l t a d o de C − R.C en l a v a r i a b l e aux .
∗/
/∗
Aplicamos R s o b r e cada uno de l o s v e c t o r e s de l a l i s t a y sumamos C − R.C a l r e s u l t a d o .
∗/
/∗ Fin ∗/
1
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
Tema 4
4-1
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
Soluciones
Ejercicio 1
Realice un programa que proporcione los desarrollos en serie de Taylor sucesi-
vos de una función desde orden cero hasta un orden n arbitrario
En la mayoría de los problemas de esta parte del curso no vamos a insistir demasia-
do en la cuestión de la optimización, pero en este problema haremos una excepción.
La forma más inmediata de hacer este ejercicio sería hacer una función que llamase a
la función taylor(f , x, x0 , n) sucesivamente para valores del orden del desarrollo
n entre n = 0 y el orden máximo que se desee calcular. A pesar de ser totalmente
ineficiente, ya que estamos repitiendo el mismo cálculo muchas veces, eso daría la
respuesta correcta. Para hacerlo de esa forma sencillamente haríamos:
taylorlistineficiente(f, x, x0, orden) := makelist( taylor(f, x, x0, i),
i, 0, orden, 1);
Esta forma de hacerlo es poco recomendable si queremos evaluar estos desarro-
llos hasta un orden muy alto, o si la función sobre la que vamos a operar es difícil de
evaluar. Por ejemplo, supongamos que la función f (x) cuyo desarrollo queremos co-
nocer no es una función conocida en términos de una expresión matemática cerrada,
sino que sólo podemos conocer los valores que esta función, o sus derivadas, toman
para valores numéricos concretos de la variable, y supongamos que cada una de esas
evaluaciones numéricas es muy costosa computacionalmente (p. ej. porque involucra
resolver numéricamente un conjunto de ecuaciones trascendentes). En ese caso ha-
ríamos el programa intentando minimizar el número de evaluaciones de la función f (x)
o sus derivadas.
Es obvio que para calcular el listado de desarrollos pedidos de una forma eficiente
basta con calcular el desarrollo de orden más alto una sola vez. Una posible forma
de hacer eso es como se muestra en la función taylor_list, cuyo listado incluimos a
continuación. Listado del archivo taylor_list.mc:
/* FUNCION "taylorlist"
Calcula la lista de desarrollos en serie de Taylor desde orden 0 hasta
un orden dado
Input:
1: f = func. de una variable cuyo desarrollo se va a calcular
2: x = variable
3: x0 = punto en torno al que desarrollamos
4: n = orden del desarrollo
Output:
lista de desarrollos de f(x) en serie de potencias de (x - x0) desde
orden 0 hasta orden n */
aux : f,
TL : [ subst(x0, x, aux) ],
aux : diff(aux,x),
TL
)$
/* fin */
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
4-4
TEMA 4. CÁLCULO CON FUNCIONES DE UNA VARIABLE
Problemas del Tema 4
Ejercicio 1
Escriba una función en Maxima que calcule valores promedio de variables aleatorias discretas
output: • Promedio.
Ejercicio 2
Escriba una función en Maxima que calcule la desviación estándar de variables aleatorias
discretas
Para resolver los dos primeros ejercicios lo más sencillo es denir una función que nos calcule el
momento de orden k de una variable discreta. Esto es lo que hace la función momentosvardis(prob,
valoresx, k), donde prob es la función de probabilidad, valoresx es la lista de posibles valores
de la variable discreta x y k el orden del momento que vamos a calcular.
/∗
Funcion momentosvardis : C a l c u l a e l momento de orden k de l a v a r i a b l e d i s c r e t a x con
v a l o r e s p o s i b l e s dados por v a l o r e s x , con p r o b a b i l i d a d e s dadas por l a fu nc . prob .
∗/
/∗ P r o b a b i l i d a d e s de cada uno de l o s v a l o r e s p o s i b l e s de l a v a r i a b l e d i s c r e t a x ∗ /
/∗ L i s t a de v a l o r e s de x^k ∗ /
1
2
xk : v a l o r e s x ^k ,
px . xk
)$
/∗ Fin ∗/
Una vez denida la función que nos genera los momentos, la función que nos calcula el promedio
puede denirse como
p r o m e d i o v a r d i s ( prob , v a l o r e s x ) := momentosvardis ( prob , v a l o r e s x , 1 ) $
En la anterior denición se ha dado por hecho que la función de probabilidad prob está debi-
damente normalizada, es decir, que su momento de orden 0 es la unidad. Si esto no fuera así una
forma de normalizar la función de probabilidad prob es redenirla dividiéndola por su momento de
orden 0: prob = prob/µ0 . En cuyo caso, para calcular el promedio tendríamos que hacer
p r o m e d i o v a r d i s ( prob , v a l o r e s x ):= momentosvardis ( prob , v a l o r e s x , 1 ) / momentosvardis ( prob , v a l o r e s x , 0 ) $
)$
Ejercicio 3
Escriba una función en Maxima que calcule el valor promedio de una variable aleatoria
continua
output: • Promedio.
Ejercicio 4
Escriba una función en Maxima que calcule la desviación estándar de una variable aleatoria
continua
Programación con Maxima; Dept. Física Matemática y de Fluidos UNED curso 2011/2012
3
Para los ejercicios 3 y 4 denimos una función que nos calcule los momentos de una variable
aleatoria continua, descrita por por la función de densidad de probabilidad f (x), sobre el intervalo
[a, b] = intervalox de la recta real.
/∗
Funcion momentosvarcon : C a l c u l a e l momento de orden k de l a v a r i a b l e c o n t i n u a x
d e f i n i d a s o b r e e l i n t e r v a l o i n t e r v a l o x , con p r o b a b i l i d a d e s dadas por l a fu nc . de
d e n s i d a d de p r o b a b i l i d a d f .
∗/
/∗ Fin ∗/
En esta denición hemos dado por hecho que los valores dados en intervalox están ordenados,
y también que la integral correspondiente puede calcularse de manera analítica. Una vez denida
esta función el promedio y la variación estándar pueden calcularse como
promediovarcon ( f , x , i n t v x ):= momentosvarcon ( f , x , i n t v x , 1 ) / momentosvarcon ( f , x , i n t v x , 0 ) $
d e s v s t d r v a r c o n ( f , x , i n t v x ) := sqrt (
)$
donde hemos conservado el factor de normalización 1/µ0 para aquellos casos en los que la función
de densidad de probabilidad suministrada no esté normalizada.
Programación con Maxima; Dept. Física Matemática y de Fluidos UNED curso 2011/2012
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
Tema 5
Visualización
Para el estudio de este tema familiarícese con el uso del WX M AXIMA para repre-
sentaciones gráficas en dos y tres dimensiones.
Representaciones gráficas:
• Gráficas en 2D: plot2d(expresión,[variable, límite inferior, límite
superior], opciones). Por ejemplo: plot2d(sin(x),[x,- %pi, %pi]).
• Gráficas en 3D: plot3d(expresión,[variable1, lím. inferior 1, lím.
superior1], [variable2, lím. inferior1, lím. superior1], opciones).
Por ejemplo: plot3d(sin(x2+y2),[x,- %pi, %pi],[y,- %pi, %pi]).
• Cada uno de estos comandos tiene multitud de opciones para representar
gráficas de distintos tipos. Consulte la ayuda del WX M AXIMA para explorar
las posibilidades de estos comandos.
Los comandos plot2d y plot3d del M AXIMA funcionan bien, pero tienen el inconve-
niente de no permitirnos la visualización simultánea de varias gráficas distintas, ya que
al usar estos comandos cualquier gráfica que hagamos se representará en una única
ventana, ocupando el sitio de cualquier gráfica que hayamos visualizado previamente.
Para resolver este problema una posibilidad es guardar los resultados en un archivo
antes de llamar a plot2d o plot3d para realizar la gráfica siguiente. Otra alternativa
es emplear los comandos wxplot2d y wxplot3d del WX M AXIMA. Estos comandos en
lugar de emplear una ventana única para todas las representaciones gráficas generan
una ventana nueva con cada nueva representación gráfica que hagamos, que que-
da integrada en la sesión de trabajo, lo que nos permite la visualización simultánea
de todas las gráficas que hayamos generado en una sesión sin necesidad de guar-
darlas en archivos. De todas formas, en muchos casos querremos incluir las gráficas
generadas en una sesión de cálculo en algún documento sin pérdida de calidad de
la imagen, para ello es fundamental saber cómo guardar gráficas en archivos, para
poder importarlas posteriormente con el procesador de textos que estemos usando.
5-1
5-2 TEMA 5. VISUALIZACIÓN
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
Soluciones
Ejercicio 1
Emplee la función plot2d para visualizar en una gráfica una función y sus co-
rrespondientes desarrollos en serie de Taylor en torno a un punto dado a orden
cada vez superior (por ejemplo puede considerar la función sin x y sus desarrollos
sucesivos para n entre 0 y 10).
Lo más inmediato para este ejercicio es usar directamente la función plot2d del
WX M AXIMA. En lugar de la función que se sugiere en el enunciado vamos a tomar
como ejemplo la función sin x + cos x, y hacemos su desarrollo en torno a x = 0 hasta
orden entre n = 0 y n = 10. Para ello en primer lugar cargamos la función definida en
el ejercicio anterior dentro de una sesión con WX M AXIMA:
kill(all);
path : ".../Fisica-Computacional-1/Maxima/";
batchload(concat(path,"taylor_list.mc"));
posteriormente hacemos:
f(x) := sin(x) + cos(x);
orden : 10$
aux : taylorlist(f(x),x,0,orden)$
Estamos interesados en ver estos resultados en un cierto entorno alrededor de
x = 0 (pongamos el intervalo [−2π, 2π]). Para no tener que escribir [x, -2* %pi,
2* %pi] muchas veces, asignamos ese dato a una variable (dominiox) y sencillamente
le pedimos a WX M AXIMA que haga la representación gráfica de aux:
dominiox : [x, -2* %pi, 2* %pi];
plot2d(aux, dominiox);
Si hacemos esto obtenemos una gráfica en la que realmente no podemos ver el
grado de aproximación de los desarrollos en serie de Taylor. Los desarrollos en serie
de Taylor son precisos en un cierto entorno alrededor del punto respecto al que de-
sarrollamos (x = 0 en este caso), pero una vez nos salimos de ese entorno crecen
de manera muy rápida, alejándose de la función que queremos aproximar. Para poder
ver algo tenemos que decirle a WX M AXIMA que queremos ver los resultados limitando
el rango de ordenadas de la gráfica al conjunto de valores de y en el que varía f (x)
cuando x toma valores en el intervalo de interés (en este caso dominiox). Definimos
entonces el rango de valores de y en el que queremos ver la gráfica y le volvemos a
pedir a WX M AXIMA que nos muestre los resultados:
dominioy : [y,-2,2];
plot2d(aux, dominiox, dominioy);
Ahora ya se ve por dónde van los desarrollos en serie de Taylor en la inmediata
vecindad del punto de interés (x = 0), y WX M AXIMA nos informa que “algunos valo-
res han sido cortados”, es decir, caen fuera de la ventana dominiox × dominioy que
estamos representando.
5.1. PROBLEMAS RESUELTOS 5-3
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
El siguiente problema que vemos en esta gráfica es que las etiquetas que indican
qué función corresponde a cada línea ocupa demasiado espacio. Para evitar esto ne-
cesitamos indicar a WX M AXIMA que no queremos emplear la opción por defecto para
identificar cada curva de la gráfica, sino que queremos especificar qué nombres mos-
trar para cada una de estas curvas. Para ello se usa la opción legend de la función
plot2d, cuya sintaxis puede consultarse en la ayuda de WX M AXIMA. En nuestro caso
necesitamos especificar una lista de “nombres” que nos permita identificar cada una
de las curvas representadas. Una posibilidad es pedirle a WX M AXIMA que en lugar de
indicar la función completa que corresponde a cada color nos indique sólo el orden
del desarrollo correspondiente. Como la lista aux contiene los desarrollos de orden
n = 0 hasta orden n = 10, para que WX M AXIMA sólo escriba el orden correspondiente
hacemos la siguiente lista de “nombres”
nombres : append([legend], makelist(string(i - 1), i, 1, length(aux), 1))
;
En la instrucción anterior en primer lugar generamos una lista de números entre 0 y
el orden más alto de la lista de desarrollos de Taylor por medio de makelist(string(i
- 1), i, 1, length(aux), 1), (el último 1 indica que queremos esa lista a intervalos
de 1). Para que la opción legend funcione correctamente en las versiones modernas
de WX M AXIMA es necesario que las etiquetas a mostrar en la gráfica sean de tipo
cadena de caracteres (es decir, de tipo string), para ello empleamos la instrucción
string(i - 1) que evalúa el valor de i − 1 y lo convierte a una variable de tipo string
(en las versiones antiguas esta conversión de tipo de variable se hacía de manera au-
tomática cuando era preciso). Finalmente empleamos append([legend], ...) para
generar una única lista cuyo primer elemento es la instrucción legend y cuyos ele-
mentos restantes están dados por la lista de etiquetas que hemos decidido emplear,
esta es la sintaxis correcta para usar la opción legend en plot2d. Una vez hemos de-
finido la lista de nombres que queremos emplear en la gráfica llamamos a la función
plot2d:
plot2d(aux, dominiox, dominioy, nombres);
Ahora ya se ve bastante claro por dónde va cada desarrollo. Lo único que falta es
incluir la función f (x), ya que el enunciado pide representar esa función con todos los
desarrollos. Para ello por medio de la función append de WX M AXIMA construimos una
lista de funciones cuyo primer elemento es f (x) y cuyos restantes elementos sean
los desarrollos definidos en aux. Análogamente empleamos la función append para
re-definir la lista de etiquetas por medio de
nombres : append([legend, string(f(x))], makelist(string(i - 1), i, 1,
length(aux), 1));
de tal forma que para la función f (x) aparezca la propia función y para cada uno de los
elementos de aux aparezca el valor del orden correspondiente. Finalmente volvemos
a emplear la función plot2d:
plot2d( append([f(x)], aux), dominiox, dominioy, nombres );
La siguiente mejora que se nos ocurre es que nos gustaría que la función exacta
f (x) apareciese más destacada sobre los desarrollos en serie de Taylor. Por ejemplo,
podríamos pintar la gráfica de f (x) con un grosor de línea mayor (pongamos 4). Para
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
indicar el grosor de línea que queremos empleamos la opción style de plot2d y vol-
vemos a emplear append para generar la lista completa de estilos que queremos para
generar la gráfica final, con grosor 4 para f (x) y grosor 1 para los desarrollos:
plot2d(
append([f(x)], aux), dominiox, dominioy, nombres,
append( [style], [[lines, 4]], makelist([lines, 1], i, 1, length(
aux), 1) )
);
Una vez hemos visto cómo representar f (x) junto a sus desarrollos podemos de-
finir una función (vertaylorlist) que haga todo este trabajo para poder usarla pos-
teriormente. Incluimos a continuación el listado del archivo ver_taylor_list.mc que
contiene las funciones vertaylorlist y vertaylorlistsave:
/* FUNCION "vertaylorlist"
Realiza la gr\'afica de una funci\'on junto con sus desarrollos en
serie de
Taylor en torno a un punto hasta un orden dado, generados con
taylorlist
Input:
f = la funci\'on a estudiar
x = variable respecto de la que se hace el desarrollo
x0 = punto en torno al que desarrollamos
n = orden m\'aximo del desarrollo
xmin, xmax = valores m{\'\i}nimo y m\'aximo de x a considerar en la
gr\'afica
ymin, ymax = valores m{\'\i}nimo y m\'aximo de y a considerar en la
gr\'afica
Output:
gr\'afica de f(x) junto a sus desarrollos */
)
5.1. PROBLEMAS RESUELTOS 5-5
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
)$
/* FUNCION "vertaylorlistsave"
Definimos la misma funci\'on con el argumento adicional "filename"
para guardar el resultado en
un archivo con formato eps.
*/
[format, filename]
)$
Una vez definida esta función podemos experimentar muy fácilmente cómo fun-
cionan los desarrollos en serie de Taylor, probando con distintas funciones y distintos
órdenes máximos. A todo esto, hemos supuesto en todo momento que la función f (x)
era analítica, si no es así los desarrollos en serie de Taylor no convergen a f (x). En
particular, si f (x) tiene una singularidad en el punto en que desarrollamos al intentar
calcular el desarrollo WX M AXIMA nos dará un error. Una vez más, para usar ordena-
dores de una manera eficiente lo mejor es saber qué es lo que estamos haciendo
en todo momento, solo de esa forma podremos interpretar correctamente los resul-
5-6 TEMA 5. VISUALIZACIÓN
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
tados que obtengamos y entender qué está pasando cuando algo no funcione como
esperábamos.
Además de la función vertaylorlist, en el archivo ver_taylor_list.mc hemos
definido la función vertaylorlistsave, que hace exactamente lo mismo, pero en lugar
de mostrar el resultado en la pantalla lo guarda en un archivo con formato eps. El
argumento adicional de la función vertaylorlistsave es precisamente el nombre del
archivo donde queremos guardar la gráfica, este argumento debe ser una “cadena de
caracteres” (un string). Por ejemplo, se puede probar lo siguiente:
vertaylorlist( log(1+x), x, 0, 5, 0, 3, -0.5, 2 );
vertaylorlistsave( log(1+x), x, 0, 5, 0, 3, -0.5, 2, "figura-1.eps" );
Hemos escogido el formato .eps (encapsulated postscript) porque es el más ha-
bitual cuando se trabaja en LATEX. La principal ventaja del .eps es que es un formato
vectorial, de modo que la calidad es muy alta y ocupa muy poco, aparte de ser es-
tándar y gratuito. Realmente .eps era el formato más habitual, actualmente es más
normal trabajar en pdfLATEX, en cuyo caso las gráficas pueden importarse en pdf.
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
Tema 6
6-1
6-2 TEMA 6. SOLUCIÓN ANALÍTICA Y NUMÉRICA DE ECUACIONES
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
la ecuación numéricamente, lo cual sólo es posible una vez que hemos sumi-
nistrado un valor numérico concreto para x. Escriba una función por medio del
comando newton() que proporcione y en función de x resolviendo la ecuación
F (x, y) = 0 numéricamente.
Notas:
Un dato necesario para resolver este ejercicio es el conjunto de funciones con-
cretas F (x, y) que definen las correspondientes ecuaciones que queremos resol-
ver. Para ello puede probar con cualquier función F , pero le recomendamos que
tome (entre otros casos) el ejemplo concreto que mencionamos más abajo.
Notas:
Para realizar este ejercicio deberá calcular las derivadas (desde la primera hasta
la n-ésima) de la función y = f (x) en el punto x0 . Para ello debe derivar respecto de
x la relación F [y(x), x] = 0 utilizando diff(), posteriormente deberá utilizar subst()
para sustituir x e y por x0 e y0 y finalmente deberá usar solve() para despejar la
derivada buscada. Esta operación deberá hacerse de manera secuencial, desde la
primera derivada hasta la de orden n.
En principio todos sabemos cómo se hace el desarrollo en serie de Taylor de una
función definida de forma explícita
y = f (x)
Esto es precisamente lo que hace la función definida en el apartado 4.1, con la única
salvedad de que en lugar de calcular el desarrollo completo (hasta n = ∞) lo estamos
cortando en un orden finito determinado (eso es lo que se llama un desarrollo trunca-
do). Es evidente que aunque matemáticamente se manejan formalmente de manera
totalmente rutinaria multitud
√ de objetos que involucran infinitos, como números con
precisión infinita (π, e, 2, . . . ) o series infinitas, computacionalmente debemos confor-
marnos con las correspondientes aproximaciones finitas.
El problema que vamos a tratar en estas indicaciones es cómo se calcula un de-
sarrollo en serie de Taylor para una función definida de forma implícita. Una función
y = f (x) está definida de forma implícita cuando la condición que define la función,
dada de forma genérica por la ecuación
F (x, y) = 0
Para los demás términos del desarrollo sustituimos formalmente y = f (x) dentro
de F (x, y) y calculamos las derivadas de f (x) por medio de la regla de la cadena
F (x, f (x)) = 0
Fx + Fy f 0 (x) = 0 ⇒ f 0 (x) = −Fx /Fy
dFx dFy 0 dFx dFy 0
+ f (x) + Fy f 00 (x) = 0 ⇒ 00
f (x) = − + f (x) /Fy
dx dx dx dx
... ... ... ⇒ ... ... ...
Lo que es importante es darse cuenta de que para calcular el desarrollo sólo tene-
mos que resolver numéricamente una única ecuación (para calcular y0 ), ya que aunque
sea imposible despejar y en función de x, siempre podemos derivar por medio de la
regla de la cadena y despejar de manera trivial las sucesivas derivadas de y respecto
de x, que quedan evaluadas de manera analítica (no numérica). Por cierto, una de
las condiciones necesarias para que se cumpla el teorema de la función implícita es
precisamente que la Fy que nos aparece en todos los denominadores no se anule.
En los ejercicios planteados en este tema se pide hacer una serie de funciones
que resuelvan la ecuación F (x, y) = 0, análiticamente si es posible o numéricamente
en caso contrario, pero no se propone ninguna función F (x, y) concreta.
Para fijar ideas proponemos trabajar sobre los siguientes casos concretos:
Caso con solución analítica: F (x, y) = x2 + y 2 − 1.
Caso sin solución analítica: F (x, y) = ey − xy. En este caso hay que tener en
cuenta que esta ecuación tiene solución única para −∞ ≤ x ≤ 0, no tiene solu-
ción para 0 < x < e y tiene dos soluciones para x > e.
Aunque para fijar ideas le proponemos trabajar sobre estos ejemplos de funciones
F (x, y), las soluciones a los ejercicios deben estar programadas para operar sobre
cualquier función F (x, y).
6.3. FUNCIÓN INVERSA 6-5
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
Ejercicio 1
Dada una ecuación F (x, y) = 0 escriba una función usando el comando solve
que despeje de forma analítica y en función de x, y defina de esta forma la corres-
pondiente función y = f (x).
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
En este ejercicio lo único que hay que hacer es usar las funciones solve y sublis
del wxMaxima. Si la ecuación F (x, y) = 0 puede resolverse analíticamente (lo cual
no siempre ocurre), la función solve(F(x, y) = 0, y) resuelve la ecuación y nos
devuelve una lista de ecuaciones en las que la variable y está despejada, cada uno
de los elementos de esta lista corresponde a una de las soluciones de la ecuación. La
función sublis aplicada al anterior output sustituye la ecuación que hemos obtenido
para la y ya despejada. Definimos entonces la función solvesust:
solvesust(F, y) := sublis( solve( F = 0, y), y )$
Haciéndolo de esta forma vemos que cuando la ecuación F (x, y) = 0 tiene más de
una solución (p. ej. x2 + y 2 − 1 = 0) sólo obtenemos la primera, ya que sublis sustituye
la primera solución y prescinde de todas las restantes, a pesar de que solve nos
genera la lista completa de soluciones. Esto es un inconveniente, ya que si la ecuación
que tenemos que resolver tiene más de una solución, en principio nos interesa obtener
una lista con todas las soluciones posibles.
Una posible forma de conseguir esta lista de soluciones es aplicando sublis de
manera sucesiva sobre cada una de las soluciones encontradas con solve, para ello
modificamos solvesust de la siguiente forma, listado del archivo solve_sust.mc:
/* FUNCION "solvesust"
Resuelve anal{\'\i}ticamente la ecuaci\'on F(x, y) = 0 para
la variable y, devolviendo la soluci\'on
Input:
F = la funci\'on que define la ecuaci\'on F = 0
y = variable que queremos despejar
Output:
lista de soluciones de F = 0 para y */
soly
)$
/* fin */
Ejercicio 2
Con mucha frecuencia aparecen ecuaciones en las que no es posible realizar
esta operación analíticamente, es ese caso no hay más remedio que resolver la
ecuación numéricamente, lo cual sólo es posible una vez que hemos suministrado
un valor numérico concreto para x. Escriba una función por medio del comando
newton que proporcione y en función de x resolviendo la ecuación F (x, y) = 0
numéricamente.
En este caso no tenemos más remedio que renunciar a la solución exacta, y debe-
mos conformarnos con obtener una solución aproximada. Esto implica que debemos
añadir una parámetro que indice cuándo consideramos que la aproximación a la solu-
ción que tenemos es aceptable, este parámetro es el último argumento de la función
newton del WX M AXIMA. En la función solvenewton, que hemos definido en el archivo
solve_Newton.mc, hemos introducido este parámetro como una variable local (epsi-
lon), no como un argumento de la función, ya que en principio este parámetro tendrá
un valor fijo para todos los cálculos que hagamos (p. ej. el valor que hemos escogido
es 10−6 , si tomamos un valor más pequeño la aproximación será algo mejor, pero el
tiempo de cálculo será mayor). Listado del archivo solve_Newton.mc:
/* FUNCION "solvenewton"
Resuelve num\'ericamente la ecuaci\'on F(x, y) = 0 para la variable y
por medio del m\'etodo de Newton
Input:
F = la funci\'on que define la ecuaci\'on F = 0
y = variable que queremos despejar
y0 = punto de partida para el m\'etodo de Newton
Output:
valor de y encontrado para la soluci\'on de F = 0 */
load (newton1),
epsilon : 10^(-6),
)$
/* fin */
Una vez tenemos esto, dada una ecuación concreta F (x, y) = 0 para resolver este
ejercicio basta con hacer
f(x) := solvenewton( F(x, y), y, y0)
donde el último argumento indica el punto de partida para el método de Newton.
Vamos a aplicar esta función para resolver la ecuación ey = xy. Dependiendo del
valor de x, esta ecuación puede tener una solución (si x ∈ (−∞, 0)), ninguna (si
x ∈ (0, e)), o dos soluciones (si x > e) para y; por otra parte, para que el método
de Newton funcione razonablemente bien es necesario que el punto de partida y0 es-
té razonablemente cerca de la solución buscada (de hecho, si la ecuación tiene más
de una solución el método de Newton convergerá a una u otra solución dependiendo
del valor de y0 ). Antes de perder horas de cálculo sin estar seguros de qué estamos
buscando, lo primero que tenemos que hacer es realizar un estudio de la ecuación pa-
ra averiguar para qué valores de x existe la solución. Para ello podemos representar
gráficamente las funciones ey junto con xy en función de y, para varios valores de x, fi-
jándonos en cuándo se cruzan; para esta ecuación esa estrategia permite comprender
rápidamente cuándo tiene solución y cuándo no, alternativamente también se puede
hacer la representación de ey − xy frente a y para varios valores de x, y ver cuándo
corta al eje de abscisas. De este estudio deducimos por un lado que la solución de
esta ecuación existe y es única para x < 0 y doble para x > e, mientras que no hay
solución para x ∈ (0, e), y por otro también nos permite hacernos una idea sobre el
primer valor de y con que iniciar el método de Newton.
Para los valores negativos de x, y para la rama de abajo correspondiente a los
valores de x por encima de e, el método de Newton converge bastante bien con y0 =
1/2, de modo que definimos:
f(x) := solvenewton(exp(y)-x*y, y, 1/2);
data1 : makelist( [x, f(x)], x, -10, -0.1, 0.05)$
data2 : makelist( [x, f(x)], x, float( %e), 15, 0.05)$
Para calcular la rama de arriba correspondiente a x > e es preciso dar un valor a
y0 que vaya aumentando a medida que x aumenta. Hemos visto que y0 = x funciona
razonablemente bien, de modo que para calcular esta rama hacemos:
f(x) := solvenewton(exp(y)-x*y, y, x);
data3 : makelist( [x, f(x)], x, float( %e), 15, 0.05)$
En principio podríamos usar la función f(x) que hemos definido directamente en
plot2d para generar las gráficas, pero eso resulta bastante lento. Para representar
funciones definidas mediante cálculo numérico, como esta, es mucho más práctico
calcular un conjunto discreto de puntos como hemos hecho arriba. Para representar
estos puntos y ver finalmente el aspecto de la función y = f (x) hacemos:
6.5. PROBLEMAS RESUELTOS 6-9
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
5
discrete1
discrete2
discrete3
4
-1
-2
-10 -5 0 5 10 15
Figura 6.1:
Ejercicio 3
Utilice el programa de la sección anterior para generar una aproximación a la
función y = f (x) en forma de serie de Taylor (de orden n arbitrario), válida en un
entorno de x0 .
epsilon : 10^(-6),
load(newton1),
la variable derivadas */
derivadas : subst(
solve(
makelist(
diff(
subst( auxf(x), y, F )
, x, i)
, i, 1, n, 1)
, derivadas)
, derivadas),
)$
/* fin */
Por ejemplo, para usar esta función para calcular el desarrollo en serie de Taylor
de y como función de x, definida implícitamente por ey = xy, en torno al punto x = 5,
a orden 3, podemos hacer
kill(all);
path : ".../Fisica-Computacional-1/Maxima/Problemas/SolucionEcuaciones/";
batchload(concat(path,"taylor_implicit.mc"));
aprox : taylorimplicit( exp(y) - x*y, x, y, 5, 1, 3);
Ejercicio 4
Visualice los resultados obtenidos mediante gráficas por medio de la función
plot2d.
En el tema anterior ya indicamos cómo visualizar listas de funciones dadas por defi-
6-12 TEMA 6. SOLUCIÓN ANALÍTICA Y NUMÉRICA DE ECUACIONES
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
niciones explícitas. Más arriba en este mismo documento ya hemos indicado que para
visualizar los resultados obtenidos con solvenewton lo más recomendable es calcular
numéricamente cada rama de la solución por separado y posteriormente representar-
las:
f(x) := solvenewton(exp(y)-x*y, y, 1/2);
data1 : makelist( [x, f(x)], x, -10, -0.1, 0.05)$
data2 : makelist( [x, f(x)], x, float( %e), 15, 0.05)$
f(x) := solvenewton(exp(y)-x*y, y, x);
data3 : makelist( [x, f(x)], x, float( %e), 15, 0.05)$
En el caso que estamos estudiando, para x > e la función f (x) es bi-valuada,
tiene dos ramas, de forma que dependiendo del valor inicial y0 que empleemos en
el método de Newton encontramos una u otra de estas ramas, tal y como hemos
hecho más arriba. A la hora de calcular el desarrollo en serie de Taylor pasa lo mismo,
dependiendo del valor que le demos a y0 encontraremos el desarrollo en serie de
Taylor de una rama o de otra. En el siguiente código calculamos los desarrollos a
orden 3 en torno a x = −5 (ver aprox1) y x = +5, en este segundo caso calculamos
un desarrollo para la rama de abajo (ver aprox2) y otro para la de arriba (ver aprox3):
aprox1 : taylorimplicit( exp(y)-x*y, x, y, -5, 1/2, 3);
aprox2 : taylorimplicit( exp(y)-x*y, x, y, +5, 1/2, 3);
aprox3 : taylorimplicit( exp(y)-x*y, x, y, +5, 5, 3);
Para ver estas aproximaciones junto con la solución numérica hacemos:
plot2d( [ [discrete, data1], [discrete, data2], [discrete, data3],
aprox1, aprox2, aprox3 ],[x, -10, 10],[y, -2, 5] );
Aquí es donde se ve la verdadera utilidad de los desarrollos en serie de Taylor,
aunque es totalmente imposible despejar y de ey = xy, por medio de estos desarro-
llos tenemos expresiones analíticas aproximadas muy precisas en un cierto entorno
alrededor del punto donde desarrollamos.
Ejercicio 5
Dada la relación y = f (x), aplique el programa anterior para obtener una apro-
ximación en forma de serie de Taylor para la función x = f −1 (y), válida en un
entorno de y0 .
Ejercicio 6
Visualice los resultados obtenidos mediante gráficas por medio de la función
plot2d.
Ya hemos indicado todas las instrucciones necesarias para visualizar los resulta-
dos.
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
6-14
TEMA 6. SOLUCIÓN ANALÍTICA Y NUMÉRICA DE ECUACIONES
Problemas del Tema 6
Ejercicio 1
Escriba una función en Maxima que aplique cambios de variable sobre funciones de densidad
de probabilidad en una variable.
Para hacer este ejercicio deberá despejar x en función de y resolviendo y = y(x). Programe esta
parte suponiendo que es posible resolver esta ecuación de forma analítica.
Para determinar el intervalo de valores posibles de y suponga que la función y = y(x) es o bien
estrictamente creciente o bien estrictamente decreciente.
Dado que el enunciado del problema no precisa con todo detalle la estructura del input, vamos
a suponer que el input de la función que se pide programar es el siguiente:
El primer paso que debemos dar es despejar x de la ecuación y = y(x). El enunciado del problema
dice que podemos suponer que x puede despejarse de forma analítica, por tanto podemos emplear
para ello la función solvesust denida en las notas del tema 6 (página 6-6). Con la notación que
acabamos de denir para el input, la solución de y = y(x) está dada por
solvesust(cambio[2] - cambio[1], x)[1] (solvesust proporciona una lista de soluciones, el
[1] al nal indica que nos quedamos con la primera).
Antes de programar la función es necesario realizar otra aclaración. El enunciado del problema
indica que la función de densidad de probabilidad en términos de la variable nueva (g(y)) está dada
1
2
por
dx(y)
g(y) = f [x(y)]
dy
Esto es cierto si dx(y)/dy > 0, es decir, si la función y(x) es estrictamente creciente. Si la función
y(x) es decreciente, entonces al calcular el intervalo de denición de y sustituyendo y = y(x) en
el intervalo [a, b] de la variable x encontramos el intervalo [y(a), y(b)] en el que y(a) > y(b) (ya
que estamos suponiendo que y(x) es decreciente y que a < b). Por ejemplo, supongamos la función
de densidad de probabilidad f (x) = 1 con x ∈ [0, 1], sustituyendo el cambio de variable y = −x
encontraríamos g(y) = −1, y como nuevo intervalo encontraríamos y ∈ [−1, 0]. Cuando sucede esto
lo más natural es redenir el intervalo de la variable y como [y(b), y(a)], lo cual implica que hemos
invertido el sentido de la integral, y por tanto debemos multiplicar dx(y)/dy por −1. Por tanto, en
realidad más que dx(y)dy debemos tomar el valor absoluto de dx(y)dy .
Resumiendo: Al aplicar el cambio x → y = y(x) sobre la función de densidad de probabilidad
f (x) obtenemos ¯ ¯
¯ dx(y) ¯
g(y) = f [x(y)] ¯¯ ¯
dy ¯
siendo el intervalo de denición de la nueva variable [y1 , y2 ] donde y1 ≡ mı́n(y(a), y(b)), y2 ≡
máx(y(a), y(b)). (Recordamos que el símbolo |. . . | denota valor absoluto y que por hipótesis la
función y(x) es, o bien estrictamente creciente, o bien estrictamente decreciente. Esto último implica
que la función x(y) será estrictamente creciente en el primer caso y estrictamente decreciente en el
segundo).
La función cambiovariablePDF realiza el cambio de variable pedido:
/∗
Funcion cambiovariablePDF : A p l i c a e l cambio de v a r i a b l e d e f i n i d o por " cambio " a l a
fun c . de d e n s i d a d de p r o b a b i l i d a d f , d e f i n i d a como fu nc . de x en e l i n t e r v a l o " i n t e r v a l o " .
∗/
/∗ c a l c u l a m o s e l i n t e r v a l o de d e f . de l a nueva var ∗/
/∗ s i y [ a ] < y [ b ] , e n t o n c e s e l s i g n o de dy / dx e s p o s i t i v o ∗/
s i g n o : +1,
/∗ cargamos l a f un c . s o l v e s u s t ∗/
Programación con Maxima; Dept. Física Matemática y de Fluidos UNED curso 2011/2012
3
/∗ finalmente e l r e s u l t a d o pedido es ∗/
[ aux , n u e v o i n t ]
)$
/∗ Fin ∗/
Ejercicio 2
Dada una función de distribución de velocidades de las moléculas de un gas escriba una
función en Maxima que calcule la función de distribución de energía cinética de las moléculas
del gas.
Para hacer este ejercicio suponga que todas las moléculas del gas tienen la misma masa m. El
intervalo de valores posibles de las componentes de la velocidad es vi ∈ (−∞, +∞) y el de la
energía cinética es (obviamente) E ∈ (0, ∞). Los pasos que deben darse para hacer este ejercicio
son los siguientes:
Programación con Maxima; Dept. Física Matemática y de Fluidos UNED curso 2011/2012
4
φ = arctan(vy /vx )
donde los dominios de denición de todas estas variables son: vx , vy , vz ∈ (−∞, ∞), mientras que
v ∈ (0, ∞), θ ∈ (0, π), y φ ∈ (0, 2π). Con esto, el elemento diferencial de volumen en el espacio
(vx , vy , vz ) en términos de unas y otras variables está dado por
El resultado de ejecutar este código es el factor v 2 sin θ. Como puede verse, este código calcula la
matriz Jacobiana, y posteriormente su determinante, sean cuales sean la lista de variables viejas
como función de las nuevas (old) y la lista de variables nuevas (new).
Programación con Maxima; Dept. Física Matemática y de Fluidos UNED curso 2011/2012
5
Una vez calculada la densidad de probabilidad de v en coordenadas esféricas, lo que nos interesa
ahora es calcular la densidad de probabilidad de encontrar el valor v , independientemente de la
orientación de v , es decir, independientemente de los ángulos θ y φ. Vamos a llamar sencillamente
g(v) a esta densidad de probabilidad
Z π Z 2π
g(v) = dθ dφ g(v, θ, φ)
0 0
Una vez calculada g(v), que depende de una única variable, para obtener la función de densidad
de probabilidad en términos de la energía cinética E (llamémosla h(E)) lo único que queda por
hacer es aplicar el cambio de variable v → E(v) = (1/2)mv 2 (obsérvese
p que en este caso la función
E(v) es estrictamente creciente), de donde deducimos v(E) = 2E/m, por tanto
dv dE
dv = dE = √
dE 2mE
por tanto, la densidad de probabilidad en términos de la energía cinética está nalmente dada por
Ãr !
2E 1
h(E) = g ·√
m 2mE
/∗ s u s t i t u i m o s e s t o en f ( vx , vy , v z ) y m u l t i p l i c a m o s e l r e s u l t a d o por e l
f a c t o r v^2 ∗ s i n ( t h e t a ) ∗ /
g : subst ( o l d [ 1 ] , vx , f ) ,
g : subst ( o l d [ 2 ] , vy , g ) ,
g : subst ( o l d [ 3 ] , vz , g ) ,
g : g ∗ v^2 ∗ s i n ( t h e t a ) ,
/∗ i n t e g r a m o s e s t e r e s u l t a d o r e s p e c t o de t o d a s l a s o r i e n t a c i o n e s p o s i b l e s , para
quedarnos f i n a l m e n t e con g ( v ) ∗ /
Programación con Maxima; Dept. Física Matemática y de Fluidos UNED curso 2011/2012
6
/∗ Fin ∗/
Programación con Maxima; Dept. Física Matemática y de Fluidos UNED curso 2011/2012
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
Tema 7
Ajustes
Dada una colección de puntos (xi , yi ) con i = 1, 2, . . . , N , que podrían ser los resul-
tados de un experimento, necesitamos generar una función que los ajuste, de forma
que podamos emplear dicha función para realizar cálculos basados en dichos datos,
como p. ej. derivadas, integrales, o cálculo de valores de y correspondientes a x no
incluidos en el conjunto de datos, es decir interpolaciones y extrapolaciones.
Siempre que dispongamos de un conjunto de datos y de un modelo matemático
o teoría que nos diga qué tipo de relación funcional, dependiente de una serie de
parámetros, deberían cumplir esos datos, lo mejor es realizar un ajuste por mínimos
cuadrados para obtener los valores de los parámetros que mejor se ajustan a nuestros
datos. Cuando no dispongamos de ninguna ley o teoría que nos diga qué tipo de de-
pendencia funcional cumplen nuestros datos experimentales ya no podremos realizar
un ajuste por mínimos cuadrados. En ese caso, si necesitamos calcular un dato que
no está incluido en la serie de datos experimentales podemos hacerlo por medio de
una función de interpolación. Una función de interpolación es una función matemática
que pasa por todos nuestros datos experimentales. Existen diversas formas de gene-
rar interpolaciones, las más frecuentes son la interpolación lineal, la interpolación de
Lagrange y la interpolación por splines, todas ellas tienen sus ventajas y sus inconve-
nientes. Con cualquiera de estos métodos de interpolación lo más frecuente es que la
fórmula de interpolación proporcione valores más o menos aproximados para puntos
que se encuentren intercalados entre dos puntos experimentales consecutivos, y que
sean totalmente inexactas (produciendo errores inmensos) si pretendemos aplicarlas
para calcular valores que estén fuera del conjunto de puntos experimentales, en cuyo
caso estaríamos haciendo una extrapolación.
Para el estudio de este tema familiarícese con las funciones que el M AXIMA pro-
porciona para realizar ajustes e interpolaciones
7-1
7-2 TEMA 7. AJUSTES
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
Interpolaciones:
Consulte describe() para una descripción más extensa de la sintaxis y para ver
ejemplos de uso de estos comandos.
por un lado se pretende conocer qué tipo de dependencia funcional siguen esos
datos, es decir ¿existe alguna función y = f (x) que nos reproduzca estos datos?
si es así ¿cómo podemos encontrar esa función?
Las técnicas para lograr estos objetivos se pueden clasificar en dos grandes fa-
milias complementarias: interpolación y ajustes, cada una de estas familias tiene sus
ventajas y sus inconvenientes y es importante conocerlas. En este capítulo nos cen-
traremos en los tres métodos de interpolación y ajustes más sencillos y habituales:
interpolación lineal, splines cúbicos, polinomio interpolador de Lagrange y el método
de ajuste por mínimos cuadrados.
7.1.1. Interpolación
Dado un conjunto de valores (xi , yi ) (con i = 1, 2, . . . , N ) una función de interpo-
lación es cualquier función f (x) tal que f (xi ) = yi para todo el conjunto de valores.
Existen diversas formas de construir funciones de interpolación, éstas se pueden cla-
sificar en 2 grandes grupos:
Funciones de interpolación globales: una única función interpola todos los puntos
(xi , yi ).
El ejemplo más sencillo de función de interpolación local (o a trozos) consiste en
unir todos los puntos (xi , yi ) por trazos rectos, es decir, en cada intervalo [xi , xi+1 ]
construimos la aproximación lineal (dada por el polinomio de orden uno: y = ax+b) que
pasa por los extremos del intervalo ((xi , yi ) y (xi+1 , yi+1 )). Esta fórmula de interpolación
es muy sencilla y produce una función continua, pero con primera derivada discontinua
en los nodos de interpolación xi .
El siguiente ejemplo típico de función de interpolación local (o a trozos) son los
splines cúbicos. En este caso, en lugar de unir los puntos por trazos rectos los unimos
mediante polinomios de orden 3, imponiendo que la función de interpolación y sus dos
primeras derivadas sean continuas en los nodos de interpolación, e imponiendo que
la segunda derivada sea nula en el primer y el último nodo de interpolación para cerrar
el sistema. Esta función es algo más complicada que la primera, pero produce una
función continua y con sus dos primeras derivadas continuas en todo el intervalo.
El ejemplo clásico de función de interpolación global es el polinomio de interpo-
lación de Lagrange: dados los N puntos (xi , yi ) se puede construir un polinomio de
orden N − 1
f (x) = a0 + a1 x + a2 x2 + · · · + aN −1 xN −1 ,
de tal forma que imponiendo que esta función pase por los N nodos de interpolación
(f (xi ) = yi para i = 1, 2, . . . , N ) obtenemos un conjunto de N ecuaciones que nos
determina los valores de los N coeficientes del polinomio de interpolación.
Es muy sencillo escribir funciones que implementen estos métodos de interpolación
usando cualquiera de los lenguajes de programación habituales, de todas formas estas
funciones ya están programadas en WX M AXIMA, para usarlas primero debemos cargar
el paquete de interpolaciones:
load(interpol)$
posteriormente las funciones linearinterpol (para interpolación lineal), cspline (pa-
ra esplines cúbicos) y lagrange (para interpolación por Lagrange), aplicadas sobre un
conjunto de datos (xi , yi ), nos devuelven la correspondiente fórmula de interpolación.
La primera parte de los ejercicios de este tema consiste en aplicar estas funciones
sobre los conjuntos de datos que pueden encontrarse en la página web de la asignatu-
ra para generar, y posteriormente visualizar con plot2d, las correspondientes fórmulas
de interpolación. Para cargar los conjuntos de datos lo que hay que hacer es:
data : read_nested_list(concat(path, filename))$
donde en la variable path tenemos el directorio donde está el archivo de datos y la
variable filename es el nombre del correspondiente archivo de datos. Por supuesto,
esto se podría hacer directamente “a mano”, pero conviene aprender cómo se car-
gan archivos de datos de manera automática, ya que esto nos permitirá en el futuro
realizar estas operaciones de manera automática operando sobre grandes cantidades
de archivos. En otras palabras, imagine que en lugar de cargar un archivo de datos
tuviera que cargar 10,000 archivos ¿lo haría a mano?
Al aplicar estas funciones sobre los conjuntos de datos disponibles en la página
web de la asignatura vemos que el output que se obtiene al visualizar el resultado de
linearinterpol o cspline es siempre lo que cabría esperar: los puntos unidos por
trazos rectos en un caso y por una función suave en el segundo. Sin embargo, en el
7-4 TEMA 7. AJUSTES
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
Por definición una función de interpolación pasa exactamente por los nodos de in-
terpolación en que se basa, si el conjunto de valores no corresponde realmente a una
función polinómica, y los nodos de interpolación son equiespaciados, es frecuente que
el polinomio interpolador de Lagrange tenga estas oscilaciones cerca de los límites del
intervalo de interpolación, limitando seriamente la utilidad de dicha función, tal y como
sucede en todos ejemplos suministrados. Estas fuertes oscilaciones se podrían ha-
ber evitado si los nodos de interpolación, en lugar de estar equiespaciados, hubiesen
estado distribuidos con una densidad creciente cerca de los límites del intervalo de in-
terpolación. De todas formas, en lugar de generar los datos de la manera idónea para
que el polinomio de interpolación de Lagrange funcione bien, hemos preferido generar-
los tal y como se obtienen típicamente en un experimento, es decir, equiespaciados en
la variable independiente. Con esto queremos mostrar que hay que tener precaución al
manejar funciones de interpolación, ya que pueden inducirnos a errores, incluso si las
usamos para predecir resultados dentro del intervalo de interpolación. Dado que las
funciones de interpolación pasan exactamente por los puntos de interpolación en que
se basan, sólo tiene sentido hacer una interpolación cuando el conjunto de valores
está exento de error, pero no cuando los valores de que disponemos tienen errores
apreciables. Esto es lo que sucede en los tres ejemplos propuestos, en los que los
conjuntos de datos se han generado aplicando una cierta función sobre el conjunto de
abscisas, añadiendo posteriormente un poco de ruido aleatorio.
7.1.2. Ajustes
Es evidente que ninguna de las funciones de interpolación construidas nos sirve
para hacer predicciones fuera del intervalo de interpolación, si usamos cualquiera de
estas funciones para predecir el valor de y correspondiente a una x fuera del intervalo
de interpolación el error será, en la inmensa mayoría de los casos, enorme. Por ese
motivo, a menos que los valores (xi , yi ) sean exactos (y que conozcamos la forma de
la función a que corresponden) más que una interpolación lo que conviene hacer es
un ajuste por mínimos cuadrados. Para ello suponemos que los datos suministrados
corresponden a cierta forma funcional, como p. ej.
y = a + bxc ,
Disponemos de un modelo físico que nos permite predecir esta forma funcional.
Por ejemplo, si los datos corresponden a la posición de un oscilador armónico
frente al tiempo sabemos que y debería estar dada por
y = A sen(ωx + δ)
de modo que un ajuste por mínimos cuadrados nos permitiría obtener la amplitud
A del oscilador, su frecuecia ω y la fase δ.
• Por último, si los datos responden a una relación tipo ley de potencias
y = axb
Estos tres tipos de dependencia son muy habituales en física, pero desde luego no
son los únicos que se observan, por ejemplo también es habitual encontrar leyes de
c
potencias desplazadas (y = y0 + axb ), exponenciales estiradas (y = aebx ), logaritmos,
funciones trigonométricas o combinaciones de varias de estas relaciones, en cuyo
caso encontrar la forma funcional adecuada se complica. En última instancia para
hacer ajustes en casos complicados es imprescindible tener un buen modelo físico y
bastante experiencia.
Cada uno de los tres archivos de datos disponibles en la página web de la asig-
natura corresponde a uno de los tres casos sencillos que hemos indicado, y se pide
identificar cada uno de ellos y obtener el correspondiente ajuste.
Contrariamente a como sucedía con las interpolaciones, si un ajuste funciona bien
normalmente sí puede usarse para hacer extrapolaciones (siempre con cierta precau-
ción), es decir, para predecir valores de y correspondientes a x fuera del intervalo de
interpolación.
apply(matrix, data)
(para convertir la lista de datos en una matriz para lsquares_estimates)
En la ayuda de WX M AXIMA están todos los detalles sobre la sintaxis de estas fun-
ciones.
Ejercicio 1
Dadas las colecciones de puntos experimentales con la forma (xi , yi ) que puede
encontrar en la página web de la asignatura, realice las correspondientes interpo-
laciones.
Ejercicio 2
A la vista de las anteriores interpolaciones formule un modelo matemático apro-
ximado y realice el correspondiente ajuste por mínimos cuadrados.
7-8 TEMA 7. AJUSTES
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021
Ejercicio 3
Visualice los resultados usando plot2d.
Para visualizar el ajuste junto con los datos y las interpolaciones hacemos:
plot2d( [ [discrete, data], aaa, bbb, ccc, f ], xdom, ydom
[ style, points, lines, lines, lines, lines ] );