Está en la página 1de 130

Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos.

UNED, 2021

Tema 1

Introducción a la física computacional

Bienvenidos a la asignatura de Física Computacional I. En esta asignatura apren-


deremos a usar diversas herramientas computacionales que nos serán útiles en el
futuro, sea cual sea la actividad que realicemos como físicos.
El objetivo de esta asignatura es aprender a manejar herramientas computaciona-
les básicas, tanto de cálculo simbólico como de cálculo numérico. En la primera mitad
del curso veremos, como ejemplo representativo de programa de cálculo simbólico,
una introducción al programa gratuito de código abierto M AXIMA1 y en la segunda par-
te, como ejemplo de lenguaje de programación útil para cálculo numérico, veremos
una introducción al lenguaje C2 . En la elección de estos lenguajes informáticos nos
hemos limitado a aquellos programas gratuitos de libre acceso, que al mismo tiempo
sean suficientemente representativos como herramientas de cálculo simbólico, en un
caso, y como lenguaje de programación en el otro. De todas formas, en el caso del
lenguaje C éste se ha convertido en el lenguaje de programación estándar, de modo
que más que un ejemplo representativo se trata del lenguaje de programación por ex-
celencia. En el caso del M AXIMA existen alternativas comerciales algo más potentes
(como p. ej. el M APLE o el M ATHEMATICA) cuyo uso está más extendido, sin embargo,
para este curso hemos optado por el paquete de cálculo simbólico gratuito de código
abierto. En este sentido el principal objetivo es aprender a organizar el trabajo de una
manera ordenada y eficiente, lo que nos resultará útil en el futuro independientemente
de cuál sea el programa de cálculo simbólico que empleemos.

1.1. Matemáticas en Física


Como todos sabemos, la Física es la ciencia que estudia las leyes que gobiernan
el comportamiento de todo cuanto se conoce (materia, energía, espacio, tiempo, . . . ).
Aunque realmente nadie sabe por qué es así, lo cierto es que, cuando se analizan
cuidadosamente, los sistemas físicos parecen estar regidos por una serie de leyes
físicas, dadas por unas ecuaciones matemáticas más o menos sencillas de formular y
de entender, y cuya resolución es, con frecuencia, difícil. Aunque la apreciación sobre
la sencillez de las leyes físicas es algo subjetiva, el cumplimiento de dichas leyes
no lo es. Con mucha frecuencia las leyes de la física toman la forma de ecuaciones
diferenciales, o bien ordinarias para magnitudes dependientes sólo del tiempo, o bien
1
http://maxima.sourceforge.net/
2
http://en.wikipedia.org/wiki/C_programming_language

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

en derivadas parciales para magnitudes dependientes del espacio y el tiempo, es decir,


para magnitudes descritas por medio de campos. Por este motivo el trabajo del físico
siempre está ligado a la manipulación de objetos matemáticos (vectores, matrices,
funciones, ecuaciones, . . . ) y a la realización de cálculos.
Aparte de proporcionar cierto grado de conocimiento sobre cómo funciona el uni-
verso en general, el conocimiento de las leyes que rigen el funcionamiento de los
sistemas físicos nos permite realizar predicciones cuantitativas muy precisas sobre
cuál será el estado de un sistema dentro de un tiempo a partir del conocimiento de su
estado actual y de las interacciones a las que está sujeto. Para realizar estas predic-
ciones normalmente es necesario realizar ciertos cálculos numéricos (normalmente
un número muy elevado de ellos), en los que los ordenadores se han convertido en la
herramienta fundamental desde finales del siglo XX.
El hecho constatado de que las leyes de la física tengan forma matemática hace
que las matemáticas en física, y en general en las Ciencias Naturales, sean mucho
más que una mera herramienta. Las matemáticas son el lenguaje en el que, aparente-
mente, estás escritas las leyes de la Naturaleza. Si el objetivo de la física es describir
las leyes que rigen el funcionamiento de todo cuanto se conoce, el conocimiento del
lenguaje en el que, aparentemente, están codificadas estas leyes es una parte funda-
mental de la física, motivo por el cual los temarios de la carrera de Ciencias Físicas
son bastante generosos en asignaturas de Matemáticas en todas las universidades
del mundo. La enorme relevancia de las matemáticas en las ciencias físicas se ana-
liza con mayor profundidad en el famoso ensayo de Eugene P. Wigner (premio Nobel
de física en 1963): “The Unreasonable Effectiveness of Mathematics in the Natural
Sciences”, Communications in Pure and Applied Mathematics 13 (1960).

1.1.1. Echemos un vistazo rápido a las Matemáticas que estudia-


remos en Físicas
El tipo de objetos matemáticos que maneja normalmente un físico es lo que de-
termina el temario de matemáticas que se estudian en físicas. En este sentido, y
resumiendo mucho, se podría decir que las matemáticas que se estudian en físicas
están orientadas al objetivo de saber resolver ecuaciones diferenciales, tanto ordina-
rias como en derivadas parciales. El motivo es que en general las leyes físicas son
ecuaciones diferenciales, que expresan cómo cambian con el tiempo las magnitudes
físicas que describen un sistema concreto. Esto no es tan sorprendente si tenemos
en cuenta que, en general, cualquier ley física que exprese un principio de conser-
vación (p. ej. de la energía o del momento lineal) para una magnitud descriptible por
medio de un campo (una función del espacio y del tiempo) llevará a una relación que
deben cumplir las derivadas de esa función respecto de sus variables, es decir, a una
ecuación diferencial en derivadas parciales, o a una ecuación diferencial ordinaria si
la función considerada sólo es función del tiempo.
Por ejemplo, las ecuaciones diferenciales ordinarias (EDOs) son fundamentales en
la mecánica de Newton, donde para realizar predicciones debemos resolver la segun-
da ley de Newton, que es una ecuación diferencial ordinaria de segundo orden (ya que
las derivadas de mayor orden que incluye son de orden 2)

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

Una situación similar se da en el caso de todos los modelos simplificados que se


emplean con frecuencia en diversos campos para describir determinados procesos por
medio de sistemas dinámicos, cuya evolución temporal está determinada por EDOs
del tipo
dxi
= fi (x1 , x2 , . . . , xn , t), xi (t = 0) = xi,0 , i = 1, 2, . . . , n (1.3)
dt
Las EDOs con “condiciones iniciales” (como los ejemplos anteriores) no son las únicas
importantes, también son fundamentales las EDOs con “condiciones de contorno”, que
aparecen, por ejemplo, al resolver una ecuación diferencial en derivadas parciales por
medio del método de separación de variables, que ya se estudiará en su momento.
Cuando se manejan magnitudes físicas que no son sólo funciones del tiempo lo
más habitual es que las leyes físicas sean ecuaciones diferenciales en derivadas par-
ciales. Las ecuaciones diferenciales en derivadas parciales (EDPs) se han convertido
en el lenguaje básico de la física desde el momento en que aparece el concepto de
“campo” como herramienta matemática apropiada para la descripción de diversas va-
riables físicas cuyo valor es función del espacio y el tiempo (como p. ej. la temperatura
o la velocidad de un fluido, o la intensidad de un campo magnético en una región en
la que hay cargas en movimiento), o para la descripción de interacciones a distancia,
como p. ej. las interacciones electromagnéticas o la interacción gravitatoria (de hecho,
el concepto de campo fue introducido por Newton en su ley de gravitación universal).
Esta situación se cumple en todas las escalas de la física, desde la escala cós-
mica (descrita por las ecuaciones de Einstein) hasta la escala microscópica (descrita
por las ecuaciones de la Mecánica Cuántica, Schrödinger, Klein-Gordon, Boltzmann),
pasando por la escala macroscópica en la que nos movemos nosotros, es decir, la es-
cala que incluye longitudes características que van desde (pongamos) los milímetros
a (pongamos) los kilómetros, descrita por las ecuaciones de Navier-Stokes. En todas
estas escalas las ecuaciones diferenciales en derivadas parciales son también el len-
guaje fundamental que permite describir las fuerzas electromagnéticas (por medio de
las ecuaciones de Maxwell). Aparte de esto las EDPs son también la herramienta fun-
damental para modelizar fenómenos sencillos que dependen de más de una variable
(ecuación de ondas, ecuación de Laplace, ecuación de la difusión, . . . ), y también
son importantes en disciplinas nuevas de la física, como p. ej. el análisis de imágenes
digitales (tan importante en teledetección y en medicina), donde frecuentemente se
plantea una EDP (la ecuación del flujo óptico) para determinar el movimiento de los
patrones detectados en una secuencia de imágenes. En el transcurso de la carrera
de ciencias físicas uno irá descubriendo poco a poco muchas de estas leyes físicas
(algunas de ellas pertenecen a temas más o menos avanzados, que sólo se estudian
en programas de doctorado), su formulación matemática precisa, las ecuaciones que
las describen y cómo se resuelven.
El otro factor que determina las matemáticas que debe conocer un físico es la natu-
raleza de los objetos matemáticos a los que se aplican las leyes de la física. Tal y como
hemos dicho antes, las variables físicas normalmente son funciones, a veces sólo del
1-4 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

tiempo (como p. ej. el valor promedio de la temperatura en una habitación), aunque


con mucha frecuencia serán funciones tanto del espacio como del tiempo (como p. ej.
el campo de temperaturas en una habitación), por este motivo el físico debe conocer
todo lo relativo a álgebra y cálculo con funciones de varias variables (derivadas par-
ciales, integrales múltiples, etc.). Aunque con cierta frecuencia las funciones que se
consideran en física son funciones reales de variable real, esto no siempre es así, por
ejemplo en Mecánica Cuántica la función de ondas que describe los orbitales atómicos
es una función que depende de variables reales pero que toma valores complejos, por
otra parte también hay algunos casos en los que resulta conveniente describir ciertas
magnitudes físicas por medio de funciones de variable compleja. Además, el análisis
de funciones de variable real es incompleto si no se estudia un poco de variable com-
pleja, de la misma manera que el estudio de los polinomios reales de variable real es
incompleto si no se estudia algo de variable compleja, ya que a veces las raíces de
estos polinomios son complejas. En particular, hay varios resultados muy relevantes
que se aplican a funciones reales de variable real a los que sólo se puede llegar por
medio del análisis complejo (p. ej. el cálculo de integrales impropias o las transforma-
das de Fourier), de modo que algo de variable compleja es imprescindible y por este
motivo las titulaciones en física generalmente incluyen algo de variable compleja en
sus temarios.
Otra disciplina matemática útil para el físico es la geometría diferencial y el cálculo
tensorial. Generalmente todas las magnitudes físicas suelen tener un rango tensorial
bien definido. Por ejemplo, hay magnitudes físicas que se describen por medio de fun-
ciones escalares (que son tensores de orden 0), como la temperatura o la masa, otras
están descritas por medio de funciones vectoriales (tensores de orden 1), como la ve-
locidad o las fuerzas, y hay ciertas magnitudes que se describen por medio de objetos
tensoriales un poco más complicados, como p. ej. el estado de tensiones en el interior
de un material, descrito por un tensor de orden 2 (que ya se estudiará en su momen-
to). Por otra parte en el trabajo rutinario que realiza un físico aparecen con muchísima
frecuencia curvas y superficies, por ejemplo en la descripción de las trayectorias de
un móvil en el espacio, o de las líneas de corriente en un fluido en movimiento, o en
el estudio de las superficies equipotenciales de un campo eléctrico, o de las fuerzas
de tensión superficial que aparecen en las superficies de los líquidos (cuya intensidad
depende de la curvatura de la superficie). En la manipulación de todos estos objetos
geométricos entran ingredientes de cálculo tensorial y de geometría diferencial, que
son por tanto disciplinas matemáticas relevantes para la física.
Continuando en la línea de analizar la naturaleza de los objetos matemáticos con
los que describimos la realidad vemos que, en muchos casos, la descripción que se
hace de ciertos sistemas físicos es estadística (esto es lo que sucede, p. ej., en cuán-
tica o en flujos turbulentos), de modo que la estadística es otra materia indispensable
para un físico.
Para terminar este breve vistazo global debemos mencionar los espacios funcio-
nales, es decir, espacios cuyos elementos son funciones (los denominados espacios
de Hilbert). En general las magnitudes físicas se describen por medio de funciones
matemáticas, muchas de las propiedades (relevantes en física) de estas funciones
sólo pueden estudiarse en el contexto de los espacios funcionales. En particular los
espacios de Hilbert constituyen el marco matemático básico de la mecánica cuántica,
pero además constituyen el contexto matemático en el que las ecuaciones diferencia-
les (ordinarias y en derivadas parciales) son inteligibles, y en este contexto es donde
1.1. MATEMÁTICAS EN FÍSICA 1-5
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

se formulan y analizan los métodos que se emplean para resolverlas.


El estudio de las diversas asignaturas de matemáticas que se contemplan en físi-
cas puede resultar en ocasiones un poco árido, sobre todo si no tenemos claro cuál
es la finalidad de lo que se está estudiando. Esperamos que este brevísimo esquema
sobre el infinitamente apasionante mundo de las matemáticas sea útil en este sentido,
y que las herramientas de cálculo simbólico y numérico que veremos en la primera
parte de esta asignatura sirvan de ayuda para el estudio en el futuro. Por otra parte
es muy importante tener presente que aunque existen paquetes informáticos capaces
de realizar cálculos simbólicos y numéricos, si no tenemos una comprensión profunda
de las matemáticas que estamos empleando no seremos capaces de sacar partido de
ninguna herramienta computacional, por potente que sea.
A todo esto, cuando en este apartado nos hemos referido a las leyes que rigen
el comportamiento de un cierto sistema físico hemos dado por sentado que esas le-
yes son conocidas. ¿Qué sucede en caso contrario? La experimentación sistemática
(racional y objetiva) ha sido desde siempre la herramienta fundamental en física (en
general en el método científico) para deducir estas leyes, o al menos para formular
modelos que nos permitan encontrar una aproximación válida de las mismas. En este
sentido es donde la gran potencia alcanzada por los ordenadores desde finales de
siglo XX nos ofrece la posibilidad de sustituir algunos experimentos reales por expe-
rimentos virtuales, en los que el experimentador introduce unas reglas de evolución
sencillas y posteriormente observa el comportamiento de ese sistema (calculado por
medio de un ordenador en una simulación numérica), y analiza si las reglas de evo-
lución propuestas reproducen el comportamiento observado en la realidad. Esto es lo
que se hace en Física Computacional y aprender a usar ordenadores para ello es el
objetivo de la segunda parte de esta asignatura.

1.1.2. Qué hacen y qué no hacen los ordenadores


Esto puede parecer una trivialidad pero conviene tener presente que los ordena-
dores hacen sólo tareas sistemáticas, tediosas, y las hacen muy rápido, por eso son
tan útiles. En muchos problemas habituales en física nos encontramos con que nece-
sitamos realizar una cantidad apreciable de cálculos numéricos (o de manipulaciones
simbólicas), que aparte del volumen de trabajo que representan no ofrecen ninguna
dificultad, ese es el tipo de trabajo que debemos re-dirigir al ordenador. De todas for-
mas, desde el punto de vista del investigador en física, el objetivo último de estos
cálculos no es solamente encontrar el resultado, la parte físicamente más importante
viene después con la interpretación física del resultado obtenido y la extracción de
conclusiones que nos permitirá hacer predicciones cualitativas correctas para casos
similares sin necesidad de hacer ningún cálculo. El objetivo en física no es generar una
solución numérica sino comprenderla, es decir, alcanzar cierto grado de conocimiento
sobre el comportamiento del sistema que se está estudiando.
Por eso no podemos esperar que los ordenadores nos resuelvan todos los proble-
mas. De hecho, normalmente la parte más difícil de un cálculo numérico es plantear
el problema de la manera adecuada, una vez que logramos eso, el resto es fácil. Para
ser capaces de plantear un problema de la manera correcta es necesario tener cierto
grado de conocimiento sobre lo que se está haciendo, sobre lo que significan las ecua-
ciones que estamos intentando resolver y también sobre qué es exactamente lo que
hace el método numérico que estamos empleando. Sólo teniendo los conocimientos
1-6 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

adecuados de física y matemáticas podremos entender por qué funciona un cálculo


numérico (o por qué no funciona cuando el método falle) y, de esta manera, hacer un
uso realmente eficiente de un ordenador. Es un error (que desgraciadamente empieza
a ser habitual) pensar que los ordenadores nos evitarán la tarea de tener que dominar
algo de matemáticas para ser capaces de trabajar en física.
En esta asignatura vamos a centrarnos en los aspectos técnicos del uso de algu-
nos paquetes informáticos. Es decir, nos centraremos en el ¿cómo se hace?, más que
en el ¿por qué se hace?. Responder la segunda pregunta (¿por qué resolvemos este
problema con este método?, ¿por qué lo planteamos de esta forma?) es algo que irá
quedando claro, poco a poco, a medida que se avanza en los estudios, a lo largo de
toda la carrera. De esta forma, con esta asignatura pretendemos ofrecer un comple-
mento a las asignaturas tradicionales de matemáticas. Esperamos sinceramente que
disponer de los conocimientos técnicos sobre ordenadores impartidos en esta asigna-
tura será de gran utilidad en los cursos posteriores, en los que necesitará poner en
práctica todas estas herramientas.

1.2. Uso eficiente de ordenadores para trabajo científi-


co. Sistema operativo Linux

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

1.2.1. Qué podemos esperar y qué no debemos permitir de un or-


denador
De un ordenador debemos esperar que realice de manera eficiente todas las tareas
que le encarguemos, y nada más. No deberíamos permitir que un ordenador sea una
amenaza para la integridad, e inviolabilidad, de la información que depositamos en él.
El ordenador debe trabajar para nosotros, y no al contrario, por este motivo no de-
beríamos permitir que el mantenimiento del ordenador suponga una carga de trabajo
considerable.
Para el tipo de tareas que nos interesan en esta asignatura, la elección de Sistema
Operativo más eficiente, segura y económica es el sistema operativo (de tipo Unix)
denominado Linux, sin ninguna duda. En sus inicios (hacia principios de los ’90) el SO
Linux tenía el inconveniente de ser algo más complicado de usar que otros conocidos
sistemas operativos comerciales. Sin embargo, en la actualidad sucede lo contrario.
La superioridad de los sistemas operativos tipo Unix está fuera de discusión en
la actualidad. Todos los super-ordenadores (vectoriales, clusters, etc.) dedicados a
tareas de cálculo exhaustivas en centros de investigación (o en universidades, etc.)
funcionan con sistemas Linux: todos los 500 super-ordenadores más rápidos del mun-
do usan Linux o alguna de sus variantes3 . Los sistemas operativos tipo Unix, como el
Linux son también los escogidos en la mayoría de los casos para los servidores que
proporcionan conexión a internet a un número elevado de usuarios.
Las ventajas del Linux frente a otros sistemas operativos son enormes. Por un lado
el propio SO es gratuito, así como todas las actualizaciones. Además es completo, es
decir, incluye paquetes para cualquier tarea que queramos hacer con el ordenador, co-
mo p. ej. comprimir y descomprimir archivos, escribir documentos de todo tipo, manipu-
lar archivos de audio y vídeo, incluye compiladores para muchos lenguajes de progra-
mación, entre ellos C, etc., y todos estos paquetes son gratuitos. Otra de las grandes
ventajas es la seguridad. El SO Linux se basa en una jerarquía de permisos y de usua-
rios. Para usar el ordenador uno necesita estar registrado como usuario (con un login y
una contraseña o password, y con un determinado directorio de trabajo, que es el úni-
co sitio en el que tiene permiso de escritura), de modo que un posible atacante ya se
encuentra con dificultades. Para modificar algo que afecte a la configuración del apa-
rato uno necesita conectarse como administrador (root). Además de esto el ordenador
mantiene un registro de todas las conexiones realizadas (con éxito y fallidas), de modo
que es fácil detectar si se está siendo víctima de un intento de invasión. Pero aparte
de todo esto la mayor ventaja del Linux es la eficiencia con la que emplea los recursos
de hardware disponibles (procesador, o procesadores y memoria), adaptándose a —y
sacando el mejor partido de— lo que tenga disponible. Para una introducción algo más
extensa a este SO se puede consultar http://en.wikipedia.org/wiki/Linux.

1.2.2. Instalación del SO Linux


El sistema operativo Linux nace en 1991, escrito por Linus Torvalds y publicado en
un servidor de acceso público de una incipiente Internet. Como sistema operativo, Li-
nux (o Linux 0.1) era muy básico: un núcleo (también llamado kernel o máquina virtual
Linux) y una serie de herramientas Unix del proyecto GNU. En la actualidad, ambas
cosas permanecen, aunque muy mejoradas por infinidad de programadores a lo largo
3
http://www.top500.org/statistics/list/
1-8 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

de los años y adaptadas a la “moda” del momento: entornos gráficos y herramientas


fácilmente utilizables desde su instalación. Esta adaptación ha llevado a la existencia
de múltiples distribuciones de Linux, muchas gratuitas (como p.ej. Fedora, Ubuntu o
Debian) y otras comerciales (como RedHat, CentOS o Suse). En este apartado nos
centraremos en dos distribuciones gratuitas (o libres) muy extendidas: Fedora (here-
dera de RedHat) y Ubuntu (basada en Debian).
Para instalar un sistema operativo Linux, lo más sencillo es descargarse de Internet
una imagen del CD/DVD de instalación. Para Fedora, esta imagen se puede descargar
de
https://getfedora.org/
Para Ubuntu, se puede descargar de
http://www.ubuntu.com/download
En el momento de escribir estas notas, la versión última de Fedora es la 33.10, y la
de Ubuntu la 20.10. Esto significa que, desde que se iniciaron estos dos proyectos, ha
habido 33 y 20 cambios, respectivamente, relativamente importantes en los sistemas
de instalación y en las versiones de las aplicaciones que contienen; después del punto,
se suelen indicar cambios menores a los que se puede actualizar una distribución
anterior, sin necesidad de reinstalarlo todo (aunque, como veremos a continuación,
esto no es tan difícil).
A continuación se dan los cinco pasos para instalar Linux, con pequeñas notas
sobre las diferencias entre Fedora y Ubuntu (cuando las haya).

1. Lo primero antes de instalar cualquier sistema operativo en una máquina, es


saber qué tipo de máquina tenemos; esto lo determina el procesador o, mejor
dicho, la familia de procesadores a la que pertenece el nuestro. Hoy en día, hay
dos familias principales de arquitecturas de procesadores: x86 y ARM. Se pue-
de resumir que los x86 se encuentran en los PCs y los ARM en los dispositivos
móviles. Y estas arquitecturas son suficientemente diferentes como para que los
procesadores de una no entiendan las instrucciones de la otra. Además de la ar-
quitectura, es muy importante el número de bits del procesador. Hoy en día, los
modelos más habituales son los de 64 bits, aunque sigue habiendo procesado-
res de 32 bits. En particular, la mayoría de los PCs que se venden son x86_64, y
los fabricantes de procesadores más habituales son Intel y AMD. La arquitectura
x86 tiene, por diseño, compatibilidad hacia atrás, de modo que software escri-
to para arquitecturas de 32 bits (llamadas genéricamente i386, por ser Intel el
creador de la especificación de las instrucciones que usan) puede ejecutarse en
máquinas modernas de 64 bits (que, por motivos similares, se llaman a veces
AMD64). Esto es importante de cara a la instalación de un Linux: si se instala un
sistema operativo para i386 en una máquina con procesador x86_64, el sistema
operativo funcionará en la mayor parte de los casos, aunque no se sacará todo
el rendimiento de la misma. Pero esto no será así a la inversa.

2. Una vez creado el CD/DVD de instalación, y reiniciada la máquina para que


arranque desde el CD/DVD4 , se carga el sistema operativo Linux. La mayoría de
4
Para los ordenadores modernos, especialmente para aquellos que ya notienen reproductor
de CD/DVD, existen métodos para generar imágenes en soportes USB desde los que la ma-
yoría de BIOS permiten arrancar. Información sobre cómo generar estos USB de instalación se
puede encontrar en las páginas de las distribuciones, p.ej. en https://ubuntu.com/tutorials/
create-a-usb-stick-on-windows
1.2. USO EFICIENTE DE ORDENADORES PARA TRABAJO CIENTÍFICO. SO LINUX1-9
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

Figura 1.1: Inicio de la instalación de Linux: seleccionar instalar en el disco, configura-


ción de idioma y teclado, fecha y hora.

las distribuciones Linux actuales permiten ejecutar el sistema operativo desde el


propio CD/DVD (lo que se llama un “live CD”); esto permite comprobar cómo fun-
cionará el sistema operativo en la máquina antes de instalarlo en el disco duro;
en particular, si funcionará todo el hardware (tarjeta de red, tarjeta gráfica, tarjeta
de sonido, etc.). Así que entre lo primero que veremos estará un menú gráfico
que nos preguntará qué queremos hacer: ejecutar el Linux en modo de prueba
desde el soporte de instalación o, efectivamente, instalarlo en el disco duro del
ordenador. Sea cual sea la decisión que tomemos, lo siguiente que se ejecutará
será el programa de arranque, que comprueba el tipo de máquina en la que está:
tipo de placa base, el tipo y tamaño de disco duro, si hay un teclado y un ratón, si
hay una tarjeta gráfica y un monitor, si hay tarjeta de red, etc. Luego veremos un
mensaje de bienvenida junto con una serie de pasos guiados iniciales de confi-
guración de la interfaz de usuario. Por ejemplo, habrá que seleccionar el idioma:
por defecto será Inglés, pero se puede seleccionar Español (de España) de entre
la larga lista de idiomas soportados. También habrá que elegir el teclado que se
tiene: la variante de idioma (Español), la distribución y número de teclas del te-
clado (usualmente QUERTY, 115 teclas, el habitual en España), la zona horaria
en la que se encuentra. Esta configuración inicial es fácil y rápida.
1-10 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

Figura 1.2: Elección del tipo de instalación y particionado del disco para instalar Linux.

3. Una vez estudiada la máquina y configurada la interfaz de usuario, lo primero


que se debe hacer es buscar sitio en el disco duro para instalar Linux. Aquí hay
dos posibilidades: utilizar todo el disco duro para Linux o compartir el disco duro
con otro sistema operativo ya instalado (como Microsoft Windows). 5 Dentro de
cada disco habrá que crear una o más particiones, que son “regiones” en el disco
en las que se encuentran los datos de un sistema operativo. Lo más práctico es
seleccionar el particionado por defecto que sugiera el instalador. No obstante,
si ya existe una partición que queremos mantener (p.ej. un sistema operativo
5
Los discos en Linux tienen nombres (en función de su tipo) y letras (en función de su orden en
la placa madre del ordenador). Así, por ejemplo, el primer disco SATA es el /dev/sda, el segundo el
/dev/sdb, etc. El “prefijo” /dev/ sólo indica que son dispositivos del sistema y da la ruta a ellos, porque
en Unix todo, hasta los propios discos, es un fichero. Dentro de un disco existen particiones: zonas del
disco (físicas o lógicas) en las que se encuentran datos relacionados entre sí. Por ejemplo, el “disco
C:” de un Windows, es realmente la partición 1 del disco donde está instalado Windows; en Linux esta
partición aparecerá con un nombre como “/dev/sda1” (primer disco, “a”, partición 1), e instalaremos
Linux a continuación, en la partición “/dev/sda2” (mismo disco, siguiente partición).
1.2. USO EFICIENTE DE ORDENADORES PARA TRABAJO CIENTÍFICO. SO LINUX1-11
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

Windows), deberemos cambiar su tamaño y hacer sitio para Linux en nuestro


disco duro, y seleccionar luego el particionado automático de la zona del disco
que hemos liberado.
Poco después de planificar el espacio en el disco, el instalador nos preguntará
qué clase de instalación queremos hacer. Esto determina las aplicaciones que
se instalarán inicialmente; podemos elegir la más completa y dejar para más
adelante la instalación o desinstalación de aplicaciones. Hecha esta elección el
proceso de instalación empezará a particionar y copiar archivos en el disco duro.

4. A continuación, se instalarán las aplicaciones. Cuando Linux termina de insta-


lar las aplicaciones, avisa que la máquina se reiniciará y se arrancará Linux por
primera vez. En ese momento, se buscarán las versiones más nuevas de las
aplicaciones y se invitará al usuario a instalar las más actualizadas (es muy re-
comendable).

5. Antes de iniciar la instalación (Ubuntu), o al finalizarla (Fedora), el instalador


nos pedirá el nombre y la contraseña del usuario habitual del sistema. También
pedirá un nombre para la máquina y tratará de configurar la conexión a internet
6
. Si alguna operación no se hace en este momento, siempre se podrá hacer una
vez instalado el sistema operativo.

1.2.3. Estructura y funcionamiento básico del SO Linux


Lo que se ha instalado es un sistema operativo y aplicaciones para este sistema
operativo. Entre estas aplicaciones se encuentran el “servidor X”, que es la aplica-
ción que proporciona a las demás aplicaciones gráficas el entorno de ventanas, y el
“entorno de escritorio”, que es la aplicación que proporciona una visión integrada de
todas las aplicaciones, para que el usuario las vea parecidas unas a otras y le sea
intuitivo su uso, con el resto del sistema operativo (sistema de ficheros, administración
de hardware, etc.). El servidor X que se suele instalar en la actualidad en todos los Li-
nux se llama Xorg. En cuanto al “entorno de escritorio”, los dos más populares son el
entorno “Gnome” (http://www.gnome.org) y el entorno “KDE” (http://www.kde.org).
Existen otros muchos, como p. ej. el Xfce (http://www.xfce.org), originalmente di-
señado para ordenadores con pocos recursos. En nuestra instalación de Linux nor-
malmente instalaremos un entorno (Ubuntu instala Gnome, Fedora da más opciones
en la instalación), pero posteriormente podremos instalar otro. Además, si tenemos
instalados más de un entorno de escritorio desde cualquiera de ellos podremos usar
las aplicaciones de los demás. Si tenemos instalado el Gnome y el KDE, desde una
sesión con Gnome podremos usar, por poner un ejemplo, cualquiera de los editores
de textos típicos del KDE (el Kwrite, o el Kate), y viceversa, desde una sesión en KDE
podremos usar cualquiera de las aplicaciones incluidas con el Gnome (como el editor
de textos gedit).
Linux basa su filosofía en el reparto de tareas. Un archivo de configuración, por
ejemplo, contiene sólo instrucciones de configuración para una aplicación. El archi-
vo ejecutable de esta aplicación sólo contiene (o debe contener) las instrucciones
6
Para esto es necesario tener conectada la máquina a una red, router o módem que Linux buscará
e identificará, y los parámetros de conexión: DHCP o dirección IP, dirección de la puerta de enlace
(gateway ) y de los servidores DNS, etc.
1-12 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

Figura 1.3: Identificación del usuario y de la máquina en la red; final de la instalación y


actualización del sistema una vez reiniciada la máquina.

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

Tarea Directorio Ejemplo


Configuración del /etc /etc/hostname
sistema (y de las /etc/gtk/gtkrc.iso-8859-15
aplicaciones)
Aplicaciones básicas /bin /bin/ls
del SO /bin/kill
Bibliotecas de /lib /lib/libc.so.6
funciones del SO /lib/libx86.so.1
Aplicaciones para los /usr/bin /usr/bin/gedit
usuarios /usr/bin/wxMaxima
Bibliotecas de /usr/lib /usr/lib/libgnome-2.so
funciones de las /usr/lib64 /usr/lib/mozilla/plugins/mozplugger.so
aplicaciones para los
usuarios
Datos compartidos /usr/share /usr/share/wxMaxima/io.github.wxmaxima_developers.wxMaxi
de las aplicaciones
Datos propios de los /home /home/usuario
usuarios
El reparto de tareas, hace que cada tarea la realice sólo un actor (aplicación, ser-
vicio, biblioteca, archivo de datos) y que las demás se aprovechen de lo bien que lo
hace. Este diseño modular permite mejorar partes sin que haya que cambiar el todo
y es la clave del éxito de los sistemas Unix. El sistema operativo se encarga de faci-
litar la interconexión de aplicaciones, servicios, bibliotecas, y su acceso a archivos de
datos fácilmente accesibles al usuario (o al administrador)7 .

1.3. Mantenimiento e instalación de paquetes informá-


ticos adicionales
Las aplicaciones que se han instalado inicialmente pueden eliminarse, ampliarse o
actualizarse, posteriormente. Como se acaba de explicar, en Unix, y en Linux particu-
larmente, la clave del funcionamiento es la colaboración entre aplicaciones, bibliotecas
y datos. Por eso, cuando se instala una nueva aplicación, es necesario asegurarse de
que están instaladas aquéllos otros elementos de los que depende. De esto se encar-
gan los sistemas de gestión de paquetes. Los dos más utilizados en Linux son “dnf”
en distribuciones Fedora y afines y “apt” en Debian, Ubuntu y distribuciones afines8 .
Estas herramientas permiten mantener actualizado el sistema para protegerlo de posi-
bles fallos de seguridad que se van descubriendo (algo que siempre está sucediendo:
sólo es totalmente seguro el ordenador sin conexión a Internet, detrás de una puer-
ta bien cerrada y. . . preferiblemente, apagado) o tener las últimas versiones de las
aplicaciones libres. Para ello se emplean “repositorios” o almacenes de paquetes.
7
Desgraciadamente, algunas aplicaciones están perdiendo esta filosofía y se están convirtiendo en
“mastodónticas”, lentas, y difíciles de mantener. Esto se debe, sobre todo, a que se busca que estas
aplicaciones sean “portables” a otros sistemas operativos como Microsoft Windows que no proporcionan
las ayudas a las aplicaciones que da Unix, por lo que es inevitable introducir código redundante que
haga tareas que ese sistema operativo hace para sí, pero no proporciona a las aplicaciones que ejecuta.
8
En distribuciones Fedora anteriores a la 22 en lugar de “dnf” se empleaba “yum” y en distribuciones
Debian anteriores a la 8 se empleaba “apt-get”.
1-14 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

1.3.1. Mantenimiento automático de la máquina


Un paquete es un archivo que contiene en su interior, además de los ficheros que
es necesario copiar en el disco, información sobre qué otros paquetes es necesario
tener instalados para su correcto funcionamiento. Estos archivos suelen tener exten-
siones “.deb” (para Debian, Ubuntu y similares) o “.rpm” (para Fedora y otras distribu-
ciones herederas de Red Hat).
Muchos paquetes vienen incluidos en el CD de instalación, pero la totalidad de
ellos no cabrían ni en varios DVDs y, además, pronto quedarían anticuados. Para ello
existen los “repositorios” (transliteración del inglés “repository”, que significa almacén).
Los repositorios son sitios de Internet (servidores HTTP o FTP) que contienen, muy
actualizados, los paquetes disponibles para una versión de una distribución. Como
consultar los paquetes de un repositorio es costoso, lo que se hace es mantener en
el propio ordenador una lista de los paquetes que contienen y sus informaciones de
dependencias. Este listado se actualiza con la instrucción (ejecutada como root desde
la línea de comandos de un terminal)
dnf update (Fedora)
apt update (Debian/Ubuntu)
Conviene realizar esta operación antes de instalar nuevos paquetes, para garan-
tizar que al descargar éstos se descargarán las últimas versiones de los paquetes
necesarios para cumplir las dependencias (una modificación en un paquete de una
aplicación, que le añada nuevas propiedades, puede requerir una nueva biblioteca de
funciones que no esté instalada en nuestro sistema).

1.3.2. Instalación de paquetes informáticos adicionales


Para instalar un paquete, lo primero que necesitamos es conocer su nombre. Los
nombres de paquetes contienen toda la información para garantizar que son los ade-
cuados a nuestra máquina: el nombre de la aplicación o biblioteca y su versión (ade-
más de la arquitectura de la máquina, de 32 o 64 bits, para la que está compilado).
Cuando queremos buscar una aplicación nueva y no sabemos su nombre exacto o
sólo sabemos lo que hace, debemos buscar el nombre correcto del paquete. Para ello
ejecutaremos:
dnf search paquete (Fedora)
apt search paquete (Debian/Ubuntu)
Por ejemplo, si buscamos un sistema de álgebra por ordenador, podemos buscar
apt search algebra (Ubuntu)
El resultado será una inmensa lista con todos los paquetes que sirven para hacer
alguna manipulación algebraica, seguidos de una breve descripción de los que son.
Así encontraremos, entre muchos

axiom - A general purpose computer algebra system: main binary and modules

gap - Groups, Algorithms and Programming computer algebra system

jacal - Interactive symbolic math system

maxima - A computer algebra system -- base system

wxmaxima - a wxWidgets GUI for the computer algebra system maxima


1.4. PROCESADORES DE TEXTO: LATEX Y LYX 1-15
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

yacas - Computer Algebra System

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

1.4. Procesadores de texto: LATEX y LyX


El uso de ordenadores en física no se limita a la realización de cálculos, sino que
se extiende a todo lo que atañe a la elaboración, manipulación, almacenamiento y
distribución de información. Aunque el contenido de esta asignatura se centra en el
uso de ordenadores para cálculo, en este apartado pasaremos revista rápidamente
al tema de la generación de documentos, centrándonos en los tipos de documentos
científicos más habituales: libros y artículos (tanto en formato impreso como electró-
nico) y presentaciones y pósters (empleados con frecuencia para exponer trabajos en
congresos de investigación).
Tomando como ejemplo representativo de documento científico un libro de texto
de Física General de primero vemos que el documento tiene cierta complejidad, dado
que incluye, además de texto, multitud de ecuaciones (muchas de ellas con carac-
teres no estándar), figuras, tablas, referencias bibliográficas, etc. Para generar docu-
mentos científicos necesitaremos, por tanto, un programa (denominado procesador
de texto) que, aparte de formatear textos, sea capaz de generar ecuaciones y tablas,
incluir gráficas, manejar volúmenes relativamente grandes de referencias bibliográfi-
cas y también manejar referencias cruzadas internas dentro de cada documento. En
la actualidad existen muchos procesadores de texto que tienen esta capacidad, unos
gratuitos y otros no.
1-16 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

? ¿Es necesario emplear un procesador de texto?

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:

1.4.1. Qué podemos esperar y qué no debemos permitir de un pro-


cesador de texto
De un procesador de texto debemos esperar que nos permita producir fácilmente
documentos, con un aspecto final de alta calidad, que incluyan todas las característi-
cas que hemos mencionado antes. En principio el procesador de texto debería hacer
automáticamente todo el trabajo de formatear adecuadamente el texto y generar auto-
máticamente las numeraciones de ecuaciones, figuras, tablas y referencias, así como
su posición adecuada, de manera que podamos centrarnos en el trabajo que realmen-
te nos interesa, que es escribir de la manera más clara posible la idea que queramos
transmitir.
No deberíamos permitir, por tanto, que tareas poco interesantes desviasen nuestra
atención de lo que realmente es importante. Al procesador de texto debemos exigirle
que realice de manera eficaz todo el trabajo de formateo, sin necesidad de tener que
invertir horas posteriormente en corregir o ajustar el aspecto del documento. Otra co-
sa que no deberíamos permitir de ninguna manera es que un procesador de texto nos
convierta en sus esclavos, obligándonos a usar un determinado programa para acce-
der a la documentación, ni tampoco que tengamos que pagar periódicamente nuevas
licencias para disponer de actualizaciones que realmente no queremos.
Afortunadamente en la actualidad existen diversas opciones de software libre (co-
mo p. ej. el LibreOffice, que se instala por defecto en cualquier distribución del SO
Linux) que nos permiten generar nuestros propios documentos y también abrir docu-
mentos generados, no solo con el LibreOffice, sino también con otros conocidos pro-
cesadores de textos comerciales de uso habitual. Por este motivo es muy aconsejable
instalar el LibreOffice, que además de textos nos permite también generar hojas de
cálculo y presentaciones, así como abrir y modificar hojas de cálculo y presentaciones
generadas con otros paquetes comerciales habituales.
De todas formas, para generar fácilmente documentos científicos de gran calidad
la mejor herramienta no es el LibreOffice, sino el LATEX. El LATEX es un programa di-
señado precisamente para que podamos concentrarnos en escribir lo que queremos
transmitir, olvidándonos totalmente de los detalles del formateo del documento. Pa-
ra ello al inicio del documento incluimos un comando particular que le indica al LATEX
el tipo de documento que estamos escribiendo (p. ej. para un artículo escribiríamos
1.4. PROCESADORES DE TEXTO: LATEX Y LYX 1-17
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

\documentclass[opciones]{article} y para un libro \documentclass[opciones]{book}),


con esa información el LATEX carga la correspondiente hoja de estilos, que se usa para
formatear el documento, liberándonos a nosotros de esa pesada carga. Básicamente,
para generar un documento con LATEX lo que hacemos es escribir un archivo de texto
plano (normalmente con extensión .tex) que contiene todo el texto que queremos in-
cluir, las ecuaciones, las tablas, los nombres de los archivos que contienen las figuras
que queramos incluir, etc., junto con una serie de órdenes o instrucciones que le indi-
can a LATEX cómo debe formatear cada parte del documento. En este sentido el LATEX
es un lenguaje que tiene sus propios comandos.
El procesador de texto LATEX está muy extendido en el mundo de las publicaciones
científicas, especialmente (pero no exclusivamente) en los campos de matemáticas,
física, informática e ingeniería. En la actualidad la inmensa mayoría de las publicacio-
nes científicas de esos campos se escriben en LATEX, tanto en lo referente a libros de
texto como a revistas periódicas. La superioridad de la calidad de la presentación de
los documentos escritos en LATEX en comparación con los realizados con los procesa-
dores de texto comerciales habituales está fuera de toda duda, basta con una breve
búsqueda en internet para obtener abundante documentación en este sentido y por
este motivo lo recomendamos fuertemente.
El éxito del LATEX se debe a que la calidad tipográfica y potencia de este sistema
(para manejar documentos extensos y complejos) es muy superior a la de cualquier
otro procesador de textos. Además este procesador de textos es extremadamente efi-
ciente a la hora de sacar partido de los recursos computacionales disponibles (memo-
ria y velocidad del procesador del ordenador), no es lógico que para escribir un mero
documento con algunas ecuaciones y unas pocas figuras tengamos que comprarnos
un ordenador nuevo cada año.
En cualquier caso, aunque nuestra recomendación es el procesador LATEX, el uso
de este procesador no es de ninguna manera obligatorio. Lo que sí deben aprender
forzosamente para estar dentro de lo que en la actualidad se considera estándar es
a manejar algún procesador de texto, el que cada uno elija con total libertad, y deben
saber usarlo lo suficientemente bien como para realizar documentos con una presen-
tación buena. De lo contrario estarían fuera de lo que se considera estándar. Si por
ejemplo realiza sus documentos “a mano” y cuando se pide un archivo PDF los esca-
nea y guarda en PDF (una práctica poco frecuente pero no del todo extinta), en ese
caso estaría haciendo algo por debajo del estándar actual y consecuentemente estaría
produciendo una mala impresión, independientemente de la calidad del contenido de
dicho documento. Un estudiante universitario debe ser capaz de usar un procesador
de textos y realizar documentos con una calidad de presentación buena. En el caso
de estudiantes de ciencias esos documentos incluirán con mucha frecuencia fórmulas
matemáticas, gráficas, tablas, referencias bibliográficas, enlaces a páginas web, etc.,
de modo que es necesario aprender a hacer todo eso. Qué procesador de texto usar
es algo que cada uno debemos elegir de manera personal, de la misma forma como
elegimos qué tipo de ordenador usar y con qué sistema operativo.
Como todo en esta vida, el LATEX no está exento de inconvenientes, los principales
son los siguientes:

hay que aprender a usarlo y

es un poco más rígido en su funcionamiento que los procesadores de texto tra-


dicionales.
1-18 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

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:

“deje el diseño de estilos de documentos a los profesionales de diseño de estilos


de documentos y céntrese en el contenido de su documento”

es la mejor elección sin ninguna duda.


Como decíamos antes, LATEX es parecido a un lenguaje de programación. Para ela-
borar documentos con LATEX lo que se hace es escribir en un archivo de texto plano
el código LATEX que posteriormente, al ser interpretado por el programa LATEX, genera
finalmente el documento formateado final, en el correspondiente archivo de tipo pdf.
Al principio puede parecer que esto es mucho más complicado que los procesadores
de texto habituales, ya que tenemos que aprender algo de código para poder escribir
un documento. Sin embargo, si disponemos de un ejemplo de código fuente en LATEX,
que contenga las instrucciones más habituales, el esfuerzo que tenemos que reali-
zar para ponernos en marcha es realmente mínimo, y al cabo de muy poco tiempo el
balance entre el tiempo que hemos perdido aprendiendo a usar el LATEX y el tiempo
que hemos ganado, al no tener que pasar horas ajustando detalles (“mover cajitas”
y/o márgenes etc.) en documentos formateados con procesadores de texto malos, es
extremadamente positivo. Además, para facilitarnos esta tarea en la web tenemos una
fuente de información virtualmente infinita, donde podremos localizar instantáneamen-
te cualquier instrucción LATEX que necesitemos usar y que no conozcamos, incluyendo
ejemplos de uso, plantillas (templates) e incluso documentos completos que podemos
emplear como puntos de partida para generar los nuestros, cambiando el texto pero
1.4. PROCESADORES DE TEXTO: LATEX Y LYX 1-19
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

conservando las instrucciones. Por supuesto que la situación es distinta si queremos


ser usuarios de LATEX a nivel profesional, como por ejemplo el responsable de la hoja
de estilos de una publicación periódica (p. ej. Physical Review Letters, formateada en
LATEX con la hoja de estilos REVTeX) o de una editorial como p. ej. Springer-Verlag o
Cambridge University Press. Para usar el procesador LATEX a ese nivel es necesario
invertir cierto tiempo de estudio. Para generar documentos a nivel de usuario normal
el tiempo de aprendizaje es mínimo.
De todas formas, si por el motivo que sea decidimos no invertir absolutamente nada
de tiempo en aprender un poquito de código LATEX, en la actualidad existen programas
que nos permiten generar documentos en LATEX al estilo de los procesadores de texto
tipo WYSIWYG (What You See Is What You Get) como el LibreOffice, es decir, visuali-
zando el aspecto final del documento al mismo tiempo que lo escribimos y accediendo
a los comandos del procesador de textos por medio de opciones en menús, sin ne-
cesidad de estudiar código LATEX. Un ejemplo es el LyX, empleado para escribir estos
apuntes. LyX también es gratuito y de código abierto y puede instalarse con cualquier
distribución de Linux. Con el LyX podemos ir generando el documento de la misma
forma que lo haríamos con el LibreOffice, generando las instrucciones de LATEX que
necesitemos por medio de las funciones disponibles en los menús que aparecen en
la parte superior de la ventana del LyX. Con esto podemos generar documentos de la
máxima calidad tipográfica, sin necesidad de estudiar código LATEX. En cualquier caso,
aunque al principio puede parecer que es mucho lo que uno necesita estudiar para
generar un simple documento, en la práctica el número de comandos de LATEX que se
emplean es muy reducido, y cuando uno está familiarizado es algo más rápido escribir
el código directamente en LATEX que navegar por los menús del LyX, aunque esto ya es
una cuestión de gustos. El LyX está bastante extendido pero no es el único procesador
de tipo WYSIWYW (What You See Is What You Want) que nos permite manejar LATEX,
otro ejemplo muy extendido es el TEXMACS (también gratuito y de código abierto), que
además puede usarse como front end del programa M AXIMA.
En http://en.wikipedia.org/wiki/LaTeX puede encontrarse un resumen sobre
este programa de procesamiento de textos, su historia y ejemplos de uso. En la ac-
tualidad este procesador de textos es el empleado para formatear los documentos de
la práctica totalidad de las publicaciones científicas en los campos de matemáticas,
física y por supuesto ciencias de la computación o informática (incluyendo libros de
texto, artículos de investigación en revistas científicas, etc.), y en gran parte de las
publicaciones de ingeniería, economía y otros campos. Por ejemplo las publicaciones
generadas por las editoriales de la American Mathematical Society, American Physical
Society, Cambridge University Press, Oxford University Press, Springer-Verlag, CRC
press, Taylor & Francis y un larguísimo etcétera están generadas con LATEX.
Resumiendo, los programas como el LibreOffice están muy bien para escribir una
nota, pero para generar un texto de alta calidad a nivel profesional el mejor proce-
sador es LATEX. Para generar documentos usando este procesador, sin necesidad de
aprender código LATEX, existe la posibilidad de usar el programa LyX. Para el alumno
interesado indicamos al final de esta sección algunas direcciones de internet donde
encontrará ejemplos de código que le serán útiles para ponerse en marcha. Al final de
esta sección y en la página web de la asignatura pueden encontrarse algunos ejem-
plos sencillos de código LATEX.
Un clásico para empezar a usar este procesador es el documento “The Not So
Short Introduction to LATEX 2ε (Or LATEX 2ε in 157 Minutes)”, disponible en
1-20 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

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

1.4.2. Escritura de documentos, presentaciones y pósters con LATEX


Lo primero que debemos hacer para poder usar el procesador LATEX es tenerlo
instalado en nuestro ordenador, para ello, desde una consola de línea de comandos
debemos hacer (como root):
dnf install texlive (Fedora)
apt install texlive (Debian/Ubuntu)
una vez hecho esto ya estamos en disposición de escribir documentos, para ello crea-
mos un archivo de texto plano (p. ej. miarchivo.tex) en el que escribimos el código
LATEX con el que se genera el documento. Las instrucciones
\documentclass[opciones]{article} o
\documentclass[opciones]{book}
que mencionábamos antes nos permiten presentar el tema de las instrucciones en
LaTeX. En la palabra \documentclass la barra \ indica al procesador LATEX que lo que
viene a continuación no es texto normal del documento, sino una instrucción en len-
guaje LATEX, es decir, una orden o comando que especifica algo sobre cómo debe
formatearse el documento. En este caso la instrucción es \documentclass que, como
su propio nombre indica, es el comando que define el tipo, o clase, de documento que
vamos a escribir, que queda especificado por el argumento “book” o “article” que va en-
tre llaves al final de la instrucción. Los otros argumentos, los que van entre corchetes,
son argumentos opcionales (es decir, se pueden omitir), e indican algunas opciones
(como tamaño de la fuente, tamaño de la página, etc.). Todos los documentos en LATEX
comienzan con la instrucción \documentclass, seguida de otras instrucciones entre
las que figura \begin{document} y terminan con la instrucción \end{document} con un
significado bastante obvio. En la práctica no es necesario conocer estas instrucciones,
ya que siempre podemos disponer de “plantillas de documentos” (o templates) que las
incluyen y que podemos emplear como punto de partida para nuestros documentos.
Para procesar este archivo tecleamos en línea de comandos
latex miarchivo.tex
con esta orden LATEX interpreta las instrucciones contenidas en miarchivo.tex y ge-
nera el archivo miarchivo.dvi (aparte de otros archivos auxiliares miarchivo.aux y
miarchivo.log). El archivo dvi contiene el documento formateado con su aspecto
final, de todas formas, la finalidad del archivo dvi es sólo ver cómo va quedando el do-
cumento a medida que lo escribimos, pero no es un formato diseñado para transmitir
información a terceras personas. Para ello, una vez que hemos finalizado el documen-
to debemos generar el correspondiente archivo en formato pdf, ésto puede hacerse
usando los menús que existen en el programa usado para visualizar el archivo dvi
(normalmente el Okular, o el xdvi, etc., todos ellos gratuitos e incluidos en cualquier
distribución de Linux), o bien desde la línea de comandos del Linux, por medio del
comando dvipdf (o del dvipdfm). Otra alternativa es compilar el documento con la
instrucción
9
Existe una traducción “oficial” al español en http://osl.ugr.es/CTAN/info/lshort/spanish/
lshort-a4.pdf
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

1.4. PROCESADORES DE TEXTO: LATEX Y LYX 1-21

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”.

1.4.3. Ejemplos de documentos básicos en LATEX


A continuación incluimos un ejemplo de cada uno de los tipos de documentos más
habituales (artículo y libro por un lado, póster y presentación con Beamer por otro).
El código de estos ejemplos está disponible en la carpeta LaTeX del curso virtual (ver
archivos de texto plano con extensión tex) junto con los correspondientes documen-
tos finales (archivos con extensión pdf), generados por medio del comando latex +
dvipdfm para los tipos “article” y “book”, y pdflatex para los que precisan el paquete
Beamer. Todos estos ejemplos se han tomado de la web donde pueden localizarse
fácilmente muchos más.

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

1-22 TEMA 1. INTRODUCCIÓN A LA FÍSICA COMPUTACIONAL

\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

\title{\bf An Example of Book Class} % Supply information


\author{for \LaTeX\ Class} % for the title page.
\date{\today} % Use current date.
% Note that book class by default is formatted to be printed back-to
-back.
\begin{document} % End of preamble, start of text.
\frontmatter % only in book class (roman page #s)
\maketitle % Print title page.
\tableofcontents % Print table of contents
\mainmatter % only in book class (arabic page #s)
\part{A Part Heading} % Print a "part" heading
\chapter{A Main Heading} % Print a "chapter" heading
Most of this example applies to \texttt{article} and \texttt{book}
classes
as well as to \texttt{report} class. In \texttt{article} class,
however,
the default position for the title information is at the top of
the first text page rather than on a separate page. Also, it is
not usual to request a table of contents with \texttt{article} class
.

\section{A Subheading} % Print a "section" heading


The following sectioning commands are available:
\begin{quote} % The following text will be
part \\ % set off and indented.
chapter \\ % \\ forces a new line
section \\
subsection \\
subsubsection \\
paragraph \\
subparagraph
\end{quote} % End of indented text
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

1.4. PROCESADORES DE TEXTO: LATEX Y LYX 1-23

But note that---unlike the \texttt{book} and \texttt{report} classes


---the
\texttt{article} class does not have a ``chapter" command.

\end{document} % The required last line

Ejemplo de póster y de presentación con el paquete Beamer:


Para compilar el ejemplo de póster y el de presentación es necesario tener car-
gado el paquete Beamer, que es un ingrediente adicional de LATEX incluido por
defecto en las versiones modernas. Beamer permite hacer presentaciones y pós-
ters con LATEX con un aspecto realmente bueno. Para emplear Beamer no se
compila el documento con el comando latex (como en los ejemplos anteriores)
sino que hay que usar el comando pdflatex. Al hacer esto pdflatex genera di-
rectamente el documento final (el póster o la presentación) en formato pdf, sin
necesidad de pasar por el archivo intermedio dvi.
Para ver el ejemplo de póster creamos un archivo de texto plano con el siguiente
código, tomado de http://tug.ctan.org/macros/latex/contrib/beamerposter/
example.tex:
\documentclass[final]{beamer} % beamer 3.10: do NOT use option
% hyperref={pdfpagelabels=false}
\mode<presentation>{
% % check http://www-i6.informatik.rwth-aachen.de/~dreuw/
latexbeamerposter.php for examples
\usetheme{Berlin}
% % you should define your own theme e.g. for big headlines
using your own logos
}
\usepackage[english]{babel}
\usepackage[latin1]{inputenc}
\usepackage{amsmath,amsthm, amssymb, latexsym}
%\usepackage{times}\usefonttheme{professionalfonts}
% times is obsolete
\usefonttheme[onlymath]{serif}
\boldmath
\usepackage[orientation=portrait,size=a0,scale=1.4,debug]{
beamerposter}
%e.g. for DIN-A0 poster
%\usepackage[orientation=portrait,size=a1,scale=1.4,grid,debug]{
beamerposter}
% e.g. for DIN-A1 poster, with optional grid and debug output

%\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

% e.g. for DIN-A0 poster with rwth-glossy-uv printer check


% ...
%
\title[Fancy Posters]{Making Really Fancy Posters with \LaTeX}
\author[Dreuw \& Deselaers]{Philippe Dreuw and Thomas Deselaers}
\institute[RWTH Aachen University]{Human Language Technology and
Pattern
Recognition, RWTH Aachen University}
\date{Jul. 31th, 2007}
\begin{document}
\begin{frame}{}
\vfill
\begin{block}{\large Fontsizes}
\centering
{\tiny tiny}\par
{\scriptsize scriptsize}\par
{\footnotesize footnotesize}\par
{\normalsize normalsize}\par
{\large large}\par
{\Large Large}\par
{\LARGE LARGE}\par
{\veryHuge veryHuge}\par
{\VeryHuge VeryHuge}\par
{\VERYHuge VERYHuge}\par
\end{block}
\vfill
\end{frame}
\end{document}

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}

Modifique el contenido de los ejemplos proporcionados para generar a partir de


ellos sus propios documentos con formatos artículo, libro, póster o presentación. Si
le surgen dificultades empleando Beamer deje este tema para más adelante, espere
1.5. ARCHIVOS DE TEXTO PLANO Y EDITORES DE TEXTO 1-25
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

a estar razonablemente familiarizado con el uso de LATEX en los tipos de documentos


sencillos como “book” y sobre todo el básico “article”, antes de hacer presentaciones
o pósters con Beamer.
A continuación incluimos unas pocas referencias que les serán útiles para empezar
a usar LATEX:

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

BibTeX, para la gestión eficiente referencias bibliográficas

http://www.bibtex.org/
http://en.wikipedia.org/wiki/BibTeX

Beamer, para hacer presentaciones y pósters

http://en.wikipedia.org/wiki/Beamer_(LaTeX)

Para usuarios de Windows

http://miktex.org/

1.5. Archivos de texto plano y editores de texto


Un tema totalmente fundamental en computación es el de los archivos de texto
plano. Los archivos de texto plano son los empleados para escrir código en cualquier
lenguaje de programación. Por código nos referimos al conjunto de instrucciones, es-
critas en un cierto lenguaje, con la finalidad de que el ordenador las interprete, por
medio del compilador o intérprete de comandos adecuado, y realice posteriormente la
serie de operaciones que hayamos programado (p. ej. realizar una serie de cálculos,
generar un documento con LATEX, conectarse con otro ordenador, etc.).
Un archivo de texto plano, por tanto, no es un documento con instrucciones de
formato complicadas, sino un archivo bastante básico, que contiene exclusivamente
caracteres estándar ASCII, es decir, letras, números, signos estándar de puntuación,
espacios y saltos de línea, etc., pero no caracteres no estándar (como p. ej. letras
1-26 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

griegas o símbolos matemáticos no estándar), ni tampoco instrucciones de formato,


es decir, instrucciones sobre cómo debe mostrarse ese texto (aparte de instruccio-
nes totalmente básicas, como espacios o saltos de línea). Los archivos de texto plano
contienen una serie de caracteres, escritos uno tras otro y separados por signos de
puntuación estándar, espacios y saltos de línea, pero no contienen elementos comple-
jos como textos resaltados o escritos con distintos tipos de fuente, distintos colores,
tablas, figuras, etc. Como decíamos antes los archivos de texto plano son los que
generalmente se emplean para escribir código en cualquier lenguaje de programa-
ción (Bash, C, C++, Fortran, LATEX, Maple, Mathematica, Matlab, Maxima, Octave, Perl,
TEX. . . ). Este tipo de archivos contiene exclusivamente el conjunto de instrucciones,
es decir, el código, del programa que sea, o en el caso de archivos tipo tex contie-
nen el conjunto de instrucciones LATEX que generan, por medio del comando latex, el
documento formateado final.

1.5.1. Nombres y extensiones de archivos


Es muy importante tener en cuenta que los documentos generados por cualquier
procesador de textos (LibreOffice, Word, etc.) no son archivos de texto plano. Los
documentos con formato pdf tampoco son archivos de texto plano. El motivo es que
estos tipos de archivos contienen elementos que no son texto plano (p. ej. instruccio-
nes en binario). También es importante darse cuenta que lo que define un archivo de
texto plano es el contenido del archivo, no su extensión. Algunos sistemas operati-
vos tienden a ocultar al usuario las extensiones de los tipos de archivos “conocidos”
(lo que es, en muchos casos, una brecha de seguridad por la que se ejecuta código
malicioso), y fomentan la confusión al dar la impresión que lo que define el tipo de un
archivo es su extensión, no su contenido. Cuando escribimos un archivo de texto plano
podemos darle el nombre de archivo y extensión que queramos, incluso podemos no
darle ninguna extensión, y esto no afectará de ninguna manera al tipo de archivo.
De todas formas, para organizar la información de manera sencilla e intuitiva y para
facilitar la comunicación entre programadores existe la convención de asignar ciertas
extensiones estándar a los archivos de texto plano con código fuente de diversos len-
guajes. Como ya hemos mencionado se suele dar la extensión .tex a los archivos con
código LATEX, en programación en C es habitual dar la extensión .c a los archivos con
código C. En este curso trabajaremos con wxMaxima, cuando se escriben programas
en Maxima se suelen usar las extensiones .mac o .mc, de manera indistinta. Para otros
lenguajes se emplean otras extensiones, para un archivo de texto plano de tipo gené-
rico, no asociado a ningún lenguaje de programación en particular, se suele emplear
la extensión .txt. En cualquier caso, no es la extensión lo que define el archivo, sino
su contenido.
Aunque anteriormente hemos mencionado que un SO serio debería permitirnos dar
a nuestros archivos el nombre y extensión que queramos, existe un problema cuando
damos a los archivos, o a los directorios que los contienen, nombres con caracteres
no estándard. Los sistemas operativos modermos permiten asignar a archivos y direc-
torios nombres con caracteres no estándard, como por ejemplo “acentos” (...Física...)
y/o espacios (...Física Computacional I...) entre otros. Aunque el sistema operativo nos
permite crear un directorio con un nombre que incluya caracteres no estándar, es muy
frecuente que al final eso sea fuente de multitud de problemas, de modo que es una
mala costumbre que conviene evitar. Esto es lo que sucede, p. ej. en wxMaxima, cuan-
1.5. ARCHIVOS DE TEXTO PLANO Y EDITORES DE TEXTO 1-27
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

do intentamos cargar un archivo por medio de la instrucción batchload(concat(path,


nombre-del-archivo)) (siendo path una cadena de caracteres que indica el direc-
torio donde está nuestro archivo). Si o bien en el path o bien en el nombre del archi-
vo tenemos algún nombre con acentos, espacios u otros caracteres no estándar el
wxMaxima no entenderá correctamente el nombre y/o localización del archivo en el
disco, y no podrá cargarlo. Tener una ortografía y sintaxis correcta es muy importan-
te cuando escribimos un texto de cualquier tipo, pero a la hora de poner nombres a
archivos y directorios en un ordenador lo mejor para evitarnos disgustos posteriores
es olvidarnos del uso de caracteres no estándar (acentos, espacios, letra ñ, . . . ). Por
ejemplo, en el caso de los espacios es recomendable sustituirlos por guiones “-” o
guiones bajos “_”, en el caso de los acentos sencillamente debemos omitirlos y pa-
ra la letra "ñ"se puede sustituir sencillamente por “n”, o por “nn” o por cualquier otra
combinación de caracteres que nos resulte cercana (“nh”, “gn”, . . . ). De esta forma,
en lugar de denominar “Física Computacional I” al directorio donde alojaremos el
material de esta asignatura, nos ahorraremos muchos disgustos si lo denominamos
“FISICA-COMPUTACIONAL-I”.

1.5.2. Editores de texto


Finalmente, llegamos a la importante cuestión sobre software:

? ¿qué programa se emplea para escribir archivos de texto plano?

Como hemos mencionado anteriormente, los archivos de texto plano no se escri-


ben con procesadores de texto (LibreOffice, Word, etc.), ya que éstos generan docu-
mentos con caracteres no visibles (en general instrucciones de formato o contenido
del archivo en formato comprimido) independientemente de cómo de sencillo o básico
sea el documento que hemos escrito.
Para escribir archivos de texto plano se emplean unos programas bastante básicos
denominados editores de texto. Es muy importante saber diferenciar entre un editor
de texto y un procesador de texto. Como su propio nombre indica, lo único que permi-
ten hacer los editores de texto es crear, mostrar y modificar archivos de texto plano,
mientras que los procesadores de texto son programas bastante más complejos que
permiten escribir documentos en los que, aparte del texto, existen instrucciones sobre
cómo debe mostrarse dicho texto.
Existen multitud de editores de texto, algunos de ellos son los siguientes: gedit,
nedit, kwrite, kate, emacs, xemacs, vi, vim, etc. Para sistemas con Windows, aparte
de los anteriores, puede usarse el notepad2 (por favor, no usen el notepad). Los edi-
tores de texto están programados con la finalidad de ser útiles para escribir código
en diversos lenguajes de programación. Por este motivo, la mayoría de los editores
de texto modernos son capaces de reconocer la sintaxis diversos lenguajes de pro-
gramación habituales y nos ofrecen la posibilidad de resaltar esta sintaxis. Para ello,
estos editores nos muestran el texto empleando colores diferentes para distintos tipos
de palabras clave (comandos o funciones del lenguaje) que el editor reconoce. Esto
es muy útil a la hora de programar, ya que permite visualizar rápidamente errores de
sintaxis comunes (como tener paréntesis mal cerrados) y no afecta al contenido de
nuestro archivo de código fuente, que sigue siendo texto plano.
En muchos lenguajes de programación existen entornos de trabajo que incluyen
en una única herramienta la ventana con el código fuente que estamos escribiendo,
1-28 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

la ventana con la órdenes enviadas al compilador, la ventana con el output de nues-


tro programa y otras. Este tipo de entornos de trabajo pueden ser muy cómodos y
útiles, pero en ocasiones generan la impresión equivocada de que el editor de texto
empleado para escribir código en un cierto lenguaje no puede ser un editor de texto
cualquiera, sino que está determinado por el lenguaje de programación que emplea-
mos. En realidad esto no es así, cuando escribimos código fuente en un lenguaje de
programación podemos emplear el editor de texto que queramos, independientemente
del lenguaje de programación que estemos empleando. Por ejemplo, para programar
funciones en Maxima una posibilidad es escribir el código de dichas funciones en la
ventana del wxMaxima y posteriormente usar los menús para exportarlas en un archi-
vo con extensión .mac, pero es mucho más cómodo usar un editor de texto ajeno al
máxima (como el KWrite) para escribir el código fuente, y sencillamente importar el
código desde wxMaxima por medio de la orden batchload(...).
Para finalizar incluimos a continuación algunos enlaces con información útil sobre
editores de texto.

Documentación general

https://en.wikipedia.org/wiki/Text_editor

Lista de editores de texto

https://en.wikipedia.org/wiki/List_of_text_editors

Comparativa de editores de texto

https://en.wikipedia.org/wiki/Comparison_of_text_editors

La recomendación que hacemos en este sentido antes de decantarnos por un editor


paricular es: probar muchos editores distintos, naturalmente que sean compatibles con
el SO que estemos empleando y por supuesto gratuitos.

1.6. Documentación científica


1.6.1. Tipos de publicaciones científicas más habituales
Tradicionalmente los estudios de ciencias físicas han estado totalmente centrados
en los contenidos de física y matemáticas, dejando de lado cualquier aspecto técnico
del desempeño de la profesión. Con el tiempo se ha observado que esto perjudicaba
en cierta medida a muchos titulados en física, que, una vez finalizados sus estudios,
debían emplear cierto tiempo en aprender este tipo de cosas. Un aspecto positivo de
los nuevos temarios en física es prestar algo de atención a estas cuestiones. Con esta
finalidad hemos presentado en este capítulo de introducción a la física computacional
algunas notas generales sobre uso de ordenadores, sistemas operativos y procesado-
res de texto, y vamos a cerrar esta sección con una breve descripción de los tipos de
publicaciones científicas más habituales, en particular los artículos de investigación.
Está fuera de discusión que muy pocos alumnos querrán leer artículos de inves-
tigación durante el primer ciclo de los estudios de física, pero no está de más tener
algo de cultura general sobre qué tipo de publicaciones científicas existe y cómo está
1.6. DOCUMENTACIÓN CIENTÍFICA 1-29
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

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.

1.6.2. Estructura de un artículo de investigación


En general la estructura típica de un artículo de investigación estándar es la si-
guiente:

Título, autores e información de contacto

Resumen (Abstract)

Lista de palabras clave (keywords)

Introducción (Introduction)

Contenido del artículo dividido en secciones

Conclusiones (Conclusions)

Bibliografía (Bibliography)

En ocasiones algunos apéndices adicionales (cuando la descripción de los deta-


lles técnicos de alguna sección se hace demasiado extensa)

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

En la primera mitad de esta asignatura vamos a aprender a programar en M AXIMA,


esto significa que no vamos a conformarnos con aprender a usar muchas de las nu-
merosas funciones que forman parte de este lenguaje de programación para cálculo
simbólico y numérico, sino que aprenderemos a programar nuestras propias funcio-
nes. El objetivo central de esta parte de la asignatura es que cada uno de nosotros
aprenda a generar su propia biblioteca de funciones, orientadas a resolver los proble-
mas más o menos avanzados que se va encontrando a medida que progresa en sus
estudios.
Para conseguir este fin debemos cubrir tres etapas: familiarizarnos con la sintaxis,
aprender a usar el manual, aprender a cargar archivos de texto con instrucciones en
M AXIMA en sesiones de trabajo con WX M AXIMA. Una vez hecho esto ya estaremos en
condiciones de programar en M AXIMA.
En este capítulo nos familiarizaremos con las peculiaridades de la sintaxis de este
lenguaje de programación, como por ejemplo el uso de “:” para hacer asignaciones, o
el uso de un carácter especial para indicar el final de una instrucción: “;” o “$” depen-
diendo de que queramos, o no, visualizar el output producido por dicha instrucción.
Como es habitual en otros sistemas de álgebra computacional, en M AXIMA se sue-
le trabajar por medio de una interfaz gráfica, denominada WX M AXIMA, la cual viene
provista de un manual con información sobre las diversas (muy numerosas) funciones
que ya vienen programadas en M AXIMA. El manual al que nos referimos está disponi-
ble en los menús:
Ayuda/Ayuda de Maxima
Ayuda/Ejemplo
de la ventana de la interfaz gráfica de WX M AXIMA. Este manual es extremadamente
útil, en él se explica la finalidad y sintaxis de todas las funciones del lenguaje M AXIMA,
además tiene buscadores que nos permiten localizar rápidamente cualquier función.
El lenguaje M AXIMA está provisto de un número enorme de funciones; ningún pro-
gramador, por experto que sea, las conoce todas, de forma que el uso del manual
para consultar sintaxis u opciones de funciones ya conocidas, o también para localizar
otras funciones que no conocíamos, es algo rutinario para todos los programadores
y usuarios de este lenguaje. Por tanto es conveniente que desde el primer momento
nos acostumbremos a consultar el manual.
En particular, a lo largo de estas notas sobre M AXIMA se hace referencia a diversos
comandos o funciones del M AXIMA, indicando su finalidad y (en algunas ocasiones) la

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

sintaxis correspondiente. En todos estos casos se sobreentiende que la información


aportada en estos apuntes debe complementarse con la información disponible en el
manual, donde la sintaxis de estos comandos o funciones del M AXIMA viene descrita
con todo detalle, junto con las diversas opciones disponibles y algunos ejemplos de
uso.

2.1. ¿Por qué M AXIMA?


Si buscamos un sistema de álgebra computacional disponible en todos los sistemas
operativos habituales, con capacidad para cálculo tanto simbólico como numérico, ca-
pacidad para diversos tipos de representaciones gráficas, y que además sea gratuito
y de código abierto, la mejor opción es M AXIMA.

M AXIMA es un sistema de álgebra computacional para la manipulación de ex-


presiones matemáticas tanto simbólicas como numéricas, con capacidad para
representaciones gráficas de funciones y datos en dos y tres dimensiones. M A -
XIMA produce resultados con alta precisión usando expresiones exactas en el
cálculo simbólico y representaciones con aritmética de coma flotante de preci-
sión arbitraria en el cálculo numérico.

M AXIMA incluye herramientas para todas las operaciones de cálculo habituales:


operaciones con vectores y matrices, números complejos, diferenciación, inte-
gración, desarrollos de Taylor y Fourier, transformadas integrales (Laplace, Fou-
rier), resolución de ecuaciones algebraicas por métodos analíticos y trascenden-
tes por métodos numéricos, así como diversas herramientas para ecuaciones
diferenciales ordinarias, sistemas de ecuaciones lineales, etc.

M AXIMA es un programa gratuito de código abierto. Su código fuente puede


ser compilado sobre varios sistemas incluyendo Windows, Linux y MacOS X.
El código fuente para todos los sistemas y los binarios precompilados para Win-
dows y Linux están disponibles en el Administrador de archivos de SourceForge
(http://maxima.sourceforge.net).

Actualmente existen otros sistemas de álgebra computacional que incluyen todas


las características anteriores. Los más extendidos son: M ATHEMATICA, M ATLAB y M A -
PLE , todos ellos considerablemente más potentes que M AXIMA, pero con el inconve-
niente de no ser gratuitos.
M AXIMA es un descendiente de M ACSYMA, el legendario sistema de álgebra compu-
tacional desarrollado a finales de 1960 en el Instituto Tecnológico de Massachusetts
(MIT). Es un sistema basado en el esfuerzo voluntario de muchos programadores y de
una comunidad de usuarios activa, gracias a la naturaleza del open source. El progra-
ma está en constante actualización, corrigiendo errores (bugs) y mejorando el código
y la documentación. La mayor parte de la discusión se hace por medio de listas de
correo. A continuación incluimos algunos enlaces con información útil sobre sistemas
de álgebra computacional en general y sobre M AXIMA en particular:

Página central de M AXIMA y documentación

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)

Sistemas de álgebra computacional

https://en.wikipedia.org/wiki/Computer_algebra_system

https://en.wikipedia.org/wiki/List_of_computer_algebra_systems

2.1.1. Interfaz gráfica (front end)


Existen tres formas posibles en las que el programa M AXIMA se presenta al usuario:
la ventana de línea de comandos básica y dos interfaces gráficas llamadas WX M AXIMA
y XM AXIMA; aparte de estos existen otros programas, como el TEXmacs, que también
permiten enviar instrucciones al M AXIMA.

? ¿Qué interfaz se recomienda?

En general la interfaz más recomendada es WX M AXIMA, especialmente para usuarios


nuevos, que estén comenzando con este lenguaje, ya que tiene numerosos menús que
facilitan aplicar las funciones del M AXIMA en las tareas más comunes, aparte de un
menú de ayuda muy completo. Además esta interfaz permite combinar texto, cálculos
y gráficas en un documento único, que se puede grabar de forma permanente, y utili-
zar como gestor del trabajo realizado. Para estos nuevos usuarios, como es obvio, el
uso de los menús y botones les permiten un aprendizaje más rápido de la sintaxis del
M AXIMA. No obstante, no debe olvidarse que este modo de trabajo no es exhaustivo,
ya que los menús y botones del interfaz gráfico no contienen todos los comandos del
M AXIMA que podrían necesitarse en una aplicación práctica concreta. En particular, si
nos limitamos a usar M AXIMA por medio los menús y botones del WX M AXIMA exclu-
sivamente, no tendremos la posibilidad de programar nuestras propias funciones, que
es el elemento fundamental de esta parte del curso
Muchos usuarios expertos tienden a trabajar al unísono en las dos interfaces ha-
bituales: WX M AXIMA y X MAXIMA, cambiando a X MAXIMA cuando ya conocen los nom-
bres de las funciones que necesitan y prefieren una interfaz estable, sin distracciones.
Por último, es importante conocer que la interfaz X MAXIMA se mantiene bastante in-
variable a lo largo de las nuevas versiones del M AXIMA, mientras que el WX M AXIMA
se está desarrollando de forma activa y suele cambiar frecuentemente su apariencia y
contenido en las sucesivas versiones del programa.
En cualquier caso, a modo de resumen

para este curso recomendamos el uso de WX M AXIMA.

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

2.1.2. Descarga e Instalación


En entornos Linux la instalación del programa M AXIMA es muy sencilla, suponiendo
que queremos usar el front end WX M AXIMA lo único que tenemos que hacer es abrir
una terminal como root y escribir:
dnf install wxmaxima (si estamos usando Fedora)
apt install wxmaxima (si estamos usando Debian o Ubuntu)
El programa de instalación se encargará automáticamente de revisar qué bibliotecas
adicionales necesitamos para instalar el WX M AXIMA, nos informará de toda la lista de
paquetes que vamos a instalar, las descargará de Internet y las instalará. Finaliza-
do este proceso (unos pocos minutos si nuestra conexión de red es razonablemente
rápida) ya estaremos en condiciones de empezar a trabajar con M AXIMA.

2.2. Sintaxis de M AXIMA


2.2.1. Primera sesión con Maxima
Para esta primera sesión utilizaremos M AXIMA en línea de comandos. Como hemos
comentado antes la forma habitual de trabajar es por medio del interfaz WX M AXIMA,
pero también es interesante observar, al menos una vez, cómo funciona este progra-
ma al nivel más básico. sin interfaz gráfica. En cualquier caso, las instrucciones que
incluimos a continuación nos servirán para comenzar a familiarizarnos con la sintaxis
de este lenguaje.
Abrimos entonces una terminal de línea de comandos (como usuario normal, no
como root) y en ella tecleamos maxima + enter . Una vez accedemos a M AXIMA lo
primero que vamos a ver será el siguiente mensaje:
Maxima 5.37.2 http://maxima.sourceforge.net
using Lisp SBCL 1.2.15-1.fc23
Distributed under the GNU Public License. See the file COPYING.
Dedicated to the memory of William Schelter.
The function bug_report() provides bug reporting information.
( %i1)
Tras la información sobre la licencia GNU-GPL, nos informa sobre la versión con la
que estamos trabajando y la página web del proyecto. A continuación, ya aparece el
indicador ( %i1), donde i es abreviatura de input, y el 1 indica su número, esperando
nuestra primera acción. Si queremos calcular una simple suma tecleamos la operación
deseada seguida de un punto y coma (;) y una pulsación de la tecla de retorno enter .
( %i1) 2.5+4;
a lo que M AXIMA da la primera respuesta en la forma
( %o1) 6.5
( %i2)
donde la o en ( %o1) es la abreviatura de output. A continuación del output observamos
( %i2), indicando que M AXIMA espera nuestra segunda instrucción.
Recordamos que en la notación anglosajona, la que sigue el M AXIMA, la separación
entre la parte entera y la parte decimal de un número se indica mediante un punto (.),
mientras que la coma (,) se reserva para separar elementos de una lista (componentes
de un vector, argumentos de una función, etc.), de tal forma que la siguiente acción da
un resultado de “error”
2.2. SINTAXIS DE MAXIMA 2-5
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:

Cuando queramos introducir un exponente en WX M AXIMA hay que teclear el sím-


bolo ^ seguido de un espacio (igual que en M AXIMA),

de esta forma el símbolo ^ aparece de manera explícita en nuestra expresión, indi-


cando de manera inequívoca que lo que va a continuación es un exponente, no un
superíndice. Operando de esta manera se resuelve el problema que aparecía antes
con el exponente 4
(%i5) 2^4;
(%o5) 16;
o en general con cualquier exponente
(%i6) 2^a;
( %o6) 2a
Hasta ahora no hemos hecho uso de la numeración de los inputs y outputs, que en
principio podría parecer que sólo sirven para el control de los cálculos. Sin embargo,
dichas entradas (( %in)) quedan grabadas en la sesión, y podemos en cualquier mo-
mento, recalcular su expresión, sin tener que copiarlo explícitamente. Así por ejemplo,
al repetir el primer input obtenemos
( %i8) %i1;
( %o8) x:125
Con la expresión obtenida en el output vemos que sólo se ha transcrito el input 1, para
comprobar si esta acción se ha ejecutado de nuevo basta solicitar el valor de x,
( %i9) x;
( %o9) x
Vemos entonces que, realmente, lo que hemos realizado es una copia del input sin eje-
cutarlo. Si quisiéramos que se ejecutara, tendríamos que colocar dos comillas simples
(no una comilla doble) antes del input a realizar. De esta forma,
( %i10)  %i1;
( %o10) 125
( %i11) x;
( %o11) 125
Antes de terminar esta primera sesión vamos a hacer uso del programa de ayuda
básico para buscar información sobre las funciones definidas en M AXIMA. El comando
se denomina describe, y como ejemplo utilizamos la función de raíz cuadrada sqrt
que hemos visto anteriormente,
( %i12) describe(sqrt);
 Función: sqrt (<x>)
Raíz cuadrada de <x>. Se representa internamente por `<x>^(1/2)'.
2-8 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

Véase también `rootscontract'.


( %o12) true
Para no perder los resultados y cálculos desarrollados en la sesión, podemos guar-
dar en un archivo los valores que nos interesen, de variables, instrucciones y resulta-
dos. Por ejemplo, para grabar en el archivo sesion1, los valores de x, y, y la instrucción
del %i6 con el nombre de “resolucion”, la instrucción sería
( %i13) save("sesion1",x,y,resolucion= %i6)$
Comprúebese que el primer nombre es el archivo (junto con su ruta de acceso, si
es necesario), que las variables x e y se escriben tal cual, pero que las referencias
a inputs y outputs deben ser referenciadas con nombres de cadena, para poder ser
reconocibles por el M AXIMA al abrir este archivo, ya que tanto %in como %on van va-
riando con el desarrollo del cálculo. Una vez terminada la sesión, la forma correcta de
abandonar la sesión es mediante el comando
( %i14) quit();
Abramos ahora una nueva sesión con el WX M AXIMA. Para cargar el archivo anterior
desde el wxMaxima, ejecutamos la sentencia
( %i1) load(sesion1);
A diferencia del M AXIMA en línea de comandos, en el WX M AXIMA para ejecutar
una instrucción debemos presionar shift + enter (presionando solamente enter
lo que obtenemos es un “salto de línea”). Ejecutando el anterior ( %i1) comprobamos
que obtenemos los resultados grabados, para x e y
( %i2) x; y;
( %o2) 125;
( %o3) 46
y también podemos comprobar que hemos recuperado la instrucción que resuelve la
ecuación en x,
( %i4) resolucion;
( %o4) solve(x^2=2,x)
y si queremos evaluarla, bastaría con la secuencia de instrucciones que hemos visto
más arriba:
( %i4) kill(x)$ resolucion;
( %o5) [x = -sqrt(2), x = sqrt(2)]

2.3. Trabajando con wxMaxima


Según muestra la página web del WX M AXIMA:
http://wxmaxima.sourceforge.net/wiki/index.php/Main_Page
las ventajas de esta interfaz respecto al XM AXIMA, son, entre otras:

creación de documentos, con texto y cálculos matemáticos, que permiten grabar


y cargar las sesiones de trabajo,

ventanas de diálogo cuando se utilizan funciones del M AXIMA con más de un


argumento, que permiten introducir los datos sin recordar la sintaxis exacta,

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.

junto con mejoras en la visualización de las expresiones matemáticas de salida, en


la transcripción de comandos, animaciones, etc. Desde esta misma página, se pue-
den descargar tutoriales que contienen archivos en el formato propio de la aplicación
(archivos de tipo wxm), que pueden ser cargados en una sesión del WX M AXIMA. El
archivo 10minute.zip contiene un tutorial de uso básico de WX M AXIMA para realizar
en 10 minutos, y el archivo usingmaxima.zip ofrece información general básica so-
bre la aplicación incluyendo, entre otras cosas, la “estructura de celdas” empleada en
WX M AXIMA .

2.3.1. Estructura de celdas


De forma distinta a la típica línea de comandos del M AXIMA, que trabaja con un
sistema de input-output único, WX M AXIMA utiliza un concepto dinámico de evaluación,
en el que se puede unir texto, cálculos y gráficas. Cada documento del WX M AXIMA
consiste en un número de las llamadas celdas. La celda es un conjunto básico de
instrucciones, y está visualmente identificada por un borde superior e inferior. Hay
celdas de distintos tipos, p. ej. hay celdas de título, de sección, de texto, etc., la más
importante para nosotros será la celda de entrada o input.
La celda de entrada o input es el tipo de celda básico, empleado para escribir
instrucciones que queremos evaluar por medio del programa M AXIMA. Para obtener
la primera celda de input en una sesión de WX M AXIMA podemos pulsar enter di-
rectamente, o bien pedir a WX M AXIMA que aporte esta celda por medio del menú:
Celda/Insertar celda de entrada. Una vez escritas las instrucciones a evaluar en
la celda de entrada, que aparece con bordes rojos antes de su evaluación, ésta se
evalúa al pulsar en el teclado la combinación de teclas shift + enter . En ese mo-
mento el código completo escrito en la celda es enviado al M AXIMA, que verifica si
existe algún error sintáctico y comprueba que cada línea de código termine en “;” o en
“$” (si no es así el WX M AXIMA añade el símbolo “;” al final de cada línea de forma auto-
mática) y posteriormente ejecuta de forma secuencial las instrucciones que hayamos
escrito en la celda.
Hacemos notar que en WX M AXIMA la celda de código no tiene por qué limitarse
a una línea de texto. Una vez corregida la sintaxis, M AXIMA procede a la evaluación
de la celda, y en la salida van apareciendo los sucesivos ( %in) y ( %on) que son
indicación del progreso del cálculo. El programa permite tener distintos colores para
los datos de entrada y salida, y los input y output asociados, para mejor visualización
del contenido de la celda. Una vez evaluada la celda, para acceder a la siguiente,
se debe pulsar la tecla enter ; entonces aparecerá ésta en el color asignado a las
celdas sin evaluar (rojo, por defecto). Las celdas ya evaluadas se pueden modificar y
recalcular, se pueden copiar y borrar, tras resaltarlas haciendo click a la izquierda de
la línea de código. La copia de la celda sólo contiene las instrucciones de entrada de
la original, en espera de su evaluación.
La sesión de trabajo con WX M AXIMA puede grabarse en un archivo (p. ej. desde
el menú: Archivo/Guardar o Archivo/Guardar como); en este sentido hay dos posibi-
lidades. En el formato básico wxm (el único disponible en versiones antiguas de WX -
M AXIMA) sólo serán grabados los inputs de cada celda de la sesión de trabajo, pero
2-10 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

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

2.3.2. Configuración del wxMaxima


Desde el menú vista (en versiones antiguas Maxima/Paneles) se pueden visuali-
zar los paneles de comandos básicos: Matemáticas generales y Estadística, así como
el panel de Historia, que contiene los últimos comandos utilizados, o el panel de In-
sertar celda, entre otros. El tipo, color y tamaño de letra, junto con otras opciones
básicas, se configura en el menú: Editar/Preferencias. Una vez realizados los cam-
bios oportunos, pueden guardarse las especificaciones en el archivo style.ini, para
poder cargarlas posteriormente en el inicio de sesión.
La mayoría de los comandos comunes en M AXIMA aparecen al seleccionar los me-
nús directores: Ecuaciones, Álgebra, Análisis, Simplificar, Gráficos y Numérico.
En el momento de seleccionar uno de ellos, WX M AXIMA lo actualiza con el dato que
figura en la celda activa. Si no existiera este dato (no existe una celda activa), WX M AXI -
MA calcula el resultado operando sobre el símbolo “ %”, que es una variable del sistema
cuyo valor está dado por la última expresión empleada. Por tanto, si queremos utilizar
esta forma directa de escritura, debemos escribir primero los datos en la celda activa,
antes de seleccionar el comando de M AXIMA. Cuando el comando necesite de más de
un dato de entrada, como puede ser el comando solve que necesita una ecuación y
una variable, al ser seleccionado, M AXIMA abre una ventana de diálogo para introducir
estos datos adicionales, junto con el dato obtenido de la celda activa.
Un aspecto muy interesante del uso de estos menús es que no solamente generan
el output de la operación matemática solicitada, sino también el correspondiente input
en M AXIMA, lo cual es muy interesante para irse familiarizando con este lenguaje de
programación.

2.3.3. Control del cálculo y memoria


Como otras características importantes, desde el menú de comandos del WX M AXI -
MA se permite interrumpir en cualquier momento el cálculo de una celda activa, evitan-
do así demoras si el usuario decide que la ejecución tarda demasiado. El WX M AXIMA
también permite borrar el contenido de la memoria, aplicando el comando kill(all)
por medio del menú correspondiente, y también existe un menú para reiniciar M AXI -
MA . Asimismo el menú Maxima/Conmutar pantalla de tiempo desactiva el control del
tiempo que ha sido empleado en cada evaluación de celda activa.
Un último apunte dentro de esta sección, para indicar con un ejemplo cómo aplicar
los comandos de M AXIMA sólo a una parte de la celda activa. El menú: Simplificar
contiene comandos que permiten encontrar expresiones más sencillas (‘simplificadas’)
que las dadas. El termino ‘simplificado’ no tiene una acepción clara y evidente, pues-
to que M AXIMA no tiene forma de conocer qué es una expresión más sencilla para
el usuario. No obstante, desde el punto de vista matemático, existen comandos bas-
tante completos para la simplificación racional y trigonométrica, para la factorización
y expansión de expresiones. Del que nos vamos a ocupar brevemente aquí es del
comando de simplificación racional ratsimp, con el caso
2.3. TRABAJANDO CON WXMAXIMA 2-11
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

( %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.

2.3.4. Manual de wxMaxima


Desde el menú: Ayuda se accede a toda la información sobre el programa M AXIMA,
incluidos tutoriales, ejemplos y sugerencias para el usuario. Asimismo desde la celda
activa, una vez resaltado un comando, la tecla F1 abre el Manual de M AXIMA para
mostrar la entrada de esa función (principalmente su significado y sintaxis completa).
Como ya se ha mencionado anteriormente, se sobreentiende que a medida que se
estudian estos apuntes se debe consultar en el manual la información completa sobre
cada uno de los comandos o funciones a los que se hace referencia, y por supuesto
también se debe practicar un poco el uso de estos comandos, a fin de asegurarse que
hemos comprendido correctamente su funcionamiento.

2.3.5. Input y output


Como ejemplo de entrada de datos mostramos cómo calcular en una celda el área
total y volumen de un cilindro de radio R = 2 y altura H = 3 en unidades arbitrarias. Ma-
temáticamente el área total del cilindro es la suma del área de cada base circular (πR2 )
más el área de la pared vertical (2πRH), resultando A = 2πR2 + 2πRH = 2πR(R + H),
mientras que el volumen es el producto base × altura, igual a V = πR2 H. Antes de
realizar este cálculo recordamos que:

el número π = 3,141592 . . . es una constante matemática predefinida en M AXIMA


por medio del símbolo %pi,

debemos introducir enter tras cada línea de texto para acceder a la siguiente,

M AXIMA diferencia entre mayúsculas y minúsculas y no tiene en cuenta los es-


pacios en blanco entre las variables y los signos, dentro de las expresiones.

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.

2.3.5.1. Expresiones y funciones

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

sino varias expresiones intermedias, antes de poder obtener el resultado retornado


por la función. En ese caso para definir una función se emplea el comando block, y la
sintaxis es la siguiente:
 
lista de

 expresiones  

  necesarias  
   lista de para definir 
lista de 
 variables 

 argumentos  la función 
 := block  locales  ,
  
“nombre de la función” 
 separados    separadas  ;
 separadas  por comas, 
por comas
return(expre- 
 
 por comas
 

 sión retorna- 

 da por la 
función)

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.

2.4. Expresiones en M AXIMA


La unidad básica de información de M AXIMA es la expresión. En la sección ante-
rior ya hemos visto algunos ejemplos sencillos de expresiones. Una expresión es una
combinación de variables, números, operadores y constantes.

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.

2.4.1. Operaciones aritméticas


Los operadores aritméticos más comunes son suma (+), resta (−), multiplicación
(∗), división (/), y potencia (^). M AXIMA por defecto devuelve los resultados de forma
exacta, sin aproximaciones ni cálculos numéricos. Así podemos obtener resultados
sencillos de expresiones complicadas como
!−3
25
1
1 + (2/3)3 +(3/2) 2

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

( %i3) fpprec:50$ bfloat( %pi^ %e);


( %o3) 22.459157718361045473427152204543735027589315133997b1
Nótese que cuando utilizamos grandes números de coma flotante con M AXIMA el ex-
ponente se escribe empleando la letra “b”, en lugar de la usual “e”, es decir, xbn quiere
decir x × 10n .

2.4.2. Teoría elemental de números con M AXIMA


M AXIMA tiene una serie de comandos que resultan muy útiles para verificar algu-
nos teoremas de la teoría de números, que además nos sirven para poner en práctica
parte de lo aprendido hasta ahora. Tenemos primep(n) que verifica si el número n
dado es primo o no, las respuestas pueden ser true o false. En este sentido convie-
ne recordar que por convención se considera que la unidad no es un número primo.
Otras funciones interesantes son next_prime(n), que retorna el primer número primo
correlativo mayor que el número n dado, gcd(n1 , n2 ), da el máximo común divisor de
los dos números dados n1 y n2 , y finalmente ifactors(n), que factoriza el número n
dado en producto de sus factores primos elevados a las potencias correspondientes.
Utilizando algunos de estos comandos vamos a calcular de forma sencilla cuán-
tos número primos hay entre 1 y 200. La forma más directa es ejecutar el comando
next_prime(i) sucesivamente desde el valor inicial i = 1 hasta que i supere el valor
200, apuntando el número de veces N que ejecutamos esta instrucción. De esta forma
el número de primos que buscamos estará dado por N − 1 (hay que restar una unidad
porque el número primo obtenido en la última iteración ya es mayor que 200, de modo
que no cuenta). Para poner esto en práctica comenzamos asignando el valor inicial
i = 1 en la primera celda:
( %i1) i : 1$
En la segunda celda aplicamos el comando next_prime
( %i2) i : next_prime(i);
( %o2) 2
que opera sobre el valor de i anterior, evaluando su primer número primo mayor que
i, y asignando el valor encontrado de nuevo a i, este último resultado es lo que se
muestra como output de la celda. Ejecutando sucesivamente esta misma celda iremos
asignando los valores de i a números primos cada vez mayores, hasta que alcance-
mos un número primo mayor que 200. El número final de veces que se ha ejecutado la
celda será el valor N que buscamos. El resultado es N = 47, lo que significa que hay
46 números primos menores que 200.
Nos preguntamos ahora cuántos de estos primos son de la forma 2n − 1, siendo n
un número entero. Para ello, basta introducir el comando ifactors en la celda principal
de cálculo, con una nueva línea de instrucción
( %i2) i: next_prime(i);
( %i3) ifactors(i+1);
( %o2) 2
( %o3) [[3,1]]
Así, con la factorización en números primos de i + 1 podemos distinguir qué factori-
zación es de la forma 2n , y por tanto qué números primos son de la forma i = 2n − 1.
La salida ( %o3) [[3,1]] indica que la primera factorización en números primos de
i + 1 da el resultado 31 . Ejecutando sucesivamente la celda obtenemos los siguientes
números primos en la forma buscada, 1 = 21 − 1, 3 = 22 − 1, 7 = 23 − 1, 31 = 25 − 1
2.4. EXPRESIONES EN MAXIMA 2-17
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

y 127 = 27 − 1. Viendo esta secuencia de números da la impresión que los números


primos se corresponden con valores primos del exponente n en la expresión 2n − 1,
de esta forma M AXIMA nos ha servido para intuir una regularidad en el conjunto de
los números primos. Veamos a continuación si esta regularidad se cumple para un
número primo n arbitrario grande
( %i-) (n:1000, n:next_prime(n), i:2^n-1)$ primep(i);
( %o3) false
lo que nos indica que la regularidad que intuíamos no se cumple siempre. Los números
de la forma Mp = 2p − 1 se denominan números de Mersenne y como hemos visto no
todos ellos son primos. Según Wikipedia, a octubre de 2020 se conocen 51 números
primos de Mersenne, siendo el mayor de ellos M82589933 = 282589933 − 1, un número de
más de 24 millones de cifras.

2.4.3. Simplificación, expansión y factorización


Al utilizar programas de cálculo simbólico es necesario en multitud de ocasiones
simplificar expresiones que, al haberse generado de manera automática, adoptan for-
mas demasiado complicadas o extensas que, sin embargo, son equivalentes a ex-
presiones analíticas más sencillas y manejables. M AXIMA dispone de numerosos co-
mandos para simplificar expresiones (de forma racional, trigonométrica, con números
complejos), expandir o desarrollar funciones (logaritmos, potencias), y factorizar nú-
meros o términos en ecuaciones. Los comandos más comunes son ratsimp para la
simplificación de expresiones racionales, trigsimp simplifica expresiones trigonomé-
tricas, factor que factoriza todo tipo de expresiones, y expand que desarrolla todos
los términos que resultan de una expresión.
Uno de los problemas que tienen los programas de cálculo simbólico es que con
frecuencia no hacen de manera automática simplificaciones que a nosotros nos resul-
tan evidentes, sólo cuando el usuario lo solicita se llevan a cabo estas operaciones de
simplificación. Veamos el siguiente ejemplo en M AXIMA:
( %i1) (x^2-1)/(x+1);
( %o1) xx+1
2 −1

Evidentemente esta expresión puede simplificarse dividiendo numerador y denomina-


dor por el factor común x + 1, es decir, factorizando x2 − 1 = (x + 1)(x − 1) en el
numerador y cancelando a continuación factores comunes. Sin embargo M AXIMA no
simplifica esta expresión a no ser que el usuario lo precise, en cuyo caso obtenemos
el resultado esperado
( %i1) factor((x^2-1)/(x+1));
( %o1) x-1
Simplificar expresiones matemáticas no es una tarea trivial y el éxito de M AXIMA en
este sentido (o en general de cualquier paquete de álgebra computacional) está con-
dicionado por el grado de experiencia del usuario. Por otra parte, para que M AXIMA
nos dé los resultados esperados es necesario conocer las técnicas que utiliza para
manipular expresiones. Por ejemplo, M AXIMA no es capaz de simplificar la expresión
x2 +1
x+i
(siendo i la unidad imaginaria) por medio del comando factor
( %i1) factor((x^2+1)/(x+ %i));
( %o1) xx+i
2 +1

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

( %i2) rectform( %);


( %o2) x − i
Resolvemos ahora un ejemplo sencillo de identificación de fórmulas trigonométri-
cas. Para ello hacemos uso de los comandos usuales de funciones trigonométricas:
sin y cos, donde el argumento se escribe en radianes (por ejemplo, cos(π ) = -1).
Queremos determinar si la fórmula

2 sin 2x cos2 x − sin2 x = cos 3x sin x + sin 3x cos x




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+...

donde el proceso se extiende al infinito. Queremos verificar si esta fracción continua


tiene un valor finito y calcularlo, en particular nos preguntamos si este valor depende
o no de la variable x, definida como indicamos a continuación. Tomamos la variable x
como variable independiente de la fracción continua
2.4. EXPRESIONES EN MAXIMA 2-19
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

( %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

Este es el valor de la fracción continua con 16 términos. Si quisiéramos calcular numé-


ricamente su valor para un x dado basta con sustituir en esta expresión x por el valor
a considerar. Por ejemplo, para x = 0, obtenemos
( %i18) x:0$
( %i19) subst(0, x, %), numer;
( %o19) 1.618037135278515
Se puede demostrar que el límite de esta fracción continua cuando el número de tér-
minos tiende a infinito es único e independiente de x, con el valor 1,61803398874989.

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

A continuación, para la sustitución en y, elegimos %o2 como expresión, en la que se


sustituye y por λy
( %i3) subst(lambda*y,y, %o2);
2 x2 y λ3 y 3 λ3 +x3 λ3
( %o3) 2 y 4 λ4 −3 x2 y 2 λ4 −x3 y λ4
+ x2 y 2 λ 4
Nos queda verificar si la expresión final es igual a la expresión inicial multiplicada por
una cierta potencia de λ. Para ello hacemos la comparación
( %i3) factor( %o3 / %o1);
( %o3) 1
λ
Por tanto la función f (x, y) es homogénea de grado −1.

2.5. Definición de funciones con Maxima

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

función, se emplea el comando block y la sintaxis es:


 
lista de

 expresiones  

  necesarias  
   lista de para definir 
lista de 
 variables 

 argumentos  la función 
 := block  locales  ,
  
“nombre de la función” 
 separados     separadas  ;
 separadas  por comas, 
por comas
return(expre- 
 
 por comas
 

 sión retorna- 

 da por la 
función)

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.

2.5.1. Variables locales y globales


En esta función graficaderivadaEPS(f, x, a, b, filename) también podemos
ver el uso de variables locales. Cuando se programan funciones un poco complicadas
es necesario realizar cierto número de cálculos intermedios, u otras operaciones, para
obtener el resultado final deseado (es decir, el output producido por la función), pero
que no nos son de utilidad una vez la función ha concluido su evaluación. Cuando
se programan funciones algo extensas lo más cómodo para trabajar de una manera
ordenada es asignar estos resultados intermedios de cálculo a variables locales, se
decir variables que solo están definidas dentro de la función donde se declaran.
En cálculos avanzados es normal operar de manera simultánea con un número
elevado de funciones ciertamente complicadas. En este caso, debido al elevado nú-
mero de variables que entra en juego, la tarea de buscar nombres de variables “que no
estén en uso por otras funciones o celdas de la sesión de trabajo” se volvería muy en-
gorrosa si todas las variables empleadas fuesen visibles de manera simultánea desde
todas las funciones en uso. Para resolver este problema, que es común a todos los
lenguajes de programación, se han inventado dos categorías de variables:
variables globales
variables locales
Las variables globales son las que uno crea en una sesión de trabajo con la fi-
nalidad de que puedan usarse posteriormente en dicha sesión. Por ejemplo, cuando
evaluamos en una celda de WX M AXIMA la instrucción a : 1; creamos la variable glo-
bal a, y asignado a ella el valor 1. Las variables globales se caracterizan por que sus
valores son visibles desde cualquier celda, expresión o función a la que llamemos en
la sesión de trabajo donde se han definido. Que sus valores sean visibles desde cual-
quier función implica dos cosas: por un lado desde cualquier función podemos usar
estas variables con sus valores correspondientes pero, por otra parte, desde cualquier
función podemos modificar los valores de estas variables.
Por el contrario, las variables locales no se crean en la sesión de trabajo, sino
dentro de las funciones, y se crean con la finalidad de ser empleadas exclusivamente
2.5. DEFINICIÓN DE FUNCIONES CON MAXIMA 2-23
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

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

do fijado al principio. Evidentemente, es poco práctico tener que contar el número de


asignaciones realizadas “a mano”, especialmente si queremos calcular cuántos núme-
ros primos existen por debajo de un número x elevado (p. ej. 106 ). Lo más razonable
es programar en una función todas las operaciones anteriores, de modo que sea el
M AXIMA quien se encargue de contar. La forma más sencilla de programar esta ope-
ración es por medio de un bucle, empleando para ello la instrucción for . . . while . . . do
(cuyo funcionamiento puede consultarse en la ayuda). El código que implementa esta
función es el siguiente:
numprimosmenoresque(x) := block( [N, i, contador],
contador : 0,
i : 1,
for N : 1 step 1 while next_prime(i) < x do (
contador : N, i : next_prime(i) ),
return(contador)
)$
Empleando esta función se puede ver que exiten 78498 números primos menores que
106 , y 148933 menores que 2 × 106 . ¿Hubiéramos podido calcular esto contando?
Resumiendo, en esta sección hemos visto la sintaxis empleada para definir fun-
ciones en M AXIMA, hemos visto la diferencia existente entre variables locales y glo-
bales, y finalmente hemos visto que cuando definimos una función, en general, esta
debe recibir como argumentos a todas las variables necesarias para obtener el out-
put deseado, y debe tener definidas como variables locales a todas las variables
auxiliares necesarias para los pasos intermedios que sean precisos.

2.6. Aprendiendo M AXIMA


2.6.1. Niveles de uso de M AXIMA
Cualquier sistema de álgebra computacional, como el M AXIMA, se puede usar a
distintos niveles, tal y como resumimos a continuación.
En nuestro caso el nivel más básico consiste en abrir una sesión de WX M AXIMA, es-
cribir en ella algunas expresiones y posteriormente manipularlas por medio de las fun-
ciones que la ventana de WX M AXIMA nos ofrece en sus menús: Ecuaciones, Álgebra,
Análisis, Simplificar, Gráficos y Numérico. Este nivel de usuario básico nos ofrece
una capacidad de computación similar a la de una calculadora científica muy avan-
zada, con capacidad para hacer gráficas y con la posibilidad adicional de guardar la
sesión de trabajo en un archivo, lo que nos permite volver a abrir en otro momento
nuestra sesión de trabajo y tomarla como punto de partida para cálculos posteriores.
En este sentido tenemos las opciones “guardar como archivo de tipo wxmx” para con-
servar la sesión de trabajo completa (input y output), o “guardar como archivo de tipo
wxm” para guardar solo el input.
Para acceder a este nivel de uso basta, por tanto, con tener el programa instalado
en el ordenador, escribir alguna expresión y posteriormente explorar un poco las posi-
bilidades de cálculo, representación gráfica y manipulación de expresiones matemáti-
cas que nos ofrecen los menús del WX M AXIMA, es decir, basta con abrir el programa
WX M AXIMA y comenzar a explorar los menús, sin necesidad de tener conocimientos
previos sobre este lenguaje de programación. Por supuesto que todos hemos sido
2.6. APRENDIENDO MAXIMA 2-25
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

El siguiente nivel de uso de M AXIMA, y objetivo de esta parte de la asignatura, es


el de usuarios avanzados. Ser un usuario avanzado no consiste en saberse de me-
moria cientos de comandos de M AXIMA, sino en saber programar funciones con este
lenguaje de programación. Para ello es imprescindible tener algunos conocimientos
básicos sobre sintaxis y funciones del M AXIMA y sobre todo hay que saber buscar la
información necesaria para localizar las herramientas de este lenguaje que podemos
necesitar en un problema concreto. Como decíamos antes, ningún usuario de M AXIMA
conoce todas las funciones disponibles en este lenguaje, lo que caracteriza a un usua-
rio avanzado es que es capaz de localizar las funciones que necesita usar, y es capaz
de escribir sus propias funciones cuando lo que quiere hacer no está programado en
ninguna función o comando propio del lenguaje M AXIMA.

2.6.2. Comandos e instrucciones de uso frecuente


En los ejemplos disponibles en los apuntes y PECs resueltas de cursos anteriores
pueden encontrarse diversos ejemplos de uso de bucles y otras instrucciones emplea-
das frecuentemente en programación con M AXIMA. A modo de introducción, a conti-
nuación mencionamos un breve listado de comandos e instrucciones de uso frecuente.
Por supuesto que es en la ayuda del M AXIMA donde debe consultarse la información
completa sobre uso, sintaxis, opciones, ejemplos, etc. acerca de estas instrucciones:
Operaciones básicas
• Para las operaciones básicas se emplea: +, -, *, /. Para el producto matri-
cial se emplea . (las matrices que multiplicamos deben tener dimensiones
compatibles, de lo contrario M AXIMA no podrá realizar el producto y nos in-
formará de un error). Para la operación “elevar a una potencia” se emplea el
símbolo ^ (o ^^ en el caso de potencias de matrices). Es importante que el
símbolo ^ aparezca realmente escrito en el código (para ello es necesario
pulsar la tecla seguida de un espacio), de lo contrario lo que hacemos es
introducir un superíndice que, con frecuencia, M AXIMA no interpretará como
un exponente. Para las funciones matemáticas habituales M AXIMA cuenta
con las funciones habituales sin, cos, log, etc. En la ayuda de M AXIMA
podremos encontrar sin ninguna dificultad cualquiera de estas funciones a
medida que nos vayan haciendo falta.
Asignaciones
• M AXIMA es distinto de la inmensa mayoría de los lenguajes de programación
en lo referente a asignar valores a variables. En M AXIMA, para asignar un
valor a una variable se emplea el símbolo “:”. El símbolo “=” en M AXIMA se
emplea para definir ecuaciones. Por ejemplo, si queremos asignar el valor
3 a la variable x hacemos x:3;. Si queremos que la variable EQ contenga la
ecuación LHS=RHS hacemos eq:LHS=RHS.
• Aparte de asignar valores a variables, una operación que emplearemos
constantemente es definir funciones. Para definir funciones en M AXIMA
se emplea el símbolo :=, y con frecuencia es conveniente usar el comando
block.
Bucles
2.6. APRENDIENDO MAXIMA 2-27
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

En programación los bucles son una de las instrucciones más habituales y


útiles. En M AXIMA para hacer un bucle hacemos, en general, lo siguiente:
for índice : valor inicial thru valor final step incremento do instrucciones;
Por ejemplo, el siguiente bucle escribe los primeros 50 múltiplos de 3:
for i : 1 thru 50 step 1 do print(3*i);
El mismo resultado se obtiene con este otro bucle
for i : 3 thru 150 step 3 do print(i);
Aparte de “thru valor final” la instrucción que define cuándo debemos in-
terrumpir la ejecución del bucle también puede programarse por medio de
una condición, empleando para ello la instrucción while, por ejemplo
for N : 1 step 1 while (N <= 10 - N) do print("N = ", N);
Además de esto, similarmente a todos los lenguajes de programación M A -
XIMA dispone del comando if, para introducir condiciones, con la sintaxis
habitual if . . . then . . . else, o también if . . . then. . . elseif . . . , etc.

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

2.6.3. ¿Cómo preparar esta parte de la asignatura?


La forma en que está diseñada esta parte de la asignatura es la siguiente. En estos
apuntes no se reproduce la información disponible en el manual del M AXIMA (menú:
Ayuda/Ayuda de Maxima). Estos apuntes contienen diversos ejemplos de programa-
ción de funciones, unas muy sencillas, otras un poco más complicadas, por medio de
las cuales vamos a ir explorando algunas de las muchísimas posibilidades que nos
ofrece este lenguaje de programación. En todo momento hemos intentado que los
problemas matemáticos sobre los que versan estos ejemplos resulten interesantes y
útiles. Por este motivo los ejemplos están relacionados con problemas de matemáticas
de interés en física.
La manera de trabajar con estos apuntes es la siguiente.
De manera secuencial (uno a uno y en orden) vamos cargando las funciones
programadas en los ejemplos en una sesión de trabajo.

Leemos cuidadosamente los comentarios que aparecen en dichas funciones,


donde se explica qué es lo que hace cada línea de código.

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

• El enunciado de la PEC de M AXIMA de cada curso, en la convocatoria de


junio, se publica en el curso virtual aproximadamente un mes antes de la
fecha final de entrega pedida. Para la convocatoria de septiembre el enun-
ciado se publica a primeros de julio.
• Las funciones pedidas en la PEC de M AXIMA son algo avanzadas, para
poder programarlas es necesario haber adquirido cierta experiencia previa-
mente, trabajando con los ejemplos aportados en los apuntes.
• Para entregar la PEC de M AXIMA hay que subir al curso virtual (Menú:
Entrega de trabajos) un archivo de texto plano con el código en M A -
XIMA que define las funciones pedidas. Esto quiere decir que en la PEC de
M AXIMA no hay que entregar una sesión de trabajo en WX M AXIMA, sino
el archivo de texto plano con el código mencionado.
• El nombre de dicho archivo debe contener los dos apellidos del alumno.
• La extensión de dicho archivo puede ser .mac, o .mc, o .m, o incluso .txt:
da exactamente lo mismo. De todas formas, a los archivos de código en
M AXIMA es costumbre ponerles la extensión .mac, o .mc.
• Las aclaraciones, explicaciones o comentarios sobre las funciones progra-
madas que cada estudiante quiera incorporar a su PEC deben ir codificadas
en el interior del mencionado archivo de código, escritas como comentarios,
delimitadas por los caracteres que se emplean en lenguaje M AXIMA para
escribir comentarios: /* ...*/.

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.

2.6.4. Programando funciones y cargando archivos de código des-


de sesiones de trabajo
Cuando se escribe una función, una subrutina o cualquier otro ingrediente de un
programa de ordenador en un cierto lenguaje de programación, lo que se está escri-
biendo es un código fuente, o sencillamente un código. Este código que uno escribe
2-30 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

se guarda en un tipo de archivo denominado archivo de texto plano, que se caracte-


riza por contener, solamente, texto plano.
En el capítulo de introducción hemos explicado qué es un archivo de texto plano,
de modo que no vamos a repetir aquí dicha información. Antes de continuar con el
estudio del lenguaje de programación M AXIMA es absolutamente fundamental tener
claro este concepto.
En el capítulo de introducción también hemos mencionado que los programas de
ordenador que se emplean para leer y escribir archivos de texto plano son los editores
de texto, y hemos aportado enlaces a diversas páginas de Wikipedia donde se explica
este concepto con mayor profundidad y donde se expone un listado muy completo (y
actualizado) de editores de texto, incluyendo información sobre cuáles son gratuitos y
cuáles no y sobre cuáles están disponibles dependiendo del sistema operativo en uso.
Los editores de texto son una herramienta tan fundamental en informática que todos
los sistemas operativos (por malos que sean) incorporan al menos uno. Sin embargo,
en algunos sistemas operativos el editor de texto que viene por defecto es tan malo
(nos referimos, por supuesto, al notepad de MS Windows) que recomendamos enca-
recidamente el uso de cualquier otro. Por tanto, es fundamental antes de continuar
explorar un poco qué editores de texto (por supuesto gratuitos) tenemos disponibles
para nuestro sistema operativo, y escoger uno que nos guste. Por ejemplo, el KWrite,
el Kate o el Geany son bastante recomendables

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

? ¿qué parte del trabajo va en el archivo de texto plano externo al WX M AXIMA y


qué parte va en la sesión de WX M AXIMA?
2.6. APRENDIENDO MAXIMA 2-31
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

vamos a respoder esta cuestión con un ejemplo sencillo.


Cuando se hace un código para resolver un problema concreto es muy conveniente
hacerlo de forma que pueda reutilizarse en el futuro, si es que tenemos que resolver
el mismo problema u otro similar. Para ello es importante que el código esté bien
documentado, es decir, que esté escrito de forma que si lo leemos dentro de varios
meses (o años) entendamos rápidamente qué es lo que hace, de modo que podamos
usarlo o bien directamente o bien modificándolo si es necesario.
Supongamos que para un problema concreto necesitamos visualizar por pantalla
la gráfica de una función f (x) junto con su primera y segunda derivadas, y al mis-
mo tiempo guardar en un archivo .eps esta gráfica para incorporarla posteriormente
a un documento. En ese caso lo más práctico sería programar una función como la
graficaderivadaEPS(f, x, a, b, filename) del ejemplo anterior, y guardarla en un
archivo de texto plano. Posteriormente, para cada uno de los casos de estudio donde
apliquemos esta función abriríamos una sesión de WX M AXIMA, desde donde carga-
mos la función y la empleamos para generar los resultados correspondientes al caso
concreto que estemos estudiando (por ejemplo: f (x) = x3 con x ∈ [−1, 1].
Las funciones de propósito más o menos general que vamos escribiendo van for-
mando nuestra biblioteca de funciones, y deben guardarse en un árbol de directorios
con cierto orden, de forma que (cuando tengamos muchas) no resulte difícil localizar
una de ellas.
De esta forma iremos generando poco a poco una biblioteca de funciones que po-
dremos usar en el futuro para resolver rápidamente problemas similares a cosas que
hayamos resuelto en el pasado. Cuando se trabaja de esta manera es impresionante
la cantidad de trabajo que se puede realizar en poco tiempo. Por el contrario si somos
desordenados y no hacemos las cosas bien, cada vez que tengamos que resolver
cualquier problema tendremos que partir de cero, con lo que será realmente difícil que
lleguemos demasiado lejos. Además, si el código está bien ordenado y bien documen-
tado será más fácil identificar los posibles errores (bugs) que hayamos cometido al
escribirlo, localizar un bug en un código desordenado o mal estructurado puede ser
prácticamente imposible.
La siguiente cuestión que aparece de manera lógica es
? ¿cómo se cargan estas funciones desde WX M AXIMA ?
Una posibilidad que funciona pero que desaconsejamos por ser incómoda es ir al
menú: Archivo/Archivo por lotes, seleccionar el archivo que contiene la función
que queramos cargar y presionar el botón “Abrir” de la esquina inferior derecha.
La manera cómoda de cargar archivos de texto plano con código, evaluando su
contenido, desde WX M AXIMA es por medio de la instrucción
batchload(filename);
el argumento filename de esta función es una cadena de caracteres (o variable de tipo
string) con el nombre completo del archivo a abrir (extensión incluida). En caso de no
suministrar la localización de este archivo en el disco (es decir, el path) WX M AXIMA lo
buscará en los directorios definidos por defecto, y dará un error en caso de no encon-
trarlo. Los directorios en los que WX M AXIMA busca por defecto están definidos en la
variable file_search_maxima. Para visualizar el contenido de esta variable podemos
evaluar la instrucción
file_search_maxima;
Para añadir más directorios (p. ej., mi-directorio) a la anterior lista podemos usar la
función append, que sirve para combinar listas
2-32 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

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.

2.6.5. Errores frecuentes


Tanto si se trabaja con SO MS Windows o con sistemas tipo UNIX, como el Linux,
cuando especificamos la ruta o path de un archivo en el disco en WX M AXIMA hay
que indicar los sub-directorios por medio del carácter empleado en UNIX: “/”, en
lugar del backslash empleado en Windows.

No se deben usar caracteres no estándar en los nombres de archivos y/o direc-


torios, esto incluye

• caracteres con tilde,


• espacios,
2.6. APRENDIENDO MAXIMA 2-33
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

• 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.

Verificar muy cuidadosamente la sintaxis de las funciones que se programan.


Cualquier error sintáctico, por pequeño que sea, convierte un código en algo to-
talmente incomprensible para el M AXIMA. Los errores sintácticos más frecuentes
son

• 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

Aplicaciones de Maxima en Álgebra

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. Operaciones elementales con vectores y matrices


Además de expresiones y funciones escalares, con M AXIMA también podemos ma-
nipular fácilmente expresiones que contengan vectores y matrices. Para ello empleare-
mos listas con varios elementos. Para asignar al parámetro a una lista de 6 elementos
(p. ej. A, B, C, D, E, F ) la sintaxis es la siguiente
( %i1) a : [A, B, C, D, E, F];
( %o1) [A, B, C, D, E, F ]
Para extraer elementos de la lista la notación es “a[n]”, siendo n el valor del índice
cuyo elemento nos interesa (p. ej. a[1] nos devuelve A). Si luego aplicamos cualquier
función u operador sobre a, la función se aplicará sobre todos los elementos, devol-
viendo una lista con los resultados (por ejemplo calcule a2 , a−1 o sin a). Al programar
en M AXIMA muchas veces querremos aplicar la misma función a una lista de valores,
por ese motivo es útil que las listas en M AXIMA funcionen de este modo. De todas
formas conviene tener cuidado, ya que aplicar una función elemento a elemento so-
bre una lista no es una operación que tenga significado como operación vectorial. Por
ejemplo, si definimos la lista b como
( %i2) b : [q, w, e, r, t, y]$
y calculamos a*b, obtenemos una lista cuyos elementos son a[i]*b[i] con i entre 1
y 6. En este caso, si lo que queremos es calcular el producto escalar de las listas a y
b consideradas como vectores, el comando que debemos usar es “.”:
( %i3) a.b;
( %o3) yF + tE + rD + eC + wB + qA
La definición de matrices es muy simple en M AXIMA, mediante el comando de
construcción matrix([elementos fila 1],[elementos fila 2],...). Por ejemplo, defini-
mos M como la siguiente la matriz 3 × 3
( %i1) M : matrix([3, -1, 0], [2, -3, 1], [4, 4, -2]);

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

la función elementos[i, j] sobre todos los puntos de la matriz de las dimensiones


asignadas. En nuestro caso,
( %i2) H:
 genmatrix(componentesH, 4, 4);
1 12 31 14

 1 1 1 1 
( %o2)  2 3 4
 1 1 1 1 
5 
3 4 5 2
1 1 1 1
4 5 6 7
Una de las características principales de las matrices de Hilbert es que aunque sus
elementos son de orden unidad su determinante es sorprendentemente pequeño. Uti-
lizamos el comando determinant y confirmamos esta característica en nuestro caso,
con seis cifras significativas
( %i3) fpprec:6$ determinant(H), bfloat;
( %o3) 1.65344b-7
Recordamos que los determinantes sólo están definidos para matrices cuadradas.
Otras construcciones que M AXIMA admite de forma directa, son la matriz identidad
ident(dimensión), la matriz nula zeromatrix(número de filas, número de columnas),
y cualquier matriz diagonal con todos los elementos iguales diagmatrix(dimensión,
elemento). Además tiene un comando específico para verificar si una lista de elemen-
tos construida es una matriz, matrixp(lista), con dos posibles outputs, true o false.
Retomamos ahora la matriz M definida numéricamente al comienzo de esta sec-
ción. Con las matrices se pueden realizar numerosas operaciones en M AXIMA, por
ejemplo con el comando addrow(matriz, fila nueva) podemos añadirle una fila nueva
( %i2) M1:
 addrow(M, [0, 2, 0] );
3 −1 0
 2 −3 1 
( %o2) 
 4 4 −2 

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

det(A · B) = det(A) det(B), det(An ) = det(A)n .

3.1.1. Matrices Ortogonales, Rotaciones


La localización de un punto en el espacio euclídeo tridimensional suele darse en
función del vector de posición en coordenadas cartesianas respecto al origen de coor-
denadas r = (x, y, z). Las operaciones habituales con vectores resultan extremada-
mente útiles cuando se interpretan de manera geométrica como operaciones sobre
vectores de posición de puntos en un espacio. Por ejemplo, si desplazamos el vector
r anterior en la dirección de otro vector d = (d1 , d2 , d3 ), la posición final de r tras este
desplazamiento estará dada por la suma de vectores r + d. La operación de rotación
de un cierto ángulo respecto a un cierto eje, aplicada sobre un vector de posición
dado, también puede describirse por medio de una operación matemática sencilla em-
pleando matrices. Como la rotación es una operación lineal, la transformación r → r 0
resultado de aplicar una rotación puede escribirse en forma matricial: r 0 = A · r. Está
claro que al aplicar una rotación sobre un vector la longitud del vector r no cambia,
lo que exige que la matriz A, con la que describimos esa rotación, sea ortogonal, es
decir, la matriz transpuesta debe ser igual a la matriz inversa (AT = A−1 ).
El ejemplo más sencillo de matriz de rotación en 3 dimensiones es la matriz de
rotación de ángulo φ alrededor del eje z
 
cos φ sin φ 0
A =  − sin φ cos φ 0 
0 0 1
3.1. OPERACIONES ELEMENTALES CON VECTORES Y MATRICES 3-5
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

Aplicada sobre el vector r esta matriz genera la transformación r 0 = A · r, dada por:


x0 = x cos φ + y sin φ
y 0 = −x sin φ + y cos φ
z0 = z
que es el resultado de rotar el vector r un ángulo φ respecto al eje z. Por ejemplo,
si aplicamos esta matriz sobre el vector unitario i = (1, 0, 0) obtenemos1 el vec-
tor (cos φ, − sin φ, 0) si lo aplicamos sobre el vector unitario j = (0, 1, 0) obtenemos
(sin φ, cos φ, 0) y si lo aplicamos sobre k = (0, 0, 1) vemos que este vector permanece
invariante, como cabía esperar.
La matriz de rotación A tiene varias propiedades interesantes. En primer lugar
podemos comprobar que es ortogonal (su matriz traspuesta es también su inversa),
una vez comprobado esto es inmediato darse cuenta de que la matriz inversa de A
es igual a la matriz A cambiando φ por −φ. Evidentemente, la operación inversa a
aplicar una rotación de ángulo φ es aplicar una rotación de ángulo −φ. Por último es
inmediato observar que la matriz A se reduce a la matriz identidad cuando el ángulo de
rotación φ es nulo, lógicamente. Estas propiedades son comunes a todas las matrices
de rotación.
Al operar con matrices de rotación hay un detalle importante que conviene aclarar.
Dada una matriz de rotación se pueden hacer dos cosas diferentes: Por un lado po-
demos aplicar dicha matriz de rotación sobre los vectores de la base, generando de
esta manera un cambio de base, o podemos aplicar esta matriz de rotación sobre los
vectores del espacio, sin cambiar la base que teníamos. Esto último es lo que hemos
hecho más arriba al aplicar la matriz A sobre el vector r.
En el primer caso, si generamos un cambio de base los vectores del espacio
no cambian, pero sus componentes en la nueva base son diferentes a las com-
ponentes que tenían respecto de la base antigua. Para ver cuáles serían las
componentes de los vectores respecto de la base nueva situémonos en el punto
de vista de la base. Al aplicar el cambio de base esta gira, a medida que la base
gira un cierto ángulo α (respecto a un cierto eje) desde el punto de referencia de
la base veremos que todos los vectores del espacio rotan un ángulo −α respecto
del mismo eje. Por tanto, para calcular las componentes de estos vectores en la
nueva base lo que tenemos que hacer es aplicar sobre dichos vectores la matriz
de rotación de ángulo −α respecto al eje de rotación dado, es decir, la matriz
inversa (o, equivalentemente, la transpuesta) de la matriz que hemos empleado
para generar el cambio de base.
En la segunda posibilidad todo es mucho más sencillo. La base del espacio no
cambia y sencillamente aplicamos la matriz de rotación sobre los vectores del
espacio, obteniendo al hacerlo las correspondientes coordenadas de dichos vec-
tores rotados un ángulo α respecto al eje de rotación que sea, y referidos a la
misma base que teníamos al principio.
Aunque hemos ilustrado el tema de las matrices de rotación con un caso en el espa-
cio tridimensional habitual, la discusión anterior es válida independientemente de la
dimensionalidad del espacio en que estemos operando, 2D, 3D, . . . , nD.
1
Maxima es suficientemente listo como para entender que, si se aplica la matriz por la izquierda al
vector, es porque éste se considera un vector columna a efectos de la operación de multiplicación; en
sentido estricto, esta operación sería incorrecta, pero Maxima traspone automáticamente el vector.
3-6 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

Pasamos ahora a comprobar las propiedades de la transformación A por medio


de M AXIMA. En primer lugar dado que la matriz de rotación depende del ángulo de
rotación φ, y éste puede tomar valores arbitrarios, vamos a definir la matriz A(φ) como
una función de φ
( %i1) A(phi) := matrix(
[cos(phi), sin(phi), 0],
[-sin(phi), cos(phi), 0],
[0,0, 1] ); 
cos φ sin φ 0
( %o1) A(φ) :=  − sin φ cos φ 0 
0 0 1
Comprobamos ahora que esta matriz es ortogonal. Para ello, debemos evaluar su
inversa y su transpuesta, que en M AXIMA corresponden a los comandos invert y
transpose, con el resultado esperado de ortogonalidad
( %i3) invert(A(phi)); transpose(A(phi));
El cálculo de la matriz inversa requiere del cálculo del determinante de la matriz, que
en este caso es det(A) = sin2 (φ) + cos2 (φ). M AXIMA no simplifica este valor a la unidad
a no ser que se lo pidamos explícitamente, p. ej. con el comando trigsimp. También
podemos comprobar que la longitud de un vector arbitrario se mantiene invariante
bajo esta rotación. Aplicando la matriz de rotación sobre un vector (x, y, z) obtenemos
el vector primado vectorP
( %i5) vectorP
 : A(phi)  . [x, y, z];
sin φ y + cos φ x
( %o5) cos φ y − sin φ x
z
y por medio de trigsimp(vectorP . vectorP); podemos comprobar que el módulo
al cuadrado de r 0 coincide con el de r.

3.1.1.1. Ángulos de Euler


En general dado un sistema de referencia arbitrario en 3 dimensiones la orienta-
ción de cualquier otro sistema de referencia, con origen en el mismo punto, se puede
obtener a partir de la del primero aplicando 3 rotaciones consecutivas, con ángulos
de rotación α, β y γ, conocidos como los ángulos de Euler, de la siguiente forma: En
primer lugar debemos girar un ángulo α en torno al eje z, posteriormente un ángulo
β en torno al nuevo eje y (dado por la posición del eje y tras la primera rotación), y
finalmente un ángulo γ en torno al nuevo eje z (dado por la posición del eje z tras la se-
gunda rotación). Matemáticamente la matriz de rotación que describe esta operación
será el producto de estas tres rotaciones
R(α, β, γ) = Az (γ)Ay (β)Az (α)
tomadas en el sentido descrito anteriormente. Las matrices de la rotación según el eje
z son las mismas que en el caso anterior, y la matriz de rotación según el eje y es
 
cos φ 0 − sin φ
Ay =  0 1 0 
sin φ 0 cos φ
Para determinar la expresión general de la matriz de rotación en M AXIMA, definimos
Ay en la forma
3.1. OPERACIONES ELEMENTALES CON VECTORES Y MATRICES 3-7
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

( %i8) Ay(phi) := matrix(


[cos(phi), 0, -sin(phi)],
[0, 1, 0],
[sin(phi), 0, cos(phi)])$
para posteriormente evaluar el producto de rotaciones
( %i9) R(alpha, beta, gamma) = A(gamma) . Ay(beta) . A(alpha);
( %o9) R(α, β, γ) =

 
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:

a. La matriz es invariante bajo la transformación α → α + π, β → −β, γ → γ − π.


Para verificar esto evaluamos
( %i11) subst(alpha + %pi, alpha, R(alpha, beta, gamma))$
subst(-beta, beta, %)$
RP: subst(gamma - %pi, gamma, %)$
( %i12) R(alpha, beta, gamma) - RP;
 
0 0 0
( %o12)  0 0 0 
0 0 0

b. La inversa de R(α, β, γ) se obtiene deshaciendo las rotaciones efectuadas, es


decir rotando según los ángulos contrarios en el orden adecuado:

R−1 (α, β, γ) = R(−γ, −β, −α)

Para verificar esto evaluamos


( %i13) R(-gamma, -beta, -alpha) - trigsimp(invert(R(alpha, beta, gamma)));
 
0 0 0
( %o13)  0 0 0 
0 0 0
3-8 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.2. Autovalores y Autovectores


El cálculo de autovalores y autovectores es una de las tareas más frecuentes en la
actividad de un físico, sea cual sea el campo en el que trabaje. Todos los paquetes de
cálculo simbólico incorporan herramientas para este tipo de operaciones, cuya eficacia
está limitada siempre por la dimensión de la matriz con la que trabajemos, con matrices
más o menos pequeñas esto siempre es muy fácil de hacer, pero con matrices muy
grandes (p. ej. 106 × 106 ) esto se convierte en algo realmente difícil.
Tomemos como un primer ejemplo el cálculo de autovalores y autovectores de una
matriz simétrica. Según la teoría de matrices todos sus autovalores deben ser reales
y los autovectores mutuamente perpendiculares. Definimos la matriz bajo estudio
( %i1) A : matrix([0, 1, 0], [1, 0, 0], [0, 0, 0])$
Los autovalores son las raíces de la ecuación característica

det(A − λI) = 0

En M AXIMA, la resolución de ecuaciones polinómicas se efectúa mediante el co-


mando solve(ecuación, incógnita). Definimos primero la matriz extendida y su deter-
minante
( %i2) matrizD
 : A - lambda
 * ident(3); D : determinant(matrizD);
−λ 1 0
( %o2)  1 −λ 0 
0 0 −λ
( %o3) λ − λ 3

El polinomio en λ que hemos obtenido (en este caso p(λ) = λ − λ3 ) se denomina


polinomio característico de la matriz A, y la ecuación característica p(λ) = 0 determina
los autovalores. Lo resolvemos con Maxima
( %i4) solve(D = 0, lambda);
( %o4) [lambda = -1, lambda = 1,lambda = 0]
Comprobamos que todos son reales, y al ser distintos, decimos que no existe dege-
neración2 . Para calcular los autovectores recordamos que para cada autovalor λ, el
autovector correspondiente debe satisfacer

(A − λI) · v λ = 0

es decir, A · v λ = λv λ . Aplicamos la matriz A sobre un vector arbitrario (x, y, z)


( %i5) condicion: matrizD . [x, y, z]$
e imponemos que se cumpla para cada uno de los 3 autovalores que hemos encon-
trado:
( %i6) condicion1 : subst(-1, lambda, condicion)$
( %i7) condicion2 : subst(+1, lambda, condicion)$
( %i8) condicion3 : subst( 0, lambda, condicion)$
Resolviendo cada una de estas condiciones obtenemos los autovectores correspon-
dientes a cada uno de los autovalores
( %i9) solve([condicion1[1, 1] = 0, condicion1[2, 1] = 0, condicion1[3, 1]
= 0], [x, y, z]);
2
Decimos que existe degeneración de los autovalores cuando podemos tener dos autovectores li-
nealmente independientes correspondientes al mismo autovalor. En Física habitualmente asociamos
cada autovector con un estado físico diferente, por lo que un autovalor es degenerado cuando no sabe-
mos diferenciar entre dos estados basándonos sólo en el valor numérico de ese autovalor repetido.
3.1. OPERACIONES ELEMENTALES CON VECTORES Y MATRICES 3-9
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

solve: dependent equations eliminated: (1)


( %o9) [[x= %r1,y=- %r1,z=0]]
Este resultado nos indica que el autovector del autovalor√λ = −1 es de la forma v =
c (1, −1, 0), siendo c un factor arbitrario. Tomando c = 1/ 2 obtenemos el autovector
normalizado √ √
v −1 = (1/ 2, −1/ 2, 0)
En este caso, de las tres incógnitas que aparecen en el sistema de ecuaciones que
hemos enviado al M AXIMA sólo se ha podido determinar de manera unívoca una de
ellas (z = 0), las otras dos quedan determinadas en función de un parámetro al que el
M AXIMA asigna el nombre %r1. Es decir,√ el subespacio
√ propio del autovalor λ = −1 es
la recta con vector director v −1 = (1/ 2, −1/ 2, 0).
Para el siguiente autovalor encontramos
( %i10) solve([condicion2[1, 1] = 0, condicion2[2, 1] = 0, condicion2[3,
1] = 0], [x, y, z]);
solve: dependent equations eliminated: (1)
( %o10) [[x= %r2,y= %r2,z=0]]
de donde deducimos que el autovector normalizado correspondiente al autovalor +1
es √ √
v +1 = (1/ 2, 1/ 2, 0)
√ √
por tanto el subespacio para λ = 1 es la recta con vector director v +1 = (1/ 2, 1/ 2, 0).
Finalmente para el tercer autovalor encontramos
( %i11) solve([condicion3[1, 1] = 0, condicion3[2, 1] = 0, condicion3[3,
1] = 0], [x, y, z]);
solve: dependent equations eliminated: (3)
( %o11) [[x=0,y=0,z= %r3]]
de modo que
v 0 = (0, 0, 1)
Es decir, el subespacio propio de λ = 0 es la recta con vector director v 0 = (0, 0, 1),
y observamos que estos tres subespacios propios son mutuamente ortogonales, tal y
como esperábamos de una matriz real y simétrica con autovalores distintos.
Hasta ahora hemos hecho esto paso a paso, para ver cómo funciona el comando
de resolver sistemas de ecuaciones algebraicas solve. El cálculo de autovalores y
autovectores es tan habitual que todos los sistemas de álgebra computacional incluyen
comandos específicos para estas tareas. El comando de M AXIMA que proporciona los
autovalores de una matriz es eigenvalues, y para los autovectores, eigenvectors.
El comando eigenvalues(A)
( %i12) eigenvalues(A);
( %o12) [[-1, 1, 0], [1, 1, 1]]
devuelve un listado con dos elementos, siendo el primero de ellos la lista de los au-
tovalores de A y el segundo la lista de sus correspondientes multiplicidades. En este
caso son todos reales y simples (todos tienen multiplicidad 1). Para los autovectores
el comando eigenvectors(A)
( %i13) eigenvectors(A);
( %o13) [[[-1, 1, 0], [1, 1, 1]], [[[-1, 1, 0]], [[1, 1, 0]], [[0, 0, 1]]]]
nos vuelve a dar en primer lugar los autovalores y sus correspondientes multiplicidades
y en segundo lugar los tres autovectores correspondientes (en sus expresiones más
sencillas posibles, no normalizados).
3-10 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

Una de las aplicaciones más importantes del cálculo de autovalores y autovectores


es la diagonalización de matrices. En el caso anterior, dado que los tres autovectores
son linealmente independientes, la matriz A admite una representación diagonal en la
forma  
−1 0 0
A0 =  0 1 0 
0 0 0
Con ayuda de los autovectores es fácil determinar qué matriz P define este cambio de
base, en la forma
A0 = P −1 · A · P
La matriz P está dada por
P = (v −1 , v 1 , v 0 )
es decir, está formada por los autovectores como columnas, siendo irrelevante la nor-
malización de los autovectores, tal y como puede comprobarse fácilmente. Con M AXI -
MA el cálculo quedaría como sigue. En primer lugar extraemos del cálculo de autovec-
tores los tres vectores fila independientes
( %i14) listado : eigenvectors(A)$
vectorf1 : listado[2][1][1]$
vectorf2 : listado[2][2][1]$
vectorf3 : listado[2][3][1]$
ya que, por ejemplo, la localización del vector v −1 en la variable listado es la siguiente:
se sitúa en el segundo grupo de datos, donde se listan los autovectores, dentro de ese
grupo, se encuentra en el primer grupo (ya que λ = −1 es el primer autovalor) y está
en primer lugar (ya que sólo hay un vector en ese subespacio). Lo mismo sucede con
los restantes vectores (ya que en este caso todas las multiplicidades eran 1). Hecho
esto, podemos definir la matriz P como una matriz de una sola columna, igual al vector
columna v −1 y posteriormente añadir los otros dos autovectores como dos columnas
adicionales
( %i15) matrizP
  : transpose(vectorf1);
1
( %o15)  −1 
0
( %i16) matrizP : addcol(matrizP, transpose(vectorf2))$
matrizP :  addcol(matrizP, transpose(vectorf3));
1 1 0
( %o16)  −1 1 0 
0 0 1
y confirmamos la transformación de semejanza a la forma diagonal
( %i15) invert(matrizP)
  . A . matrizP;
−1 0 0
( %o15)  0 1 0 
0 0 0
Otro cálculo interesante es verificar que el espacio generado por los tres auto-
vectores linealmente independientes se corresponde con todo el espacio euclídeo de
tres dimensiones; para ello basta demostrar, y se deja como ejercicio, que la matriz I
definida como la expansión matricial en los tres autovectores normalizados

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

donde xi = v Ti · r es el producto escalar, en notación matricial.


Con estos ejemplos hemos visto todo lo necesario para empezar a manejar el len-
guaje de programación M AXIMA por medio del front end WX M AXIMA. La mejor forma
de aprender cualquier lenguaje de programación es usándolo para resolver problemas
concretos, de modo que en lo que sigue indicaremos algunos problemas especialmen-
te representativos que pueden resolverse con M AXIMA. Aparte del material indicado
en la bibliografía básica de la asignatura, como ayuda para realizar estos ejercicios
dispone del menú de ayuda del WX M AXIMA y del comando describe, que le mostrará
en pantalla un resumen de la sintaxis y funcionamiento de cualquiera de los comandos
del M AXIMA.

3.2. Cambios de Base


3.2.1. Aplicación de cambios de base sobre vectores
En un espacio vectorial un vector queda descrito por sus componentes respecto
de una determinada base del espacio vectorial, p. ej. el vector v = (1, 2, 3) es el que
resulta de desplazarse una unidad en la dirección x, 2 en y y 3 en z. En el ejemplo
anterior hemos empleado la base canónica, que es la formada por los vectores

e1 = (1, 0)
en 2 dimensiones
e2 = (0, 1)

e1 = (1, 0, 0) 
e2 = (0, 1, 0) en 3 dimensiones
e3 = (0, 0, 1)


e1 = (1, 0, 0, . . . , 0) 

e2 = (0, 1, 0, . . . , 0)

en n dimensiones
... ... ... ...  
en = (0, 0, . . . , 0, 1)

Aparte de la base canónica cualquier conjunto de n vectores linealmente independien-


tes forma una base válida del espacio. Aparece entonces la cuestión:
? dadas las componentes de un vector (que existe independientemente de la
base) respecto de una base cualquiera ¿cómo se calculan las componentes
de este vector respecto de otra base distinta?
Como el objetivo de esta asignatura es sólamente aprender a programar, damos a
continuación las instrucciones detalladas sobre cómo se hacen cambios de base para
el caso de dimensión n arbitraria, sin entrar en demostraciones. De todas formas, para
3-12 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

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.

1. Cualquier vector v se expresa en términos de la base de partida como


n
X
v = v1 e1 + v2 e2 + · · · + vn en = vi ei = vi ei
i=1

donde los números vi (i = 1, . . . , n) son las coordenadas de v respecto de la base


formada por los ei . En cálculo con matrices y vectores se usan constantemente
expresiones como la anterior, en la que se hace una suma respecto de un índice
(p. ej. i en la ecuación de arriba), para simplificar estas expresiones se suele
usar el llamado:

? Convenio de suma de Einstein:


Cuando en una expresión aparece un índice repetido la expresión represen-
ta la suma respecto de ese índice para todos los valores posibles del índice,
p.ej.:
• Desarrollo en componentes de un vector
n
X
v= vi ei = vi ei
i=1

• Producto escalar
n
X
u·v = ui vi = ui vi
i=1

• Producto de dos matrices


n
X
(A · B)ij = Aik Bkj = Aik Bkj
k=1

• Producto de muchas matrices


n X
X n X
n
(A · B · C · D)ij = Aiα Bαβ Cβγ Dγj = Aiα Bαβ Cβγ Dγj
α=1 β=1 γ=1

• Traza de una matriz


n
X
trA = Aii = Aii
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

• El convenio de suma de Einstein se usa con muchísima frecuencia para


escribir expresiones de este tipo de una manera rápida, sin sumatorios.
En lo sucesivo suponemos que se aplica este convenio a menos que se
diga lo contrario.
2. Cuando se aplica un cambio de base, la base “nueva” está formada por los vec-
tores t1 , t2 , t3 , . . . , tn , cuya expresión en términos de la base antigua suponemos
conocida.

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

por eso se define de esta forma la matriz del cambio C.

4. Si los vectores ti son linealmente independientes entonces C es invertible, de


donde deducimos
ej = ti (C −1 )ij , i, j = 1, . . . , n
donde C −1 es la inversa de la matriz C (si los ti no son linealmente independien-
tes entonces no forman una base).

5. Sustituyendo esta última relación en

v = vi ei = v̂i ti

encontramos finalmente las relaciones

vi = Cij v̂j v̂i = (C −1 )ij vj

que indican cómo se relacionan las coordenadas de un vector expresadas en


dos bases distintas.

3.2.2. Aplicación de cambios de base sobre aplicaciones lineales


De forma similar a como sucedía con los vectores, las aplicaciones lineales defini-
das sobre un espacio vectorial también se describen por medio de sus componentes
respecto de una base del espacio. En el caso de las aplicaciones lineales estas com-
ponentes forman una matriz, cuyas componentes son las coordenadas de los vectores
que resultan de aplicar la aplicación lineal sobre cada uno de los vectores de la base
del espacio vectorial.

? ¿Cómo se calculan las componentes de una matriz respecto de la nueva


base?

A partir de las relaciones anteriores es muy sencillo deducir la regla de transformación


de las aplicaciones lineales.
3-14 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

1. Supongamos una aplicación lineal A, tal que aplicada sobre el vector u nos da
el vector v
Au = v

2. Si escribimos esto en componentes respecto de la base de partida tendremos

Aij uj = vi

donde Aij es la matriz de la aplicación lineal A en la base de partida. Suponemos


que la matriz Aij es un dato que conocemos. Queremos calcular la forma de esta
matriz en la base nueva.

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

4. Sustituyendo en esta ecuación la regla de transformación de los vectores dedu-


cimos directamente

Aij = Cik Âkl (C −1 )lj Âij = (C −1 )ik Akl Clj

Estas reglas indican cómo se transforman las componentes de una matriz al


aplicar un cambio de base. Esta es toda la teoría que tenemos que aplicar para
hacer los ejercicios del tema 3.

3.2.3. Funciones de Maxima que debemos aplicar


Las siguientes funciones de WX M AXIMA son algunas de las que tendremos que
emplear para hacer los ejercicios de este tema:
Asignación del valor B a la variable A A : B
Definición de una función A que depende de x A(x) := ...
Para crear una matriz matrix

Para invertir matrices invert

Producto de matrices .

Cálculo de los autovectores de una matriz eigenvectors

Muy importante: Siempre que estemos trabajando con WX M AXIMA, cuando se


definen funciones más o menos extensas es una buena idea emplear el coman-
do block, que nos permite definir variables locales dentro de esa función. Por
ejemplo, si calculamos una función que calcule integrales como
Z b
y= f (x) dx
a

una buena forma de hacerlo es por medio de la función block, definiendo la


variable x como una variable local.
3.3. PROBLEMAS 3-15
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

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.

input: coordenadas del vector en la base estándar, vectores que forman la


nueva base.
output: coordenadas del vector en la nueva base.

2. Escriba un programa que aplique cambios de base sobre matrices.

input: coordenadas de la matriz correspondiente a una aplicación lineal en


la base estándar, vectores que forman la nueva base.
output: coordenadas de la matriz correspondiente a la aplicación lineal en
la nueva base.

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.

input: coordenadas del vector o de la matriz respecto de una base arbitraria,


vectores que forman la base arbitraria respecto de la base estándar.
output: coordenadas del vector o de la matriz en la base estándar.

3.3.2. Problemas resueltos


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?

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.

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

3-16 TEMA 3. APLICACIONES DE MAXIMA EN ÁLGEBRA

hacer la misma cosa y dependiendo de qué es lo que se quiera optimizar resultará


más conveniente una u otra. Lo más habitual es que los programas de cálculo estén
optimizados para velocidad, para que den la respuesta empleando el mínimo tiempo
de cálculo posible, o para memoria, para que puedan ejecutarse empleando el míni-
mo espacio de memoria posible. De todas formas hay otras posibilidades, por ejemplo
también es habitual optimizar un programa para velocidad pero teniendo en cuenta
no sólo el tiempo de cálculo, sino también el tiempo que nos lleva escribir y depurar
el código, lo cual nos llevará a una solución de compromiso que optimiza la senci-
llez del código. Este último es un poco el espíritu de los programas que incluimos a
continuación, que desde luego no están optimizados ni para velocidad ni para uso de
memoria.
Para aprender a programar no hay nada mejor que resolver ejercicios concretos
y copiar (es decir, tomar como punto de partida) ejemplos ya hechos. A continuación
incluimos sin más el código para los ejercicios del tema 3.

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 */

cambiobasevector(basenueva, vector) := block( [A],

/* construimos la matriz del cambio de base y la guardamos en la


variable local A */
3.3. PROBLEMAS 3-17
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

A : matrix(basenueva[1]),

for i : 2 thru length(basenueva) step 1 do A : addrow(A, basenueva[


i]),

A : transpose(A),

/* calculamos la inversa de la matriz del cambio de base */

A : invert(A),

/* aplicamos esta matriz sobre el vector */

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

3-18 TEMA 3. APLICACIONES DE MAXIMA EN ÁLGEBRA

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 continuación definimos la función cambiobasematriz, que aplica cambios de


base sobre matrices. Listado del archivo cambio_base_matriz.mc que contiene
dicha función:
/* FUNCION "cambiobasematriz"
Aplica cambios de base sobre aplicaciones lineales
Input:
1: "basenueva" = lista de vectores que forman la nueva base
2: "M" = matriz sobre la que vamos a aplicar el cambio de base
Output:
componentes de la matriz M en la nueva base */

cambiobasematriz(basenueva, M) := block( [A, B],

/* construimos la matriz del cambio de base y la guardamos en la


variable local A */

A : matrix(basenueva[1]),

for i : 2 thru length(basenueva) step 1 do A : addrow(A, basenueva[


i]),

A : transpose(A),

/* guardamos la inversa de la matriz del cambio de base en la


variable local B */

B : invert(A),

/* aplicamos el cambio de base sobre M */

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

3.3. PROBLEMAS 3-19

/* 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 */

cambiobasevectorm1(basenueva, vector) := block( [A],

/* construimos la matriz del cambio de base y la guardamos en la


variable local A */

A : matrix(basenueva[1]),

for i : 2 thru length(basenueva) step 1 do A : addrow(A, basenueva[


i]),

A : transpose(A),

/* aplicamos esta matriz sobre el vector */

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 */

cambiobasematrizm1(basenueva, MN) := block( [A, B],

/* construimos la matriz del cambio de base y la guardamos en la


variable local A */

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

3-20 TEMA 3. APLICACIONES DE MAXIMA EN ÁLGEBRA

for i : 2 thru length(basenueva) step 1 do A : addrow(A, basenueva[


i]),

A : transpose(A),

/* guardamos la inversa de la matriz del cambio de base en la


variable local B */

B : invert(A),

/* aplicamos la inversa del cambio de base sobre MN */

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 */

eigenvectorlist(M) := block( [A, dimM, numV],

/* asignamos a la variable local dimM la dimensionalidad del


espacio vectorial */

dimM : length(M),

/* calculamos los autovectores y los guardamos en la variable


local A */

A : eigenvectors(M)[2],

/* construimos una lista plana con las coordenadas de los


autovectores */
3.3. PROBLEMAS 3-21
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

A : flatten(A),

/* Para que la matriz sea diagonalizable es necesario que haya


tantos autovectores
como indica la dimensionalidad del espacio, pero eso no siempre
ocurre.
Guardamos en la variable local numV el cardinal del conjuto de
autovectores. */

numV : length(A) / dimM,

/* asignamos estas coordenadas a una lista de numV vectores de


dimM componentes */

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"));

Ahora introduzca una matriz A a modo de ejemplo, para calcular la forma de A


en la base formada por sus autovectores basta con hacer:
bn : eigenvectorlist(A);
AN : expand(cambiobasematriz(bn,A));

? ¿Se obtiene el resultado esperado?

Dependiendo de si la matriz A que introduzcamos arriba es diagonalizable o no,


esta función nos dará o bien una matriz diagonal cuyos elementos no nulos son los
autovalores de A, o bien un error. En la introducción al curso comentábamos que en
computación lo más importante es saber qué es lo que estamos haciendo, por tanto,
3-22 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

antes de ejecutar las instrucciones de arriba deberíamos saber si lo que le estamos


pidiendo al M AXIMA es posible o no. En la asignatura de álgebra se estudian los cri-
terios que permiten saber (muy fácilmente) si una matriz se puede diagonalizar o no,
para las matrices no diagonalizables lo que se puede calcular es la forma canónica de
Jordan, algo que también puede programarse en M AXIMA.

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.

Realmente la forma más seria de calcular productos escalares en cualquier base


es calculando previamente el tensor métrico, dado por la tabla de productos escalares
de los vectores base de la base que estemos empleando (gij = ti · tj ): por medio de
este tensor podemos calcular el producto escalar en términos de la base nueva como
u · v = gij ûi v̂j , donde se aplica el convenio de suma de Einstein para los índices i y j.
De todas formas, una manera inmediata de hacer este ejercicio a partir de las
funciones que se pedía programar en este tema es usar la función que hemos definido
antes para deshacer cambios de base, lo que nos proporciona las componentes de
los vectores en la base estándar, y posteriormente aplicar la fórmula habitual para el
producto escalar (que es la se aplica al emplear la instrucción “.”):
productoescalarBA(base1,V1,base2,V2) := cambiobasevectorm1(base1,V1) .
cambiobasevectorm1(base2,V2)$
Problemas del Tema 3

Ejercicio 1
Escriba una función en Maxima que rote objetos tridimensionales

input: • Lista de puntos que denen el objeto.


• Lista de ángulos de Euler α, β y γ según los cuales se va a rotar el objeto.
• Posición del centro respecto al que vamos a realizar la rotación.

output: • Lista de puntos que denen el objeto rotado.

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)

donde la matriz de rotación R(α, β, γ) ya se ha denido anteriormente. Si el objeto en cuestión


tiene muchos puntos no tiene sentido repetir el cálculo de aplicar R sobre C , de modo que para
programar esta operación de forma eciente lo que se puede hacer es esto:
/∗
Funcion a p l i c a r R
∗/

a p l i c a r R ( v e c t o r e s , alpha , beta , gamma , c e n t r o ) := block ( [ aux ] ,

/∗
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 .
∗/

aux : c e n t r o − R( alpha , beta , gamma) . c e n t r o ,

/∗
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 .
∗/

makelist ( aux + R( alpha , beta , gamma ) . ( v e c t o r e s [ i ] ) , i , 1 , length ( v e c t o r e s ) , 1 )


);

/∗ 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

Cálculo con funciones de una variable

Para el estudio de este tema familiarícese con los comandos empleados en M A -


XIMA para todas las operaciones habituales en cálculo con funciones de una variable,
en particular las siguientes: límites, derivadas, integrales (definidas e indefinidas) y
desarrollos en serie de Taylor:
Para calcular límites:

• Límites bien definidos: limit(expresión, variable, valor)


• Límites laterales: limit(expresión, variable, valor, dirección)

Para calcular derivadas:

• Primera derivada: diff(expresión, variable)


• Derivadas de orden superior: diff(expresión, variable, orden)
• Derivadas parciales de orden arbitrario diff(expresión, variable1, orden1,
variable2, orden2, ..., variablen, ordenn)
Para calcular integrales:

• Integral indefinida (primitiva): integrate(expresión, variable)


• Integral definida: integrate(expresión, variable, límite inferior, límite
superior)
• Cálculo numérico de una integral definida: quad_qag

Para calcular desarrollos en serie de Taylor:

• taylor(expresión, variable, punto en torno al que desarrollamos, orden)

4.1. Problemas resueltos


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.

input: La función a desarrollar, el punto en torno al que desarrollamos y el


orden máximo n.
output: La lista de desarrollos en serie de Taylor correspondiente.

4-1
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

4-2 TEMA 4. CÁLCULO CON FUNCIONES DE UNA VARIABLE

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 */

taylorlist(f, x, x0, n) := block( [TL, aux],


4.1. PROBLEMAS RESUELTOS 4-3
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

/* asignamos la func. f a la variable auxiliar aux */

aux : f,

/* definimos la variable auxiliar TL como una lista de un solo elemento


, dado por
el primer elemento del desarrollo en serie de f(x) (es decir, f(x0))
*/

TL : [ subst(x0, x, aux) ],

/* en este bucle vamos evaluando los sucesivos elementos del desarrollo


y los vamos
incluyendo en la lista TL como elementos adicionales mediante el
comando append */

for i : 1 thru n step 1 do (

/* vamos calculando sucesivamente las derivadas de orden desde 1


hasta n */

aux : diff(aux,x),

/* cada una de estas derivadas evaluadas en x = x0 y multiplicadas


por
(1/i!)*(x - x0)^i
nos proporciona el elemento siguiente del desarrollo
construimos la lista de desarrollos pedida annadiendo al
desarrollo anterior
el desarrollo siguiente, dado por el anterior mas el nuevo
elemento */

TL : append( TL, [ TL[i] + (1/i!) * subst(x0, x, aux) * (x - x0)^i ] )

), /* fin del bucle */

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

input: • Función de probabilidad de la variable discreta.


• Conjunto de valores posibles de la variable discreta.

output: • Promedio.

Ejercicio 2
Escriba una función en Maxima que calcule la desviación estándar de variables aleatorias
discretas

input: • Función de probabilidad de la variable discreta.


• Conjunto de valores posibles de la variable discreta.

output: • Desviación estándar.

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 .
∗/

momentosvardis ( prob , v a l o r e s x , k ) := block ( [ px , xk ] ,

/∗ 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 ∗ /

px : makelist ( subst ( v a l o r e s x [ i ] , x , prob ) , i , 1 , length ( v a l o r e s x ) , 1 ) ,

/∗ 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 ,

/∗ Calculamos e l momento de orden 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 ) $

En el caso de una función de probabilidad debidamente normalizada (µ0 = 1) la desviación


¡ ¢1/2
estándar está dada por µ2 − µ21 . Si la función no está normalizada la re-denimos dividien-
do por el valor de µ0 , de forma que en general la desviación estándar se puede calcular como
¡ ¢1/2
µ2 /µ0 − µ21 /µ20 . A partir de las funciones anteriores es muy sencillo denir una función que nos
calcule esta desviación estándar:
d e s v s t d r v a r d i s ( prob , v a l o r e s x ) := sqrt (

momentosvardis ( prob , v a l o r e s x , 2 ) / momentosvardis ( prob , v a l o r e s x , 0 ) − p r o m e d i o v a r d i s ( prob , v a l o r e s x )^2

)$

Ejercicio 3
Escriba una función en Maxima que calcule el valor promedio de una variable aleatoria
continua

input: • Función de densidad de probabilidad de la variable continua.


• Intervalo de la recta real donde puede tomas valores la variable continua.

output: • Promedio.

Ejercicio 4
Escriba una función en Maxima que calcule la desviación estándar de una variable aleatoria
continua

input: • Función de densidad de probabilidad de la variable continua.


• Intervalo de la recta real donde puede tomas valores la variable continua.

Programación con Maxima; Dept. Física Matemática y de Fluidos UNED curso 2011/2012
3

output: • Desviación estándar.

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 .
∗/

momentosvarcon ( f , x , i n t e r v a l o x , k ) := integrate ( f ∗ x^k , x , i n t e r v a l o x [ 1 ] , i n t e r v a l o x [ 2 ] ) $

/∗ 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 (

momentosvarcon ( f , x , i n t v x , 2 ) / momentosvarcon ( f , x , i n t v x , 0 ) − promediovarcon ( f , x , i n t v x )^2

)$

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. Problemas resueltos


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 desarro-
llos sucesivos para n entre 0 y 10).

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

5-4 TEMA 5. VISUALIZACIÓN

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 */

vertaylorlist(f, x, x0, n, xmin, xmax, ymin, ymax) := block( [aux,


dominiox, dominioy, nombres],

aux : taylorlist( f, x, 0, n),

dominiox : [x, xmin, xmax],

dominioy : [y, ymin, ymax],

nombres : append([legend, string(f)], makelist(string(i - 1), i, 1,


length(aux), 1)),

plot2d( append( [f], aux ), dominiox, dominioy, nombres,

append( [style], [[lines, 4]], makelist( [lines, 1], i, 1, length(


aux), 1) )

)
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.
*/

vertaylorlistsave(f, x, x0, n, xmin, xmax, ymin, ymax, filename) := block


( [aux, dominiox, dominioy, nombres, format],

aux : taylorlist( f, x, 0, n),

dominiox : [x, xmin, xmax],

dominioy : [y, ymin, ymax],

nombres : append([legend, string(f)], makelist(string(i - 1), i, 1,


length(aux), 1)),

/* con la variable local format elegimos el formato para el archivo


de salida:
1 = pdf
2 = png
3 = eps
*/

format : [pdf_file, png_file, ps_file][1],

plot2d( append( [f], aux ), dominiox, dominioy, nombres,

append( [style], [[lines, 4]], makelist( [lines, 1], i, 1, length(


aux), 1) ),

[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

Solución analítica y numérica de


ecuaciones

Las instrucciones básicas del M AXIMA para resolver ecuaciones y sistemas de


ecuaciones son:

Ecuaciones algebraicas: solve(ecuación, variable).

Sistemas de ecuaciones algebraicas: solve(lista de ecuaciones, lista de


variables).
Solución numérica de ecuaciones (método de Newton): primero load("newton1"),
y posteriormente newton(ecuación, variable, valor inicial, precisión).

En este tema veremos la aplicación de dichas instrucciones para el cálculo de


funciones definidas de forma implícita mediante ecuaciones.

6.1. Función implícita


En general una ecuación del tipo F (x, y) = 0 define de manera implícita a la va-
riable y como función de x (y análogamente a la x como función de y). Para que esta
ecuación defina una función de forma implícita deben cumplirse ciertas condiciones,
tal y como establece el teorema de la función implícita; por ejemplo, para que esta
condición defina una única función y = y(x) es necesario que la solución sea única,
y que las derivadas parciales de F sean finitas y distintas de cero. En estas notas
no entraremos en los detalles del teorema de la función implícita, y nos centraremos
directamente en la aplicación del WX M AXIMA para el cálculo de funciones definidas de
forma implícita por medio de ecuaciones.

6.1.1. Ejercicios propuestos


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
correspondiente función y = f (x).

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

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.

Dependiendo de la función F (x, y) que consideremos, la anterior ecuación puede


tener o no solución y en caso de tenerla esta podrá o no ser única. Es convenien-
te tener esta información antes de intentar resolver la ecuación, para ello puede
emplear el comando plot3d().

En el caso de la solución numérica conviene saber que el método de Newton


(que ya estudiará en la asignatura de Métodos Numéricos) es un método itera-
tivo que, por medio de un algoritmo, va produciendo aproximaciones cada vez
más precisas de la solución buscada. Para funcionar este método precisa que
el programador introduzca un primer valor aproximado de la solución (el tercer
argumento de la función newton). El éxito del método depende, entre otras co-
sas, del primer valor con el que iniciamos las iteraciones. En algunos casos el
método sólo converge a la solución que buscamos si el primer valor que nosotros
suministramos no está demasiado alejado de la solución buscada. Para calcular
esta primera aproximación a la solución lo más sencillo es visualizar F (x, y) por
medio de plot3d().

Un consejo: considere funciones F (x, y) tales que la ecuación F (x, y) = 0 tenga


una solución única. En problemas con múltiples soluciones el método de Newton
no siempre converge, lo cual es un tema muy interesante que estudiará en la
asignatura de Métodos Numéricos.

6.2. Desarrollos en serie de Taylor de funciones defini-


das de forma implícita
En aquellos casos en los que no es posible despejar y en función de x de la ecua-
ción F (x, y) = 0, el teorema de la función implícita nos garantiza que si para unos
determinados x0 e y0 se cumple F (x0 , y0 ) = 0 y F (x, y) es continua y diferenciable
en un entorno del punto (x0 , y0 ), entonces la condición F (x, y) = 0 define la corres-
pondiente función y = f (x) al menos en un entorno pequeño del punto (x0 , y0 ). (La
extensión del entorno en el que puede definirse esta función (determinado por la fun-
ción F ) es un resultado muy interesante que se estudia en la asignatura de Análisis
Matemático).
6.2. DESARROLLOS EN SERIE DE TAYLOR DE FUNCIONES DEFINIDAS DE FORMA IMPLÍCITA6-3
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

6.2.1. Ejercicios propuestos


1. 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 .

2. Visualice los resultados obtenidos mediante gráficas por medio de la función


plot2d().

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)

para el desarrollo en torno a un punto x0 sencillamente tenemos que calcular la si-


guiente suma (suponiendo que f (x) es analítica):

1 dn f

X
y= n
(x − x0 )n
n=0
n! dx x0

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

no puede despejarse para y como función de x.


El teorema de la función implícita indica las condiciones que debe cumplir F (x, y)
para que esa ecuación defina efectivamente a y como función de x, pero dado que
no es el tema de esta asignatura no entraremos en los detalles de dicho teorema.
Supongamos sencillamente que en un entorno del punto x0 se cumple el teorema de
la función implícita, por tanto en un entorno de ese punto existe la función y = f (x)
cuyo desarrollo queremos calcular. Para calcular el desarrollo lo que hay que hacer es
lo siguiente:
6-4 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

Calcular el primer término del desarrollo (y0 = f (x0 )) resolviendo numéricamente


la ecuación
F (x0 , y0 ) = 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
... ... ... ⇒ ... ... ...

donde estamos empleando la notación siguiente

∂F (x, f (x)) ∂F (x, f (x))


Fx = , Fy =
∂x ∂f (x)

y así sucesivamente para las derivadas de orden superior.

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.

Ejemplos de funciones F (x, y)

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

6.3. Función inversa


Como caso particular del teorema de la función implícita tenemos el teorema de la
función inversa, que nos garantiza que la relación y = f (x) define a x como función
de y, al menos localmente (relación que se obtiene resolviendo para x la ecuación
f (x)−y = 0). (La extensión del entorno en el que puede definirse la función x = f −1 (y)
(determinado por la función f ) es un resultado muy interesante que se estudia en la
asignatura de Análisis Matemático). Cuando no es posible despejar x en función de
y analíticamente no hay más remedio que hacerlo numéricamente, para ello en este
curso usaremos el comando newton().

6.3.1. Ejercicios propuestos


1. 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 .
2. Visualice los resultados obtenidos mediante gráficas por medio de la función
plot2d().

6.4. Funciones del Maxima que debemos aplicar


Para los ejercicios de este tema resulta conveniente emplear las siguientes funcio-
nes del WX M AXIMA:
solve
sublis
newton, para ello previamente hay que cargar el paquete “newton” por medio de
load(newton1);
subst
diff
aparte de las que ya hemos visto block, append, makelist, plot2d

6.5. Problemas resueltos

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

6-6 TEMA 6. SOLUCIÓN ANALÍTICA Y NUMÉRICA DE ECUACIONES

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 */

solvesust(F, y) := block( [soluciones, soly],

/* asignamos a la variable local soluciones la lista de soluciones de


F = 0 */

soluciones : solve( F = 0, y),

/* asignamos la primera soluci\'on a la lista de soluciones soly */

soly : [ sublis( [soluciones[1]], y) ],

/* en este bucle sustituimos cada una de las soluciones encontradas a


partir de
la segunda y las vamos a\~nadiendo a la lista de soluciones soly
*/

for i : 2 thru length(soluciones) step 1 do (

soly : append( soly, [ sublis( [soluciones[i]], y ) ] )

), /* fin del bucle */


Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

6.5. PROBLEMAS RESUELTOS 6-7

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 */

solvenewton(F, y, y0) := block( [epsilon],

/* cargamos el paquete newton1 */

load (newton1),

/* epsilon = tolerancia (suponemos que hemos encontrado la soluci\'on


con un grado de aproximaci\'on aceptable cuando F(x, y) < epsilon)
*/
6-8 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

epsilon : 10^(-6),

newton(F, y, y0, epsilon)

)$

/* 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:

plot2d( [ [discrete, data1], [discrete,data2],[discrete, data3] ] );


El resultado se muestra en la figura 6.1, donde se pueden ver las 3 ramas de la
solución de ey = xy.

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 .

Se sobre-entiende que la función y = f (x) a la que se refiere el enunciado es


la que se obtiene resolviendo una ecuación del tipo F (x, y) = 0, tal y como hemos
considerado en los ejercicios precedentes. Por tanto, la forma de hacer el desarrollo
de Taylor pedido depende de si la variable y se puede despejar o no en la ecuación
F (x, y) = 0.
En el caso en que sí pueda despejarse este ejercicio es bastante sencillo, lo único
que hay que hacer es aplicar la función taylor al output producido por solvesust
taylor( solvesust(F(x, y), y), x, x0, n)
Obsérvese que si hay más de una solución, la anterior instrucción aplica la función
taylor sobre cada una de las soluciones y nos devuelve la correspondiente lista de
desarrollos válidos en torno a x0 hasta el orden indicado en n.
Realmente si es posible despejar de manera exacta y en función de x no tiene
demasiado interés hacer el desarrollo, ya que conocemos la función exacta y = f (x).
El desarrollo en serie de Taylor tiene sentido especialmente cuando no hay forma
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

6-10 TEMA 6. SOLUCIÓN ANALÍTICA Y NUMÉRICA DE ECUACIONES

de despejar y en la ecuación F (x, y) = 0, ya que en ese caso nos proporciona una


aproximación a f (x), válida al menos en un cierto entorno alrededor del punto x0 que
estemos considerando. Para hacer el desarrollo en ese caso seguimos los pasos que
se daban más arriba en este capítulo. La función taylorimplicit nos proporciona el
desarrollo pedido, listado del archivo taylor_implicit.mc:
/* FUNCION "taylorimplicit"
Calcula el desarrollo en serie de Taylor, en torno a x0, a orden n, de
la funci\'on
y = f(x), definida de manera impl{\'\i}cita por la condici\'on F(x, y)
= 0
Input:
1: F = la funci\'on de x e y que define la ecuaci\'on F(x, y) = 0
2: x = variable independiente, respecto de la que desarrollamos
3: y = variable dependiente, y = f(x)
4: x0 = punto en torno al que desarrollamos
5: y0 = punto de partida para resolver F(x0, y0) = 0 por el m\'etodo
de Newton
6: n = orden del desarrollo
Output:
desarrollo de f(x) en serie de potencias de (x - x0) hasta orden n
*/

taylorimplicit(F, x, y, x0, y0, n) := block( [epsilon, derivadas, auxf],

/* asignamos a epsilon la tolerancia con la que vamos a resolver F(x0,


y0) = 0 */

epsilon : 10^(-6),

/* cargamos el paquete newton1 y resolvemos F(x0, y0) = 0 */

load(newton1),

y0 : newton( subst(x0, x, F), y, y0, epsilon ),

/* para calcular los valores de las n primeras derivadas de y respecto


a x en x0
definimos primero la lista de derivadas que tenemos que calcular y
la guardamos
en la variable local derivadas */

derivadas : makelist( diff(auxf(x), x, i), i, 1, n, 1),

/* derivando impl{\'\i}citamente n veces la ecuaci\'on F(x, auxf(x)) =


0 encontramos
el sistema de n ecuaciones que nos determina las n derivadas,
planteamos este sistema, lo resolvemos con solve y sustituimos las
soluciones en
6.5. PROBLEMAS RESUELTOS 6-11
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

la variable derivadas */

derivadas : subst(

solve(
makelist(
diff(
subst( auxf(x), y, F )
, x, i)
, i, 1, n, 1)
, derivadas)

, derivadas),

/* a continuaci\'on tenemos que sustituir auxf(x) por y0, x por x0 */

derivadas : subst( x0, x, subst(y0, auxf(x), derivadas) ),

/* finalmente el desarrollo se obtiene multiplicando cada una de estas


derivadas por
(1/i!) * (x - x0)^i, sumando todos estos resultados, y a\~nadiendo
el primer
t\'ermino del desarrollo y0, todo eso se puede hacer de una manera
compacta por
medio de */

y0 + ( derivadas . makelist( (x - x0)^i / i!, i, 1, n, 1) )

)$

/* 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 .

La ecuación x = f −1 (y), para una determinada función conocida f , equivale a


resolver para x la ecuación F (x, y) = 0, definida por la función F (x, y) = y − f (x).
Por tanto este problema se reduce a un caso particular del problema que acaba-
mos de resolver. De todas formas le recomendamos que practique aplicando estas
funciones a diversas ecuaciones, por ejemplo puede aplicarlas a las ecuaciones que
aparezcan en asignaturas como cálculo o física.
6.5. PROBLEMAS RESUELTOS 6-13
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

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.

input: • Función de densidad de probabilidad en términos de x.


• Intervalo de valores posibles de x.
• Cambio de variable y = y(x).

output: • Función de densidad de probabilidad en términos de y .


• Intervalo de valores posibles de y .

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:

input: • f: Función de densidad de probabilidad en términos de x.


• intervalo: Intervalo de valores posibles de x, denido como una lista [a, b] con a < b.
• cambio: Cambio de variable y = y(x), suponemos que este input se proporciona en
forma de una lista [y, y(x)], donde el primer elemento es la nueva variable y , y el segundo
elemento la función y(x) que dene esta nueva variable como función de x.

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 " .
∗/

cambiovariablePDF ( f , i n t e r v a l o , cambio ) := block ( [ aux , s i g n o , n u e v o i n t ] ,


/∗
INPUT:
f : fu nc . de d e n s i d a d de p r o b a b i l i d a d de l a v a r i a b l e v i e j a ( x )
i n t e r v a l o : dominio de d e f . [ a , b ] de l a v a r i a b l e x
cambio : l i s t a
cambio [ 1 ] : l a nueva v a r i a b l e ,
cambio [ 2 ] : l a fu nc . que d e f i n e l a nueva v a r i a b l e como f un c . de x
OUTPUT:
lista :
[ 1 ] : fu nc . de d e n s i d a d de prob . de l a v a r i a b l e nueva
[ 2 ] : dominio de d e f . [ a , b ] de l a v a r i a b l e nueva
∗/

/∗ 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 ∗/

aux : [ subst ( i n t e r v a l o [ 1 ] , x , cambio [ 2 ] ) , subst ( i n t e r v a l o [ 2 ] , x , cambio [ 2 ] ) ] ,

n u e v o i n t : [ min ( aux [ 1 ] , aux [ 2 ] ) , max( aux [ 1 ] , aux [ 2 ] ) ] ,

/∗ 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,

/∗ s i y [ a ] > y [ b ] , dy / dx e s n e g a t i v o y debemos m u l t i p l i c a r por −1 ∗/

i f aux [ 1 ] > aux [ 2 ] then 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

batchload ( " Docencia /Grado−en− F i s i c a /1− F i s i c a −Computacional −I / a p u n t e s / c −05/ s o l v e _ s u s t . mc" ) ,


/∗ despejamos x de y = y ( x ) , guardamos e l r e s u l t a d o en aux ∗/

aux : s o l v e s u s t ( cambio [ 2 ] − cambio [ 1 ] , x ) [ 1 ] ,

/∗ s u s t i t u i m o s x por su e x p r e s . como fu nc . de l a nueva v a r i a b l e en f ( x )


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 dx /dy , c a l c u l a d o como d ( aux )/ d ( cambio [ 1 ] )
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 s i g n o (= +1 s i dy / dx > 0 , = −1 s i dy / dx < 0 )
∗/

aux : subst ( aux , x , f ) ∗ d i f f ( aux , cambio [ 1 ] ) ∗ s i g n o ,

/∗ 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.

input: • Función de densidad de probabilidad en términos de las componentes cartesianas de


la velocidad v = (vx , vy , vz ).

output: • Función de densidad de probabilidad en términos de la energía cinética E =


(1/2)mv 2 .

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:

Aplicar el cambio de variable de cartesianas a esféricas. Con esto pasamos de la función


de densidad de probabilidad en términos de las componentes cartesianas de la velocidad
v = (vx , vy , vz ) a la densidad de probabilidad en términos del módulo de la velocidad v y
de los dos ángulos (θ, φ) que denen la orientación del vector velocidad.

Integramos la función de distribución obtenida en el apartado anterior respecto de θ y


φ para todos los valores posibles de estos ángulos. Con esto obtenemos la función de
densidad de probabilidad en términos del módulo de la velocidad v , independientemente
de su orientación.

Aplicamos el cambio de variable E = (1/2)mv 2

Programación con Maxima; Dept. Física Matemática y de Fluidos UNED curso 2011/2012
4

En coordenadas esféricas el vector v = (vx , vy , vz ) está descrito por el módulo de la velocidad


q
v = vx2 + vy2 + vz2

el ángulo θ formado por v y el eje z


θ = arc cos(vz /v)
y el ángulo φ formado por la proyección de v en el plano xy con el eje x

φ = arctan(vy /vx )

y viceversa, las coordenadas cartesianas de v en términos de (v, θ, φ) están dadas por

vx = v sin θ cos φ, vy = v sin θ sin φ, vz = v cos θ

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

dV = dvx dvy dvz = v 2 sin θ dv dθ dφ

Este resultado se obtiene calculando el determinante de la matriz jacobiana de este cambio de


variable. Es un ejercicio interesante vericar este resultado con Maxima, para ello basta con hacer
lo siguiente:
old : [ v ∗ s i n ( theta ) ∗ cos ( phi ) , v ∗ s i n ( theta ) ∗ s i n ( phi ) , v ∗ cos ( theta ) ] ;
new : [ v , t h e t a , p h i ] ;
J : apply ( matrix ,
makelist (
makelist (
d i f f ( o l d [ i ] , new [ j ] )
, j , 1 , length ( o l d ) )
, i , 1 , length ( o l d ) )
);
trigsimp ( determinant ( J ) ) ;

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

Volviendo al problema 2, la probabilidad dP de que el vector velocidad v tome valores en un


elemento diferencial de volumen dV alrededor del punto (vx , vy , vz ) es

dP = f (vx , vy , vz ) dvx dvy dvz

En términos de las variables (v, θ, φ) esta probabilidad puede expresarse como

dP = f (v sin θ cos φ, v sin θ sin φ, v cos θ) v 2 sin θ dv dθ dφ

identicando esto con dP = g(v, θ, φ) dv dθ dφ encontramos

g(v, θ, φ) = f (v sin θ cos φ, v sin θ sin φ, v cos θ) v 2 sin θ

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

El código incluido a continuación implementa este cambio de variable:


/∗
Funcion PDFvelmolecular2PDFenercin : Genera l a f un c . de d e n s i d a d de p r o b a b i l i d a d de l a
energ \ '\ i a c i n \ ' e t i c a de l a s mol \ ' e c u l a s un gas (E) , a p a r t i r de l a f un c . de d e n s i d a d
de p r o b a b i l i d a d de l a s v e l o c i d a d e s m o l e c u l a r e s , e x p r e s a d a en fun c . de l a s componentes
cartesianas del vector velocidad .
∗/

PDFvelmolecular2PDFenercin ( f ) := block ( [ old , g ] ,


/∗
INPUT:
f ( vx , vy , v z ) : fu nc . de d e n s i d a d de p r o b a b i l i d a d de l a s v e l o c i d a d e s
m o l e c u l a r e s en c a r t e s i a n a s
OUTPUT:
h (E ) : fu nc . de d e n s i d a d de p r o b a b i l i d a d de l a energ \ '\ i a c i n \ ' e t i c a
∗/

/∗ La l i s t a de v a r i a b l e s v i e j a s como fu nc . de l a s nuevas para e l cambio a


e s f \ ' e r i c a s e s ∗/

old : [ v ∗ s i n ( theta ) ∗ cos ( phi ) , v ∗ s i n ( theta ) ∗ s i n ( phi ) , v ∗ cos ( theta ) ] ,

/∗ 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 ) ∗ /

g : integrate ( integrate ( g , t h e t a , 0 , %p i ) , phi , 0 , 2∗ %p i ) ,

Programación con Maxima; Dept. Física Matemática y de Fluidos UNED curso 2011/2012
6

/∗ s u s t i t u i m o s e l cambio de v a r i a b l e v −> v (E) = s q r t (2 ∗ E/m) en e l r e s u l t a d o


a n t e r i o r ∗/

subst ( sqrt ( 2 ∗ E/m) , v , g ) / sqrt ( 2 ∗ m ∗ E)


)$

/∗ 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

Ajustes por mínimos cuadrados:

• lsquares_estimates(datos, variable, modelo, parámetros)


El mejor método para realizar ajustes es el de mínimos cuadrados, para
ello en M AXIMA utilizamos el comando lsquares_estimates() al que sumi-
nistramos los datos que queremos ajustar agrupados en una matriz (M :
matrix([x1, y1], [x2, y2], . . . [xN, yN])), la variable independiente (p. ej. x),
como modelo suministramos la forma general de la función de x a la que
queremos ajustar esos datos (p. ej. ax + b), esta forma general depende de
una serie de parámetros (en nuestro ejemplo a y b) cuyos nombres debemos

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

suministrar como último argumento de la función lsquares_estimates().

Interpolaciones:

• Interpolación lineal (unimos los puntos por tramos rectos): linearinterpol(datos)


• Interpolación lagrangiana (construimos un polinomio de Lagrange que pasa
por todos nuestros puntos): lagrange(datos)
• Interpolación por splines cúbicos (construimos una función polinomial a tro-
zos que pasa por todos nuestros puntos de forma continua y diferenciable):
cspline(datos)

Consulte describe() para una descripción más extensa de la sintaxis y para ver
ejemplos de uso de estos comandos.

7.1. De datos aislados a funciones


Un problema muy habitual en física computacional consiste en extraer de un con-
junto de datos experimentales (del tipo (xi , yi ), con i = 1, 2, . . . , N ) una función mate-
mática que de alguna forma reproduzca dichos datos. El objetivo de esto es múltiple:

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?

por otro lado se pretende poder predecir valores de y correspondientes a x no


incluidos en el conjunto de datos (p. ej, suponiendo que las xi están ordenadas
de manera creciente ¿qué valor de y corresponde a x = (x1 + x2 )/2?)

y también se pretende realizar operaciones de cálculo como integrales o deriva-


das sobre esos datos (p. ej. ¿cómo podemos calcular la derivada dy/dx (o en
general dn y/dxn ) a partir de los datos?)

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 locales: la función de interpolación se define como


una función “a trozos”.
7.1. DE DATOS AISLADOS A FUNCIONES 7-3
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

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

output del polinomio interpolador de Lagrange se observan unas oscilaciones de gran


amplitud cerca de los extremos del conjunto de nodos de interpolación (para visualizar
los resultados hay que fijar manualmente la escala de ordenadas que se usa en plot2d
mediante [y, ymin, ymax]), cuya presencia limita la aplicabilidad del polinomio inter-
polador de Lagrange. Para que el polinomio interpolador de Lagrange proporcione una
aproximación precisa a la función definida por el conjunto de datos es necesario que
esta función sea suave (continua e infinitamente diferenciable) y que los valores de la
variable independiente empleados para la interpolación cumplan ciertas condiciones
(los xi deben corresponder a las abscisas de una fórmula de quadratura gaussiana),
estas condiciones no se verifican si el conjunto de datos experimentales se basa en
valores xi equiespaciados. Normalmente se da por hecho que el polinomio interpola-
dor de Lagrange no sirve para realizar extrapolaciones (es decir, para predecir valores
de y correspondientes a x fuera del intervalo de interpolación), pero si el conjunto de
datos de partida no es suficientemente suave o los valores xi en que se basa este
conjunto no son los adecuados, la presencia de estas fuertes oscilaciones hará que el
polinomio interpolador de Lagrange ni siquiera sea adecuado para predecir valores de
y correspondientes a x dentro del intervalo de interpolación.

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.

De todas formas de esta discusión no debe extraerse la conclusión de que los


polinomios interpoladores de Lagrange son poco prácticos. Si el conjunto de valores
de que se dispone es suficientemente preciso las interpolaciones son extremadamente
útiles. En particular, si los abscisas de interpolación corresponden a las abscisas de
una fórmula de quadratura gaussiana (que ya se estudiará en la asignatura de cálculo
numérico), y la función a la que responden estos valores es suficientemente suave, el
polinomio interpolador de Lagrange es extremadamente preciso y útil.
7.1. DE DATOS AISLADOS A FUNCIONES 7-5
Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

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 ,

dependiente de algunos parámetros (en este caso a, b y c) cuyos valores se deter-


minan imponiendo que el módulo al cuadrado de la distancia entre los datos y esta
función sea mínimo. Este tipo de aproximación es un ajuste por mínimos cuadrados y,
a diferencia de como sucedía en la interpolación, no pasa de forma exacta por ninguno
de los datos, sino que pasa más o menos cerca de todos ellos.
Por supuesto, para que el ajuste por mínimos cuadrados funcione bien es necesario
que los datos que queremos ajustar correspondan, al menos de manera aproximada, a
la forma funcional que empleamos para hacer el ajuste. Es decir, necesitamos algo de
información adicional para escoger una forma funcional adecuada. Existen dos formas
de tener esta información adicional:

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 δ.

Si no disponemos de un modelo físico en principio no hay ninguna manera sen-


cilla de obtener la forma funcional apropiada, sin embargo, en algunos casos la
mera inspección de los datos puede darnos algunas ideas, tal y como explicamos
más abajo.

• Supongamos que los datos suministrados corresponden (aproximadamen-


te) a una relación lineal
y = ax + b
al representarlos gráficamente esto salta a la vista, y nos sugerirá hacer el
ajuste basándonos en la sencilla relación lineal de arriba.
• Otro caso sencillo es aquel en que los datos corresponden a una relación
de tipo exponencial
y = aebx
entonces al representarlos gráficamente en una gráfica semi-logarítmica (es
decir ln y frente a x) veremos una línea recta, que nos sugerirá probar la
dependencia funcional de arriba.
7-6 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 último, si los datos responden a una relación tipo ley de potencias

y = axb

entonces al representarlos en una gráfica logarítmica (ln y frente a ln x) ve-


remos una línea recta, que nos indicará que debemos probar ese tipo de
dependencia.

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.

7.2. Funciones de Maxima que debemos aplicar


La función de WX M AXIMA para realizar ajustes por mínimos cuadrados es lsquares_estimates
para usarla es necesario cargar antes el paquete de ajustes:
load(lsquares)$
Aparte de esto puede ser conveniente usar estas funciones:

data : read_nested_list(concat(path, filename))$ (para leer el archivo de


datos)

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.

7.3. Problemas resueltos


Física Computacional I. M. Arias, P. Córdoba, D. Rodríguez. Dep. Física Matemática y de Fluidos. UNED, 2021

7.3. PROBLEMAS RESUELTOS 7-7

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.

En primer lugar cargamos el paquete de interpolaciones y el primer archivo de


datos:
load(interpol)$
data : read_nested_list(concat(path, "data-1.out"))$
A continuación hacemos las interpolaciones mediante las funciones linearinterpol,
lagrange y cspline
aaa : linearinterpol(data)$
bbb : lagrange(data)$
ccc : cspline(data)$
Para visualizar los resultados (líneas continuas), junto con los datos de partida
(puntos) empleamos la función plot2d
plot2d(
[ [discrete, data], aaa, bbb, ccc ], xdom, ydom
[ style, points, lines, lines, lines ]
);
donde previamente hemos definido el intervalo que queremos mostrar en la gráfica
mediante:
xdom : [ x, apply(min, transpose(Mdata)[1]), apply(max, transpose(Mdata)
[1]) ]
ydom : [ y, apply(min, transpose(Mdata)[2]), apply(max, transpose(Mdata)
[2]) ]
siendo Mdata el conjunto de datos en forma matricial
Mdata : apply(matrix,data)$
de tal forma que transpose(Mdata)[1] es el conjunto de abscisas y transpose(Mdata)[2]
el conjunto de ordenadas.
Para ver el eje x (respectivamente el eje y) en escala logarítmica hay que usar la
opción [logx] (respectivamente logy) dentro de la función plot2d. Para ver ambos
ejes en escala logarítmica hay que usar [logx], [logy].
Análogamente haríamos lo mismo con los restantes archivos de datos.

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

En primer lugar cargamos el paquete de ajustes por mínimos cuadrados:


load(lsquares)$
En principio vamos a operar con tres modelos sencillos, todos ellos dependientes sólo
de dos parámetros que llamaremos A y B. Definimos los modelos que vamos a usar:
model1 : A + B * x$
model2 : A * exp( B * x )$
model3 : A * x^B$
Mediante inspección de los datos vemos que el primer archivo de datos correspon-
de al modelo 1, entonces para obtener el ajuste por mínimos cuadrados hacemos
model : model1$
aux : lsquares_estimates( Mdata, [x,y], y = model, [A, B] )$
f : float(subst(aux[1], model));
donde previamente hemos definido la matriz de datos Mdata tal y como se indica en el
primer ejercicio.
Operamos de manera análoga con los archivos de datos restantes, lo único que hay
que hacer es cargar el archivo de datos correspondiente, re-defininir Mdata y asignar
a la variable model el modelo que consideremos apropiado (model1, model2 o model3).

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 ] );

También podría gustarte