Sie sind auf Seite 1von 189

Prcticas

de
ordenador
con
con wxMaxima
wxMaxima

Jernimo Alaminos Prats


Camilo Aparicio del Prado
Jos Extremera Lizana
Pilar Muoz Rivas
Armando R. Villena Muoz

13 noviembre 2011

Reconocimiento-No
comercial 3.0 Espaa

Usted es libre de:


copiar, distribuir y comunicar pblicamente la obra
hacer obras derivadas

Bajo las condiciones siguientes:


Reconocimiento. Debe reconocer los crditos de la obra de la manera especificada por el autor o
el licenciador (pero no de una manera que sugiera que tiene su apoyo o apoyan el uso que hace de
su obra).
No comercial. No puede utilizar esta obra para fines comerciales.
a) Al reutilizar o distribuir la obra, tiene que dejar bien claro los trminos de la licencia de esta
obra.
b) Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor
c) Nada en esta licencia menoscaba o restringe los derechos morales del autor.

Advertencia
Este resumen no es una licencia. Es simplemente una referencia prctica para entender la licencia
completa que puede consultarse en
http://creativecommons.org/licenses/by-nc/3.0/es/legalcode.es

ndice

ndice
ndice i
Introduccin iii
1

Primeros pasos 5

1.1 Introduccin 5
1.2 Resultados exactos y aproximacin decimal 9
usuales 12 1.4 Operadores lgicos y relacionales 16 1.5 Variables 17
simblicas 20 1.7 La ayuda de Maxima 27 1.8 Ejercicios 29
Grficos 31
2.1 Funciones 31 2.2 Grficos en el plano con plot2d 35
2.4 Animaciones grficas 49 2.5 Ejercicios 52

1.3 Funciones
1.6 Expresiones

2.3 Grficos con draw 39

Listas y matrices 55

3.1 Listas 55 3.2 Matrices 60 3.3 Ejercicios 69


Resolucin de ecuaciones 71
4.1 Ecuaciones y operaciones con ecuaciones 71 4.2 Resolucin de ecuaciones 72 4.3 Ejercicios 79

Mtodos numricos de resolucin de ecuaciones 81


5.1 Introduccin al anlisis numrico 81
5.2 Resolucin numrica de ecuaciones con Maxima 85 5.3 Breves conceptos de programacin 89 5.4 El mtodo de biseccin 93 5.5 Mtodos de iteracin funcional 102
5

Lmites y continuidad 111

6.1 Lmites 111 6.2 Sucesiones 113

6.3 Continuidad 115

6.4 Ejercicios 117

Derivacin 119
7.1 Clculo de derivadas 119 7.2 Rectas secante y tangente a una funcin 122 7.3 Mximos
y mnimos relativos 126 7.4 Ejercicios 131

Integracin 133
8.1 Clculo de integrales 133 8.2 Sumas de Riemann 139 8.3 Aplicaciones 142 8.4 Ejercicios 149

Interpolacin polinmica 153


9.1 Interpolacin polinmica 153
Taylor 157

9.2 Interpolacin de Lagrange 154

9.3 Polinomio de

Derivacin e integracin numrica 163


10.1 Derivacin numrica 163 10.2 Integracin numrica 164 10.3 Mtodos simples 165
10.4 Mtodos de aproximacin compuestos 167
10

ndice

Nmeros complejos 171

Avisos y mensajes de error 175

Bibliografa 179
Glosario 181

ii

Introduccin

Introduccin
Maxima es un programa que realiza clculos matemticos de forma tanto numrica como simblica, esto es, sabe tanto manipular nmeros como calcular la derivada de una funcin. Sus capacidades cubren sobradamente las necesidades de un alumno de un curso de Clculo en unos
estudios de Ingeniera. Se encuentra disponible bajo licencia GNU GPL tanto el programa como
los manuales del programa.
Lo que presentamos aqu son unas notas sobre el uso de Maxima para impartir la parte correspondiente a unas prcticas de ordenador en una asignatura de Clculo que incluya derivadas e
integrales en una y varias variables y una breve introduccin a ecuaciones diferenciales ordinarias.
Adems de eso, hemos aadido unos captulos iniciales donde se explican con algo de detalle algunos conceptos ms o menos generales que se utilizan en la resolucin de problemas con Maxima.
Hemos pensado que es mejor introducir, por ejemplo, la gestin de grficos en un captulo separado que ir comentando cada orden en el momento que se use por primera vez. Esto no quiere decir
que todo lo que se cuenta en los cuatro primeros captulos sea necesario para el desarrollo del resto
de estas notas. De hecho, posiblemente es demasiado. En cualquier caso pensamos que puede ser
til en algn momento.

Por qu
Hay muchos programas que cumplen en mayor o menor medida los requisitos que se necesitan
para ensear y aprender Clculo. Slo por mencionar algunos, y sin ningn orden particular, casi
todos conocemos Mathematica (Wolfram Research) o Maple (Maplesoft). Tambin hay una
larga lista de programas englobados en el mundo del software libre que se pueden adaptar a este
trabajo.
Siempre hay que intentar escoger la herramienta que mejor se adapte al problema que se presenta
y, en nuestro caso, Maxima cumple con creces las necesidades de un curso de Clculo. Es evidente
que Mathematica o Maple tambin pero creemos que el uso de programas de software libre permite
al alumno y al profesor estudiar cmo est hecho, ayudar en su mejora y, si fuera necesario y posible,
adaptarlo a sus propias necesidades.
Adems pensamos que el programa tiene la suficiente capacidad como para que el alumno le
pueda seguir sacando provecho durante largo tiempo. Estamos todos de acuerdo en que esto slo
es un primer paso y que Maxima se puede utilizar para problemas ms complejos que los que
aparecen en estas notas. Esto no es un callejn sin salida sino el comienzo de un camino.

Dnde y cmo
No es nuestra intencin hacer una historia de Maxima, ni explicar cmo se puede conseguir o
instalar, tampoco aqu encontrars ayuda ni preguntas frecuentes ni nada parecido. Cualquiera de
estas informaciones se encuentra respondida de manera detallada en la pgina web del programa:
http://maxima.sourceforge.net/es/

iii

Introduccin

En esta pgina puedes descargarte el programa y encontrar abundante documentacin sobre


cmo instalarlo. Al momento de escribir estas notas, en dicha pgina puedes encontrar versiones
listas para funcionar disponibles para entornos Windows y Linux e instrucciones detalladas para
ponerlo en marcha en Mac OS X.

wxMaxima
En estas notas no estamos usando Maxima directamente sino un entorno grfico que utiliza
Maxima como motor para realizar los clculos. Este entorno (programa) es wxMaxima. Nos va a
permitir que la curva de aprendizaje sea mucho ms suave. Desde el primer da el alumno ser
capaz de realizar la mayora de las operaciones bsicas. A pesar de ello, en todos los ejemplos
seguimos utilizando la notacin de Maxima que es la que le aparece al lector en pantalla y que
nunca est de ms conocer. wxMaxima se puede descargar de su pgina web
http://wxmaxima.sourceforge.net/
Suele venir incluido con Maxima en su versin para entorno Windows y en Mac OS X. Sobre
la instalacin en alguna distribucin Linux es mejor consultar la ayuda sobre su correspondiente
programa para gestionar software.
Granada a 10 de septiembre de 2008

iv

Primeros pasos

Introduccin

Primeros pasos
1
1.1 Introduccin 5 1.2 Resultados exactos y aproximacin decimal 9 1.3 Funciones usuales 12 1.4 Operadores lgicos y relacionales 16 1.5 Variables 17
1.6 Expresiones simblicas 20 1.7 La ayuda de Maxima 27 1.8 Ejercicios 29

1.1 Introduccin
Vamos a comenzar familiarizndonos con Maxima y con el entorno de trabajo wxMaxima. Cuando iniciamos el programa se nos presenta una ventana como la de la Figura 1.1. En la parte superior
tienes el men con las opciones usuales (abrir, cerrar, guardar) y otras relacionadas con las posibilidades ms matemticas de Maxima. En segundo lugar aparecen algunos iconos que sirven
de atajo a algunas operaciones y la ventana de trabajo. En sta ltima, podemos leer un recordatorio de las versiones que estamos utilizando de los programas Maxima y wxMaxima as como el
entorno Lisp sobre el que est funcionando y la licencia (GNU Public License): 1

wxMaxima 0.8.3a http://wxmaxima.sourceforge.net


Maxima 5.19.2 http://maxima.sourceforge.net
Using Lisp SBCL 1.0.30
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.
Ya iremos comentando con mayor profundidad
los distintos mens y opciones que se nos presentan pero antes de ir ms lejos, podemos
escribir algo? S, situa el cursor dentro de la
ventana, pulsa y escribe 2+3. Luego pulsa las
teclas Shift + Return . Obtendrs algo similar a esto:

(%i1)

2+3;

(%o1)

5
Figura 1.1 Ventana inicial de wxMaxima

Como puedes ver Maxima da la respuesta


correcta: 5. Bueno, no parece mucho. Seguro que tienes una calculadora que hace eso. De acuerdo.
Es slo el principio.
1

Por defecto, la ventana de wxMaxima aparece en blanco. En las preferencias del programa, se puede elegir que aparezca
la versin instalada al inicio del mismo como se ve en la figura.

Introduccin

Primeros pasos

Observacin 1.1. Conviene hacer algunos comentarios sobre lo que acabamos de hacer:
a) No intentes escribir los smbolos (%i1) y (%o1), ya que stos los escribe el programa
para llevar un control sobre las operaciones que va efectuando. (%i1) se refiere a la primera
entrada (input) y (%o1) a la primera respuesta (output).
b) La entradas terminan en punto y coma. wxMaxima lo aade si t te has olvidado de escribirlo.
Justamente lo que nos haba pasado.

Operaciones bsicas
+

/
o
sqrt( )

suma
producto
divisin
potencia
raz cuadrada

El producto se indica con :

(%i2)

35;

(%o2)

15

Para multiplicar nmeros es necesario escribir el smbolo de la multiplicacin. Si slo dejamos


un espacio entre los factores el resultado es un error:

(%i3)

5 4;

(%o3)

Incorrect syntax: 4 is not an infix operator


5Space4;

Tambin podemos dividir

(%i4)

5+(24+6)/7;

(%o4)

(%i5)

5+24+6/7;
97
7

(%o5)

eso s, teniendo cuidado con la precedencia de las operaciones. En estos casos el uso de parntesis
es obligado.
Podemos escribir potencias

(%i6)

3 57;

Primeros pasos

(%o6)

Introduccin

1570042899082081611640534563

Fjate en el nmero de dgitos que tiene el resultado. Es un primer ejemplo de que la potencia de
clculo de Maxima es mayor que la de una calculadora que no suele tener ms all de 10 o 12. Ya
s lo que estars pensando en este momento: en lugar de elevar a 57, elevemos a un nmero ms
grande. De acuerdo.

(%i7)

3 1000;

(%o7)

13220708194808066368904552597
5[418 digits]6143661321731027
68902855220001

Como puedes ver, Maxima realiza la operacin pero no muestra el resultado completo. Nos dice que, en este caso, hay 418
dgitos que no est mostrando. Se puede saber cules son? S.
Nos vamos al men MaximaCambiar pantalla 2D y escogemos ascii. Por ltimo, repetimos la operacin.

(%i8)

set_display(ascii)$

(%i9)

3 1000;

(%o9)

1322070819480806636890455259752144365965422032752148167664
9203682268285973467048995407783138506080619639097776968725
8235595095458210061891186534272525795367402762022519832080
3878014774228964841274390400117588618041128947815623094438
0615661730540866744905061781254803444055470543970388958174
6536825491613622083026856377858229022841639830788789691855
6404084898937609373242171846359938695516765018940588109060
4260896714388641028143503856487471658320106143661321731027
68902855220001

La salida en formato ascii es la que tiene por defecto Maxima. La salida con formato xml es una
mejora de wxMaxima. Siempre puedes cambiar entre una y otra va el men o volviendo a escribir

(%i10)

set_display(xml)$

(%i11)

3 1000;

(%o11)

132207081948080663689045525975[418 digits]61436613217310
2768902855220001

Observacin 1.2. Antes de seguir, por qu sale $ y no punto y coma al final de la salida anterior?
El punto y coma sirve para terminar un comando o separar varios de ellos. El dlar, $, tambin
termina un comando o separa varios de ellos pero, a diferencia del punto y coma, no muestra el
resultado en pantalla.
Si trabajamos con fracciones, Maxima dar por defecto el resultado en forma de fraccin

Introduccin

(%i12)
(%o12)

Primeros pasos

2+5/11;
27
11

simplificando cuando sea posible

(%i13)
(%o13)

128/234;
64
117

Clculo simblico
Cuando hablamos de que Maxima es un programa de clculo simblico, nos referimos a que no
necesitamos trabajar con valores concretos. Fjate en el siguiente ejemplo:

(%i14)
(%o14)

Races

a/2+3a/5
11a
10

Bueno, hasta ahora sabemos sumar, restar, multiplicar, dividir y poco ms. Maxima tiene predefinidas la mayora de las funciones usuales. Por ejemplo, para obtener la raz de un nmero se usa
el comando sqrt

(%i15)
(%o15)

sqrt(5);

lo cul no parece muy buena respuesta. En realidad es la mejor posible: Maxima es un programa
de clculo simblico y siempre intentar dar el resultado en la forma ms exacta.
Obviamente, tambin puedes hacer la raz cuadrada de un nmero, elevando dicho nmero al
exponente 21

(%i16)
(%o16)
float

5 (1/2);

Si queremos obtener la expresin decimal, utilizamos la orden float.

(%i17)

float( 5);

(%o17)

2.23606797749979

Primeros pasos

Resultados exactos y aproximacin decimal

Constantes
Adems de las funciones usuales (ya iremos viendo ms), Maxima tambin conoce el valor de
algunas de las constantes tpicas.

%pi
%e
%i
%phi

el nmero
el nmero e
la unidad imaginaria
la razn area,

1+ 5
2

Podemos operar con ellas como con cualquier otro nmero.

(%i18)

(2+3*%i)*(5+3*%i);

(%o18)

(3*%i+2)*(3*%i+5)

Evidentemente necesitamos alguna manera de indicar a Maxima que debe desarrollar los productos, pero eso lo dejaremos para ms tarde.

Cul era el resultado anterior?


%
%inmero
%onmero

ltimo resultado
entrada nmero
resultado nmero

Con Maxima podemos usar el resultado de una operacin anterior sin necesidad de teclearlo. Esto
se consigue con la orden %. No slo podemos referirnos a la ltima respuesta sino a cualquier
entrada o salida anterior. Para ello

(%i19)
(%o19)

%o15

adems podemos usar esa informacin como cualquier otro dato.

(%i20)
(%o20)

%o4+%o5;
146
7

1.2 Resultados exactos y aproximacin decimal


Hay una diferencia bsica entre el concepto abstracto de nmero real y cmo trabajamos con
ellos mediante un ordenador: la memoria y la capacidad de proceso de un ordenador son finitos. La
precisin de un ordenador es el nmero de dgitos con los que hace los clculos. En un hipottico

Resultados exactos y aproximacin decimal

Primeros pasos

ordenador que nicamente tuviera capacidad para almacenar el primer decimal, el nmero sera
representado como 3.1. Esto puede dar lugar a errores si, por ejemplo, restamos nmeros similares.
Maxima realiza los clculos de forma simblica o numrica. En principio, la primera forma es
mejor, pero hay ocasiones en las que no es posible.
Maxima tiene dos tipos de nmeros: exactos y aproximados. La diferencia entre ambos es la
esperable. 31 es un nmero exacto y 0.333 es una aproximacin del anterior. En una calculadora
normal todos los nmeros son aproximados y la precisin (el nmero de dgitos con el que trabaja
la calculadora) es limitada, usualmente 10 o 12 dgitos. Maxima puede manejar los nmeros de
forma exacta, por ejemplo

(%i21)
(%o21)

1/2+1/3;
5
6

Mientras estemos utilizando nicamente nmeros exactos, Maxima intenta dar la respuesta de la
misma forma. Ahora bien, en cuanto algn trmino sea aproximado el resultado final ser siempre
aproximado. Por ejemplo

numer

(%i22)

1.0/2+1/3;

(%o22)

0.83333333333333

Este comportamiento de Maxima viene determinado por la variable numer que tiene el valor
false por defecto. En caso de que cambiemos su valor a true, la respuesta de Maxima ser
aproximada.

(%i23)

numer;

(%o23)

false

(%i24)

numer:true$

(%i25)

1/2+1/3

(%o25)

0.83333333333333

(%i26)

numer:false$

Recuerda cambiar el valor de la variable numer a false para volver al comportamiento original
de Maxima. En wxMaxima, podemos utilizar el men Numricoconmutar salida numrica
para cambiar el valor de la variable numer.

float(nmero )
nmero,numer
bfloat(nmero )

expresin decimal de nmero


expresin decimal de nmero
expresin decimal larga de nmero

Si slo queremos conocer una aproximacin decimal de un resultado exacto, tenemos a nuestra
disposicin las rdenes float y bfloat.

10

Primeros pasos

Resultados exactos y aproximacin decimal

(%i27)

float(sqrt(2));

(%o27)

1.414213562373095

En la ayuda de Maxima podemos leer

Valor por defecto: 16.


La variable fpprec guarda el nmero de dgitos significativos en
la aritmtica con nmeros decimales de punto flotante grandes
("bigfloats"). La variable fpprec no afecta a los clculos con
nmeros decimales de punto flotante ordinarios.
Maxima puede trabajar con cualquier precisin. Dicha precisin la podemos fijar asignando el
valor que queramos a la variable fpprec. Por ejemplo, podemos calcular cunto valen los 100
primeros decimales de :

(%i28)

fpprec:100;

(%o28)

100

(%i29)

float(%pi);

(%o29)

3.141592653589793

No parece que tengamos 100 dgitos...de acuerdo, justo eso nos deca la ayuda de mxima: La
variable fpprec no afecta a los clculos con nmeros decimales de punto flotante ordinarios. Necesitamos la orden bfloat para que Maxima nos muestre todos los decimales pedidos (y cambiar
la pantalla a ascii):

(%i30)

bfloat(%pi);

(%o30)

3.1415926535897932384626433832[43 digits]62862089986280348
25342117068b0

(%i31)

set_display(ascii)$

(%i32)

bfloat(%pi);

(%o32)

3.141592653589793238462643383279502884197169399375105820
974944592307816406286208998628034825342117068b0

11

Funciones usuales

Primeros pasos

Si te has fijado, en la salida anterior la expresin decimal del nmero termina con b0. Los nmeros
en coma flotante grandes siempre terminan con b
seguido de un nmero n para indicar que debemos
multiplicar por 10n . En el caso anterior, la expresin
decimal de deberamos multiplicarla por 100 = 1.
Por ltimo, observa que, como se puede ver en la
Figura
1.2, tambin se puede utilizar el men NumFigura 1.2 En el men, la pestaa Numrico permite obtener la expresin deci- ricoA real o NumricoA real grande(bigfloat)
para obtener la expresin decimal buscada.
mal con la precisin que se desee

1.3 Funciones usuales


Adems de las operaciones elementales que hemos visto, Maxima tiene definidas la mayor parte
de las funciones elementales. Los nombres de estas funciones suelen ser su abreviatura en ingls,
que algunas veces difiere bastante de su nombre en castellano. Por ejemplo, ya hemos visto races
cuadradas

(%i33)

sqrt(4);

(%o33)

sqrt(x)
exp(x)
log(x)
sin(x), cos(x), tan(x)
csc(x), sec(x), cot(x)
asin(x), acos(x), atan(x)
sinh(x), cosh(x), tanh(x)
asinh(x), acosh(x), atanh(x)

raz cuadrada de x
exponencial de x
logaritmo neperiano de x
seno, coseno y tangente en radianes
cosecante, secante y cotangente en radianes
arcoseno, arcocoseno y arcotangente
seno, coseno y tangente hiperblicos
arcoseno, arcocoseno y arcotangente
hiperblicos

Potencias, races y exponenciales


Hemos visto que podemos escribir potencias utlizando o . No importa que el exponente
sea racional. En otras palabras: podemos calcular races de la misma forma

(%i34)

625 (1/4);

(%o34)

(%i35)

625 (1/3)2 (1/3):

(%o35)

21/3 54/3

En el caso particular de que la base sea el nmero e, podemos escribir

12

Primeros pasos

Funciones usuales

(%i36)

%e 2;

(%o36)

%e2

o, lo que es ms cmodo especialmente si el exponente es una expresin ms larga, utilizar la


funcin exponencial exp

(%i37)

exp(2);

(%o37)

%e 2

(%i38)

exp(2),numer;

(%o38)

7.38905609893065

Logaritmos
Maxima slo tiene la definicin del logaritmo neperiano o natural que se consigue con la orden
log:

(%i39)

log(20);

(%o39)

log(20)

y si lo que nos interesa es su expresin decimal

(%i40)

log(20),numer;

(%o40)

2.995732273553991

Observacin 1.3. Mucho cuidado con utilizar ln para calcular logaritmos neperianos:

(%i41)

ln(20);

(%o41)

ln(20)

puede parecer que funciona igual que antes pero en realidad Maxima no tiene la ms remota idea
de lo que vale, slo est repitiendo lo que le habis escrito. Si no te lo crees, pdele que te diga el
valor:

(%i42)

ln(20),numer;

(%o42)

ln(20)

Cmo podemos calcular log2 (64)? Para calcular logaritmos en cualquier base podemos utilizar
que

13

Funciones usuales

Primeros pasos

logb (x) =

log(x)
.
log(b)

Se puede definir una funcin que calcule los logaritmos en base 2 de la siguiente manera

(%i43)

log2(x):=log(x)/log(2)$

(%i44)

log2(64);
log(64)
log(2)

(%o44)

Te habrs dado cuenta de que Maxima no desarrolla ni simplifica la mayora de las expresiones.
En segundo lugar, la posibilidad de definir funciones a partir de funciones conocidas nos abre una
amplia gama de posibilidades. En el segundo captulo veremos con ms detalle cmo trabajar con
funciones.

Funciones trigonomtricas e hiperblicas


Maxima tiene predefinidas las funciones trigonomtricas usuales seno, sin, coseno, cos, y
tangente, tan, que devuelven, si es posible, el resultado exacto.

(%i45)
(%o45)

sin(%pi/4)
1

Por defecto, las funciones trigonomtricas estn expresadas en radianes.


Tambin estn predefinidas sus inversas, esto es, arcoseno, arcocoseno y arcotangente, que se
escriben respectivamente asin(x), acos(x) y atan(x), as como las funciones recprocas secante, sec(x), cosecante, csc(x), y cotangente, cot(x) 2.

(%i46)

(%i47)

atan(1);

4
sec(0);

(%o47)

(%o46)

De forma anloga, puedes utilizar las correspondientes funciones hiperblicas.

Otras funciones
Adems de las anteriores, hay muchas ms funciones de las que Maxima conoce la definicin.
Podemos, por ejemplo, calcular factoriales

El nmero no aparece como tal por defecto en wxMaxima. Para que aparezca as, puedes marcar Usar fuente griega
dentro de PreferenciasEstilo.

14

Primeros pasos

Funciones usuales

(%i48)

32!

(%o48)

263130836933693530167218012160000000

o nmeros binmicos

(%i49)

binomial(10,4);

(%o49)

210

 
Recuerdas cul es la definicin de mn ?
!
m(m 1)(m 2) (m (n 1))
m
=
n!
n
En el desarrollo de Taylor de una funcin veremos que estos nmeros nos simplifican bastante la
notacin.

n!
entier(x)
abs(x)
random(x)
signum(x)
max( x1 , x2 ,...)
min( x1 , x2 ,...)

factorial de n
parte entera de x
valor absoluto o mdulo de x
devuelve un nmero aleatorio
signo de x
mximo de x1 ,x2 ,...
mnimo de x1 ,x2 ,...

Una de las funciones que usaremos ms adelante es random. Conviene comentar que su comporta- random
miento es distinto dependiendo de si se aplica a un nmero entero o a un nmero decimal, siempre
positivo, eso s. Si el nmero x es natural, random(x ) devuelve un natural menor o igual que
x 1.

(%i50)

random(100);

(%o50)

Obviamente no creo que t tambin obtengas un 7, aunque hay un caso en que s puedes saber
cul es el nmero aleatorio que vas a obtener:

(%i51)

random(1);

(%o51)

efectivamente, el nico entero no negativo menor o igual que 1 1 es el cero. En el caso de que
utilicemos nmeros decimales random(x) nos devuelve un nmero decimal menor que x. Por
ejemplo,

15

Operadores lgicos y relacionales

Primeros pasos

(%i52)

random(1.0);

(%o52)

0.9138095996129

nos da un nmero (decimal) entre 0 y 1.


La lista de funciones es mucho mayor de lo que aqu hemos comentado y es fcil que cualquier
funcin que necesites est predefinida en Maxima. En la ayuda del programa puedes encontrar la
lista completa.

1.4 Operadores lgicos y relacionales


Maxima puede comprobar si se da una igualdad (o desigualdad). Slo tenemos que escribirla y
nos dir qu le parece:

(%i53)

is(3<5);

(%o53)

true
is(expresin )
assume(expresin )
forget(expresin )
and
or

decide si la expresin es cierta o falsa


supone que la expresin es cierta
olvida la expresin
y
o

No se pueden encadenar varias condiciones. No se admiten expresiones del tipo 3 < 4 < 5. Las
desigualdades slo se aplican a parejas de expresiones. Lo que s podemos hacer es combinar varias
cuestiones como, por ejemplo,

(%i54)

is(3<2 or 3<4);

(%o54)

true

En cualquier caso tampoco esperes de Maxima la respuesta al sentido de la vida:

(%i55)

is((x+1) 2=x 2+2x+1);

(%o55)

false
=
notequal
x>y
x<y
x>=y
x<=y

igual
distinto
mayor
menor
mayor o igual
menor o igual

16

Primeros pasos

Variables

Pues no pareca tan difcil de responder. Lo cierto es que Maxima no ha desarrollado la expresin.
Vamos con otra pregunta fcil:

(%i56)

is((x+1) 2>0);

(%o56)

unknown

Pero, no era positivo un nmero al cuadrado? Hay que tener en cuenta que x podra valer 1 .
Te parece tan mala la respuesta ahora? Si nosotros disponemos de informacin adicional, siempre
podemos ayudar. Por ejemplo, si sabemos que x es distinto de 1 la situacin cambia:

(%i57)

assume(notequal(x,-1));

(%o57)

[notequal(x,-1)]

(%i58)

is((x+1) 2>0);

(%o58)

true

Eso s, en este caso Maxima presupone que x es distino de 1 en lo que resta de sesin. Esto
puede dar lugar a errores si volvemos a utilizar la variable x en un ambiente distinto ms adelante.
El comando forget nos permite hacer olvidar a Maxima.
forget

(%i59)

forget(notequal(x,-1));

(%o59)

[notequal(x,-1)]

(%i60)

is(notequal(x,-1));

(%o60)

unknown

1.5 Variables
El uso de variables es muy fcil y cmodo en Maxima. Uno de los motivos de esto es que no
hay que declarar tipos previamente. Para asignar un valor a una variable utilizamos los dos puntos

(%i61)

a:2

(%o61)

(%i62)

a2

(%o62)

var :expr
kill(a1,a2,... )
remvalue(var1,var2,... )
values

la variable var vale expr


elimina los valores
borra los valores de las variables
muestra las variables con valor asignado

17

Variables

Primeros pasos

Cuando una variable tenga asignado un valor concreto, a veces diremos que es una constante, para
distinguir del caso en que no tiene ningn valor asignado.
Observacin 1.4. El nombre de una variable puede ser cualquier cosa que no empiece por un
nmero. Puede ser una palabra, una letra o una mezcla de ambas cosas.

(%i63)

largo:10;

(%o63)

10

(%i64)

ancho:7;

(%o64)

(%i65)

largoancho;

(%o65)

70

Podemos asociar una variable con prcticamente cualquier cosa que se nos ocurra: un valor
numrico, una cadena de texto, las soluciones de una ecuacin, etc.

(%i66)

solucion:solve(x 2-1=0,x);

(%o66)

[x=-1,x=1]

para luego poder usarlas.


Los valores que asignamos a una variable no se borran por s solos. Siguen en activo mientras no
los cambiemos o comencemos una nueva sesin de Maxima. Quiz por costumbre, todos tendemos
a usar como nombre de variables x, y, z, t, igual que los primeros nombres que se nos vienen a
la cabeza de funciones son f o g. Despus de trabajar un rato con Maxima es fcil que usemos
una variable que ya hemos definido antes. Es posible que dar un valor a una variable haga que una
operacin posterior nos de un resultado inesperado o un error. Por ejemplo, damos un valor a x

(%i67)

x:3;

(%o67)

y despus intentamos derivar una funcin de x, olvidando que le hemos asignado un valor. Cul
es el resultado?

(%i68)

diff(sin(x),x);
Non-variable 2nd argument to diff:
3
-- an error. To debug this try debugmode(true);

Efectivamente, un error. Hay dos maneras de evitar esto. La primera es utilizar el operador
comilla, , que evita que se evale la variable:

(%i69)

diff(sin(x),x);

18

Primeros pasos

(%o69)

Variables

cos(x)

La segunda es borrar el valor de x. Esto lo podemos hacer con la orden kill o con la orden remvalue. Tambin
puedes ir al men Maximaborrar variable y escribir
las variables que quieres borrar. Por defecto se borrarn
todas.
Si te fijas, dentro del men Maxima tambin hay varios
tems interesantes: se pueden borrar funciones y se pueden
mostrar aquellas variables (y funciones) que tengamos definidas. Esto se consigue con la orden values.

(%i70)

values;

(%o70)

[a,largo,ancho,x,solucion]

Una vez que sabemos cules son, podemos borrar algunas de ellas

(%i71)

remvalue(a,x);

(%o71)

[a,x]

values

remvalue

o todas.

(%i72)

remvalue(all);

(%o72)

[largo,ancho,solucion]

La orden remvalue slo permite borrar valores de variables. Existen versiones similares para
borrar funciones, reglas, etc. En cambio, la orden kill es la versin genrica de borrar valores
de cualquier cosa.

(%i73)

ancho:10$

(%i74)

kill(ancho);

(%o74)

done

(%i75)

remvalue(ancho);

(%o75)

[false]

Una de las pequeas diferencias entre kill y remvalue es que la primera no comprueba si la
variable, o lo que sea, estaba previamente definida y siempre responde done. Existe tambin la
posibilidad de borrar todo:

(%i76)

kill(all);

19

kill

Expresiones simblicas

(%o0)

Primeros pasos

done

y, si te fijas, Maxima se reinicia: es como si empezramos de nuevo. Hemos borrado cualquier


valor que tuvisemos previamente definido.

1.6 Expresiones simblicas


Hasta ahora slo hemos usado el Maxima como
una calculadora muy potente, pero prcticamente
todo lo que hemos aprendido puede hacerse sin dificultad con una calculadora convencional. Entonces, qu puede hacer Maxima que sea imposible
con una calculadora? Bueno, entre otras muchas
cosas que veremos posteriormente, la principal utilidad de Maxima es el clculo simblico, es decir,
el trabajar con expresiones algebraicas (expresiones donde intervienen variables, constantes... y no
tienen por qu tener un valor numrico concreto)
en vez de con nmeros. Por ejemplo, el programa sabe que la funcin logaritmo y la funcin exponencial son inversas una de otra, con lo que si ponemos

(%i1)

exp(log(x));

(%o1)

es decir, sin saber el valor de la variable x el programa es capaz de trabajar simblicamente con
ella. Ms ejemplos

(%i2)

exp(x)*exp(y);

(%o2)

%ey+x

Aunque parece que no siempre obtenemos el resultado esperado

(%i3)

log(xy);

(%o3)

log(x y)

(%i4)

log(x)+log(y);

(%o4)

log(y)+log(x)

Vamos a practicar con comandos de Maxima para manejar expresiones algebraicas: polinomios,
funciones racionales, trigonomtricas, etc.
Casi todas las rdenes de esta seccin, ya sea expandir o simplificar expresiones, se encuentran
en el men Simplificar y, opcionalmente, en los paneles de wxMaxima.

20

Primeros pasos

1.6.1

Expresiones simblicas

Desarrollo de expresiones simblicas


La capacidad de Maxima para trabajar con expresiones es notable. Comencemos con funciones
sencillas. Consideremos el polinomio

(%i5)

p:(x+2)(x-1);

(%o5)

(x-1)(x+2)

lo nico qu hace Maxima es reescribirlo. Y las potencias?

(%i6)

q:(x-3) 2

(%o6)

(x-3)2

Vale, tampoco desarrolla el cuadrado. Probemos ahora a restar las dos expresiones:

(%i7)

p-q;

(%o7)

(x-1)(x+2)-(x-3)2

Si no haba desarrollado las expresiones anteriores, no era lgico esperar que desarrollara ahora
la diferencia. Maxima no factoriza ni desarrolla automticamente: debemos decirle que lo haga.
Cmo lo hacemos?

expand(expr )
partfrac(frac,var )
num(frac )
denom(frac )

realiza productos y potencias


descompone en fracciones simples
numerador
denominador

La orden expand desarrollo productos, potencias,

(%i8)

expand(p);

(%o8)

x2 +x-2

expand

y cocientes.

(%i9)

expand(p/q);

(%o9)

x2
x
2
+

x2 -6 x+9 x2 -6 x+9 x2 -6 x+9

Como puedes ver, expand slo divide la fraccin teniendo en cuenta el numerador. Si queremos
dividir en fracciones simples tenemos que usar partfrac.

21

partfrac

Expresiones simblicas

(%i10)
(%o10)

num
denom

Primeros pasos

partfrac(p/q,x);
7
10
+
+1
x-3 x-32

Por cierto, tambin podemos recuperar el numerador y el denominador de una fraccin con las
rdenes num y denom:

(%i11)

denom(p/q);

(%o11)

(x-3)2

(%i12)

num(p/q);

(%o12)

(x-1)(x+2)

Comportamiento de expand
El comportamiento de la orden expand viene determinado por el valor de algunas variables.
No vamos a comentar todas, ni mucho menos, pero mencionar algunas de ellas nos puede dar una
idea del grado de control al que tenemos acceso.

expand(expr,n,m)
logexpand
radexpand

desarrolla potencias con grado entre m y n


variable que controla el desarrollo de logaritmos
variable que controla el desarrollo de radicales

Si quisiramos desarrollar la funcin


(x + 1)100 + (x 3)32 + (x + 2)2 + x 1

2
1
1
+
+
2
x (x 1)
(x 7)15

posiblemente no estemos interesados en que Maxima escriba los desarrollos completos de los dos
primeros sumandos o del ltimo. Quedara demasiado largo en pantalla. La orden expand permite
acotar qu potencias desarrollamos. Por ejemplo, expand(expr,3,5) slo desarrolla aquellas
potencias que estn entre 3 y 5.

(%i13)
(%o13)

expand((x+1) 100+(x-3) 32+(x+2) 2+x-1-1/x+2/((x-1) 2)


+1/((x-7) 15),3,4);
2
1
100 +x2 +5x- 1 +(x-3)32 +
+(
x+1)
+3
x
(x-7)15
x2 -2x+1

Las variables logexpand y radexpand controlan si se simplifican logaritmos de productos


o radicales con productos. Por defecto su valor es true y esto se traduce en que expand no
desarrolla estos productos:

(%i14)

log(ab);

22

Primeros pasos

Expresiones simblicas

(%o14)

log(a b)

(%i15)

sqrt(xy)

xy

(%o15)

Cuando cambiamos su valor a all,

(%i16)

radexpand:all$ logexpand:all$

(%i17)

log(ab);

(%o17)

log(a)+log(b)

(%i18)

sqrt(xy)

x y

(%o18)

Dependiendo del valor de logexpand, la respuesta de Maxima vara cuando calculamos log(ab )
o log(a/b).

Compara t cul es el resultado de x2 cuando radexpand toma los valores true y all.

Factorizacin
factor(expr )

escribe la expresin como


producto de factores ms sencillos

La orden factor realiza la operacin inversa a expand. La podemos utilizar tanto en nmeros

(%i19)

factor(100);

(%o19)

22 52

como con expresiones polinmicas como las anteriores

(%i20)

factor(x 2-1);

(%o20)

(x-1)(x+1)

El nmero de variables que aparecen tampoco es un problema:

(%i21)

(x-y)(xy-3x 2);

(%o21)

(x-y)(xy-3x2 )

(%i22)

expand(%);

(%o22)

-xy2 +4x2 y-3x3

(%i23)

factor(%);

(%o23)

-x(y-3x)(y-x)

23

factor

Expresiones simblicas

Primeros pasos

Evaluacin de valores en expresiones


ev(expr,arg1,arg2,... )

ev

evalua la expresin segn los argumentos

Ahora que hemos estado trabajando con expresiones polinmicas, para evaluar en un punto podemos utilizar la orden ev. En su versin ms simple, esta orden nos permite dar un valor en una
expresin:

(%i24)

ev(p,x=7);

(%o24)

54

que puede escribirse tambin de la forma

(%i25)

p,x=7;

(%o25)

54

Tambin se puede aplicar ev a una parte de la expresin:

(%i26)

x 2+ev(2*x,x=3);

(%o26)

x2 +6

Este tipo de sustituciones se pueden hacer de forma un poco ms general y sustituir expresiones
enteras

(%i27)

ev(x+(x+y) 2-3(x+y) 3,x+y=t);

(%o27)

x-3*t3 +t2

En la ayuda de Maxima puedes ver con ms detalle todos los argumentos que admite la orden
ev, que son muchos.

1.6.2

Simplificacin de expresiones
Es discutible qu queremos decir cuando afirmamos que una expresin es ms simple o ms
sencilla que otra. Por ejemplo, cul de las dos siguientes expresiones te parece ms sencilla?

(%i28)
(%o28)
(%i29)
(%o29)

radcan(p/q);
x2 +x-2
x2 -6*x+9
partfrac(p/q,x);
7
10
+
+1
x-3 x-32

24

Primeros pasos

Expresiones simblicas

radcan(expr )
ratsimp(expr )
fullratsimp(expr )

simplifica expresiones con radicales


simplifica expresiones racionales
simplifica expresiones racionales

Maxima tiene algunas rdenes que permiten simplificar expresiones pero muchas veces no hay
nada como un poco de ayuda y hay que indicarle si queremos desarrollar radicales o no, logaritmos,
etc como hemos visto antes.
Para simplificar expresiones racionales, ratsimp funciona bastante bien aunque hay veces que
es necesario aplicarlo ms de una vez. La orden fullratsimp simplifica algo mejor a costa de
algo ms de tiempo y proceso.

(%i30)

fullratsimp((x+a)(x-b) 2(x 2-a 2)/(x-a));

(%o30)

x4 +(2a-2b)x3 +(b2 -4ab+a2 )x2 +(2ab2 -2a2 b)x+a2 b2

Para simplificar expresiones que contienen radicales, exponenciales o logaritmos es ms til la


orden radcan

1.6.3

(%i31)

radcan((%e (2x)-1)/(%e x+1));

(%o31)

%e x -1

Expresiones trigonomtricas
Maxima conoce las identidades trigonomtricas y puede usarlas para simplificar expresiones
en las que aparezcan dichas funciones. En lugar de expand y factor, utilizaremos las rdenes
trigexpand, trigsimp y trigreduce.

trigexpand(expresion )

desarrolla funciones
trigonomtricas e hiprbolicas

trigsimp(expresion )

simplifica funciones
trigonomtricas e hiperblicas

trigreduce(expresion )

simplifica funciones
trigonomtricas e hiperblicas

Por ejemplo,

(%i32)

trigexpand(cos(a+b);

(%o32)

cos(a)cos(b)-sin(a)sin(b);

(%i33)

trigexpand(sin(2atan(x)));
2x
x2 +1
trigexpand(sin(x+3y)+cos(2z)sin(x-y));

(%o33)
(%i34)

25

Expresiones simblicas

Primeros pasos

(%o34)

-(cos(x)sin(y)-sin(x)cos(y))(cos(z)2 -sin(z)2 )+cos(x)sin(3y)+


sin(x)cos(3y)

(%i35)

trigexpand(8sin(2x) 2cos(x) 3);

(%o35)

32 cos(x)5 sin(x)2

Compara el resultado del comando trigexpand con el comando trigreduce en la ltima


expresin:

(%i36)
(%o36)

trigreduce(8sin(2x) 2cos(x) 3);


 cos(5 x) cos(3 x) 
cos(7 x) cos(x)

+
3
+
(3
(x)
cos
x)
3
cos
2
2
2

8 2

+
+

8
8
8
8

Quizs es complicado ver qu est ocurriendo con estas expresiones tan largas. Vamos a ver
cmo se comportan en una un poco ms sencilla:

(%i37)

eq:cos(2*x)+cos(x) 2$

(%i38)

trigexpand(eq);

(%o38)

2cos(x)2 -sin(x)2

(%i39)

(%i40)

trigreduce(eq);
cos(2x)+1
+cos(2x)
2
trigsimp(eq);

(%o40)

cos(2x)+cos(x)2

(%o39)

Como puedes ver, trigsimp intenta escribir la expresin de manera simple, trigexpand y
trigreduce desarrollan y agrupan en trminos similares pero mientras una prefiere usar potencias, la otra utiliza mltiplos de la variable. Estos es muy a grosso modo.
Cualquiera de estas rdenes opera de manera similar con funciones hiperblicas:

(%i41)

trigexpand(sinh(2x) 3);

(%o41)

8 cosh(x)3 sinh(x)3

(%i42)

trigreduce(cosh(x+y)+sinh(x) 2);
cosh(2x)-1
cosh(y+x)+
2

(%o42)

Observacin 1.5. Al igual que con expand o ratsimp, se puede ajustar el comportamiento de
estas rdenes mediante el valor de algunas variables como trigexpand, trigexpandplus o
trigexpandtimes. Consulta la ayuda de Maxima si ests interesado.

26

Primeros pasos

La ayuda de Maxima

1.7 La ayuda de Maxima


El entorno wxMaxima permite acceder a la amplia ayuda incluida con Maxima de una manera
grfica. En el mismo men tenemos algunos comandos que nos pueden ser tiles.

describe(expr )
example(expr )
apropos("expr ")
??expr

ayuda sobre expr


ejemplo de expr
comandos relacionados con expr
comandos que contienen expr

Figura 1.3 Ayuda de wxMaxima


En el caso de que conozcamos el nombre del comando sobre el que estamos buscando ayuda, la
orden describe 3 nos da una breve, a veces no tan breve, explicacin sobre la variable, comando
o lo que sea que hayamos preguntado.

(%i43)

describe(dependencies); -- Variable del sistema: dependencies


Valor por defecto: []
La variable dependencies es la lista de tomos que tienen
algn
tipo de dependencia funcional, asignada por depends o
gradef.
La lista dependencies es acumulativa: cada llamada a depends o
gradef aade elementos adicionales.
Vanse depends y gradef.

El comando describe(expr ) produce el mismo resultado que ?expr . Es obligatorio el espacio en blanco entre la
interrogacin y la expresin.

27

describe

La ayuda de Maxima

(%o43)

Primeros pasos

true

Claro que a veces nos equivocamos y no nos acordamos exactamente del nombre del comando

(%i44)

describe(plot); No exact match found for topic plot.


Try ?? plot (inexact match) instead.

(%o44)

false

La solucin la tenemos escrita justo en la salida anterior: ?? busca en la ayuda comandos, variables, etc. que contengan la cadena plot.

apropos

(%i45)

??plot 0: Funciones y variables para plotdf


1: Introduccin a plotdf
2: barsplot (Funciones y variables para grficos estadsticos)
3: boxplot (Funciones y variables para grficos estadsticos)
4: contour_plot (Funciones y variables para grficos)
5: gnuplot_close (Funciones y variables para grficos)
6: gnuplot_replot (Funciones y variables para grficos)
7: gnuplot_reset (Funciones y variables para grficos)
8: gnuplot_restart (Funciones y variables para grficos)
9: gnuplot_start (Funciones y variables para grficos)
10: plot2d (Funciones y variables para grficos)
11: plot3d (Funciones y variables para grficos)
12: plotdf (Funciones y variables para plotdf)
13: plot_options (Funciones y variables para grficos)
14: scatterplot (Funciones y variables para grficos estadsticos)
15: set_plot_option (Funciones y variables para grficos)
Enter space-separated numbers, all or none:none;

(%o45)

true

Si, como en este caso, hay varias posibles elecciones, Maxima se queda esperando hasta que escribimos el nmero que corresponde al tem en que estamos interesados, o all o none si estamos
interesados en todos o en ninguno respectivamente. Mientras no respondamos a esto no podemos
realizar ninguna otra operacin.
Si has mirado en el men de wxMaxima, seguramente habrs visto AyudaA propsito. Su
propsito es similar a las dos interrogaciones, ??, que acabamos de ver pero el resultado es levemente distinto:

(%i46)

apropos("plot");

28

Primeros pasos

(%o46)

Ejercicios

[plot,plot2d,plot3d,plotheight,plotmode,plotting,
plot_format,plot_options,plot_realpart]

nos da la lista de comandos en los que aparece la cadena plot sin incluir nada ms. Si ya tenemos
una idea de lo que estamos buscando, muchas veces ser suficiente con esto.
Muchas veces es mejor un ejemplo sobre cmo se utiliza una orden que una explicacin terica. Esto lo podemos conseguir con la orden example.
example

(%i47)

example(limit);

(%i48)

limit(xlog(x),x,0,plus)

(%o48)

(%i49)

limit((x+1) (1/x),x,0)

(%o49)

%e

(%i50)

limit(%e x/x,x,inf)

(%o50)

(%i51)

limit(sin(1/x),x,0)

(%o51)

ind

(%o51)

done

Por ltimo, la ayuda completa de Maxima est disponible en la pgina web de Maxima
http://maxima.sourceforge.net/es/
en formato PDF y como pgina web. Son ms de 800 pginas que explican prcticamente cualquier
detalle que se te pueda ocurrir.

1.8 Ejercicios
Ejercicio 1.1. Calcula
a) Los 100 primeros decimales del nmero e,
b) el logaritmo en base 3 de 16423203268260658146231467800709255289.
c) el arcocoseno hiperblico de 1,
d) el seno y el coseno de i, y
e) el logaritmo de -2.
Ejercicio 1.2.
a) Qu nmero es mayor 1000999 o 9991000 ?
b) Ordena de mayor a menor los nmeros , 73231844868435875
37631844868435563 y cosh(3)/3.
Ejercicio 1.3.

Descompn la fraccin

x2 4
x5 +x4 2 x3 2 x2 +x+1

29

en fracciones simples.

Ejercicios

Primeros pasos

Ejercicio 1.4. Escribe sen(5x) cos(3x) en funcin de sen(x) y cos(x).


Ejercicio 1.5. Comprueba si las funciones hiperblicas y las correspondientes arco-versiones
son inversas.

30

Grficos

Funciones

Grficos
2
2.1 Funciones 31 2.2 Grficos en el plano con plot2d 35
draw 39 2.4 Animaciones grficas 49 2.5 Ejercicios 52

2.3 Grficos con

El objetivo de este captulo es aprender a representar grficos en dos dimensiones. Lo haremos,


tanto para grficas en coordenadas cartesianas como para grficas en coordenadas paramtricas y
polares. wxMaxima permite hacer esto fcilmente aunque tambin veremos cmo utilizar el mdulo draw que nos da algunas posibilidades ms sin complicar excesivamente la escritura.
Aunque slo vamos a hablar de grficos en dos dimensiones, hay que decir que se pueden realizar
representaciones en tres dimensiones de manera anloga. En la ayuda de Maxima puedes encontrar
todos los detalles.

2.1 Funciones
funcion(var1,var2,..) :=[expr1,expr2,... ]
define (func,expr )
fundef(func )
functions
remfunction(func1,func2,... )

definicin de funcin
la funcin vale expr
devuelve la definicin de la funcin
lista de funciones
definidas por el usuario
borra las funciones

Para definir una funcin en Maxima se utiliza el operador :=. Se pueden definir funciones de una
o varias variables, con valores escalares o vectoriales,

(%i1)

f(x):=sin(x);

(%o1)

f(x):=sin(x)

que se pueden utilizar como cualquier otra funcin.

(%i2)
(%o2)

f(%pi/4);
1

Si la funcin tiene valores vectoriales o varias variables tampoco hay problema:

(%i3)

g(x,y,z):=[2x,3cos(x+y)];

31

Funciones

define

Grficos

(%o3)

g(x,y,z):=[2x,3cos(x+y)]

(%i4)

g(1,%pi,0);

(%o4)

[2,-3cos(1)]

Tambin se puede utilizar el comando define para definir una funcin. Por ejemplo, podemos
utilizar la funcin g para definir una nueva funcin y, de hecho veremos que sta es la manera
correcta de hacerlo cuando la definicin involucra funciones previamente definidas, derivadas de
funciones, etc. El motivo es que la orden define evala los comandos que pongamos en la definicin.

(%i5)

define(h(x,y,z),g(x,y,z) 2);

(%o5)

h(x,y,z):=[4x2 ,9cos(y+x)2 ]

Eso s, aunque hemos definido las funciones f , g y h, para utilizarlas debemos aadirles variables:

(%i6)

g;

(%o6)

Si queremos saber cul es la definicin de la funcin g, tenemos que preguntar

(%i7)

g(x,y);
Too few arguments supplied to g(x,y,z):
[x,y]
-- an error. To debug this try debugmode(true);

pero teniendo cuidado de escribir el nmero correcto de


variables

(%i8)

g(x,y,z);

(%o8)

[2x,3cos(y+x)]

Esto plantea varias cuestiones muy relacionadas entre


s: cuando llevamos un rato trabajando y hemos definido
varias funciones, cmo sabemos cuales eran? y cul
era su definicin?. La lista de funciones que hemos definido se guarda en la variable functions a la que tambin puedes acceder desde el men MaximaMostrar
funciones de manera similar a como accedemos a la lista de variables. En el mismo men, MaximaBorrar

32

Figura 2.1 Desde el men podemos


consultar las funciones que tenemos
definidas, cul es su definicin y borrar
algunas o todas ellas

Grficos

Funciones

funcin tenemos la solucin a cmo borrar una funcin (o todas). Tambin podemos hacer esto
con la orden remfunction.

(%i9)

functions;

(%o9)

[f(x),g(x,y,z),h(x,y,z)]

Ya sabemos preguntar cul es la definicin de cada una de ellas. Ms cmodo es, quizs, utilizar
la orden fundef que nos evita escribir las variables

(%i10)

fundef(f);

(%o10)

f(x):=sin(x)

que, si nos interesa, podemos borrar

(%i11)

remfunction(f);

(%o11)

[f]

o, simplemente, borrar todas las que tengamos definidas

(%i12)

remfunction(all);

(%o12)

[g,h]

Funciones definidas a trozos


Las funciones definidas a trozos plantean algunos problemas de difcil solucin para Maxima.
Esencialmente hay dos formas de definir y trabajar con funciones a trozos:
a) definir una funcin para cada trozo con lo que tendremos que ocuparnos nosotros de ir escogiendo de elegir la funcin adecuada, o
b) utilizar una estructura if-then-else para definirla. 4
Cada uno de los mtodos tiene sus ventajas e inconvenientes. El primero de ellos nos hace aumentar el nmero de funciones que definimos, usamos y tenemos que nombrar y recordar. Adems
de esto, cualquier cosa que queramos hacer, ya sea representar grficamente o calcular una integral
tenemos que plantearlo nosotros. Maxima no se encarga de esto. La principal limitacin del segundo mtodo es que las funciones definidas de esta manera no nos sirven para derivarlas o integrarlas,
aunque s podremos dibujar su grfica. Por ejemplo, la funcin
(
x2 , si x < 0
f (x) =
x3 , en otro caso
la podemos definir de la siguiente forma utilizando el segundo mtodo

En la seccin 5.3 explicamos con ms detalle este tipo de estructuras

33

remfunction

fundef

Funciones

Grficos

(%i13)

f(x):=if x< 0 then x 2 else x 3;

(%o13)

f(x):=if x< 0 then x2 else x3

y podemos evaluarla en un punto

(%i14)

f(-2);

(%o14)

(%i15)

f(2);

(%o15)

o dibujarla

(%i16)

plot2d(f(x),[x,-3,3]);

(%o16)

30

20

if x < 0 then x else x

25

15

10

0
-3

-2

pero no podemos calcular

-1

R3
3

0
x

f (x) dx:

(%i17)

integrate(f(x),x,-3,3);

(%o17)

R3
3

if x<0 then x2 else x3 dx

La otra posibilidad es mucho ms de andar por casa, pero muy prctica. Podemos definir las
funciones

(%i18)

f1(x):=x 2$

(%i19)

f2(x):=x 3$

y decidir nosotros cul es la que tenemos que utilizar:

(%i20)
(%o20)

integrate(f1(x),x,-3,0)+integrate(f2(x),x,0,3);
117
4

34

Grficos

Grficos en el plano con plot2d

Evidentemente, si la funcin tiene muchos trozos, la definicin se alarga; no cabe otra posibilidad. En este caso tenemos que anidar varias estructuras if-then-else o definir tantas funciones
como trozos. Por ejemplo, la funcin
2

x ,
si x 1,

g(x) =
sen(x),
si
1 x ,

x + 1, si x >
la podemos escribir como sigue anidando dos condicionales

(%i21)

g(x):=if x<=1 then x 2 else


if x <= %pi then sin(x) else -x+1$

Comprobamos que la definicin se comporta correctamente en un valor de cada intervalo

(%i22)

[g(-3),g(2),g(5)];

(%o22)

[9,sin(2),-4]

2.2 Grficos en el plano con plot2d


El comando que se utiliza para representar la grfica de una funcin de una variable real es
plot2d que acta, como mnimo, con dos parmetros: la funcin (o lista de funciones a represen- plot2d
tar), y el intervalo de valores para la variable x. Al comando plot2d se puede acceder tambin a
travs del men GrficosGrficos 2D.

plot2d(f(x),[x,a,b]) grfica de f (x) en [a, b]


plot2d([f1(x),f2(x),...],[x,a,b]) grfica de una lista de funciones en [a, b]
Podemos dibujar la grfica de una funcin

(%i23)

plot2d(sin(2*x),[x,-2*%pi,2*%pi]);

(%o23)

sin(2*x)

0.5

-0.5

-1
-6

-4

-2

0
x

o de varias

(%i24)

plot2d([x 2,sqrt(2*x)],[x,-2,2]);

35

Grficos en el plano con plot2d

(%o24)

Grficos

x2
sqrt(2)*sqrt(x)

3.5
3
2.5
2
1.5
1
0.5
0
-2

-1.5

-1

-0.5

0.5

1.5

Observa en esta ltima salida cmo el programa asigna a cada grfica un color distinto para
diferenciarlas mejor y aade la correspondiente explicacin de qu color representa a cada funcin.
Cuando accedemos a travs del men, aparece una ventana de dilogo con varios campos que
podemos completar o modificar:
a) Expresin(es). La funcin o funciones que queramos dibujar. Por defecto, wxMaxima rellena
este espacio con % para referirse a la salida anterior.
b) Variable x. Aqu establecemos el intervalo de la variable x donde queramos representar la funcin.
c) Variable y. dem para acotar el recorrido de los
valores de la imagen.
d) Graduaciones. Nos permite regular el nmero de
puntos en los que el programa evala una funcin
para su representacin.
e) Formato. Maxima realiza por defecto la grfica
con un programa auxiliar. Si seleccionamos en
lnea, dicho programa auxiliar es wxMaxima y
obtendremos la grfica en una ventana alineada
con la salida correspondiente. Hay dos opciones
ms y ambas abren una ventana externa para dibuFigura 2.2 Grficos en 2D
jar la grfica requerida: gnuplot es la opcin por
defecto que utiliza el programa Gnuplot para realizar la representacin; tambin est disponible la opcin openmath que utiliza el programa XMaxima. Prueba las diferentes opciones y
decide cul te gusta ms.
f) Opciones. Aqu podemos seleccionar algunas opciones para que, por ejemplo, dibuje los ejes de
coordenadas ("set zeroaxis;"); dibuje los ejes de coordenadas, de forma que cada unidad
en el eje Y sea igual que el eje X ("set size ratio 1; set zeroaxis;"); dibuje una
cuadrcula ("set grid;") o dibuje una grfica en coordenadas polares ("set polar; set
zeroaxis;"). Esta ltima opcin la comentamos ms adelante.
g) Grfico al archivo. Guarda el grfico en un archivo con formato Postscript.
Evidentemente, estas no son todas las posibles opciones. La cantidad de posibilidades que tiene
Gnuplot es inmensa.
Observacin 2.1. El prefijo wx aadido a plot2d o a cualquiera del resto de las rdenes
que veremos en este captulo hace que wxMaxima pase automticamente a mostrar los grficos
en la misma ventana y no en una ventana separada. Es lo mismo que seleccionar en lnea. Por
ejemplo,

36

Grficos

(%i25)

Grficos en el plano con plot2d

wxplot2d(sin(2x),[x,-2%pi,2%pi]);
1

(%t25)

sin(2*x)

0.5

-0.5

-1
-6

-4

-2

Es complicado representar una ventana separada en unas notas escritas as que, aunque no utilicemos wxplot2d, s hemos representado todas las grficas a continuacin de la correspondiente wxplot2d
orden.
Veamos algunos ejemplos de las opciones que hemos comentado. Podemos aadir ejes,

(%i26)

plot2d(x/(x 2-4), [x,-6,6], [y,-6,6],


[gnuplot_preamble, "set zeroaxis;"])$

(%o26)

x/(x -4)

-2

-4

-6
-6

-4

-2

0
x

podemos cambiar la proporcin entre ejes.

(%i27)

plot2d(x/(x 2-4), [x,-6,6], [y,-6,6],


[gnuplot_preamble, "set size ratio 1; set zeroaxis;"])$

(%o27)

x/(x2-4)

-2

-4

-6
-6

-4

-2

0
x

37

Grficos en el plano con plot2d

Grficos

set size ratio 1 dibuja ambos ejes con el mismo tamao en pantalla, set size ratio 2
o set size ratio 0.5 dibuja el eje X el doble o la mitad de grande que el eje Y. O podemos
aadir una malla que nos facilite la lectura de los valores de la funcin.
(%i28)

plot2d(x/(x 2-4),[x,-6,6],[y,-6,6],
[gnuplot_preamble, "set grid;"])$

(%o28)

x/(x -4)

-2

-4

-6
-6

-4

-2

0
x

Con el siguiente ejemplo vamos a ver la utilidad de laopcin "set


size ratio 1; set
zeroaxis;". En primer lugar dibujamos las funciones 1 x2 y 1 x2 , con x [1, 1].
El resultado debera ser la circunferencia unidad. Sin embargo, aparentemente es una elipse. Lo
arreglamos de la siguiente forma:

(%i29)

plot2d([sqrt(1-x 2,-sqrt(1-x 2)],[x,-1,1],[y,-1,1],


[gnuplot_preamble, "set size ratio 1; set zeroaxis;"])$

(%o29)

sqrt(1-x2)
-sqrt(1-x2)

0.5

-0.5

-1
-1

-0.5

0
x

0.5

Tambin podemos dibujar grficas de funciones a trozos. Antes, tenemos que recordar cmo
se definen estas funciones. Lo hacemos con un ejemplo. Consideremos la funcin f : R R
definida como
(
x si x < 0
f (x) =
3
x
si x 0.
Vamos, en primer lugar, a definirla:

(%i30)

f(x):= if x<0 then sqrt(-x) else x 3;

38

Grficos

(%o30)

Grficos con draw

f(x):= if x<0 then

x else x3

y luego la representamos

(%i31)

plot2d(f(x),[x,-9,9],[y,-1,6],
[gnuplot_preamble,"set zeroaxis;"])$

(%o31)

if x < 0 then sqrt(-x) else x

-1
-8

-6

-4

-2

0
x

2.3 Grficos con draw


El mdulo draw es relativamente reciente en la historia de Maxima y permite dibujar grficos
en 2 y 3 dimensiones con relativa comodidad. Se trata de un mdulo adicional que hay que cargar
previamente. Este se hace de la siguiente forma

(%i32)

load(draw)$
gr2d(opciones, objeto grfico,... )
draw(opciones, objeto grfico,... )
draw2d(opciones, objeto grfico,... )

grfico dos dimensional


dibuja un grfico
dibuja grfico dos dimensional

El paquete draw, permite utilizar, entre otras, la orden draw2d para dibujar grficos en dos dimensiones. Un grfico est compuesto por varias opciones y el objeto grfico que queremos dibujar.
Por ejemplo, en dos dimensiones tendramos algo as:

objeto:gr2d(
color=blue,
nticks=60,
explicit(cos(t),t,0,2$*$\%pi)
)
Las opciones son numerosas y permiten controlar prcticamente cualquier aspecto imaginable.
Aqu comentaremos algunas de ellas pero la ayuda del programa es insustituible. En segundo lugar
aparece el objeto grfico. En este caso explicit(cos(t),t,0,2%pi). Estos pueden ser de
varios tipos aunque los que ms usaremos son quizs explicit e implicit. Para dibujar un
grfico tenemos dos posibilidades
a) Si tenemos previamente definido el objeto, draw(objeto), o bien,
draw

39

Grficos con draw

draw2d

Grficos

b) draw2d(definicin del objeto) si lo definimos en ese momento para dibujarlo.


Por ejemplo,

(%i33)

coseno:gr2d(
color=blue,
explicit(cos(x),x,0,4*%pi))$

(%i34)

draw(coseno);

(%o34)

0.5

-0.5

-1
0

10

12

da el mismo resultado que

(%i35)

(%o35)

draw2d(
color=blue,
explicit(cos(x),x,0,4*%pi)
);
1

0.5

-0.5

-1
0

10

12

Tambin podemos representar ms de un objeto en un mismo grfico. Simplemente escribimos


uno tras otro separados por comas. En el siguiente ejemplo estamos mezclando una funcin dada
explcitamente y una curva en coordenadas paramtricas.

(%i36)

draw2d(
color=red,
explicit(x 2,x,-1,1),
color=blue,nticks=60,
implicit(x 2+y 2=1,x,-1,1,y,-1,1)
);

40

Grficos

Grficos con draw

(%o36)

Vamos a comentar brevemente alguno de los objetos y de las opciones del mdulo draw. Comenzamos con algunos de los objetos que podemos representar y, posteriormente, comentamos
algunas opciones.

2.3.1

Objetos
explicit: nos permite dibujar una funcin de una o dos variables. Para funciones de una variable
usaremos explicit( f (x), x,a,b) para dibujar f (x) en [a, b]. Con funciones de dos variables
escribiremos explicit( f (x, y), x,a,b,y,c,d).
(%i37)

draw2d(
color=dark-red,line_width=5,
xaxis=true,yaxis=true,
explicit(log(x),x,0,7));

(%o37)
1.5

0.5

-0.5

-1

-1.5

-2
0

implicit: nos permite dibujar el lugar de los puntos que verifican una ecuacin en el plano

41

Grficos con draw

(%i38)

(%o38)

Grficos

draw2d(
grid=true,
line_type=solid,
color=blue,
key="y 2=x 3-2x+1",
implicit(y 2=x 3-2x+1, x, -4,4, y, -4,4),
line_type=dots,
color=red,
key="x 3+y 3 = 3xy 2-x-1",
implicit(x 3+y 3 = 3xy 2-x-1, x,-4,4, y,-4,4),
title="dos funciones implcitas");
dos funciones impl citas
4

y^2=x^3-2*x+1
x^3+y^3 = 3*x*y^2-x-1

3
2
1
0
-1
-2
-3
-4
-4

-3

-2

-1

rectangle: para dibujar un rectngulo slo tenemos que indicar el vrtice inferior izquierdo y
su opuesto.
(%i39)

draw2d(line_width=6,
line_type=dots,
transparent=false,
fill_color=spring-green,
rectangle([-2,-2],[6,-1]),
transparent=false,
fill_color=red,
line_type=solid,
line_width=2,
rectangle([9,4],[2,-1]),
xrange=[-3,10],
yrange=[-3,4.5]);

42

Grficos

(%o39)

Grficos con draw

-1

-2

-3
-2

10

ellipse: la orden ellipse permite dibujar elipses indicando 3 pares de nmeros: los dos primeros son las coordenadas del centro, los dos segundos indican la longitud de los semiejes y los
ltimos son los ngulos inicial y final.
En el dibujo siguiente puedes comprobar cmo la opcin nticks permite mejorar, aqu empeorar,
un grfico aumentando o, como en este caso, disminuyendo el nmero de puntos que se utilizan
para dibujarlo.
(%i40)

(%o40)

draw2d(
ellipse(0,0,4,2,0,180),
nticks = 5,
ellipse(0,0,4,2,180,360));
2

1.5

0.5

-0.5

-1

-1.5

-2
-4

-3

-2

-1

La parte superior de la elipse se ha dibujado utilizando 30 puntos y la inferior nicamente 5.

points: permite representar una lista de puntos en el plano. Las coordenadas de la lista las
escribimos de la forma 5 [[x1,y1],[x2,y2],...].
(%i41)

draw2d(
color=blue,
point_type=filled_circle,
point_size=2,
points(makelist([random(10.0),random(10.0)],k,1,150)));

En el ejemplo usamos la orden makelist que genera una lista de acuerdo a la regla que aparece como primera entrada
con tantos elementos como indique el contador que le sigue. En el prximo captulo lo comentaremos con ms detalle.

43

Grficos con draw

(%o41)

Grficos

9
8
7
6
5
4
3
2
1

vector: dibuja vectores tanto en dos como en tres dimensiones. Para dar un vector hay que fijar
el origen y la direccin.
(%i42)

draw2d(
head_length = 0.03, head_angle=20,
color=cyan, vector([0,0],[1,1]/sqrt(2)),
color=red, vector([0,0],[1,-1]/sqrt(2)),
color=blue, vector([0,0],[1,2]/sqrt(5)),
title="tres vectores");

(%o42)

En la ayuda puedes encontrar varios opciones sobre el aspecto como se representan los vectores.
Nosotros hemos usado head_length y head_angle para el tamao de la punta de la fecha de
los vectores.

2.3.2

Opciones
Es importante destacar que hay dos tipos de opciones: locales y globales. Las locales slo afectan
al objeto que les sigue y, obligatoriamente, tienen que precederlo. En cambio las globales afectan
a todos los objetos dentro de la orden draw y da igual su posicin (aunque solemos escribirlas
todas juntas al final).

44

Grficos

Grficos con draw

Opciones globales
xrange, yrange: rango de las variables x e y. Por defecto se ajusta automticamente al objeto
que se est representando pero hay ocasiones en que es preferible fijar un rango comn.
(%i43)

draw2d(color=blue,
explicit(cos(x),x,0,4%pi),
color=red,
explicit(x 3,x,-5,5),
xrange=[0,%pi],yrange=[-2,2])$
2

(%o43)

1.5

0.5

-0.5

-1

-1.5

-2
0

0.5

1.5

2.5

Si en el ejemplo anterior no limitamos el rango a representar, al menos en la coordenada y, es


difcil poder ver a la vez la funcin coseno que toma valores entre 1 y -1 y la funcin x3 que en 5
vale bastante ms.

grid: dibuja una malla sobre el plano XY si vale true.


(%i44)

(%o44)

draw2d(
color=blue,nticks=100,
implicit(xy=1,x,-3,3,y,-3,3),
grid=true)$
3

-1

-2

-3
-3

-2

-1

Acabamos de dibujar la hiprbola definida implcitamente por la ecuacin xy = 1. La opcin grid


nos ayuda a hacernos una idea de los valores que estamos representando.

title ="ttulo de la ventana" nos permite poner un ttulo a la ventana donde aparece el resultado
final. Es una opcin global.

45

Grficos con draw

(%i45)

Grficos

draw2d(
color=blue,
nticks=100,
implicit(xy=1,x,-3,3,y,-3,3),
grid=true,
title="Hiperbola"
)$

(%o45)

Hiperbola
3

-1

-2

-3
-3

-2

-1

xlabel, ylabel, zlabel: indica la etiqueta de cada eje. Es una opcin global.
(%i46)

draw2d(color=blue,
explicit(exp(x/2),x,-2,2),
xlabel="Tiempo",
ylabel="Habitantes",
title="Evolucion de la poblacion");

(%o46)

Evolucion de la poblacion

2.5

Habitantes

1.5

0.5
-2

-1.5

-1

-0.5

0
Tiempo

0.5

1.5

xaxis, yaxis: si vale true se dibuja el correspondiente eje. Es una opcin global.

Opciones locales
point_size: tamao al que se dibujan los puntos. Su valor por defecto es 1. Afecta a los objetos
de tipo point.
point_type: indica cmo se van a dibujar los puntos . El valor para esta opcin puede ser un nombre o un nmero: none (-1), dot (0),plus (1), multiply (2), asterisk (3), square (4), filled_square (5),
circle (6), filled_circle (7), up_triangle (8), filled_up_triangle (9), down_triangle (10), filled_down_triangle
(11), diamant (12) y filled_diamant (13). Afecta a los objetos de tipo point.

46

Grficos

Grficos con draw

filled_func: esta orden nos permite rellenar con un color la grfica de una funcin. Existen
dos posibilidades: si filled_func vale true se rellena la grfica de la funcin hasta la parte
inferior de la ventana con el color establecido en fill_color
(%i47)

(%o47)

draw2d(fill_color=blue,
filled_func=true,
explicit(cos(x),x,0,10)
):
1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
0

10

en cambio, si filled_func es una funcin, entonces se colorea el espacio entre dicha funcin y
la grfica que estemos dibujando

(%i48)

(%o48)

draw2d(
filled_func=sin(x),
fill_color=navy,
explicit(cos(x),x,0,10));
1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
0

10

En este caso, tenemos sombreada el rea entre las funciones seno y coseno. Podemos dibujar stas
tambin pero es necesario suprimir el sombreado si queremos que no tape a las funciones:

(%i49)

draw2d(
filled_func=sin(x),fill_color=navy,
explicit(cos(x),x,0,10),
filled_func=false,color=red,line_width=10,
explicit(sin(x),x,0,10),
color=yellow,line_width=10,
explicit(cos(x),x,0,10));

47

Grficos con draw

(%o49)

Grficos

1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
0

10

fill_color: ver el apartado anterior filled_func.


color: especifica el color en el que se dibujan lneas, puntos y bordes de polgonos. Directamente
de la ayuda de Maxima:
Los nombres de colores disponibles son: "white", "black",
"gray0", "grey0", "gray10", "grey10", "gray20",
"grey20", "gray30", "grey30", "gray40", "grey40",
"gray50", "grey50", "gray60", "grey60", "gray70",
"grey70", "gray80", "grey80", "gray90", "grey90",
"gray100", "grey100", "gray", "grey", "light-gray",
"light-grey", "dark-gray", "dark-grey", "red",
"light-red", "dark-red", "yellow", "light-yellow",
"dark-yellow", "green", "light-green", "dark-green",
"spring-green", "forest-green", "sea-green", "blue",
"light-blue", "dark-blue", "midnight-blue", "navy",
"medium-blue", "royalblue", "skyblue", "cyan",
"light-cyan", "dark-cyan", "magenta", "light-magenta",
"dark-magenta", "turquoise", "light-turquoise",
"dark-turquoise", "pink", "light-pink", "dark-pink",
"coral", "light-coral", "orange-red", "salmon",
"light-salmon", "dark-salmon", "aquamarine", "khaki",
"dark-khaki", "goldenrod", "light-goldenrod",
"dark-goldenrod", "gold", "beige", "brown", "orange",
"dark-orange", "violet", "dark-violet", "plum" y
"purple".
Ya lo hemos usado en casi todos los ejemplos anteriores.

line_width: grosor con el que se dibujan las lneas. Su valor por defecto es 1.
(%i50)

draw2d(
color=blue,line_width=10,nticks=100,
implicit(xy=1,x,-3,3,y,-3,3),
grid=true,
)$

48

Grficos

(%o50)

Animaciones grficas

-1

-2

-3
-3

-2

-1

nticks: nmero de puntos que se utilizan para calcular los dibujos. Por defecto es 30. Un nmero
mayor aumenta el detalle del dibujo aunque a costa de un mayor tiempo de clculo y tamao del
fichero (si se guarda). Slo afecta a los objetos de tipo ellipse, explicit, parametric, polar
y parametric.
key: indica la leyenda con la que se identifica la funcin.
(%i51)

draw2d(color=blue,key="funcin",explicit(f(x),x,-2,3),
color=red,key="tangente",explicit(tangente(x,1),x,-2,3),
grid=true);

(%o51)

funcion
tangente
5

-5

-10

-2

-1

2.4 Animaciones grficas


Con wxMaxima es muy fcil hacer animaciones grficas que dependen de un parmetro. Por
ejemplo, la funcin sen(x + n) depende del parmetro n. Podemos representar su grfica para
distintos valores de n y con ello logramos una buena visualizacin de su evolucin (que en este
caso ser una onda que se desplaza). Para que una animacin tenga calidad es necesario que todos
los grficos individuales tengan el mismo tamao y que no den saltos para lo que elegimos un
intervalo del eje de ordenadas comn.
Para ver la animacin, cuando se hayan representado las grficas, haz clic con el ratn sobre
ella y desplaza la barra (slider) que tienes bajo el men. De esta forma t mismo puedes controlar
el sentido de la animacin , as como la velocidad.

with_slider
with_slider_draw

animacin de plot2d
animacin de draw2d

49

Animaciones grficas

Tenemos dos posibilidades para construir animaciones dependiendo de si queremos que Maxima
utilice plot2d o draw2d. En cualquier caso, en primer lugar siempre empezamos con el parmetro, una lista de valores del parmetro y el resto debe ser algo aceptable por el correspondiente
comando con el que vayamos a dibujar.
Por ejemplo, vamos a crear una animacin con la orden with slider de la funcin sen(x + n),
donde el parmetro n va a tomar los valores desde 1 a 20. La orden makelist(i,i,1,20) nos
da todos los nmeros naturales comprendidos entre 1 y 20. Ya veremos con ms detalle en el
Captulo 3 cmo podemos manejar listas.

with slider(n,
makelist(i,i,1,20),
sin(x+n),
[x,-2*%pi,2*%pi],
[y,-1.1,1.1]);

(%i52)

En la Figura 2.3 tienes la representacin de algunos valores.


1

0.5

0.5

sin(x+15)

sin(x+5)

with_slider

Grficos

-0.5

-0.5

-1

-1
-6

-4

-2

0
x

-6

n = 5

-4

-2

0
x

n = 15
Figura 2.3 sen(x + n)

Si en lugar de sumar el parmetro a la variable (que traslada la funcin), multiplicamos el parmetro


y la variable conseguimos cambiar la frecuencia de la onda que estamos dibujando.

(%i53)

with slider(n,makelist(i,i,1,20),sin(xn),
[x,-2*%pi,2*%pi],[y,-1.1,1.1]);

Puedes ver en la Figura 2.4 puedes ver cmo aumenta la frecuencia con n.
Si en lugar de plot2d, utilizamos el mdulo draw para disear los dibujos, tenemos que usar
with_slider_draw. De nuevo, en primer lugar va el parmetro, despus, una lista que indica
los valores que tomar el parmetro y el resto debe ser algo aceptable por la orden draw. Un
detalle importante en este caso es que el parmetro no slo puede afectar a la funcin sino que
podemos utilizarlo en cualquier otra parte de la expresin. Por ejemplo, podemos utilizar esto para
ir dibujando poco a poco una circunferencia en coordenadas paramtricas de la siguiente forma

50

Animaciones grficas

0.5

0.5

sin(15*x)

sin(5*x)

Grficos

-0.5

-0.5

-1

-1
-6

-4

-2

0
x

-6

-4

-2

n = 5

0
x

n = 15
Figura 2.4 sen(n x)

(%i54)

with_slider_draw(
t,makelist(%pii/10,i,1,20),
parametric(cos(x),sin(x),x,0,t),
xrange=[-1,1],
yrange=[-1,1],
user_preamble="set size ratio 1")$

En la Figura 2.5 tenemos representados algunos pasos intermedios


1

0.5

0.5

-0.5

-0.5

-1

-1

-0.5

0.5

-1

t =

-1

-0.5

0.5

y = 3/2

Figura 2.5 Construccin de una circunferencia en paramtricas


El tipo de objeto parametric no lo hemos comentado en los apartados anteriores. Nos permite
representar la grfica de una curva en el plano. En la ayuda de Maxima puedes encontrar ms
detalles.
En el ltimo ejemplo podemos ver cmo se pueden combinar funciones definidas explcita e
implcitamente juntos con vectores para obtener una representacin de las funciones seno y coseno.

51

Ejercicios

(%i55)

Grficos

with_slider_draw(t,makelist(2%pii/39,i,1,40),
line_width=3, color=blue,
parametric(cos(x),sin(x),x,0,t),
color=light-red, key="seno",
explicit(sin(x),x,0,t),
color=dark-red, key="coseno",
explicit(cos(x),x,0,t),
line_type=dots, head_length=0.1,
color=dark-red, key="",
vector([0,0],[cos(t),0]),
color=light-red, line_type=dots,
head_length=0.1, key="",
vector([0,0],[0,sin(t)]),
line_type=dots, head_length=0.1, key="",
vector([0,0],[cos(t),sin(t)]),
xaxis=true,yaxis=true,
title="Funciones seno y coseno",
xrange=[-1,2%pi],yrange=[-1,1]);

Para t = 5, el resultado lo puedes ver en la Figura 2.6


Funciones seno y coseno
1

seno
coseno

0.5

-0.5

-1

-1

Figura 2.6

Las funciones seno y coseno

2.5 Ejercicios
Ejercicio 2.1. Representa en una misma grfica las funciones seno y coseno en el intervalo
[2, 2]. Utiliza las opciones adecuadas para que una de las funciones se represente en azul y
otra en rojo y, adems, tengan grosores distintos.
Ejercicio 2.2. Compara las grficas de las funciones cos(x) y cos(x). A qu conclusin llegas
sobre la paridad o imparidad de la funcin coseno? Haz lo mismo con las funciones sen(x) y
sen(x).

52

Grficos

Ejercicios

Ejercicio 2.3. Representa las funciones logaritmo neperiano, exponencial y f (x) = x2 con
colores diferentes. Compara el crecimiento de estas funciones cerca de cero y lejos de cero. Qu
ocurre si la base de la exponencial y del logaritmo es menor que 1?
Ejercicio 2.4. Dibuja las grficas de las funciones coseno hiperblico, seno hiperblico, argumento seno hiperblico y argumento coseno hiperblico. Alguna de ellas es par o impar? Son
positivas?
Ejercicio 2.5. Representa la curva cos(x)2 x sen(x)2 en el intervalo [, ] y sobre ella 5
puntos cuyo tamao y color debes elegir t. Sabras hacer lo mismo con 8 puntos elegidos aleatoriamente? 6
Ejercicio 2.6.

Representa la grfica de la funcin f : R+0 R definida como


( 3x+1
e  ,  si 0 x < 10,
f (x) =
ln x2 + 1 , si x 10.

Ejercicio 2.7. Encuentra las funciones cuyas grficas corresponden a las siguientes curvas:

(a)

(b)

(c)

(d)

En el siguiente captulo puedes encontrar una explicacin ms detallada sobre como definir y operar con listas.

53

54

Listas y matrices

Listas

Listas y matrices
3
3.1 Listas 55 3.2 Matrices 60

3.3 Ejercicios 69

3.1 Listas
Maxima tiene una manera fcil de agrupar objetos, ya sean nmeros, funciones, cadenas de
texto, etc. y poder operar con ellos. Una lista se escribe agrupando entre corchetes los objetos que
queramos separados por comas. Por ejemplo,

(%i1)

[0,1,-3];

(%o1)

[0,1,-3]

es una lista de nmeros. Tambin podemos escribir listas de funciones

(%i2)

[x,x 2,x 3]

(%o2)

[x,x2 ,x3 ]

o mezclar nmeros, variables y texto

(%i3)

[0,1,-3,a,"hola"];

(%o3)

[0,1,-3,a,hola]
first, second,...,tenth
lista[i]
last
part
reverse
sort
flatten
length
unique

primera, segunda,...,dcima
entrada de una lista
entrada i-sima de la lista
ltimo elemento de una lista
busca un elemento dando
su posicin en la lista
invertir lista
ordenar lista
unifica las sublistas en una lista
longitud de la lista
elementos que slo aparecen
una vez en la lista

55

Listas

Listas y matrices

Los elementos que forman la lista pueden ser, a su vez, listas (aunque no es exactamente lo mismo,
piensa en matrices como listas de vectores):

(%i4)
(%o4)



lista: [1,2],1,[3,a,1]


[1,2],1,[3,a,1]

Podemos referirnos a una entrada concreta de una lista. De hecho Maxima tiene puesto nombre
a las diez primeras: first, second,..., tenth

last

part

(%i5)

first(lista);

(%o5)

[1,2]

(%i6)

second(lista);

(%o6)

o podemos referirnos directamente al ltimo trmino.

(%i7)

last(lista);

(%o7)

[3,a,1]

Si sabemos la posicin que ocupa, podemos refererirnos a un elemento de la lista utilizando part.
Por ejemplo,

(%i8)

part(lista,1)

(%o8)

[1,2]

nos da el primer elemento de la lista anterior. Obtenemos el mismo resultado indicando la posicin
entre corchetes. Por ejemplo,

(%i9)

lista[3];

(%o9)

[3,a,1]

y tambin podemos anidar esta operacin para obtener elementos de una sublista

(%i10)

lista[3][1];

(%o10)

Con part podemos extraer varios elementos de la lista enumerando sus posiciones. Por ejemplo,
el primer y el tercer elemento de la lista son

56

Listas y matrices

(%i11)

part(lista,[1,3]);

(%o11)

[[1,2],[3,a,1]]

Listas

o el segundo trmino del tercero que era a su vez una lista:

(%i12)

part(lista,3,2);

(%o12)

El comando flatten construye una nica lista con todas los elementos, sean estos listas o no. flatten
Mejor un ejemplo:

(%i13)

flatten([[1,2],1,[3,a,1]])

(%o13)

[1,2,1,3,a,1]

La lista que hemos obtenido contiene todos los anteriores. Podemos eliminar los repetidos con

unique

unique

(%i14)

unique(%)

(%o14)

[1,2,3,a]

Vectores
En el caso de vectores, listas de nmeros, tenemos algunas posibilidades ms. Podemos sumarlos

(%i15)

v1:[1,0,-1];v2:[-2,1,3];

(%o15)

[1,0,-1]

(%o16)

[-2,1,3]

(%i17)

v1+v2;

(%o17)

[-1,1,2]

o multiplicarlos.

(%i18)

v1v2;

(%o18)

[-2,0,-3]

Un momento, cmo los hemos multiplicado? Trmino a trmino. Esto no tiene nada que ver con
el producto escalar o con el producto vectorial. El producto escalar, por ejemplo, se indica con .

(%i19)

v1.v2;

57

Listas

(%o19)
sort

length

3.1.1

Listas y matrices

-5

Podemos ordenar los elementos de la lista (del vector en este caso)

(%i20)

sort(v1);

(%o20)

[-1,0,1]

o saber cuntos elementos tiene

(%i21)

length(v1);

(%o21)

Construir y operar con listas


makelist
apply
map
listp(expr )

makelist

genera lista
aplicar un operador a una lista
aplicar una funcin a una lista
devuelve true si la expresin
es una lista

Los ejemplos que hemos visto de listas hasta ahora son mezcla de nmeros y letras de forma
bastante aleatoria. En la prctica, muchas de las listas que aparecen estn definidas por alguna
regla. Por ejemplo, queremos dibujar las funciones sen(x), sen(2x),..., sen(20x). Seguro que no
tienes ganas de escribir la lista completa. Este es el papel de la orden makelist. Para escribir esa
lista necesitamos la regla, la frmula que la define, un parmetro y entre qu dos valores se mueve
dicho parmetro:

(%i22)

makelist(sin(tx),t,1,20)

(%o22)

[sin(x),sin(2 x),sin(3 x),sin(4 x),sin(5 x),sin(6 x),


sin(7 x),sin(8 x),sin(9 x),sin(10 x),sin(11 x),
sin(12 x),sin(13 x),
sin(14 x),sin(15 x),
sin(16 x),sin(17 x),sin(18 x),sin(19 x),sin(20 x)]

Las listas tambin se pueden utilizar como contadores. El caso que suele ser ms til es una lista
cuyas entradas sean un rango de enteros. Por ejemplo, los primeros cien naturales empezamos en
uno) son

(%i23)

makelist(i,i,1,100);

58

Listas y matrices

(%o23)

Listas

[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,
23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,
42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,
61,62,63,64,65,66,67, 68,69,70,71,72,73,74,75,76,77,78,79,
80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,
99,100]

o si slo queremos los pares:

(%i24)

makelist(2i,i,1,50);

(%o24)

[2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,
42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,
80,82,84,86,88,90,92,94,96,98,100]

Ya que tenemos una lista, cmo podemos jugar con sus elementos? Por ejemplo, se puede
calcular el cuadrado de los 100 primeros naturales? Y su media aritmtica o su media geomtrica?
Las rdenes map y apply nos ayudan a resolver este problema. La orden map permite aplicar una map
funcin a cada uno de los elementos de una lista. Por ejemplo, para calcular sen(1), sen(2),...,
sen(10), hacemos lo siguiente

(%i25)

map(sin,makelist(i,i,1,10));

(%o25)

[sin(1),sin(2),sin(3),sin(4),sin(5),sin(6),sin(7),sin(8),
sin(9),sin(10)]

o si queremos la expresin decimal

(%i26)

%,numer

(%o26)

[0.8414709848079,0.90929742682568,0.14112000805987,
-0.75680249530793,-0.95892427466314,-0.27941549819893,
0.65698659871879,0.98935824662338,0.41211848524176,
-0.54402111088937]

La orden apply, en cambio, pasa todos los valores de la lista a un operador que, evidentemente, apply
debe saber qu hacer con la lista. Ejemplos tpicos son el operador suma o multiplicacin. Por
ejemplo

(%i27)

apply("+",makelist(i,i,1,100));

(%o27)

5050

nos da la suma de los primeros 100 naturales.

59

Matrices

Listas y matrices

Ejemplo 3.1. Vamos a calcular la media aritmtica y la media geomtrica de los 100 primeros
naturales. Cul ser mayor? Recuerdas la desigualdad entre ambas medias? La media aritmtica
es la suma de todos los elementos dividido por la cantidad de elementos que sumemos:

(%i28)
(%o28)

apply("+",makelist(i,i,1,100))/100;
101
2

La media geomtrica es la raz n-sima del producto de los n elementos:

(%i29)

apply("",makelist(i,i,1,100)) (1/100);

(%o29)

17 20 19 20 23 25 37 50 41 50 43 50 47 50 2401 25 15625 25 531441 25


1
638714741182055044530[30digits]99766363898994157944832 100

(%i30)

float(%);

(%o30)

37.9926893448343

Parece que la media geomtrica es menor.


Ejemplo 3.2. Cul es el mdulo del vector (1, 3, 7, 8, 1)? Tenemos que calcular la raz cuadrada
de la suma de sus coordenadas al cuadrado:

(%i31)

vector:[1,3,-7,8,1];

(%o31)

[1,3,-7,8,1]

(%i32)

sqrt(apply("+",vector 2));

2 31

(%o32)

Tambin es posible calcular el mdulo como la raz cuadrada del producto escalar de un vector
consigo mismo.

(%i33)
(%o33)

sqrt(vector.vector);

2 31

A la vista de estos ejemplos, cmo podramos definir una funcin que nos devuelva la media
aritmtica, la media geomtrica de una lista o el mdulo de un vector?

3.2 Matrices
matrix

Las matrices se escriben de forma parecida a las listas y, de hecho, slo tenemos que agrupar las
filas de la matriz escritas como listas bajo la orden matrix. Vamos a definir un par de matrices y
un par de vectores que van a servir en los ejemplos en lo que sigue.

60

Listas y matrices

(%i34)

Matrices

(%o37)

A:matrix([1,2,3],[-1,0,3],[2,1,-1]);
B:matrix([-1,1,1],[1,0,0],[-3,7,2]);
a:[1,2,1];
b:[0,1,-1];

1 2 3
-1 0 3

2 1 -1

-1 1 1
1 0 0

-3 7 2
[1,2,1]

(%o37)

[0,-1,1]

(%o35)

(%o36)

En wxMaxima tambin podemos escribir una matriz usando el men lgebraIntroducir


matriz. Nos aparece una ventana como las de la Figura 3.1 donde podemos rellenar los valores.

Seleccionar tipo de matriz

Introducir valores

Figura 3.1 Introducir matriz

matrix(fila1,fila2,... )
matrix_size(matriz )
matrixp(expresin )

matriz
nmero de filas y columnas
devuelve true si expresin
es una matriz

Las dimensiones de una matriz se pueden recuperar mediante la orden matrix_size que devuel- matrix_size
ve una lista con el nmero de filas y columnas.

(%i38)

matrix_size(A);

(%o38)

[3,3]

Observacin 3.3. Aunque muy similares, Maxima distingue entre listas y matrices. La orden
matrixp(expresin ) devuelve true o false dependiendo de si la expresin es o no una
matriz. Por ejemplo, los vectores a y b que hemos definido antes, son o no son matrices?

61

matrixp

Matrices

Listas y matrices

(%i39)

matrixp(a);

(%o39)

false

Aunque pueda parecer lo contrario, no son matrices, son listas.

(%i40)

listp(a);

(%o40)

true

Slo es aceptado como matriz aquello que hallamos definido como matriz mediante la orden matrix o alguna de sus variantes. Al menos en wxMaxima, hay un pequeo truco para ver si algo es
o no una matriz. Cul es la diferencia entre las dos siguientes salidas?

(%i41)

[1,2,3];

(%o41)

[1,2,3]

(%i42)

matrix([1,2,3]);

(%o42)

[1

3]

wxMaxima respeta algunas de las diferencias usuales entre vectores y matrices: no pone comas
separando las entradas de las matrices y, adems, dibuja los corchetes un poco ms grandes en el
caso de matrices.

3.2.1

Operaciones elementales con matrices


La suma y resta de matrices se indica como es usual,

(%i43)
(%o43)
(%i44)
(%o44)

A+B;

0
0

1
A-B;

2
2

3
0
8
1
0
6

en cambio el producto de matrices se indica con un punto, ., como ya vimos con vectores. El
operador multiplica los elementos de la matriz entrada a entrada.

(%i45)
(%o45)

A.B;

8 22
8 20

2 5

62

Listas y matrices

(%i46)
(%o46)

Matrices

AB;

1 2
1 0

6 7

Con las potencias ocurre algo parecido: n eleva toda la matriz a n, esto es, multiplica la
matriz consigo misma n veces,

(%i47)
(%o47)

A 2

5 5
5 1

1 3

10

y n eleva cada entrada de la matriz a n.

(%i48)
(%o48)

A2

1 4
1 0

4 1

Para el producto de una matriz por un vector slo tenemos que tener cuidado con utilizar el
punto.

(%i49)
(%o49)

A.a;

8
2

3

y no tenemos que preocuparnos de si el vector es un vector fila o columna

(%i50)

a.A

(%o50)

[1

8]

El nico caso en que tiene el resultado esperado es el producto de una matriz o un vector por
un escalar.

(%i51)
(%o51)

2*A;

2 4
2 0

4 2

63

Matrices

3.2.2

Listas y matrices

Otras operaciones usuales


rank(matriz )
col(matriz,i )
row(matriz,j )
minor(matriz,i,j )

rango de la matriz
columna i de la matriz
fila j de la matriz
menor de la matriz obtenido al
eliminar la fila i y la columna j

submatrix(fila1,fila2,..,matriz,col1,.. ) matriz obtenida al eliminar las


filas y columnas mencionadas
triangularize(matriz ) forma triangular superior de la matriz
determinant(matriz ) determinante
invert(matriz ) matriz inversa
transpose(matriz ) matriz transpuesta
nullspace(matriz ) ncleo de la matriz

transpose

Existen rdenes para la mayora de las operaciones comunes. Podemos calcular la matriz transpuesta con transpose,

(%i52)
(%o52)

determinant

invert

calcular el determinante,

(%i53)

determinant(A);

(%o53)

o, ya que sabemos que el determinante no es cero, su inversa:

(%i54)
(%o54)

rank

transpose(A);

1 1 2
2 0
1

3 3 1

invert(A);
3
5
3
4
4
2
5
7
3

4
2
41
3
1
4
4
2

Como det(A) 6= 0, la matriz A tiene rango 3. En general, podemos calcular el rango de una
matriz cualquiera n m con la orden rank

(%i55)

m:matrix([1,3,0,-1],[3,-1,0,6],[5,-3,1,1])$

(%i56)

rank(m);

64

Listas y matrices

(%o56)

Matrices

El rango es fcil de averiguar si escribimos la matriz en forma triangular superior utilizando el


mtodo de Gauss con la orden triangularize y le echamos un vistazo a la diagonal:

(%i57)
(%o57)

triangularize(m);

3
0
1
1

0 10
0
9

0
0
10 102

Cualquiera de estos mtodos es ms rpido que ir menor a menor buscando alguno que no se
anule. Por ejemplo, el menor de la matriz A que se obtiene cuando se eliminan la segunda fila y la
primera columna es

(%i58)
(%o58)

minor

minor(A,2,1);


2 3
1 1

Caso de que no fuera suficiente con eliminar una nica fila y columna podemos eliminar tantas
filas y columnas como queramos con la orden submatrix. Esta orden elimina todas las filas que
escribamos antes de una matriz y todas las columnas que escribamos despus. Por ejemplo, para
eliminar la primera y ltima columnas junto con la segunda fila de la matriz m escribimos:

(%i59)

triangularize

submatrix

submatrix(2,m,1,4);

3 0
3 1

(%o59)

En el extremo opuesto, si slo queremos una fila o una columna de la matriz, podemos usar el
comando col para extraer una columna

(%i60)
(%o60)

col

col(m,2);

3
1

3

y el comando row para extraer una fila. El resultado de ambas rdenes es una matriz.

(%i61)

row(m,1);

(%o61)

[1

(%i62)

matrixp(%);

(%o62)

true

1 ]

65

row

Matrices

Listas y matrices

Para acabar con esta lista de operaciones, conviene mencionar cmo se calcula el ncleo de una
matriz. Ya sabes que el ncleo de una matriz A = (ai j ) de orden n m es el subespacio
ker(A) = {x; A.x = 0}
nullspace

y es muy til, por ejemplo, en la resolucin de sistemas lineales de ecuaciones. La orden nullspace
nos da una base del ncleo de la matriz:

(%i63)
(%o63)

3.2.3

nullspace(matrix([1,2,4],[-1,0,2]));

4
span 6
2

Ms sobre escribir matrices


Si has utilizado el men lgebraIntroducir matriz para escribir matrices ya has visto que
tienes atajos para escribir matrices diagonales, simtricas y antisimtricas.

diagmatrix(n,x)
entermatrix(m,n )
genmatrix
matrix[i,j]

entermatrix

definir matriz m n
genera una matriz mediante una regla
elemento de la fila i, columna j de la matriz

Existen otras formas de dar una matriz en Maxima. La primera de ellas tiene ms inters si ests
utilizando Maxima y no wxMaxima. Se trata de la orden entermatrix. Por ejemplo, para definir una matriz con dos filas y tres columnas, utilizamos entermatrix(2,3) y Maxima nos va
pidiendo que escribamos entrada a entrada de la matriz:

(%i64)

(%o64)

diagmatrix

matriz diagonal n n con x en la diagonal

c:entermatrix(2,3);
Row 1 Column 1: 1;
Row 1 Column 2: 2;
Row 1 Column 3: 4;
Row 2 Column 1: -1;
Row 2 Column 2: 0;
Row 2 Column 3: 2;
Matrix entered.


1 2 4
1 0 2

Tambin es fcil de escribir la matriz diagonal que tiene un mismo valor en todas las entradas
de la diagonal: slo hay que indicar el orden y el elemento que ocupa la diagonal. Por ejemplo,
la matriz identidad de orden 4 se puede escribir como sigue.

(%i65)

diagmatrix(4,1);

66

Listas y matrices

(%o65)

Matrices

0
1
0
0

0
0
1
0

0
1

Por ltimo, tambin podemos escribir una matriz si sabemos una regla que nos diga cul es el
valor de la entrada (i, j) de la matriz. Por ejemplo, para escribir la matriz que tiene como entrada
ai j = i j, escribimos en primer lugar dicha regla 7

(%i66)

a[i,j]:=ij;

(%o66)

aij :=ij

y luego utilizamos genmatrix para construir la matriz (3 3 en este caso):

(%i67)
(%o67)

genmatrix(a,3,3);

1 2 3
2 4 6

3 6 9

Observa que hemos utilizado corchetes y no parntesis para definir la regla ai j . Bueno, que ya
hemos definido la matriz a...un momento, seguro?

(%i68)

matrixp(a);

(%o68)

false

Pero no acabbamos de definirla? En realidad, no. Lo que hemos hecho es definir la regla que
permite construir los elementos de la matriz pero no le hemos puesto nombre:

(%i69)
(%o69)

c:genmatrix(a,4,5);
2 3
4
5

4 6
8 10

6 9 12 15
8 12 16 20

3
4

Podemos utilizar la misma notacin para referirnos a los elementos de la matriz. Por ejemplo,
al elemento de la fila i y la columna j, nos referimos como c[i, j] (de nuevo, observa que estamos
utilizando corchetes):

(%i70)

c[2,3];

(%o70)

Si no has borrado el vector a que definimos hace algunas pginas, Maxima te dar un error.

67

genmatrix

Matrices

3.2.4

Listas y matrices

Valores propios
charpoly(matriz,variable )
eigenvalues(matriz )
eigenvectors(matriz )

charpoly

polinomio caracterstico
valores propios de la matriz
valores y vectores propios de la matriz

Los valores propios de una matriz cuadrada, A, son las races del polinomio caracterstico det(A
xI), siendo I la matriz identidad. La orden charpoly nos da dicho polinomio.

(%i71)

(%i73)

S:matrix([-11/15,-2/15,-4/3],[-17/15,16/15,-1/3],[8/15,4/15,5/3]);
11
2
4
15 15 3
17
16
13
15
15

8
4
5
15
15
3
charpoly(S,x);

 16 


5
8 15 x
!
!
!
! 2 17 3 x 8
4

15
45
15
5
4
11
16
x
x +

x
+
15
3
45
15
15
3
expand(%);

(%o73)

-x 3+2x 2+x-2

(%o71)
(%i72)
(%o72)

68
225

Por tanto, sus valores propios son

eigenvalues

eigenvectors

(%i74)

solve(%,x);

(%o74)

[x=2,x=-1,x=1]

Todo este desarrollo nos lo podemos ahorrar: la orden eigenvalues nos da los valores propios
junto con su multiplicidad.

(%i75)

eigenvalues(S);

(%o75)

[[2,-1,1],[1,1,1]]

En otras palabras, los valores propios son 2, 1 y 1 todos con multiplicidad 1. Aunque no lo
vamos a utilizar, tambin se pueden calcular los correspondientes vectores propios con la orden
eigenvectors:

(%i76)

eigenvectors(S);

(%o76)

[[[2,-1,1],[1,1,1]],[1,-1/2,-2],[1,4/7,1/7],[1,7,-2]]

68

Listas y matrices

Ejercicios

La respuesta es, en esto caso, cinco listas. Las dos primeras las hemos visto antes: son los valores
propios y sus multiplicidades. Las tres siguientes son los tres vectores propios asociados a dichos
valores propios.

3.3 Ejercicios
Ejercicio 3.1. Consideremos los vectores a = (1, 2, 1), b = (0, 2, 3/4), c = (e, 1, 0), y d =
(0, 0, 1). Realiza las siguientes operaciones
a) a + b,
b) 3c + 2b,
c) c.d, y
d) b.d + 3a.c.
Ejercicio 3.2. Consideremos las matrices

1 2 0

5
3
A = 2

3 1 4
1
2
0 5

0
4 2 1

C =
3
2 1 3

5
4 1 5

B = 12

D = 12

2 0

1 3
2
5
0

0 3

0 1

a) Calcular A.B, A + B, D.C.


b) Extraer la segunda fila de A, la tercera columna de C y el elemento (3, 3) de D.
c) Calcular det(A), det(B) y det(C). Para las matrices cuyo determinante sea no nulo, calcular su
inversa. Calcular sus valores propios.
d) Calcular el rango de las matrices A, B, C, D, D.C y A + B.
e) Construye una matriz del orden 3 3, de forma que el elemento (i, j) sea i j + j i. Calcula
el determinante, su inversa si la tiene, y su rango. Cules son sus valores propios?
Ejercicio 3.3. Calcula el rango de la matriz
2 7 4 3 0 1

0 0 5 4 1 0

A =
2 1 0 2 1 3
0 6 1
1 0 2
Ejercicio 3.4. Calcula los valores y vectores propios de las siguientes matrices:

3
9


3 0 4
0

0 4
A=
, B = 0 3 1 y C = 4 8 10
4 4
4 1 4
8 4 2
Ejercicio 3.5.
a) Genera una lista de 10 nmeros aleatorios entre 5 y 25 y reordnala en orden decreciente.

69

Ejercicios

Listas y matrices

Ejercicio 3.6. Define listauno:makelist(i,i,2,21), listados:makelist(i,i,22,31).


Realiza las siguientes operaciones usando algunos de los comandos antes vistos.
a) Multiplica cada elemento de listauno por todos los elementos de listados. El resultado
ser una lista con 20 elementos (que a su vez sern listas de 10 elementos), a la que llamars
productos.
b) Calcula la suma de cada una de las listas que forman la lista productos (no te equivoques,
comprueba el resultado). Obtendrs una lista con 20 nmeros.
c) Calcula el producto de los elementos de la lista obtenida en el apartado anterior.
Ejercicio 3.7. Genera una lista de 30 elementos cuyos elementos sean listas de dos nmeros que
no sean valores exactos.
Ejercicio 3.8.
(1)k+1

k

desde k = 1 hasta k = 1000.



b) Calcula el producto de los nmeros de la forma 1 + k12 desde k = 1 hasta k = 1000.
a) Calcula la suma de los nmeros de la forma

70

Resolucin de ecuaciones

Ecuaciones y operaciones con ecuaciones

Resolucin de ecuaciones
4
4.1 Ecuaciones y operaciones con ecuaciones 71 4.2 Resolucin de ecuaciones 72
4.3 Ejercicios 79

Maxima nos va a ser de gran ayuda en la resolucin de ecuaciones, ya sean sistemas de ecuaciones lineales con un nmero grande de incgnitas (y parmetros) o ecuaciones no lineales. Un
ejemplo tpico es encontrar las soluciones de un polinomio. En este caso es fcil que alguna de
las soluciones sea compleja. No importa. Maxima se maneja bien con nmeros complejos. De hecho, siempre trabaja con nmeros complejos. Si tienes alguna duda de cmo operar con nmeros
complejos, en el Apndice A tienes una breve introduccin sobre su uso.

4.1 Ecuaciones y operaciones con ecuaciones


En Maxima, una ecuacin es una igualdad entre dos expresiones algebraicas escrita con el smbolo =.

expresin1=expresin2
lhs(expresin1=expresin2)
rhs(expresin1=expresin2)

ecuacin
expresin1
expresin2

Si escribimos una ecuacin, Maxima devuelve la misma ecuacin.

(%i1)

3x 2+2x+x 3-x 2=4x 2;

(%o1)

x3 +2x2 +2x=4x2

adems podemos asignarle un nombre para poder referirnos a ella

(%i2)

eq:3x 2+2x+x 3-a*x 2=4x 2;

(%o2)

x3 -ax2 +3x2 +2x=4x2

y operar como con cualquier otra expresin

(%i3)

eq-4x 2;

(%o3)

x3 -ax2 -x2 +2x=0

Podemos seleccionar la expresin a la izquierda o la derecha de la ecuacin con las rdenes lhs
y rhs respectivamente.

71

Resolucin de ecuaciones

(%i4)

lhs(eq);

(%o4)

x3 -ax2 +3x2 +2x

Resolucin de ecuaciones

4.2 Resolucin de ecuaciones


Maxima puede resolver los tipos ms comunes de ecuaciones y sistemas de ecuaciones algebraicas de forma exacta. Por ejemplo, sabe encontrar las races de polinomios de grado bajo (2,3 y 4).
En cuanto a polinomios de grado ms alto o ecuaciones ms complicadas, no siempre ser posible
encontrar la solucin exacta. En este caso, podemos intentar encontrar una solucin aproximada
en lugar de la solucin exacta.

4.2.1

solve

La orden solve
La primera orden que aparece en el men dentro de Maxima para resolver ecuaciones es solve. Esta orden intenta dar todas las soluciones, ya sean reales o complejas
de una ecuacin o sistema de ecuaciones. Se puede acceder a esta orden desde el men EcuacionesResolver
o escribiendo directamente en la ventana de Maxima la
ecuacin a resolver.

(%i5)
(%o5)

Figura 4.1 Resolver una ecuacin

solve(x 2-3x+1=0,x);

53
5+3
,x=
]
[x=2
2
solve(ecuacin,incgnita )
solve(expr,incgnita )
solve([ecuaciones ],[variables ])
multiplicities

resuelve la ecuacin
resuelve la expresin
igualada a cero
resuelve el sistema
guarda la multiplicidad
de las soluciones

Tambin podemos resolver ecuaciones que dependan de algn parmetro. Consideremos la ecuacin eq1:

(%i6)

eq1:x 3-ax 2-x 2+2x=0;

(%o6)

x3 -ax2 -x2 +2x=0

(%i7)

solve(eq1,x);

a2 +2a-7-a-1
a2 +2a-7+a+1
[x=,x=
,x=0]
2
2

(%o7)

Slo en el caso de ecuaciones con una nica variable podemos ahorrarnos escribirla

72

Resolucin de ecuaciones

(%i8)

solve(x 2+2x=3);

(%o8)

[x=-3,x=1]

Resolucin de ecuaciones

Tambin podemos no escribir el segundo miembro de una ecuacin cuando ste sea cero

(%i9)

solve(x 2+2x);

(%o9)

[x=-2,x=0]

(%i10)

solve(x 2+2x=0);

(%o10)

[x=-2,x=0]

Cuando buscamos las races de un polinomio hay veces que es conveniente tener en cuenta la
multiplicidad de las races. sta se guarda automticamente en la variable multiplicities. Por
ejemplo, el polinomio x7 2 x6 + 2 x5 2 x4 + x3 tiene las races 0, 1, i, i,

(%i11)

solve(x 7-2x 6+2x 5-2x 4+x 3);

(%o11)

[x=-%i,x=%i,x=1,x=0]

pero estas races no pueden ser simples: es un polinomio de grado 7 y slo tenemos 4 races. Cul
es su multiplicidad?

(%i12)

multiplicities;

(%o12)

[1,1,2,3]

O sea que i y i son races simples, 1 tiene multiplicidad 2 y 0 es una raz triple.
Observacin 4.1. Mucho cuidado con olvidar escribir cules son las incgnitas.

(%i13)

solve(eq1);
More unknowns than equations - solve
Unknowns given :
[a,x]
Equations given:
[x3 -ax2 +3x2 +2x=4x2 ]
-- an error. To debug this try debugmode(true);

Hay dos variables y Maxima no sabe con cul de ellas quedarse como incgnita. Aunque nosotros
estemos acostumbrados a utilizar las letras x, y, z como incgnitas, para Maxima tanto a como x
tienen perfecto sentido como incgnitas y la respuesta en uno de ellos no nos interesa:

(%i14)

solve(eq1,a);

73

multiplicities

Resolucin de ecuaciones

(%o14)

[a=

Resolucin de ecuaciones

x2 -x+2
]
2

La orden solve no slo puede resolver ecuaciones algebraicas.

(%i15)

(%o15)

solve(sin(x)cos(x)=0,x);
solve: is using arc-trig functions to get a solution.
Some solutions will be lost.
%pi
[x=0,x=
]
2

Qu ocurre aqu? La expresin sen(x) cos(x) vale cero cuando el seno o el coseno se anulen.
Para calcular la solucin de sen(x) = 0 aplicamos la funcin arcoseno a ambos lados de la ecuacin.
La funcin arcoseno vale cero en cero pero la funcin seno se anula en muchos ms puntos. Nos
estamos dejando todas esas soluciones y eso es lo que nos est avisando Maxima.
Como cualquiera puede imaginarse, Maxima no resuelve todo. Incluso en las ecuaciones ms
sencillas, las polinmicas, se presenta el primer problema: no hay una frmula en trminos
algebraicos para obtener las races de un polinomio de grado 5 o ms. Pero no hay que ir tan lejos.
Cuando aadimos races, logaritmos, exponenciales, etc., la resolucin de ecuaciones se complica
mucho. En esas ocasiones lo ms que podemos hacer es ayudar a Maxima a resolverlas.

(%i16)

eq:x+3=sqrt(x+1);

(%o16)

x+3=sqrt(x+1)

(%i17)

solve(eq,x);

[x= x+1-3]

(%o17)
(%i18)
(%o18)

solve(eq 2);

7%i+5
7%i-5
[x=,x=
]
2
2

Cmo hacer referencia a las soluciones


Uno de los ejemplos usuales en los que utilizaremos las soluciones de una ecuacin es en el
estudio de una funcin. Necesitaremos calcular puntos crticos, esto es, ceros de la derivada. El
resultado de la orden solve no es una lista de puntos, es una lista de ecuaciones.
Una primera solucin consiste en usar la orden rhs e ir recorriendo uno a uno las soluciones:

(%i19)

sol:solve(x 2-4x+3);

(%o19)

[x=3,x=1]

La primera solucin es

(%i20)

rhs(part(sol,1));

74

Resolucin de ecuaciones

(%o20)

Resolucin de ecuaciones

y la segunda

(%i21)

rhs(part(sol,2));

(%o21)

Este mtodo no es prctico en cuanto tengamos un nmero un poco ms alto de soluciones.


Tenemos que encontrar una manera de aplicar la orden rhs a toda la lista de soluciones. Eso es
justamente para lo que habamos presentado la orden map:

(%i22)

sol:map(rhs,solve(x 2-4x+3));

(%o22)

[3,1]

Sistemas de ecuaciones
Tambin podemos resolver sistemas de ecuaciones. Slo tenemos que escribir la lista de ecuaciones y de incgnitas. Por ejemplo, para resolver el sistema

x2 + y2 =1

2
2

(x 2) + (y 1) =4
escribimos

(%i23)
(%o23)

solve([x2 +y2 =1,(x-2)2 +(y-1)2 =4],[x,y]);


4
3
[[x= ,y=- ],[x=0,y=1]]
5
5

Siempre hay que tener en cuenta que, por defecto, Maxima da todas las soluciones incluyendo
las complejas aunque muchas veces no pensemos en ellas. Por ejemplo, la recta x + y = 5 no corta
a la circunferencia x2 + y2 = 1:

(%i24)
(%o24)

solve([x 2+y 2=1,x+y=5],[x,y]);

23%i-5
23%i+5
23%i+5
23%i-5
[[x=,y=
],[x=
,y=]]
2
2
2
2

Si la solucin depende de un parmetro o varios, Maxima utilizar %r1, %r2,... para referirse a
estos. Por ejemplo,

(%i25)

solve([x+y+z=3,x-y=z],[x,y,z]);

75

Resolucin de ecuaciones

(%o25)

[[x=3/2,y=-

Resolucin de ecuaciones

2%r1-3
,z=%r1]]
2

Qu pasa si el sistema de ecuaciones no tiene solucin? Veamos un ejemplo (de acuerdo, no


es muy difcil)

(%i26)

solve([x+y=0,x+y=1],[x,y]);
[]

Y si todos los valores de x cumplen la ecuacin?

(%i27)

solve((x+1) 2=x 2+2x+1,x);

(%o27)

[x=x]

Maxima nos dice que el sistema se reduce a x = x que claramente es cierto para todo x. El siguiente
caso es similar. Obviamente (x + y)2 = x2 + 2xy + y2 . Qu dice al respecto Maxima?

(%i28)

solve((x+y) 2=x 2+2xy+y 2,[x,y]);


Dependent equations eliminated: (1)

(%o28)

[[x=%r3,y=%r2]]

En otras palabras, x puede tomar cualquier valor e y lo mismo.

4.2.2

to_poly_solve
Hay una segunda forma de resolver ecuaciones en Maxima. puedes acceder a ella desde el men
EcuacionesResolver (to_poly). Sin entrar en detalles, algunas ecuaciones las resuelve mejor.
Por ejemplo, cuando hay radicales por medio la orden solve no siempre funciona bien:

(%i29)
(%o29)

solve(3*x=sqrt(x 2+1),x);

x2 + 1
[x=
]
3

En cambio, tiene un poco ms de xito

(%i30)
(%o30)

to_poly_solve(3*x=sqrt(x 2+1),x);

1 
%union [x = (3/2) ]
2

Como puedes ver, la respuesta es el conjunto de soluciones que verifica la ecuacin. De ah la


palabra union delante de la respuesta.

76

Resolucin de ecuaciones

Resolucin de ecuaciones

to_poly_solve(ecuacin, variable )
to_poly_solve(expr, variable )

resuelve la ecuacin
resuelve la expresin igualada a cero

Adems de este ejemplo, hay otras ocasiones en las que la respuesta de to_poly_solve es
mejor o ms completa. Por ejemplo, con funciones trigonomtricas ya hemos visto que solve no
da la lista completa de soluciones

(%i31)

solve(x*cos(x));
solve: using arc-trig functions to get a solution.
Some solutions will be lost.

(%o31)

[x=0]

En cambio, con to_poly_solve la respuesta es un poco ms amplia

(%i32)
(%o32)

to_poly_solve(x*cos(x),x);



%union [x=0], [x=2%z101 ], [x=2%z103 + ]
2
2

Los parmetros z101 y z103 indican un nmero entero arbitrario y la numeracin depende
del nmero de operaciones que hayas realizado. No es quiz la forma ms elemental de escribir
la solucin, pero s que tenemos todas las soluciones de la ecuacin. Observa tambin que en
este caso no hemos escrito una ecuacin sino una expresin y to_poly_solve ha resuelto dicha
expresin igualada a cero lo mismo que ocurra con la orden solve.

4.2.3

Sistemas de ecuaciones lineales


linsolve([ecuaciones ],[variables ])

resuelve el sistema

En el caso particular de sistemas de ecuaciones lineales puede ser conveniente utilizar linsolve
en lugar de solve. Ambas rdenes se utilizan de la misma forma, pero linsolve es ms eficiente
en estos casos. Slo una observacin: sigue siendo importante escribir correctamente qu variables
se consideran como incgnitas. El resultado puede ser muy diferente dependiendo de esto.

(%i33)

eq:[x+y+z+w=1,x-y+z-w=-2,x+y-w=0]$

(%i34)

linsolve(eq,[x,y,z]);
4 w-3
2 w-3
[x=
,y=,z=1-2 w]
2
2

(%o34)

Cul es el resultado de linsolve(eq,[x,y,z,w])?

77

linsolve

Resolucin de ecuaciones

4.2.4

Resolucin de ecuaciones

Algsys
algsys([ecuaciones ],[variables ])
realonly

algsys

resuelve la ecuacin o ecuaciones


si vale true, algsys muestra
slo soluciones reales

La orden algsys resuelve ecuaciones o sistemas de ecuaciones algebraicas. La primera diferencia


con la orden solve es pequea: algsys siempre tiene como entrada listas, en otras palabras,
tenemos que agrupar la ecuacin o ecuaciones entre corchetes igual que las incgnitas.

(%i35)

eq:x 2-4x+3;

(%o35)

x 2-4x+3

(%i36)

algsys([eq],[x]);

(%o36)

[[x=3],[x=1]]

La segunda diferencia es que algsys intenta resolver numricamente la ecuacin si no es capaz


de encontrar la solucin exacta.

realonly

(%i37)

solve(eq:x 6+x+1);

(%o37)

[0=x 6+x+1]

(%i38)

algsys([eq],[x]);

(%o38)

[[x=-1.038380754458461 %i-0.15473514449684],
[x=1.038380754458461 %i-0.15473514449684],
[x=-0.30050692030955 %i-0.79066718881442],
[x=0.30050692030955 %i-0.79066718881442],
[x=0.94540233331126-0.61183669378101 %i],
[x=0.61183669378101 %i+0.94540233331126]]

En general, para ecuaciones polinmicas algsys nos permite algo ms de flexibilidad ya que
funciona bien con polinomios de grado alto y, adems, permite seleccionar las races reales. El
comportamiento de algsys est determinado por la variable realonly. Su valor por defecto es
false. Esto significa que algsys muestra todas las races. Si su valor es true slo muestra las
races reales.

(%i39)

eq:x 4-1=0$

(%i40)

realonly;

(%o40)

false

(%i41)

algsys([eq],[x]);

(%o41)

[[x=1],[x=-1],[x=%i],[x=-%i]]

(%i42)

realonly:true$

78

Resolucin de ecuaciones

Ejercicios

(%i43)

algsys([eq],[x]);

(%o43)

[[x=1],[x=-1]

4.3 Ejercicios
Ejercicio 4.1. Calcula los puntos donde se cortan las parbolas y = x2 , y = 2x2 + ax + b. Discute
todos los casos posibles dependiendo de los valores de a y b.
Ejercicio 4.2. Dibuja, en un mismo grfico, la elipse de semieje horizontal a = 3 y de semieje
vertical b = 5 y la bisectriz del primer cuadrante. Calcula los puntos donde se cortan ambas curvas.
Ejercicio 4.3. Consideremos la circunferencia de centro (0, 0) y radio 2. Dibjala. Ahora consideremos un rectngulo centrado en el origen e inscrito en ella. Determina el rectngulo as construido
cuya rea sea 1.
Ejercicio 4.4. Representa grficamente y determina los puntos de corte de las siguientes curvas:
a) la recta x y = 5 y la parbola (x 1)2 + y = 4;
b) la hiprbola equiltera y la circunferencia de centro (1, 1) y radio 1;
c) las circunferencias de centro (0, 0) y radio 2 y la de centro (1, 3) y radio 3.
Ejercicio 4.5. Resolver la ecuacin logartmica:
log(x) + log(x + 1) = 3

79

80

Mtodos numricos de resolucin de ecuaciones

Introduccin al anlisis numrico

Mtodos numricos de resolucin de ecuaciones


5
5.1 Introduccin al anlisis numrico 81 5.2 Resolucin numrica de ecuaciones
con Maxima 85 5.3 Breves conceptos de programacin 89 5.4 El mtodo de
biseccin 93 5.5 Mtodos de iteracin funcional 102

En este captulo vamos a ver cmo encontrar soluciones aproximadas a ecuaciones que no podemos resolver de forma exacta. En la primera parte, presentamos algunos de los comandos incluidos
en Maxima para este fin. En la segunda parte, mostramos algunos mtodos para el clculo de soluciones como el mtodo de biseccin o el de Newton-Raphson
Comenzamos la primera seccin hablando sobre las ventajas e inconvenientes de trabajar en
modo numrico.

5.1 Introduccin al anlisis numrico


Los ordenadores tienen un capacidad limitada para almacenar cada nmero real por lo que en
un ordenador nicamente pueden representarse un nmero finito de nmeros reales: los nmeros
mquina. Si un nmero real no coincide con uno de estos nmeros mquina, entonces se aproxima
al ms prximo. En este proceso se pueden producir, y de hecho se producen, errores de redondeo
al eliminar decimales. Tambin se pueden introducir errores en la conversin entre sistema decimal
y sistema binario: puede ocurrir que un nmero que en sistema decimal presente un nmero finito
de dgitos, en sistema binario presente un nmero infinito de los mismos.
Como consecuencia de esto, algunas propiedades aritmticas dejan de ser ciertas cuando utilizamos un ordenador.
La precisin de un nmero mquina depende del nmero de bits utilizados para ser almacenados.
Puede producirse una severa reduccin en la precisin si al realizar los clculos se restan dos
nmeros similares. A este fenmeno se le conoce como cancelacin de cifras significativas. Lo que
haremos para evitar este fenmeno ser reorganizar los clculos en un determinado desarrollo.

5.1.1

Nmeros y precisin
Todos los nmeros que maneja Maxima tienen precisin arbitraria. Podemos calcular tantos
decimales como queramos. Si es posible, Maxima trabaja de forma exacta

(%i1)
(%o1)

sqrt(2);

o podemos con la precisin por defecto

81

Introduccin al anlisis numrico

(%i2)

sqrt(2),numer;

(%o2)

1.414213562373095

Mtodos numricos de resolucin de ecuaciones

Cuando decimos que 2 es un nmero de precisin arbitraria no queremos decir que podamos
escribir su expresin decimal completa (ya sabes que es un nmero irracional) sino que podemos
elegir el nmero de digitos que deseemos y calcular su expresin decimal con esa precisin.

(%i3)

fpprec:20;

(%o3)

20

(%i4)

bfloat(sqrt(2));

(%o4)

1.4142135623730950488b0

Vamos a comentar un par de detalles que tenemos que tener en cuenta en este proceso.

Errores de redondeo
Si slo tenemos 5 dgitos de precisin, cmo escribimos el nmero 7.12345? Hay dos mtodos usuales: podemos truncar o podemos redondear. Por truncar se entiende desechar los dgitos
sobrantes. El redondeo consiste en truncar si los ltimos dgitos estn entre 0 y 4 y aumentar un
dgito si estamos entre 5 y 9. Por ejemplo, 7.46 se convertira en 7.4 si truncamos y en 7.5 si redondeamos. El error es siempre menor en utilizando rendondeo. Cul de las dos formas usa Maxima?
Puedes comprobarlo tu mismo.

(%i5)

fpprec:5;

(%o5)

(%i6)

bfloat(7.12345);

(%o6)

7.1234b0

Qu pasa si aumentamos la precisin en lugar de disminuirla?

(%i7)

fpprec:20;

(%o7)

20

(%i8)

bfloat(0.1);

(%o8)

1.0000000000000000555b-1

Qu ha pasado? 0.1 es un nmero exacto. Porqu la respuesta no ha sido 0.1 de nuevo? Fjate en
la siguiente respuesta

(%i9)

bfloat(1/10);

82

Mtodos numricos de resolucin de ecuaciones

(%o9)

Introduccin al anlisis numrico

1.0b-1

Cul es la diferencia entre una otra? Porqu una es exacta y la otra no? La diferencia es el
error que se puede aadir (y acabamos de ver que se aade) cuando pasamos de representar un
nmero en el sistema decimal a binario y viceversa.

5.1.2

Aritmtica de ordenador
Sabemos que el ordenador puede trabajar con nmeros muy grandes o muy pequeos; pero, por
debajo de cierto valor, un nmero pequeo puede hacerse cero debido al error de redondeo. Por
eso hay que tener cuidado y recordar que propiedades usuales en la aritmtica real (asociatividad,
elemento neutro) no son ciertas en la aritmtica de ordenador.

Elemento neutro
Tomamos un nmero muy pequeo, pero distinto de cero y vamos a ver cmo Maxima interpreta
que es cero:

(%i10)

h:2.22045*10(-17);

(%o10)

2.22045 10 -17

Y si nos cuestionamos si h funciona como elemento neutro:

(%i11)

is(h+1.0=1.0);

(%o11)

true

la respuesta es que s que es cierto que h+1.0=1.0, luego h sera cero.


Por encima, con nmeros muy grandes puede hacer cosas raras.

(%i12)

g:15.0+10(20);

(%o12)

1.10 20

(%i13)

is(g-10(20)=0);

(%o13)

false

(%i14)

g-10(20);

(%o14)

0.0

Aqu no sale igual, pero si los restis cree que la diferencia es cero.

83

Introduccin al anlisis numrico

Mtodos numricos de resolucin de ecuaciones

Propiedad asociativa de la suma


Con aritmtica de ordenador vamos a ver que no siempre se cumple que: (a + b) + c = a + (b + c)

(%i15)

is((11.3+10(14))+(-(10)14)=11.3+(10(14)+(-(10)14)));

(%o15)

false

Si ahora trabajamos con nmeros exactos, vamos a ver qu pasa:

5.1.3

(%i16)

is((113/10+10(14))+(-(10)14)=113/10+(10(14)+(-(10)14)));

(%o16)

true

Cancelacin de cifras significativas


Como hemos visto, uno de los factores que hay que tener en cuenta a la hora de realizar clculos,
son aquellas operaciones que involucren valores muy grandes o cercanos a cero. Esta situacin se
presenta por ejemplo, el clculo de la diferencia de los cuadrados de dos nmeros muy similares

(%i17)

a:1242123.78$
b:1242123.79$
a 2-b 2;
(a-b)*(a+b);

(%o18)

-24842.4755859375

(%o18)

-24842.47572313636

Por cierto? Cul es el resultado correcto? Probemos de otra forma

(%i19)

a:124212378$
b:124212379$
a 2-b 2;
(a-b)*(a+b);

(%o20)

-248424757

(%o21)

-248424757

Parece que el resultado correcto es -24842.4757. Ninguno de los dos anteriores. Vale. Veamos otro
ejemplo usando basado en la misma idea. Fijemos la precisin 40 y consideremos el nmero a:

(%i22)

fpprec:40;

(%o22)

40

(%i23)

a:bfloat(1-(10)(-30));

84

Mtodos numricos de resolucin de ecuaciones

(%o23)

Resolucin numrica de ecuaciones con Maxima

9.99999999999999999999999999999b-1

Ahora vamos a calcular: 1 + a y (a2 1)/(a 1). Deberan ser iguales, ya que ambas expresiones
matemticamente son equivalentes:
1+a=

(a 1)(a + 1) a2 1
=
,
a1
a1

en cambio,

(%i24)

b:1+a$

(%i25)

c:(a 2-1)/(a-1)$

(%i26)

is(b=c);

(%o26)

false

No las reconoce como iguales. Este es el resultado del efecto de cancelacin de cifras significativas que tiene lugar cuando se restan dos cantidades muy parecidas. En este caso es claro cul de
ambas formas de realizar el clculo es mejor.

5.2 Resolucin numrica de ecuaciones con Maxima


Las ecuaciones polinmicas se pueden resolver de manera aproximada. Los comandos allroots y realroots estn especializados en encontrar soluciones racionales aproximadas de polinomios en una variable.

allroots(polinomio )
bfallroots(polinomio )
realroots(polinomio )
realroots(polinomio, error )
nroots(polinomio,a,b )
algsys([ecuaciones ],[variables ])

soluciones aproximadas del polinomio


soluciones aproximadas del polinomio
con precisin arbitraria
soluciones aproximadas reales del polinomio
soluciones aproximadas reales del polinomio
con cota del error
nmero de soluciones reales
del polinomio entre a y b
resuelve la ecuacin o ecuaciones

Ests rdenes nos dan todas las soluciones reales y complejas de un polinomio en una variable y son
tiles en polinomios de grado alto cuando falla la orden solve. La primera de ellas, allroots, allroots
nos da las soluciones con la precisin por defecto

(%i27)

eq:x 9+x 7-x 4+x$

(%i28)

allroots(eq);

85

Resolucin numrica de ecuaciones con Maxima

(%o28)

bfallroots

[x=0.0,x=0.30190507748312%i+0.8440677798278,
x=0.8440677798278-0.30190507748312%i,
x=0.8923132916888%i-0.32846441923834,
x=-0.8923132916888%i-0.32846441923834,
x=0.51104079208431%i-0.80986929589487,
x=-0.51104079208431%i-0.80986929589487,
x=1.189238256723466%i+0.29426593530541,
x=0.29426593530541-1.189238256723466%i]

Si queremos una precisin determinada, usamos la orden bfallroots.

(%i29)

(%o29)

realroots

Mtodos numricos de resolucin de ecuaciones

fpprec:6$
bfallroots(eq);
[x=0.0b0,x=3.0191b-1%i+8.44063b-1,
x=8.44063b-1-3.0191b-1%i,x=8.92279b-1%i-3.28481b-1,
x=-8.92279b-1%i-3.28481b-1,x=5.11037b-1%i-8.09838b-1,
x=-5.11037b-1%i-8.09838b-1,x=1.18924b0%i+2.94256b-1,
x=2.94256b-1-1.18924b0%i]

Si slo nos interesan las soluciones reales, la orden realroots calcula soluciones racionales
aproximadas del polinomio.

(%i30)

eq1:x 4-3*x 3+x 2-4*x+12$

(%i31)

realroots(eq1);
81497599
]
[x=2,x=
33554432

(%o31)

Si comparas con la salida de allroots, comprobars que 2 es solucin, pero que 81497599
33554432 slo
es una solucin aproximada. La precisin con la que se realiza la aproximacin se puede controlar
con un segundo parmetro. Por ejemplo, si queremos que el error sea menor que 105 , escribimos
lo siguiente.

(%i32)
(%o32)

realroots(eq1,10 (-5));
636699
]
[x=2,x=
262144

Recuerda que la variable multiplicities guarda la multiplicidad de cada una de las races
de la ltima ecuacin que has resuelto.

(%i33)
(%o33)

realroots((x-2) 2*eq1,10 (-5));


636699
[x=2,x=
]
262144

86

Mtodos numricos de resolucin de ecuaciones

(%i34)

multiplicities;

(%o34)

[3,1]

Resolucin numrica de ecuaciones con Maxima

Por ltimo, comentar que es posible saber el nmero de races de un polinomio en una variable
en un intervalo concreto 8

(%i35)

nroots(eq1,0,2);

(%o35)

eso s, ten cuidado porque se cuentan races con su multiplicidad

(%i36)

nroots((x-2) 2*eq1,0,2);

(%o36)

El teorema de los ceros de Bolzano


Uno de los primeros resultados que aprendemos sobre funciones continuas es que si cambian
de signo tienen que valer cero en algn momento. Para que esto sea cierto nos falta aadir un
ingrediente: la funciones tienen que estar definidas en intervalos. Este resultado se conoce como
teorema de los ceros de Bolzano y es una variante del teorema del valor intermedio.
Teorema 5.1. Sea f : [a, b] R una funcin continua verificando que f (a) f (b) < 0,
entonces existe c ]a, b[ tal que f (c) = 0.

Teorema de los
ceros de Bolzano

Ejemplo 5.2. Una de las utilidades ms importantes del Teorema de los ceros de Bolzano es
garantizar que una ecuacin tiene solucin. Por ejemplo, para comprobar que la ecuacin e x +
log(x) = 0 tiene solucin, estudiamos la funcin f (x) = e x + log(x): es continua en R+ y se puede
comprobar que f (e10 ) < 0 y 0 < f (e10 ). Por tanto, la ecuacin e x + log(x) = 0 tiene al menos una
solucin entre e10 y e10 . En particular, tiene solucin en R+ .

find_root(f(x),x,a,b )
El comando find_root encuentra una
solucin de una funcin (ecuacin) continua que cambia de signo por el mtodo de biseccin, esto es, dividiendo
el intervalo por la mitad y quedndose
con aquella mitad en la que la funcin
sigue cambiando de signo. En realidad
el mtodo que utiliza Maxima es algo
ms elaborado pero no vamos a entrar
en ms detalles.

(%i37)

solucin de f en [a, b]
find_root

a
(a, f (a))

(b, f (b))
b

Figura 5.1 Teorema de los ceros de Bolzano

f(x):=exp(x)+log(x);

87

Resolucin numrica de ecuaciones con Maxima

(%o37)

Mtodos numricos de resolucin de ecuaciones

f(x):=exp(x)+log(x)

Buscamos un par de puntos donde cambie de signo

(%i38)

f(1)

(%o38)

%e

(%i39)

f(exp(-3));

(%o39)

%e%e +3

Ese nmero es negativo?

(%i40)

is(f(exp(-3))<0);

(%o40)

true

o bien,

(%i41)

f(exp(-3)),numer;

(%o41)

-1.948952728663784

Vale, ya que tenemos dos puntos donde cambia de signo podemos utilizar find_root:

(%i42)

find_root(f(x),x,exp(-3),1);

(%o42)

0.26987413757345

Observacin 5.3. Este mtodo encuentra una solucin pero no nos dice cuntas soluciones hay.
Para eso tendremos que echar mano de otras herramientas adicionales como, por ejemplo, el estudio de la monotona de la funcin.

5.2.1

Ejercicios
Ejercicio 5.1. Calcula las soluciones de 8 sen(x) + 1

x2
3

= 0.

Ejercicio 5.2. Encuentra una solucin de la ecuacin tan(x) =


Ejercicio 5.3. Cuantas soluciones tiene la ecuacin

Se admiten como posibles extremos del intervalo

88

ex
2

1
x

i
h
en el intervalo 0, 2 .

2 sen(x) = 1 en el intervalo [3, 3]?

Mtodos numricos de resolucin de ecuaciones

Breves conceptos de programacin

5.3 Breves conceptos de programacin


Hemos visto cmo resolver ecuaciones y sistemas de ecuaciones con Maxima mediante la orden solve o algsys. La resolucin de ecuaciones y sistemas de ecuaciones de manera exacta
est limitada a aquellas para los que es posible aplicar un mtodo algebraico sencillo. En estas
condiciones, nos damos cuenta de la necesidad de encontrar o aproximar soluciones para ecuaciones del tipo f (x) = 0, donde, en principio, podemos considerar como f cualquier funcin real de
una variable. Nuestro siguiente objetivo es aprender a programar algoritmos con Maxima para
aproximar la solucin de estas ecuaciones.
Lo primero que tenemos que tener en cuenta es que no existe ningn mtodo general para resolver todo este tipo de ecuaciones en un nmero finito de pasos. Lo que s tendremos es condiciones
para poder asegurar, bajo ciertas hiptesis sobre la funcin f , que un determinado valor es una
aproximacin de la solucin de la ecuacin con un error prefijado.
El principal resultado para asegurar la existencia de solucin para la ecuacin f (x) = 0 en
un intervalo [a, b], es el Teorema de Bolzano que hemos recordado ms arriba. Dicho teorema
asegura que si f es continua en [a, b] y cambia de signo en el intervalo, entonces existe al menos
una solucin de la ecuacin en el intervalo [a, b].
Vamos a ver dos mtodos que se basan en este resultado. Ambos mtodos nos proporcionan
un algoritmo para calcular una sucesin de aproximaciones, y condiciones sobre la funcin f
para poder asegurar que la sucesin que obtenemos converge a la solucin del problema. Una vez
asegurada esta convergencia, bastar tomar alguno de los trminos de la sucesin que se aproxime
a la sucesin con la exactitud que deseemos.

5.3.1

Bucles
Antes de introducirnos en el mtodo terico de resolucin, vamos a presentar algunas estructuras
sencillas de programacin que necesitaremos ms adelante.
La primera de las rdenes que vamos a ver es el comando for, usada para realizar bucles. Un
bucle es un proceso repetitivo que se realiza un cierto nmero de veces. Un ejemplo de bucle puede
ser el siguiente: supongamos que queremos obtener los mltiplos de siete comprendidos entre 7 y
70; para ello, multiplicamos 7 por cada uno de los nmeros naturales comprendidos entre 1 y 10,
es decir, repetimos 10 veces la misma operacin: multiplicar por 7.

for var:valor1 step valor2 thru valor3 do expr


for var:valor1 step valor2 while cond do expr
for var:valor1 step valor2 unless cond do expr

bucle for
bucle for
bucle for

En un bucle for nos pueden aparecer los siguientes elementos (no necesariamente todos)
a) var:valor1 nos sita en las condiciones de comienzo del bucle.
b) cond dir a Maxima el momento de detener el proceso.
c) step valor2 expresar la forma de aumentar la condicin inicial.
d) expr dir a Maxima lo que tiene que realizar en cada paso; expr puede estar compuesta de varias
sentencias separadas mediante punto y coma.
En los casos en que el paso es 1, no es necesario indicarlo.

89

Breves conceptos de programacin

Mtodos numricos de resolucin de ecuaciones

for var:valor1 thru valor3 do expr


for var:valor1 while cond do expr
for var:valor1 unless cond do expr

bucle for con paso 1


bucle for con paso 1
bucle for con paso 1

Para comprender mejor el funcionamiento de esta orden vamos a ver algunos ejemplos sencillos.
En primer lugar, generemos los mltiplos de 7 hasta 70:

(%i43)

for i:1 step 1 thru 10 do print(7i)


7
14
21
28
35
42
49
56
63
70

(%o43)

done

Se puede conseguir el mismo efecto sumando en lugar de multiplicando. Por ejemplo, los mltiplos
de 5 hasta 25 son

(%i44)

for i:5 step 5 thru 25 do print(i);


5
10
15
20
25

(%o44)

done

Ejemplo 5.4. Podemos utilizar un bucle para sumar una lista de nmeros pero nos hace falta una
variable adicional en la que ir guardando las sumas parciales que vamos obteniendo. Por ejemplo,
el siguiente cdigo suma los cuadrados de los 100 primeros naturales.

(%i45)

(%o45)

suma:0$
for i:1 thru 100 do suma:suma+i 2$
print("la suma de los cuadrados de los 100 primeros
naturales vale ",suma);
la suma de los cuadrados de los 100 primeros
naturales vale 338350

90

Mtodos numricos de resolucin de ecuaciones

print(expr1,expr2,... )

Breves conceptos de programacin

escribe las expresiones en pantalla

En la suma anterior hemos utilizado la orden print para escribir el resultado en pantalla. La
orden print admite una lista, separada por comas, de literales y expresiones.
Por ltimo, comentar que no es necesario utilizar una variable como contador. Podemos estar
ejecutando una serie de expresiones mientras una condicin sea cierta (bucle while) o mientras
sea falsa (bucle unless). Incluso podemos comenzar un bucle infinito con la orden do, sin ninguna
condicin previa, aunque, claro est, en algn momento tendremos que ocuparnos nosotros de salir
(recuerda el comando return).

while cond do expr


unless cond do expr
do expr
return (var )

bucle while
bucle unless
bucle for
bucle for

Este tipo de construcciones son tiles cuando no sabemos cuntos pasos hemos de dar pero tenemos
clara cul es la condicin de salida. Veamos un ejemplo bastante simple: queremos calcular cos(x)
comenzando en x = 0 e ir aumentando de 0.3 en 0.3 hasta que el coseno deje de ser positivo.

5.3.2

(%i46)

i:0;

(%o46)

(%i47)

while cos(i)>0 do (print([i,cos(i)]),i:i+0.3);


[0, 1]
[0.3, 0.95533648560273]
[0.6, 0.82533560144755]
[0.9, 0.62160994025671]
[1.2, 0.36235771003359]
[1.5, 0.070737142212368]

(%o47)

done

Condicionales
La segunda sentencia es la orden condicional if. Esta sentencia comprueba si se verifica una
condicin, despus, si la condicin es verdadera Maxima ejecutar una expresin1, y si es falsa
ejecutar otra expresin2.

if condicin then expr1 else expr2


if condicin then expr

condicional if-then-else
condicional if-then

La expresiones 1 y 2 pueden estar formadas por varias rdenes separadas por comas. Como siempre
en estos casos, quiz un ejemplo es la mejor explicacin:

(%i48)

if log(2)<0 then x:5 else 3;

91

print

Breves conceptos de programacin

(%o48)

Mtodos numricos de resolucin de ecuaciones

Observa que la estructura if-then-else devuelve la expresin correspondiente y que esta expresin puede ser una asignacin, algo ms complicado o algo tan simple como 3.
La ltima sentencia de programacin que vamos a ver es la orden return(var ) cuya nica
finalidad es la de interrumpir un bucle en el momento que se ejecuta y devolver un valor. En el
siguiente ejemplo se puede comprender rpidamente el uso de esta orden.

(%i49)

for i:1 thru 10 do


(
if log(i)<2 then print("el logaritmo de",i,"es menor
que 2")
else return(x:i)
)$
print("el logaritmo de",x,"es mayor que 2")$
el logaritmo de 1 es menor que 2
el logaritmo de 2 es menor que 2
el logaritmo de 3 es menor que 2
el logaritmo de 4 es menor que 2
el logaritmo de 5 es menor que 2
el logaritmo de 6 es menor que 2
el logaritmo de 7 es menor que 2
el logaritmo de 8 es mayor que 2

Observacin 5.5. La variable que se utiliza como contador, i en el caso anterior, es siempre local
al bucle. No tiene ningn valor asignado fuera de l. Es por esto que hemos guardado su valor en
una variable auxiliar, x, para poder usarla fuera del bucle.

5.3.3

Ejercicios
Ejercicio 5.4. Usa el comando for en los siguientes ejemplos:
a) Sumar los nmeros naturales entre 400 y 450.
b) Calcula la media de los cuadrados de los primeros 1000 naturales.
Ejercicio 5.5. Dado un nmero positivo x, se puede conseguir que la suma
1+

1 1
1
+ + +
2 3
n

sea mayor que x tomando un nmero n suficientemente grande. Encuentra la forma de calcular
dicho nmero de manera general. Cul es el valor para x = 10, 11 y 13?
Ejercicio 5.6. Calcula las medias geomtricas de los n primeros naturales y averigua cul es el
primer natural para el que dicha media sea mayor que 20.
Ejercicio 5.7. Calcula la lista de los divisores de una natural n.

92

Mtodos numricos de resolucin de ecuaciones

El mtodo de biseccin

5.4 El mtodo de biseccin


El mtodo de biseccin es una de las formas ms elementales de buscar una solucin de una
ecuacin. Ya sabemos que si una funcin continua cambia de signo en un intervalo, entonces se
anula en algn punto. Cmo buscamos dicho punto?
(b, f (b))

(c, f (c))
(a, f (a))
Figura 5.2

Mtodo de biseccin

Comencemos con una funcin f : [a, b] R continua y verificando que tiene signos distintos
en los extremos del intervalo. La idea bsica es ir dividiendo el intervalo por la mitad en dos
subintervalos, [a, 1/2(a + b)] y [1/2(a + b), b], y elegir aquel en el que la funcin siga cambiando de
signo. Si repetimos este proceso, obtenemos un intervalo cada vez ms pequeo donde se encuentra
la raz.
Ms concretamente el proceso sera,
Datos iniciales: funcin f , nmeros a, b
Se verifica que: f (a) f (b) < 0
bucle
B Calculamos el punto medio c = (a + b)/2,
B Comparamos los signos de f (a), f (c) y f (b)
B y elegimos aqul donde la funcin cambie de signo
final bucle

5.4.1

Un ejemplo concreto
Vamos a aplicar este mtodo a la funcin f (x) = x6 + x 5 en el intervalo [0, 2].
Definiremos en primer lugar la funcin y el intervalo y luego un bucle que nos calcula el intervalo donde, despus de los pasos que digamos, se encuentra localizado el cero de la funcin.

(%i50)

f(x):=x 6+x-5;
a:0.0;
b:2.0;

(%o51)

x 6+x-5

(%o52)

0.0

(%o53)

2.0

93

El mtodo de biseccin

Mtodos numricos de resolucin de ecuaciones

Observa que hemos declarado a y b como valores numricos. Comprobamos que la funcin cambia
de signo.

(%i54)

f(a)*f(b);

(%o54)

-305.0

Ahora el bucle, 9

(%i55)

(%o55)

for i:1 thru 10 do


(
c:(a+b)/2, /* calculamos el punto medio */
if f(a)f(c)<0 /* cambia de signo en [a,c]? */
then b:c /* elegimos [a,c] */
else a:c, /* elegimos [c,b] */
print(a,b) /* escribimos los resultados por pantalla */
)$
1.0 2.0
1.0 1.5
1.0 1.25
1.125 1.25
1.1875 1.25
1.21875 1.25
1.234375 1.25
1.2421875 1.25
1.24609375 1.25
1.24609375 1.248046875

Fjate que ya sabemos que la solucin es aproximadamente 1.24. No podemos estar seguros
todava del tercer decimal. Quiz sera mejor repetir el bucle ms de diez veces, pero, cuantas?
Podemos establecer como control que la distancia entre los extremos sea pequea. Eso s, habra
que aadir un tope al nmero de pasos para asegurarnos de que el bucle termina.
Observacin 5.6. Si no se quiere ralentizar mucho la ejecucin de este bucle y del resto de programas en el resto del tema, es conveniente trabajar en modo nmerico. Recuerda que este comportamiento se controla con la variable numer. Puedes cambiarlo en el men NumricoConmutar
salida numrica o directamente estableciendo el valor de numer en verdadero.

(%i56)

numer:true;

(%o56)

true

Los smbolos /* y */ indican el principio y el fin de un comentario. No se ejecutan.

94

Mtodos numricos de resolucin de ecuaciones

El mtodo de biseccin

Control del error


En este mtodo es fcil acotar el error que estamos cometiendo. Sabemos que la funcin f
se anula entre a y b. Cul es la mejor eleccin sin tener ms datos? Si elegimos a la solucin,
tericamente, podra ser b. El error sera en este caso b a. Hay alguna eleccin mejor? S, el
punto medio c = (a + b)/2. Cul es el error ahora? Lo peor que podra pasar sera que la solucin
fuera alguno de los extremos del intervalo. Por tanto, el error sera como mucho ba
2 . En cada paso
que damos dividimos el intervalo por la mitad y al mismo tiempo tambin el error cometido que
en el paso n-simo es menor o igual que ba
2n .
A partir de aqu, podemos deducir el nmero de iteraciones necesarias para obtener una aproximacin con un error o exactitud prefijados. Si notamos por err a la exactitud prefijada, entonces
para conseguir dicha precisin, el nmero n de iteraciones necesarias deber satisfacer
ba
err
2n
as,
n log2

ceiling(a)

! log  ba 
ba
err
=
.
err
log(2)

menor entero mayor o igual que a

La orden ceiling(x) nos da el menor entero mayor o igual que x. Bueno, ya sabemos cuntos
pasos tenemos que dar. Reescribimos nuestro algoritmo con esta nueva informacin:
Datos iniciales: funcin f , nmeros a, b, error err, contador i
Se verifica que: f (a) f (b) < 0
B Calculamos el nmero de pasos
para i:1 hasta nmero de pasos hacer
B Calculamos el punto medio c = (a + b)/2,
B Comparamos los signos de f (a), f (c) y f (b)
B y elegimos aqul donde la funcin cambie de signo
final bucle
Volviendo a nuestro ejemplo, nos quedara algo as.

95

ceiling

El mtodo de biseccin

(%i57)

Mtodos numricos de resolucin de ecuaciones

f(x):=x 6+x-5;
a:0$
b:2$
err:10 (-6)$
log2(x):=log(x)/log(2)$ /* hay que definir el logaritmo en
base 2 */
pasos:ceiling(log2((b-a)/err))$
for i:1 thru pasos do
(
c:(a+b)/2,
if f(a)f(c)<0
then b:c
else a:c,
print(a,b) /* escribimos los resultados por pantalla */
)$

Y si hay suerte?
Si encontramos la solucin en un paso intermedio no habra que hacer ms iteraciones. Deberamos parar y presentar la solucin encontrada. En cada paso, tenemos que ir comprobando que f (c)
vale o no vale cero. Podramos comprobarlo con una orden del tipo is(f(c)=0), pero recuerda
que con valores numricos esto puede dar problemas. Mejor comprobemos que es suficientemente pequeo.
Datos iniciales: funcin f , nmeros a, b, error err, contador i, precisin pr
Se verifica que: f (a) f (b) < 0
B Calculamos el nmero de pasos
para i:1 hasta nmero de pasos hacer
B Calculamos el punto medio c = (a + b)/2,
si f(c)<pr entonces
B La solucin es c
en otro caso
B Comparamos los signos de f (a), f (c) y f (b)
B y elegimos aqul donde la funcin cambie de signo
final si
B La solucin aproximada es c
final del bucle
En nuestro ejemplo, tendramos lo siguiente

96

Mtodos numricos de resolucin de ecuaciones

(%i58)

El mtodo de biseccin

f(x):=x 6+x-5;
a:0$
b:2$
err:10 (-6)$
pr:10 (-5)$
log2(x):=log(x)/log(2)$
pasos:ceiling(log2((b-a)/err))$
for i:1 thru pasos do
(
c:(a+b)/2,
if abs(f(c))<pr
then (print("La solucion es exacta"), return(c))
else if f(a)f(c)<0
then b:c
else a:c
)$
print("la solucion es ",c)$ /* aproximada o exacta, es la
solucin */

Se te ocurren algunas mejoras del algoritmo? Algunas ideas ms:


a) el clculo de f (a) f (c) en cada paso no es necesario: si sabemos el signo de f (a), slo necesitamos saber el signo de f (c) y no el signo del producto,
b) habra que comprobar que f (a) y f (b) no son cero (eso ya lo hemos hecho) ni estn cerca de
cero como hemos hecho con c.
c) Si queremos trabajar con una precisin mayor de 16 dgitos, sera conveniente utilizar numros
en coma flotante grandes.

5.4.2

Funciones y bloques
Una vez que tenemos ms o menos completo el mtodo de biseccin, sera interesante tener una
forma cmoda de cambiar los parmetros iniciales: la funcin, la precisin, los extremos, etc. Un
bloque es la estructura diseada para esto: permite evaluar varias expresiones y devuelve el ltimo
resultado salvo peticin expresa.
La forma ms elemental de programa en Maxima es lo que hemos hecho dentro del cuerpo
del bucle anterior: entre parntesis y separados por comas se incluyen comandos que se ejecutan
sucesivamente y devuelve como salida la respuesta de la ltima sentencia.

(%i59)

(a:3,b:2,a+b);

(%o59)

Variables y funciones locales


Es conveniente tener la precaucin de que las variables que se utilicen sean locales a dicho
programa y que no afecten al resto de la sesin. Esto se consigue agrupando estas rdenes en un
bloque

97

El mtodo de biseccin

local

Mtodos numricos de resolucin de ecuaciones

(%i60)

a:1;

(%o60)

(%i61)

block([a,b],a:2,b:3,a+b);

(%o61)

(%i62)

a;

(%o62)

Como puedes ver, la variable a global sigue valiendo uno y no cambia su valor a pesar de
las asignaciones dentro del bloque. Esto no ocurre con las funciones que definamos dentro de un
bloque. Su valor es global a menos que lo declaremos local explcitamente con la sentencia local.
Observa la diferencia entre las funcione f y g.

(%i63)

block([a,b],
local(g),g(x):=x 3,
f(x):=x 2,
a:2,b:3,g(a+b));

(%o63)

125

Si preguntamos por el valor de f o de g fuera del bloque, f tiene un valor concreto y g no:

(%i64)

f(x);

(%o64)

x2

(%i65)

g(x);

(%o65)

g(x)
local(funciones )
return(expr )
block([var1,var2,.. ],expr1,expr2,..)

declara funciones locales


a un bloque
detiene la ejecucin de un
bloque y devuelve expr
evala expr1, expr2,... y
devuelve la ltima expresin
evaluada

El ltimo paso suele ser definir una funcin que permite reutilizar el bloque. Por ejemplo, el factorial de un nmero natural n se define recursivamente como
1! = 1,

(n + 1)! = (n + 1) n!.

Podemos calcular el factorial de un natural usando un bucle: usaremos la variable f para ir acumulando los productos sucesivos y multiplicamos todos los naturales hasta llegar al pedido.

98

Mtodos numricos de resolucin de ecuaciones

El mtodo de biseccin

(%i66)

fact(n):=block([f:1], for k:1 thru n do f:f*k,f );

(%o66)

fact(n):=block([f:1],for k thru n do f:f*k,f)

(%i67)

fact(5);

(%o67)

120

Y si quiero acabar antes?


Si queremos salir de un bloque y devolver un resultado antes de llegar a la ltima expresin,
podemos usar la orden return. Por ejemplo, recuerda la definicin que hicimos en el primer
tema de la funcin logaritmo con base arbitraria.

(%i68)

loga(x):=log(x)/log(a)$

Esto podemos mejorarlo algo utilizando dos variables:

(%i69)

loga(x,a):=log(x)/log(a)$

pero deberamos tener en cuenta si a es un nmero que se puede tomar como base para los logaritmos. Slo nos valen los nmeros positivos distintos de 1. Vamos a utilizar un bloque y un
condicional.

(%i70)

loga(x,a):=block(
if a<0 then print("La base es negativa"),
if a=1 then print("La base es 1"),
log(x)/log(a)
)$

Si probamos con nmeros positivos

(%i71)
(%o71)

loga(3,4);
log(3)
log(4)

Funciona. Y si la base no es vlida?

(%i72)
(%o72)

log(3,-1);
No calculamos logaritmos con base 1
log(3)
log(-1)

99

El mtodo de biseccin

Mtodos numricos de resolucin de ecuaciones

Fjate que no hemos puesto ninguna condicin de salida en el caso de que la base no sea vlida.
Por tanto, Maxima evala una tras otra cada una de las sentencias y devuelve la ltima. Vamos a
arreglarlo.

(%i73)

loga(x,a):=block(
if a<0 then
(print("La base es negativa"),return()),
if a=1 then
(print("La base es 1"),return()),
log(x)/log(a)
)$

Parmetros opcionales
Para redondear la definicin de la funcin logaritmo con base cualquiera, podra ser interesante
que la funcin loga calcule el logaritmo neperiano si slo ponemos una variable y el logaritmo
en base a si tenemos dos variables.
Las entradas opcionales se pasan a la definicin de una funcin entre corchetes. Por ejemplo, la
funcin

(%i74)

f(a,[b]):=block(print(a),print(b))$

da por pantalla la variable a y el parmetro o parmetros adicionales que sean. Si solo escribimos
una coordenada

(%i75)

f(2);
2
[]

(%o75)

[]

nos devuelve la primera entrada y la segunda obviamente vaca en este caso. Pero si aadimos una
entrada ms

(%i76)

f(2,3);
2
[3]

(%o76)

[3]

o varias

(%i77)

f(2,3,4,5);
2
[3,4,5]

100

Mtodos numricos de resolucin de ecuaciones

(%o77)

El mtodo de biseccin

[3,4,5]

Como puedes ver, [b] en este caso representa una lista en la que incluimos todos los parmetros opcionales que necesitemos. Ahora slo es cuestin de utilizar las sentencias que nos permiten
manejar los elementos de una lista para definir la funcin logaritmo tal y como queramos.

(%i78)

loga(x,[a]):=block([res],/* variable para el resultado */


if length(a)=0
then return(res:log(x))
else (
if a[1]<0 then (print("La base es negativa"),return()),
if a[1]=1 then (print("La base es 1"),return()),
log(x)/log(a[1])
)
)$

Observacin 5.7. Se puede salir del bloque de definicin de la funcin usando la sentencia
error(mensaje ) en los casos en que la base no sea la adecuada.

(%i79)

5.4.3

loga(x,[a]):=block([res],/* variable para el resultado */


if length(a)=0
then return(res:log(x))
else (
if a[1]<0 then error("Cambia la base"),
if a[1]=1 then error("La base es 1"),
log(x)/log(a[1])
)
)$

De nuevo biseccin
Si unimos todo lo que hemos aprendido, podemos definir una funcin que utilice el mtodo de
biseccin. Hemos usado la sentencia subst para definir la funcin a la que aplicamos biseccin
dentro del bloque. La orden subst(a,b,c) sustituye a por b en c.

biseccion(expr,var,ext_inf,ext_sup):=
block(
[a,b,c,k,err:10(-8),prec:10(-9)],
/* extremos del intervalo */
a:ext_inf,
b:ext_sup,
/* nmero de pasos */
local(log2,f),
define(log2(x),log(x)/log(2)),

101

Mtodos de iteracin funcional

Mtodos numricos de resolucin de ecuaciones

define(f(x),subst(x,var,expr)),
pasos:ceiling(log2((b-a)/err)),
/* comprobamos las condiciones iniciales */
if f(a)*f(b)>0 then error("Error: no hay cambio de signo"),
/* se alcanza la solucin en los extremos? */
if abs(f(a)) < prec then return(a),
if abs(f(b)) < prec then return(b),
for k:1 thru pasos do
(
c:(a+b)/2,
if abs(f(c))< prec then return (c),
if f(a)*f(c)< 0 then b:c else a:c
),
c);
A partir de este momento, podemos utilizarlo usando

(%i80)

biseccion(x 2-2,x,0.0,3.0);

(%o80)

1.414213562384248

Observa que las cotas del error y la precisin la hemos fijado dentro del bloque. Prueba a aadirlo
como valores opcionales.

5.4.4

Ejercicios
Prueba a cambiar la funcin, los extremos del intervalo (en los cuales dicha funcin cambia de
signo), as como la exactitud exigida. Intenta tambin buscar un caso simple en el que se encuentre
solucin exacta en unos pocos pasos. Por ltimo, intenta usar el algoritmo anterior para calcular
la
3
5 con una exactitud de 1010 .

5.5 Mtodos de iteracin funcional


En esta seccin tratamos de encontrar una solucin aproximada de una ecuacin de la forma
x = f (x). Es usual referirse a dichas soluciones como puntos fijos de la funcin f . Los puntos
fijos de una funcin f no son ms los puntos de interseccin de las grficas de la funcin f y de
la identidad. Por ejemplo, la funcin de la Figura 5.3 tiene tres puntos fijos.
Hay algunas condiciones sencillas que nos garantizan que una funcin tiene un nico punto fijo.
Teorema 5.8. Sea f : [a, b] [a, b].
a) Si f es continua, f tiene al menos un punto fijo.
b) Si f es derivable y | f 0 (x) | L < 1, x [a, b], entonces tiene un nico punto fijo.

102

Mtodos numricos de resolucin de ecuaciones

Mtodos de iteracin funcional

a3
a1
a2
g(x) = x

f (x)
Figura 5.3 Puntos fijos de una funcin

Iteracin funcional
Para buscar un punto fijo de una funcin, se elige un punto inicial x1 [a, b] cualquiera y aplicamos la funcin repetidamente. En otras palabras, consideramos la sucesin definida por recurrencia
como
xn+1 = f (xn )
para n 1. Si la sucesin es convergente y llamamos s a su lmite, entonces
s = lim xn+1 = lim f (xn ) = f (s),
n

o, lo que es lo mismo, s es un punto fijo de la funcin f . Ms an, en algunos casos es posible


controlar el error.
Teorema 5.9. Sea f : [a, b] [a, b] derivable verificando que | f 0 (x) | L < 1, x [a, b].
Sea s el nico punto fijo de la funcin f . Sea x1 [a, b] cualquiera y xn+1 = f (xn ), entonces
| xn s |

Ln1
L
| xn xn1 |
| x2 x1 | .
1L
1L

El mtodo de construccin de la sucesin es lo que se conoce como un mtodo de iteracin


funcional.


Ejemplo 5.10. Consideremos la funcin f (x) = 14 cos(x) + x2 con x [0, 1]. Acotemos la
derivada,
0 sen(x) + 2x sen(x) 2x 1 2 3
f (x) =

+
+ = < 1.
4
4 4 4 4 4
Por tanto, la funcin f tiene un nico punto fijo en el intervalo [0, 1]. Podemos encontrar el punto
fijo resolviendo la correspondiente ecuacin.

(%i81)

find_root((cos(x)+x 2)/4-x,x,0,1);

(%o81)

.2583921443715997

103

Mtodos de iteracin funcional

Mtodos numricos de resolucin de ecuaciones

Tambin podemos calcular las iteraciones comenzando en un punto inicial dado de manera sencilla
utilizando un bucle

(%i82)

define(f(x),(cos(x)+x 2)/4)$

(%i83)

x0:0;
for i:1 thru 10 do(
x1:f(x0),print("Iteracin",i,"vale", x1),x0:x1
);

(%o83)

0
Iteracin
Iteracin
Iteracin
Iteracin
Iteracin
Iteracin
Iteracin
Iteracin
Iteracin
Iteracin

1 vale 0.25
2 vale .2578531054276612
3 vale .2583569748525884
4 vale .2583898474528139
5 vale .2583919943502456
6 vale .2583921345730372
7 vale .2583921437316118
8 vale .2583921443297992
9 vale .2583921443688695
10 vale .2583921443714213

Observacin 5.11. Existen muchas formas de cambiar una ecuacin de la forma f (x) = 0 en un
problema de puntos fijos de la forma g(x) = x. Por ejemplo, consideremos la ecuacin x2 5x+2 =
0.
a) Sumando x en los dos miembros
x2 5x + 2 = 0 x2 4x + 2 = x,
y las soluciones de f son los puntos fijos de g1 (x) = x2 4x + 2 (si los tiene).
b) Si despejamos x,
x2 5x + 2 = 0 x =

x2 + 2
5

y, en este caso, los puntos fijos de la funcin g2 (x) = x 5+2 son las soluciones buscadas.
c) Tambin podemos despejar x2 y extraer races cuadradas

x2 5x + 2 = 0 x2 = 5x 2 x = 5x 2 .

En este caso, nos interesan los puntos fijos de la funcin g3 (x) = 5x 2.


Como puedes ver, la transformacin en un problema de puntos fijos no es nica. Evidentemente,
algunas de las transformaciones mencionadas antes dependen de que x sea distinto de cero, mayor
o menor que 2/5, etc. Adems de eso las funciones gi pueden tener mejores o peores propiedades,
algunas verificarn las condiciones del teorema anterior y otras no.
2

104

Mtodos numricos de resolucin de ecuaciones

5.5.1

Mtodos de iteracin funcional

Ejercicios
Ejercicio 5.8. Escribe un programa que dada una funcin, un punto inicial y un nmero de
iteraciones, devuelva la ltima de ellas.
Ejercicio 5.9. Utiliza el mtodo de iteracin con las 3 funciones anteriores empezando en cada
uno de los puntos 0.5, 1.5 y 6. En cules obtienes convergencia a un punto fijo? Es siempre el
mismo?

5.5.2

Representacin grfica con el paquete dynamics


Para representar grficamente los puntos de la sucesin, comenzamos con el primer punto de la
sucesin (x1 , f (x1 )) y, a partir de ese momento, nos vamos moviendo horizontalmente hasta cruzar
la bisectriz y verticalmente hasta encontrar de nuevo la grfica de la funcin. Ms concretamente,
a) comenzamos con (x1 , f (x1 ));
b) nos movemos horizontalmente hasta cortar la bisectriz. El punto de corte ser ( f (x1 ), f (x1 ));
c) nos movemos verticalmente hasta cortar a la grfica de f o, lo que es lo mismo, tomamos
x2 = f (x1 ) y le calculamos su imagen. El punto de corte ser esta vez (x2 , f (x2 )).
d) Repetimos.

Figura 5.4 Mtodo de iteracin funcional


El paquete dynamics permite hacer estas representaciones de forma muy sencilla. Primero lo cargamos

(%i84)

load(dynamics)$

y luego podemos usar los comandos evolution y staircase indicando el punto inicial y el
nmero de iteraciones. Por ejemplo, el diagrama de escalera para la funcin ex tomando como
punto inicial 1 y 10 pasos

(%i85)

staircase(exp(-x),1,10,[y,0,1]);

105

Mtodos de iteracin funcional

Mtodos numricos de resolucin de ecuaciones

(%o85)

Observa que hemos aadido [y,0,1] para indicar un rango ms apropiado que el se dibuja por
defecto.

evolution(func,pto1,pasos,opciones )
staircase(func,pto1,pasos,opciones )

5.5.3

Tolerancia

5.5.4

Grfico de escalera
de las iteraciones de func

Criterios de parada
Suele cuando trabajamos con mtodos iterativos que tenemos una sucesin que sabemos que
es convergente, pero no conocemos cul es el valor exacto de su lmite. En estos casos lo que
podemos hacer es sustituir el valor desconocido del lmite por uno de los trminos de la sucesin
que hara el papel de una aproximacin de dicho lmite. Por ejemplo, si consideramos el trmino
general de una sucesin {an }nN dada, con la ayuda del ordenador podemos calcular un nmero
finito de trminos. La idea es pararse en los clculos en un determinado elemento ak0 para que
haga el papel del lmite. Se impone entonces un criterio de parada para que dicho valor sea una
buena aproximacin del lmite de la sucesin.
Una forma de establecer un criterio de parada es considerar un nmero pequeo, al que llamaremos tolerancia y denotaremos por T , y parar el desarrollo de la sucesin cuando se de una de
las dos circunstancias siguientes:
a) |an an1 | < T ,
| an an1 |
b)
< T.
|an |
La primera es el error absoluto y la segunda el error relativo. Suele ser mejor utilizar esta ltima.

Ejercicios
Ejercicio 5.10.

5.5.5

Grfico de las iteraciones de func

Aade una condicin de parada al mtodo de iteracin.

El mtodo de Newton-Raphson
El mtodo de Newton-Raphson nos proporciona un algoritmo para obtener una sucesin de
puntos que aproxima un cero de una funcin dada.
La forma de construir los trminos de la sucesin de aproximaciones es sencilla. Una vez fijado
un valor inicial x1 , el trmino x2 se obtiene como el punto de corte de la recta tangente a f en x1
con el eje OX. De la misma forma, obtenemos xn+1 como el punto de corte de la recta tangente a
f en el punto xn con el eje OX. De lo dicho hasta aqu se deduce:

106

Mtodos numricos de resolucin de ecuaciones

Mtodos de iteracin funcional

xn+1 = xn

f (xn )
.
f 0 (xn )

Como observars se trata de un mtodo de iteracin funcional. Para comprender el algoritmo observa la Figura 5.5 donde se ve cmo se generan los valores de las aproximaciones.
Para asegurar la convergencia de la sucesin (hacia la solucin de la ecuacin) usaremos el
siguiente resultado.
Teorema 5.12. Sea f una funcin de clase dos en el intervalo [a, b] que verifica:
a) f (a) f (b) < 0,
b) f 0 (x) 6= 0, para todo x [a, b],
c) f 00 (x) no cambia de signo en [a, b].
Entonces, tomando como primera aproximacin el extremo del intervalo [a, b] donde f y f 00
tienen el mismo signo, la sucesin de valores xn del mtodo de Newton-Raphson es convergente hacia la nica solucin de la ecuacin f (x) = 0 en [a, b].
f (x)

40
30
20
10

2 x2

x1

10
Figura 5.5 Mtodo de Newton-Raphson
Una vez que tenemos asegurada la convergencia de la sucesin hacia la solucin de la ecuacin,
deberamos decidir la precisin. Sin embargo, veremos que el mtodo es tan rpido en su convergencia que por defecto haremos siempre 10 iteraciones. Otra posibilidad sera detener el clculo
de cuando el valor absoluto de la diferencia entre xn y xn+1 sea menor que la precisin buscada (lo
cual no implica necesariamente que el error cometido sea menor que la precisin).
Utilizaremos ahora Maxima para generar la sucesin de aproximaciones. Resolvamos de nuevo
el ejemplo de x3 5 = 0 en el intervalo [1, 3].
Podemos comprobar, dibujando las grficas de f (x) = x3 5, f 0 (x) y f 00 (x) en el intervalo
[1, 3], que estamos en las condiciones bajo las cuales el Teorema de Newton-Raphson nos asegura
convergencia.

(%i86)

f(x):=x 3-5$

(%i87)

define(df(x),diff(f(x),x))$

(%i88)

define(df2(x),diff(f(x),x,2))$

(%i89)

plot2d([f(x),df(x),df2(x)],[x,1,3]);

107

Teorema de
Newton-Raphson

Mtodos de iteracin funcional

(%o89)

Mtodos numricos de resolucin de ecuaciones

30

x3-5
3*x2
6*x

25

20

15

10

-5
1

1.5

2.5

A continuacin, generaremos los trminos de la sucesin de aproximaciones mediante el siguiente algoritmo. Comenzaremos por definir la funcin f y el valor de la primera aproximacin.
Inmediatamente despus definimos el algoritmo del mtodo de Newton-Raphson, e iremos visualizando las sucesivas aproximaciones. Como dijimos, pondremos un lmite de 10 iteraciones, aunque
usando mayor precisin decimal puedes probar con un nmero mayor de iteraciones.

(%i90)

y:3.0$
for i:1 thru 10 do
(y1:y-f(y)/df(y),
print(i,"- aproximacin",y1),
y:y1
);
1 - aproximacin 2.185185185185185
2 - aproximacin 1.80582775632091
3 - aproximacin 1.714973662124988
4 - aproximacin 1.709990496694424
5 - aproximacin 1.7099759468005
6 - aproximacin 1.709975946676697
7 - aproximacin 1.709975946676697
8 - aproximacin 1.709975946676697
9 - aproximacin 1.709975946676697
10 - aproximacin 1.709975946676697

Observars al ejecutar este grupo de comandos que ya en la sptima iteracin se han estabilizado diez cifras decimales. Como puedes ver, la velocidad de convergencia de este mtodo es muy
alta.

El mdulo mnewton
El mtodo que acabamos de ver se encuentra implementado en Maxima en el mdulo mnewton
de forma mucho ms completa. Esta versin se puede aplicar tanto a funciones de varias variables,
en otras palabras, tambin sirve para resolver sistemas de ecuaciones.
Primero cargamos el mdulo

(%i91)

load(mnewton)$

108

Mtodos numricos de resolucin de ecuaciones

Mtodos de iteracin funcional

y luego podemos buscar una solucin indicando funcin, variable y punto inicial

5.5.6

(%i92)

mnewton(x 3-5,x,3);

(%o92)

[[x=1.709975946676697]]

Ejercicios
Ejercicio 5.11.
El mtodo de regula falsi o de la falsa posicin es
muy parecido al mtodo de biseccin. La nica diferencia es que se cambia el punto medio por el punto
de corte del segmento que une los puntos (a, f (a)) y
(b, f (b)) con el eje de abscisas.
Escribe un programa que utilice este mtodo. Para la
funcin f (x) = x2 5 en el intervalo [0, 4], compara
los resultados obtenidos. Cul es mejor?

(b, f (b))

(a, f (a))

f (x)

Figura 5.6 Mtodo de regula falsi


Ejercicio 5.12. Reescribe el mtodo de NewtonRaphson aadiendo una condicin de salida (cundo
el error relativo o absoluto sea menor que una cierta cantidad) y que compruebe que la primera
derivada est lejos de cero en cada paso.
Ejercicio 5.13.
El mtodo de la secante evita calcular la derivada
de una funcin utilizando recta secantes. Partiendo
de dos puntos iniciales x0 y x1 , el siguiente es el
punto de corte de la recta que pasa por (x0 , f (x0 )) y
(x1 , f (x1 )) y el eje de abscisas. Se repite el proceso
tomando ahora los puntos x1 y x2 y as sucesivamenx2 x0
x1
te.
f (x)
La convergencia de este mtodo no est garantizada,
pero si los dos puntos iniciales estn prximos a la
Figura 5.7 Mtodo de la secante
raz no suele haber problemas. Su convergencia es
ms lenta que el mtodo de Newton-Raphson aunque a cambio los clculos son ms simples.
Escribe un programa que utilice este mtodo. Para la funcin f (x) = x2 5, compara los resultados
obtenidos con el mtodo de Newton-Raphson. Cul es mejor?
Ejercicio 5.14. Resuelve las ecuaciones
a) ex + x2 3 sen(x) = 0,
b) e| x | = arctan(x),
c) x15 2 = 0
utilizando los mtodos que hemos estudiado. Compara cmo se comportan y decide en cul la
convergencia es ms rpida.

109

Mtodos de iteracin funcional

Mtodos numricos de resolucin de ecuaciones

Ejercicio 5.15.
2
3
a) Considrese la ecuacin e(x +x+1) e x 2 = 0. Calcular programando los mtodos de biseccin
y de Newton-Raphson, la solucin de dicha ecuacin en el intervalo [0.3, 1] con exactitud
1010 .
b) Buscar la solucin que la ecuacin tan(x) = 1x posee en el intervalo [0, 2 ] usando los mtodos
estudiados.

110

Lmites y continuidad

Lmites

Lmites y continuidad
6
6.1 Lmites 111
cios 117

6.2 Sucesiones 113

6.3 Continuidad 115

6.4 Ejerci-

Uno de los primeros conceptos que se presentan en un curso de Clculo es el de continuidad.


Este concepto est ntimamente ligado al concepto de lmite. En clase hemos utilizado sucesiones
para definir lmite funcional. En este captulo veremos cmo usar Maxima para resolver algunos
problemas relacionados con todos esto.

6.1 Lmites
El clculo de lmites se realiza con la orden limit. Con
ella podemos calcular lmites de funciones o de sucesiones
en un nmero, en + o en . Tambin podemos usar el men AnlisisCalcular lmite. Ah podemos escoger, adems
de a qu funcin le estamos calculando el lmite, a qu tiende
la variable incluyendo los valores especiales como , e o infinito. Adems de esto, tambin podemos marcar si queremos
calcular nicamente el lmite por la derecha o por la izquierda
en lugar de la opcin por defecto que es por ambos lados.

limit (expr,x,a )
limit (expr,x,a,plus)
limit (expr,x,a,minus)
inf
minf
und
ind

lim xa expr
lim xa+ expr
lim xa expr
+

indefinido
indefinido pero acotado

El clculo de lmites con Maxima, como puedes ver, es sencillo. Sabe calcular lmites de cocientes
de polinomios en infinito

(%i1)

limit(n/(n+1),n,inf);

(%o1)

111

Lmites

Lmites y continuidad

o en ,

(%i2)

limit((x 2+3x+1)/(2x+3),x,minf);

(%o2)

aplicar las reglas de LHpital,

(%i3)

limit(sin(x)/x,x,0);

(%o3)

Incluso es capaz de dar alguna informacin en el caso de que no exista el lmite. Por ejemplo,
sabemos que las funciones peridicas, salvo las constantes, no tienen lmite en . La respuesta de
Maxima cuando calculamos el lmite de la funcin coseno en es

(%i4)

limit(cos(x),x,inf);

(%o4)

ind

Indeterminado. Este lmite es equivalente a

(%i5)

limit(cos(1/x),x,0);

(%o5)

ind

La funcin cos
su grfica.

(%i6)

 
1
x

oscila cada vez ms rpidamente cuando nos acercamos al origen. Observa

plot2d([cos(1/x)], [x,-2,2]);

(%o6)

1
0.8
0.6
0.4

cos(1/x)

0.2
0
-0.2
-0.4
-0.6
-0.8
-1

ind
und

-2

-1.5

-1

-0.5

0
x

0.5

1.5

Maxima tiene dos formas de indicar indeterminacin. Una es ind, para indicar que est acotado,
y la otra es und, para indicar indeterminacin a secas. Ahora bien, mucho cuidado con pensar que
si la respuesta es und entonces la funcin es no acotada. Esto puede ser cierto o no

(%i7)

limit(abs(x)/x,x,0);

112

Lmites y continuidad

(%o7)

Sucesiones

und

Observacin 6.1. La acotacin que incluye ind es una informacin adicional que da Maxima.
Si no sabe si es cierta la acotacin o, directamente, no es cierta, entonces responde und pero esto
no quiere decir que la funcin a la que le estamos calculando el lmite no est acotada: solamente
quiere decir que no sabe si lo est o no.
En este ltimo lmite lo que ocurre es que tenemos que estudiar los lmites laterales

(%i8)

limit(abs(x)/x,x,0,plus);

(%o8)

(%i9)

limit(abs(x)/x,x,0,minus);

(%o9)

-1

Por tanto, no existe el lmite puesto que los lmites laterales no coinciden. Si recuerdas la definicin
de funcin derivable, acabamos de comprobar que la funcin valor absoluto no es derivable en el
origen.

Infinito o infinitos?
Maxima diferencia entre infinitos reales e infinitos complejos. Qu quiere decir esto? Veamos un ejemplo. Si calculamos el lmite de la funcin 1/x en 0 inmediatamente pensamos que el
resultado depende de si calculamos el lmite por la izquierda o por la derecha. En efecto,

(%i10)

limit(1/x,x,0,plus);

(%o10)

(%i11)

limit(1/x,x,0,minus);

(%o11)

Pero, qu ocurre si no estudiamos lmites laterales?

(%i12)

limit(1/x,x,0);

(%o12)

infinity

La constante infinity representa infinito complejo. Esto quiere decir que en mdulo el
lmite es infinito.

6.2 Sucesiones
En clase hemos visto cmo calcular lmites de sucesiones, pero cmo podemos calcular esos
lmites con Maxima? Bueno, en la prctica hemos visto dos tipos de sucesiones dependiendo de
cmo estaba definidas. Por un lado tenemos aquellas definidas mediante una frmula que nos vale

113

infinity

Sucesiones

Lmites y continuidad


n
para todos los trminos. Por ejemplo, la sucesin que tiene como trmino general xn = 1 + 1n .
En este caso no hay ningn problema en definir

(%i13)
(%o13)

f(n):=(1+1/n) n;
 1 n
f(n):= 1+
n

y se puede calcular el lmite en + sin ninguna dificultad

(%i14)

limit(f(n), n, inf);

(%o14)

%e

La situacin es diferente cuando no tenemos una frmula para el trmino general como, por
ejemplo, cuando la sucesin est definida por recurrencia. Veamos un ejemplo. Consideremos la
cn
sucesin que tiene como trmino general c1 = 1 y cn+1 = 1+c
para cualquier natural n. Podemos
n
definirla utilizando una lista definida, como no, por recurrencia:

(%i15)

c[1]:1;

(%o15)

(%i16)

c[n]:=c[n-1]/(1+c[n-1]);
cn-1
cn :=
1+cn-1

(%o16)

Si somos capaces de encontrar una frmula para el trmino general, podemos calcular el lmite.
Con lo que tenemos hasta ahora no vamos muy lejos:

(%i17)

limit(c[n],n,inf);
Maxima encountered a Lisp error:
Error in PROGN [or a callee]: Bind stack overflow.
Automatically continuing.
To reenable the Lisp debugger set *debugger-hook* to nil.

Podemos demostrar por induccin que la sucesin es, en este caso, decreciente y acotada infeL
riormente. Una vez hecho, la sucesin es convergente y el lmite L debe verificar que L = 1+L
. Esta
ecuacin s nos la resuelve Maxima

(%i18)

solve(L/(1+L)=L,L);

(%o18)

[L=0]

con lo que tendramos demostrado que el lmite es 0.


Observacin 6.2. Para esta sucesin en concreto, s se puede encontrar una frmula para el trmino general. De hecho existe un mdulo, solve_rec, que resuelve justo este tipo de problemas.

114

Lmites y continuidad

(%i19)

Continuidad

kill(all);

(%o0)

done

(%i1)

load(solve_rec)$

(%i2)

solve_rec(c[n]=c[n-1]/(1+c[n-1]),c[n]);
n+%k1 +1
cn =
-1
n+%k1

(%o2)

que, simplificando, nos queda

(%i3)
(%o3)

ratsimp(%);
1
cn =
n+%k1

1
.
si a esto le aadimos que c1 = 1 obtenemos que cn = 1+n
De todas formas no hay que ilusionarse demasiado. Encontrar una frmula para el trmino general
es difcil y lo normal es no poder hacerlo. Es por ello que no vamos a entrar en ms detalles
con solve_rec. Lo nico que podemos hacer con Maxima es calcular trminos. Por ejemplo, solve_rec
solve_rec no es capaz de encontrar el trmino general de la sucesin x1 = 1, xn = 1 + xn1 ,
n N. En cambio, no tiene ninguna dificultad en calcular tanto trminos como se quiera,

(%i4)

x[1]:1;

(%o4)

(%i5)

x[n]:=sqrt(1+x[n-1]);

xn = 1+xn1

(%o5)
(%i6)
(%o6)

x[10];
v
v
u
v
u
u
u
u
u
u
u
tsr
tv
tv
tu
tu
q
2+1+1+1+1+1+1+1+1

(%i7)

%,numer;

(%o7)

1.618016542231488

pero seremos nosotros los que tendremos que demostrar la convergencia estudiando la monotona
y la acotacin de la sucesin.

6.3 Continuidad
El estudio de la continuidad de una funcin es inmediato una vez que sabemos calcular lmites.
Una funcin f : A R R es continua en a A si lim xa f (x) = f (a). Conocido el valor de la
funcin en el punto, la nica dificultad es, por tanto, saber si coincide o no con el valor del lmite.
Con respecto a las funciones discontinuas, la grfica puede darnos una idea del tipo de discontinuidad. Si la discontinuidad es evitable, es difcil apreciar un nico pixel en la grfica. Una

115

Continuidad

Lmites y continuidad

discontinuidad de salto es fcilmente apreciable. Por ejemplo, la funcin signo, esto es,
un salto en el origen que Maxima une con una lnea vertical.

(%i8)

load(draw)$

(%i9)

draw2d(color=blue,
explicit(abs(x)/x,x,-3,3),
yrange=[-2,2],
grid=true);

(%o9)

|x|
x ,

tiene

1.5

0.5

-0.5

-1

-1.5

-2
-3

-2

-1

Cuando el salto es infinito o, lo que es lo mismo, cuando la funcin tiene una asntota vertical,
la primera dificultad que se encuentra Maxima es escoger un rango adecuado para representarla:

(%i10)

plot2d(tan(x),[x,-5,5]);

(%o10)

2500
2000
1500
1000

tan(x)

500
0
-500
-1000
-1500
-2000
-2500
-4

-2

0
x

En estos casos tenemos que ayudar nosotros a Maxima restringiendo el rango donde representamos
la funcin

(%i11)

plot2d(tan(x),[x,-5,5],[y,-15,15]);

(%o11)

15

10

tan(x)

-5

-10

-15
-4

-2

0
x

116

Lmites y continuidad

Ejercicios

6.4 Ejercicios
Ejercicio 6.1. Estudia la continuidad de la funcin f : R R definida como f (x) = x ln | x |
si x 6= 0 y f (0) = 0.
Ejercicio 6.2. Sean a y b dos nmeros reales verificando b < 0 < a; estudia el comportamiento
en cero de la funcin
!
a
b
, x R .
arctan
f (x) = arctan
x
x
 
Ejercicio 6.3. Estudia la continuidad de la funcin f (x) = arctan 1+x
1x con x 6= 1, as como su
comportamiento en 1, + y .
Ejercicio 6.4.
a) Dibuja una funcin continua cuya imagen no sea un intervalo.
b) Dibuja una funcin definida en un intervalo cuya imagen sea un intervalo y que no sea continua.
c) Dibuja una funcin continua en todo R, no constante y cuya imagen sea un conjunto (obligatoriamente un intervalo) acotado.
d) Dibuja una funcin continua en [0, 1[ tal que f ([0, 1[) no sea acotado.
e) Dibuja una funcin continua definida en un intervalo abierto acotado y cuya imagen sea un
intervalo cerrado y acotado.
Ejercicio 6.5. Consideremos la funcin f : [0, 1] R definida como f (x) = 21 (cos(x) + sen(x)).
a) Utiliza que f ([0, 1]) [0, 1] para probar que existe x [0, 1] tal que f (x) = x (sin utilizar
Maxima). A dicho punto se le suele llamar un punto fijo de la funcin f .
b) Se puede demostrar que la sucesin x1 = 1, xn+1 = f (xn ), para cualquier natural n tiende a un
punto fijo. Utiliza un bucle para encontrar un punto fijo con una exactitud menor que 105 .

117

118

Derivacin

Clculo de derivadas

Derivacin
7
7.1 Clculo de derivadas 119
7.2 Rectas secante y tangente a una funcin 122
7.3 Mximos y mnimos relativos 126 7.4 Ejercicios 131

En este captulo vamos a aprender a calcular y evaluar derivadas de cualquier orden de una
funcin; representar grficamente rectas tangentes y normales a la grfica de una funcin; calcular extremos de funciones reales de una variable y, por ltimo, calcular polinomios de Taylor y
representarlos grficamente para aproximar una funcin.

7.1 Clculo de derivadas


Para calcular la derivada de una funcin real de variable real, una vez definida, por ejemplo,
como f (x), se utiliza el comando diff que toma como argumentos la funcin a derivar, la variable diff
con respecto a la cual hacerlo y, opcionalmente, el orden de derivacin.

diff(expr,variable )
diff(expr,variable,n )

derivada de expr
derivada n-sima de expr

A este comando tambin podemos acceder a travs del men


AnlisisDerivar o, tambin, a travs del botn Derivar
si hemos activado el correspondiente panel. Hacindolo de
cualquiera de estas dos formas, aparece una ventana de dilogo con varios datos a rellenar; a saber:
a) Expresin. Por defecto, wxMaxima rellena este espacio con
% para referirse a la salida anterior. Si no es la que nos interesa, la escribimos directamente nosotros.
b) respecto la variable. Se refiere a la variable respecto a la
cual vamos a derivar.
c) veces. Se refiere al orden de derivacin.
Comencemos con un ejemplo,

(%i1)

diff(tan(x),x);

(%o1)

sec(x)2

Figura 7.1

Introducir derivada

La orden diff considera como constantes cualquier otra variable que aparezca en la expresin
a derivar, salvo que explcitamente manifestemos que estn relacionadas.

(%i2)

diff(xysin(x+y),x);

119

Clculo de derivadas

(%o2)

Derivacin

ysin(y+x)+xycos(y+x)

Tambin podemos trabajar con funciones que previamente hayamos definido.

(%i3)

f(x):= x 4+sin(x 2);

(%o3)

f(x):=x4 +sin(x2 )

(%i4)

diff(f(x),x);

(%o4)

2x cos(x2 )+4x3

La tercera entrada de la orden diff nos permite calcular derivadas de orden superior. Por ejemplo, la cuarta derivada de f sera la siguiente.

7.1.1

(%i5)

diff(f(x),x,4);

(%o5)

16x4 sin(x2 ) 12 sin(x2 ) 48x2 cos(x2 ) + 24

Reutilizar la derivada
Las derivadas sucesivas de una funcin nos dan mucha informacin sobre la funcin original
y con frecuencia nos hace falta utilizarlas de nuevo, ya sea para calcular puntos crticos, evaluar
para estudiar monotona o extremos relativos, etc. Es por ello que es cmodo escribir la derivada
como una funcin. Hay varias formas en las que podemos hacerlo. Podemos, por ejemplo, utilizar
la orden define

(%i6)

define(g(x),diff(f(x),x));

(%o6)

g(x):=2xcos(x2 )+4x3

o podemos aprovechar las dobles comillas

(%i7)

df(x):=(%o4);

(%o7)

df(x):=2xcos(x2 )+4x3

(%i8)

df(1);

(%o8)

2cos(1)+4

Observacin 7.1. Te recuerdo que la comilla que utilizamos para asignar a la funcin df(x) la
derivada primera de f es la que aparece en la tecla ? , es decir, son dos apstrofos , + , y
no hay que confundirla con las dobles comillas de la tecla 2 .
Tambin podemos evaluar la derivada en un determinado punto sin necesidad de definir una
nueva funcin,

(%i9)

(diff(f(x),x)),x=1;

120

Derivacin

(%o9)

Clculo de derivadas

2cos(1)+4

aunque esto deja de ser prctico cuando tenemos que calcular el valor en varios puntos.

El operador comilla y dobles comillas


Hasta ahora no hemos utilizado demasiado, en realidad prcticamente nada, los operadores comilla y dobles comillas. Estos operadores tienen un comportamiento muy distinto: una comilla
simple hace que no se evale, en cambio las dobles comillas obligan a una evaluacin de la expresin que le sigue. Observa cul es la diferencia cuando aplicamos ambos operadores a una misma
expresin:

(%i10)
(%o10)

diff(f(x),x)=diff(f(x),x);
d
(sin(x2 )+x4 )=2 x cos(x2 )+4 x3
dx

En la parte de la izquierda tenemos la derivada sin evaluar, la expresin que hemos escrito tal cual.
En la derecha tenemos la derivada calculada de la funcin f .
Observacin 7.2. El uso de las dobles comillas para definir la derivada de una funcin puede
dar lugar a error. Observa la siguiente secuencia de comandos: definimos la funcin coseno y su
derivada,

(%i11)

remfunction(all)$

(%i12)

f(x):=cos(x);

(%o12)

f(x):=cos(x)

(%i13)

g(x):=diff(f(x),x);

(%o13)

g(x):=diff(f(x),x)

(%i14)

h(x):=diff(f(x),x);

(%o14)

h(x):=diff(f(x),x)

bueno, no parece que haya mucha diferencia entre usar o no las comillas. Vamos a ver cunto valen
las funciones g y h:

(%i15)

g(x);

(%o15)

-sin(x)

(%i16)

h(x);

(%o16)

-sin(x)

Parece que no hay grandes diferencias. De hecho no se ve ninguna. Vamos a ver cunto valen en
algn punto.

121

Rectas secante y tangente a una funcin

(%i17)

Derivacin

g(1);
Non-variable 2nd argument to diff:
1
#0: g(x=1)
-- an error. To debug this try debugmode(true);

Por fin, un error. Habamos dicho que necesitbamos las comillas para que se evaluara la derivada.
Slo lo ha hecho cuando lo hemos definido pero, sin las dobles comillas, no vuelve a hacerlo y, por
tanto, no sabe evaluar en 1. En la prctica g(x):=-sin(x) es una simple cadena de texto y no
una funcin. Vale. Entonces, vamos con la funcin h:

(%i18)

h(1);
Non-variable 2nd argument to diff:
1
#0: g(x=1)
-- an error. To debug this try debugmode(true);

Qu ha pasado aqu? Pero si hemos puesto las comillas dobles! Qu est mal? Hemos escrito
mal las comillas? Repsalo y vers que no. El problema es un poco ms sutil: las dobles comillas
afectan a lo que tienen directamente a su derecha. En la definicin de la funcin h no hemos escrito
entre parntesis la derivada y las dobles comillas no afectan a todo; slo afectan al operador diff
pero no a la x. Es por eso que no la considera una variable y tampoco se puede evaluar h en un punto.
Llegados a este punto entenders porqu hemos recomendado que utilices el comando define en
lugar de las comillas.

7.2 Rectas secante y tangente a una funcin


La definicin de derivada de una funcin real de variable real en un punto a es, como conoces
bien,
f (x) f (a)
lim
,
xa
xa
lmite que denotamos f 0 (a).

y = f (a) + f 0 (a)(x a)
f (x)
f (x)

f (a)

Figura 7.2

Recta tangente

122

Derivacin

Rectas secante y tangente a una funcin

En otras palabras, calculamos la recta que pasa por el punto (a, f (a)) y el punto (x, f (x)), hacemos
tender x a a y, en el lmite, la recta que obtenemos es la recta tangente. La pendiente de dicha recta
es la derivada de f en a.
Vamos a aprovechar la orden with_slider para representar grficamente este proceso en un
ejemplo. Consideremos la funcin f (x) = x3 2x2 x + 2 y su derivada, a la que notaremos d f ,

(%i19)

f(x):=x 3-2x 2-x+2;

(%o19)

f(x):=x3 -2x2 -x+2

(%i20)

define(df(x),diff(f(x),x));

(%o20)

df(x):=3x2 -4x-1

La recta tangente a una funcin f en un punto a es la recta y = f (a) + f 0 (a)(x a). La definimos.

(%i21)

tangente(x,a):=f(a)+df(a)(x-a);

(%o21)

tangente(x,a):=f(a)+df(a)(x-a)

Ya podemos dibujar la funcin y su tangente en 1:

(%i22)

load(draw)$

(%i23)

draw2d(
color=blue,key="funcin",explicit(f(x),x,-2,3),
color=red,key="tangente",explicit(tangente(x,1),x,-2,3),
grid=true);

(%o23)

funcion
tangente
5

-5

-10

-2

-1

Para dibujar la recta secante la primera cuestin es cul es la recta que pasa por (1, f (1)) y
por (x, f (x))? Recordemos que la recta que pasa por un par de puntos (a, c), (b, d) que no estn
verticalmente alineados es la grfica de la funcin
recta(x) =

cd
ad bc
x+
.
ab
ab

La definimos en Maxima:

(%i24)

recta(x,a,c,b,d):=x(c-d)/(a-b)+(ad-bc)/(a-b);

123

Rectas secante y tangente a una funcin

(%o24)

Derivacin

recta(x,a,c,b,d):=

x(c-d) ad-bc
+
a-b
a-b

Ahora podemos ver qu ocurre con la rectas que pasan por los puntos (1, f (1)) y (1 + h, f (1 + h))
cuando h tiende a cero. Por ejemplo para h = 0.6, tendramos

(%i25)

draw2d(
point_type=filled_circle,
color=black,points([[1,f(1)]]),
point_type=filled_circle,
color=black,points([[1.6,f(1.6)]]),
color=blue,key="funcion",explicit(f(x),x,-2,3),
color=red,key="tangente",explicit(tangente(x,1),x,-2,3),
color=green,key="secante",
explicit(recta(x,1,f(1),1+0.6,f(1.6)),x,-2,3),
grid=true)$

(%o25)

funcion
tangente
secante
5

-5

-10

-2

-1

Si te fijas, en la grfica anterior hemos aadido tambin el par de puntos que definen la recta
sectante.
En la Figura 7.3 puedes ver el resultado para h = 0.2, 0.4, 0.6, y 0.8.
Podemos unir todo lo que hemos hecho y usar la capacidad de wxMaxima para representar
grficos en funcin de un parmetro. Dibujemos la funcin, la recta tangente y las secantes para
h = 0.1, 0.2, . . . , 2:

(%i26)

7.2.1

with_slider(
n,0.1reverse(makelist(i,i,1,20)),
[f(x),tangente(x,1),recta(x,1,f(1),1+n,f(1+n))],
[x,-2,3]);

Recta normal
La recta normal es la recta perpendicular a la recta tangente. Su pendiente es 1/ f 0 (a) y, por
tanto, tiene como ecuacin
1
y = f (a) 0 (x a).
f (a)
Con todo lo que ya tenemos hecho es muy fcil dibujarla.

124

Derivacin

Rectas secante y tangente a una funcin

funcion
tangente
secante

funcion
tangente
secante
5

-5

-5

-10

-10

-2

-1

-2

-1

h = 0.8

funcion
tangente
secante

-5

-5

-10

-10

-1

h = 0.6
funcion
tangente
secante

-2

-2

-1

h = 0.4

h = 0.2

Figura 7.3 Rectas secantes y tangente

(%i27)

normal(x,a):=f(a)-df(a) (-1)*(x-a)$

(%i28)

draw2d(
point_type=filled_circle,color=black,points([[1,f(1)]]),
color=blue,key="funcion",explicit(f(x),x,-2,3),
color=red,key="tangente",explicit(tangente(x,1),x,-2,3),
color=green,key="normal",explicit(normal(x,1),x,-2,3),
grid=true)$

(%o28)

funcion
tangente
normal
5

-5

-10

-2

-1

En la figura anterior, la recta normal no parece perpendicular a la recta tangente. Eso es por que
no hemos tenido en cuenta la escala a la que se dibujan los ejes. Prueba a cambiar la escala para
que queden perpendiculares.

125

Mximos y mnimos relativos

Derivacin

Prueba a cambiar la funcin f , el punto a. Ahora


es tu turno! Por ejemplo, haz esto mismo para
una funcin que no sea derivable como f (x) = | x | en el origen.

7.3 Mximos y mnimos relativos


En esta seccin vamos a aprender a localizar extemos relativos de una funcin f . Para ello
encontraremos las soluciones de la ecuacin de punto crtico: f 0 (x) = 0. Y para resolver dicha
ecuacin podemos usar el comando solve.
Ejemplo 7.3. Calculemos los extremos relativos de la funcin f (x) = 2x4 + 4x, x R.
Comenzamos, entonces, presentndosela al programa (no olvidis borrar de la memoria la anterior
funcin f ) y pintando su grfica para hacernos una idea de dnde pueden estar sus extremos.

(%i29)

f(x):=2*x 4+4*x$

(%i30)

plot2d(f(x),[x,-2,1]);

(%o30)

25

20

15

10

-5
-2

-1.5

-1

-0.5
x

0.5

Parece que hay un mnimo en las proximidades de -1. Para confirmarlo, calculamos los puntos
crticos de f .

(%i31)

define(d1f(x),diff(f(x),x))$

(%i32)

puntosf:solve(d1f(x),x);

(%o32)

[x=-(sqrt(3)*%i-1)/(2*2 (1/3)),x=(sqrt(3)*%i+1)/(2*2 (1/3)),


x=-1/2 (1/3)]

Observamos que hay slo una raz real que es la nica que nos interesa.

(%i33)

last(puntosf);

(%o33)

x=-1/2 (1/3)

Llamamos a al nico punto crtico que hemos obtenido, y evaluamos en l la segunda derivada:

(%i34)

a:rhs(%)$

(%i35)

define(d2f(x),diff(f(x),x,2))$

(%i36)

d2f(a);

126

Derivacin

(%o36)

Mximos y mnimos relativos

24/2 (2/3)

Por tanto la funcin f tiene un mnimo relativo en dicho punto a. Puede haber otro extremo ms?
Cmo podemos asegurarnos?
Ejemplo 7.4. Vamos a calcular los extremos relativos de la funcin:
f (x) = x5 + x4 11x3 9x2 + 18x + 10 en el intervalo [4, 4]
Procedemos de la misma forma que en el ejemplo anterior.

(%i37)

f(x):=x 5+x 4-11x 3-9x 2+18x+10$

(%i38)

plot2d(f(x),[x,-4,4])$

(%o38)

600
500
400
300

200
100
0
-100
-200
-300
-4

-3

-2

-1

0
x

A simple vista observamos que hay:


a) un mximo relativo entre -3 y -2,
b) un mnimo relativo entre -2 y -1,
c) un mximo relativo entre 0 y 1, y
d) un mnimo relativo entre 2 y 3.
Vamos entonces a derivar la funcin e intentamos calcular los ceros de f 0 haciendo uso del comando solve.

(%i39)

define(d1f(x),diff(f(x),x));

(%o39)

d1f(x):=5x4 +4x3 -33x2 -18x+18

(%i40)

solve(d1f(x),x);

Las soluciones que nos da el programa no son nada manejables, as que vamos a resolver la ecuacin f 0 (x) = 0 de forma numrica, esto es, con el comando find_root. Para ello, nos apoyamos
en la grfica que hemos calculado ms arriba, puesto que para resolver numricamente esta ecuacin hay que dar un intervalo en el que se puede encontrar la posible solucin. Vamos, entonces, a
obtener la lista de puntos crticos que tiene la funcin.

(%i41)

puntosf:[find_root(d1f(x),x,-3,-2),
find_root(d1f(x),x,-2,-1), find_root(d1f(x),x,0,1),
find_root(d1f(x),x,2,3)];

127

Mximos y mnimos relativos

(%o41)

Derivacin

[-2.600821117505113,-1.096856508567827,0.53386135374308,
2.363816272329865]

Ahora, para decidir si en estos puntos crticos se alcanza mximo o mnimo relativo, vamos a
aplicar el test de la segunda derivada. Esto es:

(%i42)

define(d2f(x),diff(f(x),x,2));

(%o42)

d2f(x):=20x3 +12x2 -66x-18

(%i43)

map(d2f,puntosf);

(%o43)

[-117.0277108731797,42.43722588782084,-46.77165945967596,
157.2021444450349]

Lo que nos dice que en el primer y tercer puntos hay mximos relativos, mientras que en los otros
dos tenemos mnimos relativos.
A continuacin veremos un caso en el que la grfica diseada por el programa nos puede llevar
a engao. Descubriremos el error gracias al test de la segunda derivada.
Ejemplo 7.5. Vamos a estudiar los extremos relativos de la funcin
f (x) = x2 10x 40 +

1
.
10x2 100x + 251

Comenzamos dibujando su grfica en el intervalo [15, 15]

(%i44)

f(x):=x 2-10*x-40+1/(10*x 2-100*x+251)$

(%i45)

plot2d(f(x),[x,-15,15]);

(%o45)

350
300
250
200

150
100
50
0
-50
-100
-15

-10

-5

0
x

10

15

Aparentemente hay un mnimo cerca de 5. De hecho, si aplicamos el comando solve a la primera


derivada de f obtenemos que precisamente la derivada de f se anula en x = 5. A la vista de la
grfica parece que efectivamente en x = 5 hay un mnimo de la funcin f . Pero nada ms lejos de
la realidad, porque si evaluamos la derivada segunda de f en 5 obtendremos que f 00 (5) = 18 < 0.
La segunda derivada es negativa y por tanto en x = 5 tiene que haber un mximo. En efecto:

(%i46)

define(d1f(x),diff(f(x),x))$

(%i47)

d1f(5);

128

Derivacin

Mximos y mnimos relativos

(%o47)

(%i48)

define(d2f(x),diff(f(x),x,2))$

(%i49)

d2f(5);

(%o49)

-18

De hecho, si hubiramos dibujado la grfica en un intervalo ms pequeo, s se hubiera apreciado


el mximo en el punto 5.

(%i50)

plot2d(f(x),[x,3,7]);

(%o50)

-60.5
-61
-61.5

-62
-62.5
-63
-63.5
-64
-64.5
3

3.5

4.5

5
x

5.5

6.5

En resumen, ten cuidado con los resultados que obtengas y, siempre, comprueba si se ajustan a los
contenidos tericos que has visto en clase.
En el siguiente ejemplo, resolvemos un problema de optimizacin.
Ejemplo 7.6. Se desea construir una ventana con forma de rectngulo coronado de un semicrculo
de dimetro igual a la base del rectngulo. Pondremos cristal blanco en la parte rectangular y cristal
de color en el semicrculo. Sabiendo que el cristal coloreado deja pasar la mitad de luz (por unidad
de superficie) que el blanco, calcular las dimensiones para conseguir la mxima luminosidad si se
ha de mantener el permetro constante dado.
Llamemos x a la longitud de la base de la ventana y h a su altura. El permetro es una cantidad
dada A; es decir, x + 2h + x
2 = A. Despejamos h en funcin de x:

(%i51)
(%o51)

altura:solve(x+2h+(%pix)/2=A,h)$
2 A+(--2) x
[h=
]
4

La luminosidad viene dada por


f (x) = 2xh +

x2
x
x2
1
= x(A x ) + = A x (8 + 3)x2
8
2
8
8

Definimos entonces la funcin f y calculamos sus puntos crticos:

(%i52)

f(x):=Ax-(1/8)(8+3%pi)x 2$

(%i53)

define(d1f(x),diff(f(x),x))$

129

Mximos y mnimos relativos

(%i54)
(%o54)
(%i55)
(%o55)

Derivacin

solve(diff(f(x),x),x);
4A
[x=
]
3+8
%[1];
4A
x=
3+8

Y ahora evaluaremos la segunda derivada en dicho punto crtico. Para ello:

(%i56)

a:rhs(%)$

(%i57)

define(d2f(x),diff(f(x),x,2))$

(%i58)

d2f(a);
3+8

(%o58)

La segunda derivada es negativa: ya tenemos el mximo que estbamos buscando.


Por ltimo, veamos cmo podemos verificar una desigualdad haciendo uso de tcnicas de derivacin.
x
Ejemplo 7.7. Se nos plantea demostrar la siguiente desigualdad: log(x + 1) x+1
, x 1.
x
Estudiemos entonces la siguiente funcin: f (x) = log(x + 1) x+1 . Tendremos que comprobar
que dicha funcin es siempre positiva. Para esto es suficiente comprobar que, si la funcin f tiene
mnimo absoluto, su valor es mayor o igual que cero. En efecto:

(%i59)

f(x):=log(x+1)-x/(x+1)$

(%i60)

define(d1f(x),diff(f(x),x))$

(%i61)

solve(d1f(x),x);

(%o61)

[x=0]

Por tanto slo tiene un punto crtico, y adems:

(%i62)

define(d2f(x),diff(f(x),x,2))$

(%i63)

d2f(0);

(%o63)

Luego, en el punto 0 alcanza un mnimo relativo que, por ser nico, es el mnimo absoluto. Como
se verifica que f (0) = 0, la desigualdad es cierta.

130

Derivacin

Ejercicios

7.4 Ejercicios
Ejercicio 7.1.
a) Calcula las tangentes a la hiprbola xy = 1 que pasan por el punto (1, 1). Haz una representacin grfica.
b) Calcula las tangentes a la grfica de y = 2x3 + 13x2 + 5x + 9 que pasan por el origen. Haz una
representacin grfica.
Ejercicio 7.2. Haz una animacin grfica en la que se represente la grfica de la parbola f (x) =
6 (x 3)2 en azul, la recta tangente en el punto (1, f (1)) en negro y las rectas secantes que pasan
por los puntos (1, f (1)) y (1 h, f (1 h)) donde h vara de 3 a 0.2 con incrementos iguales a
0.2, en rojo. Utiliza las opciones que consideres ms apropiadas para hacer la animacin.
Ejercicio 7.3. Representa en una misma grfica la parbola y = x2 /4 y sus rectas tangentes
en los puntos de abscisas 3 + 6k/30 para 1 k 29. Utiliza las opciones que consideres ms
apropiadas.
Ejercicio 7.4. Halla dos nmeros no negativos tales que la suma de uno ms el doble del otro
sea 12 y su producto sea mximo.
Ejercicio 7.5.
funcin

Un mvil tiene un movimiento rectilneo con desplazamiento descrito por la


s(t) = t4 2t3 12t2 + 60t 10.

En qu instante del intervalo [0, 3] alcanza su mxima velocidad?

131

132

Integracin

Clculo de integrales

Integracin
8
8.1 Clculo de integrales 133
nes 142 8.4 Ejercicios 149

8.2 Sumas de Riemann 139

8.3 Aplicacio-

En este captulo vamos a aprender a calcular integrales en una variable, as como aplicar estas
integrales al clculo de reas de recintos en el plano limitados por varias curvas, longitudes de
curvas, volmenes de cuerpos de revolucin y reas de superficies de revolucin.

8.1 Clculo de integrales


La principal orden de Maxima para calcular integrales es integrate. Nos va a permitir calcular
integrales, tanto definidas como indefinidas, con mucha comodidad.

integrate(f(x),x)
integrate(f(x),x,a,b)

primitiva de la funcin f (x)


Rb
f (x) dx
a

Disponemos tambin de la siguiente opcin en el men para calcular integrales, sin necesidad de
escribir el comando correspondiente en la ventana de entradas: AnlisisIntegrar. Despus slo
tenemos que rellenar los datos que nos interesen.

Integral indefinida

Integral definida

Figura 8.1 Clculo de integrales


Comencemos por integrales indefinidas. Maxima calcula primitivas de funciones trigonomtricas,

(%i1)

integrate(xsin(x),x);

(%o1)

sin(x)-xcos(x)

133

Clculo de integrales

Integracin

de funciones racionales,

(%i2)
(%o2)

integrate(1/(x 4-1),x);
log(x+1) atan(x) log(x-1)

+
4
2
4

irracionales,

(%i3)
(%o3)

integrate(sqrt(x 2+1),x);

asinh(x) x x2 +1
+
2
2

ya sea aplicando integracin por partes

(%i4)
(%o4)

integrate(x 3*%e x,x);



x3 3x2 + 6x-6 %ex

o el mtodo que considere necesario

(%i5)
(%o5)

integrate(%e (-x 2),x);

erf(x)
2

integral que no sabamos hacer. Bueno, como puedes ver, Maxima se defiende bien con integrales.
Eso s, es posible que nos aparezcan funciones (como erf). El motivo es muy sencillo: la forma
de saber calcular primitivas de muchas funciones es saberse muchas funciones. Maxima se sabe
muchas y, cuando nos aparezca alguna nueva, siempre podemos preguntar cul es.

(%i6)

describe(erf); -- Funcin: erf (<x>)


Es la funcin de error, cuya derivada
es 2exp(-x 2)/sqrt(%pi).
There are also some inexact matches for erf.
Try ?? erf to see them.

(%o6)

true

Para calcular integrales definidas slo tenemos que aadir los extremos del intervalo de integracin

(%i7)

integrate(x*sin(x),x,%pi/2,%pi);

(%o7)

-1

134

Integracin

(%i8)
(%o8)

Clculo de integrales

integrate(1/(x 2-1),x,2,5);
log(6) log(4) log(3)
+
+
2
2
2

En la integrales pueden aparecer parmetros y si Maxima tiene dudas acerca de su valor pregunta,

(%i9)
(%o9)

integrate(x n,x);
Is n+1 zero or nonzero? nonzero;
xn+1
n+1

pregunta todo lo que haga falta:

(%i10)

integrate(1/x,x,a,b);
Is b - a positive, negative, or zero? positive;
Is b positive, negative, or zero? positive;
Is a positive, negative, or zero? positive;
Is x + b positive or negative? positive;

(%o10)

log(b)-log(a)

Evidentemente hay funciones a las que Maxima no sabe calcular una integral indefinida. En ese
caso, da como respuesta la misma integral que le hemos preguntado.

(%i11)
(%o11)

integrate(exp(x 3+x),x);
Z
3
%ex +x dx

Veremos que este problema desaparece cuando pasamos a integrales definidas.

8.1.1

Integracin impropia
Como recordars de las clases tericas, la integral que, en principio, se define para funciones
continuas en intervalos compactos, puede extenderse a funciones continuas definidas en intervalos
de longitud infinita y a funciones que no estn acotadas en un intervalo de longitud finita. Es lo que
se conoce como integracin impropia. Para el programa Maxima, trabajar con integrales impropias
no supone ningn problema ya que las trata exactamente igual que las integrales de funciones
continuas en intervalos cerrados y acotados. De hecho, no hay forma de distinguir unas de otras:
en ningn momento hemos indicado al comando integrate que la funcin era acotada ni hemos
dicho si el intervalo era abierto, cerrado o semiabierto. Slo hemos indicado los extremos y ya est.
Por tanto, con la misma orden integrate se pueden calcular integrales impropias. Por ejemplo:

(%i12)

integrate(1/sqrt(1-x 2),x,-1,1);

135

Clculo de integrales

Integracin

(%o12)

(%i13)

integrate(%e(-x 2),x,0,inf);

(%o13)

Intenta calcular una primitiva de los integrandos anteriores. Como vers, la primitiva de la
funcin f (x) = 1 2 ya la conocas; en cambio, en la primitiva de la funcin f (x) = exp(x2 )
1x
aparece una funcin que seguro que no conocas, pero que ha aparecido en el apartado dedicado
al clculo de integrales. Probamos a hacer las siguientes integrales impropias:
Z +
Z +
1
1
dx ,
dx
2
x
x
1
1

(%i14)

integrate(1/x 2,x,1,inf);

(%o14)

(%i15)

integrate(1/x,x,0,inf);
Integral is divergent
-- an error. To debug this try debugmode(true);

Observa cmo en la salida de la ltima integral el programa advierte de la no convergencia de la


integral planteada. Sabis decir el por qu? Bueno, recordemos que la definicin de dicha integral
es
Z +
1
dx = lim G(x) lim G(x),
x+
x1
x
1
donde G es una primitiva de 1x . En este caso, una primitiva es ln(x) que no tiene lmite en + (es
+).
Observacin 8.1. Hay que tener cierto cuidado con la integracin de funciones que no son continuas. Por ejemplo, la funcin f (x) = 1x no es impropiamente integrable en [1, 1]. Si as fuera,
tambin lo sera en el intervalo [0, 1] y esto es claramente falso.
Dependiendo de las versiones, la respuesta de Maxima puede variar, pero siempre involucra el
llamado valor principal de la integral. Por ejemplo, con la versin 5.17 de Maxima el resultado es
el siguiente

(%i16)

integrate(1/x,x,-1,1);

Principal value

(%o16)

8.1.2

log(-1)+%i

Integracin nmerica
El clculo de primitivas no es interesante por s mismo, el motivo que lo hace interesante es la
regla de Barrow: si conoces una primitiva de una funcin, entonces el clculo de la integral en un
intervalo se reduce a evaluar la primitiva en los extremos y restar.

136

Integracin

Clculo de integrales

quad_quags(f(x),x,a,b)
quad_qagi(f(x),x,a,b)
romberg(f(x),x,a,b)

aproximacin numrica de

Rb

aproximacin numrica de

Rb

aproximacin numrica de

Rb

a
a
a

f (x) dx
f (x) dx
f (x) dx

En la prctica, no siempre es fcil calcular una primitiva, pero s


es fcil (para un ordenador y tericamente) aproximar el valor de la
integral por las reas de los rectngulos que aparecen en la definicin
de integral. Este mtodo no es el mejor, pero versiones mejoradas
permiten aproximar el valor de casi cualquier integral.
Si en el men AnlisisIntegrar marcamos Integracin definida e Integracin numrica se nos da la opcin de escoger entre
dos mtodos: quadpack y romberg, cada uno referido a un tipo diferente de aproximacin numrica de la integral. Vamos a calcular
numricamente la integral que hemos hecho ms arriba que tena
como resultado 1

(%i17)

quad_qags(xsin(x),x,%pi/2,%pi);

(%o17)

[2.141592653589794,2.3788064330872769 1014 ,21,0]

(%i18)

romberg(xsin(x),x,%pi/2,%pi);

(%o18)

2.141591640806944

Observamos que hay una diferencia entre las salidas de ambos comandos. Mientras que en la
ltima aparece el valor aproximado de la integral (fjate que es 1), en la primera aparece como
salida una lista de 4 valores:
a) la aproximacin de la integral
b) el error absoluto estimado de la aproximacin
c) el nmero de evaluaciones del integrando
d) el cdigo de error (que puede ir desde 0 hasta 6) que, copiado de la ayuda de Maxima, significa

El cdigo de error (el cuarto elemento del resultado) puede tener


los siguientes valores:
0
si no ha habido problemas;
1
si se utilizaron demasiados intervalos;
2
si se encontr un nmero excesivo de errores de redondeo;
3
si el integrando ha tenido un comportamiento extrao
frente a
la integracin;
4
fallo de convergencia;
5

137

Clculo de integrales

Integracin

la integral es probablemente divergente o de convergencia


lenta;
6
si los argumentos de entrada no son vlidos.
Qu duda cabe que este tipo de integracin numrica es interesante para integrandos de los
cuales no se conoce una primitiva. Vamos a intentar calcular una primitiva y posteriormente una
2
integral definida de la funcin f (x) = ex .

(%i19)
(%o19)
(%i20)
(%o20)

integrate(exp(-x 2),x);

erf(x)
2
integrate(exp(-x 2),x,0,1);

erf(1)
2

Si ahora queremos, podemos calcular numricamente este valor,

(%i21)

float(%);

(%o21)

0.74682413281243

o tambin, podamos haber utlizado los comandos de integracin numrica directamente

quadpack

(%i22)

quad_qags(exp(-x 2),x,0,1);

(%o22)

[0.74682413281243,8.2954620176770253 1015 ,21,0]

(%i23)

romberg(exp(-x 2),x,0,1);

(%o23)

0.7468241699099

En realidad, quadpack no es un mtodo concreto sino una serie de mtodos para aproximar
numricamente la integral. Los dos que hemos visto antes, quad_qags y romberg
R , se pueden
utilizar en intervalos finitos. Comprueba t mismo lo que ocurre cuando calculas 1 cos(x)/x2 dx
utilizando el men AnlisisIntegrar: obtendrs algo as

(%i24)

quad_qagi(cos(x)/x 2, x, 1, inf);
MESSAGE FROM ROUTINE DQAGI IN LIBRARY SLATEC.
INFORMATIVE MESSAGE, PROG CONTINUES, TRACEBACK REQUESTED
ABNORMAL RETURN
ERROR NUMBER = 1

END OF MESSAGE

(%o24)

[-0.084302101159614,1.5565565173632223 104 ,5985,1]

138

Integracin

Sumas de Riemann

Maxima decide cul es el mtodo que mejor le parece y, en este caso utiliza quad_qagi. Evidentemente, depende del integrando el resultado puede dar uno u otro tipo de error. Por ejemplo,
Z 1
sen(1/x)
vamos ahora a calcular de forma numrica
.
x
0

(%i25)

quad_qags((1/x)*sin(1/x),x,0,1);
MESSAGE FROM ROUTINE DQAGS IN LIBRARY SLATEC.
INFORMATIVE MESSAGE, PROG CONTINUES, TRACEBACK REQUESTED
ABNORMAL RETURN
ERROR NUMBER = 5

***END OF MESSAGE

(%o25)

[-1.050233246377689,0.20398634967385,8379,5]

(%i26)

romberg((1/x)sin(1/x),x,0,1);

sin( 1x )

romberg
,x,0.0,1.0
x

(%o26)

Se trata de una funcin que cerca del cero oscila mucho, lo que hace que el comando quadqags nos d aviso de error (aunque da una aproximacin), mientras que el comando romberg no
nos d ninguna salida.

8.2 Sumas de Riemann


El proceso que hemos seguido en clase para la construccin de la integral de una funcin f :
[a, b] R pasa por lo que hemos llamado sumas superiores y sumas inferiores. Lo que hacamos
era dividir el intervalo [a, b] en n trozos usando una particin P = {a = x0 < x1 < . . . < xn = b}
del intervalo. Luego calculbamos el supremo y el nfimo de f en cada uno de los intervalos
Ii = [xii , xi ] y podamos aproximar la integral de dos formas: si escogamos el rea asociada a
los rectngulos que tienen como altura el supremo obtenamos las sumas superiores. Las sumas
inferiores se obtenan de forma anloga pero con el nfimo.

y = f (x)

a
x0 x1 x2

...

a
x0 x1 x2

b
xn1 xn x

Figura 8.2

y = f (x)

Sumas superiores e inferiores

Las dos reas que tienes marcadas en la Figura 8.2 son

139

...

b
xn1 xn x

Sumas de Riemann

Integracin

S ( f, P) =

n
X

sup ( f (Ii ) ` (Ii ) y I( f, P) =

i=1

n
X

inf ( f (Ii ) ` (Ii ) ,

i=1

donde ` (Ii ) denota la longitud del intervalo Ii o, lo que es lo mismo, la base de cada uno de los
rectngulos que tenemos en la figura.
Si coinciden las mejores aproximaciones obtenidas de esta manera o hablando un poco a la
ligera, si la menor de las sumas superiores coincide con la mayor de las sumas inferiores entonces
llamamos a ese valor integral de la funcin.
Este mtodo tiene varios inconvenientes si pretendemos hacerlo con un ordenador. Por ejemplo,
cmo escogemos la particin? y, ms importante, cmo calculamos el supremo y el nfimo de
la funcin en cada uno de los intervalos? El primer problema se puede evitar tomando la particin
de una forma particular: dividimos el intervalo [a, b] en trozos iguales, en muchos trozos iguales.
Esto nos permite dar una expresin concreta de la particin.
Si dividimos [a, b] en dos trozos, estars de acuerdo que los puntos seran a, b y el punto medio
a+b
2 . Cules seran los puntos que nos dividen [a, b] en tres trozos? Ahora no hay punto medio,
ahora nos hacen falta dos puntos adems de a y b. Pinsalo un poco. En lugar de fijarnos en
cules son los extremos de los intervalos, fijmonos en cunto miden. Efectivamente, todos miden
lo mismo ba
3 puesto que queremos dividir el intervalo en tres trozos iguales. Ahora la pregunta
es: qu intervalo tiene como extremos de la izquierda a y mide ba
3 ? La respuesta es muy fcil:
h
i
a, a + ba
.
Con
este
mtodo
es
sencillo
seguir
escribiendo
intervalos:
slo tenemos que seguir
3
ba
sumando 3 hasta llegar al extremo de la derecha, b.
En general, si n es un natural mayor o igual que 2,
ba
ba
ba
a, a +
, a+2
,..., a + n
n
n
n
son los n + 1 extremos que dividen a [a, b] en n intervalos iguales. Vamos a seguir estos pasos con
Maxima. Escojamos una funcin y un intervalo:

(%i27)

a:-2;b:5;n:10

(%o28)

-2

(%o29)

(%o29)

10

(%i30)

f(x):=(x-1)x(x-3);

(%o30)

f(x):=(x-1)x(x-3)

La lista de extremos es fcil de escribir usando el comando makelist.

(%i31)
(%o31)

makelist(a+i(b-a)/n,i,0,n);
13 3 1 4 3 11 29 18 43
[-2,- ,- , , , , , , , ,5]
10 5 10 5 2 5 10 5 10

La segunda dificultad que hemos mencionado es la dificultad de calcular supremos e nfimos.


La solucin es escoger un punto cualquiera de cada uno de los intervalos Ii : el extremo de la
izquierda, el de la derecha, el punto medio o, simplemente, un punto elegido al azar. Esto tiene

140

Integracin

Sumas de Riemann

nombre: una suma de Riemann. Si dividimos el intervalo en muchos trocitos, no debera haber
demasiada diferencia entre el supremo, el nfimo o un punto intermedio.
Proposicin 8.2. Sea f : [a, b] R integrable. Sea Pn la particin

Convergencia de
las sumas de Riemann

ba
ba
ba
, a+2
,..., a + n
n
n
n
i
h
ba
y sea xi a + (i 1) ba
n , a + i n . Entonces
Z b
n
X
ba
=
f (x) dx.
f (xi )
lim
n
n
a
i=1
a, a +

En la Figura 8.3 podemos ver cmo mejora cuando aumentamos el nmero de subdivisiones.
Buenos, sigamos adelante. Elegimos puntos al azar en cada uno de los intervalos.

(%i32)

puntos:makelist(a+(i-1)(b-a)/n+random(1.0)(b-a)/n,i,1,n);

(%o32)

[-1.974524678870055,-0.86229173716074,0.095612020508637,
0.12911247230811,1.242837772556621,1.915206527061883,
2.658260436280155,3.229497471823565,3.636346487565163,
4.30162951626272]

40

40

30

30

20

20

10

10

-10

-10

-20

-20

-30
-2

-1

-30
-2

-1

n = 10
40

30

30

20

20

10

10

-10

-10

-20

-20

-2

-1

n = 20

40

-30

-30

n = 30

-2

-1

n = 60

Figura 8.3 Convergencia de las sumas de Riemann

141

Aplicaciones

Integracin

Ahora tenemos que sumar las reas de los rectngulos de las sumas de Riemann, cosa que podemos
hacer de la siguiente manera usando la orden sum:

(%i33)

sum((b-a)/n(f(a+(i-1)(b-a)/n+random(1.0)(b-a)/n)),i,1,n);

(%o33)

5.859818716400653

que si lo comparamos con el valor de dicha integral

(%i34)

(%i35)

integrate(f(x),x,a,b);
77
12
%,numer

(%o35)

6.416666666666667

(%o34)

...pues no se parece demasiado. Bueno, aumentemos el nmero de intervalos:

(%i36)

n:100;

(%o36)

100

(%i37)

sum((b-a)/n(f(a+(i-1)(b-a)/n+random(1.0)(b-a)/n)),i,1,n);

(%o37)

6.538846969978081

Vale, esto es otra cosa. Ten en cuenta que, debido al uso de random, cada vez que ejecutes la
orden obtendrs un resultado diferente y, por supuesto, que dependiendo de la funcin puede ser
necesario dividir en una cantidad alta de intervalos.

8.3 Aplicaciones
8.3.1

Clculo de reas planas


Te recuerdo que si f y g son funciones integrables definidas en un intervalo [a, b], el rea entre
las dos funciones es
Z b
| f (x) g(x)| dx
a

Evidentemente, calcular una integral con un valor absoluto no es fcil (cul es la primitiva de la
funcin | x |?). Como funcin definida a trozos, lo que tenemos que hacer es dividir el intervalo
[a, b] en subintervalos en los que sepamos cul de las dos funciones f y g es la ms grande.
Ejemplo 8.3. Calculemos el rea entre las curvas y = x2 , y2 = 8x.
Podemos dibujar las dos curvas y hacernos una idea del aspecto del rea que queremos calcular.

142

Integracin

(%i38)

(%o38)

Aplicaciones

draw2d(
color=blue,
explicit(x 2,x,0,3),
color=red,
explicit(sqrt(8x),x,0,3),
explicit(-sqrt(8x),x,0,3)
)
8

-2

-4
0

0.5

1.5

2.5

En realidad, lo primero que nos hace falta averiguar son los puntos de corte:

(%i39)
(%o39)

solve([y=x 2,y 2=8*x],[x,y]);

[[x=2,y=4],[x=- 3 %i-1,y=2 3 %i-2],[x= 3 %i-1,y=-2 3 %i-2],


[x=0,y=0]]

De todas las soluciones, nos quedamos con las soluciones reales: (0, 0) y (2, 4). En el intervalo
[0, 2], cul de las dos funciones es mayor? Son dos funciones continuas en un intervalo que slo
coinciden en 0 y en 2, por tanto el Teorema de los ceros de Bolzano nos dice que una de ellas es
siempre mayor que la otra. Para averiguarlo slo tenemos que evaluar en algn punto entre 0 y 2.
En este caso es ms fcil: se ve claramente que y = x2 est por debajo. Por tanto el rea es

(%i40)
(%o40)

integrate(sqrt(8*x)-x 2,x,0,2);
8
3

Observacin 8.4. La frmula que define el clculo del rea entre dos funciones tiene un valor absoluto que hace difcil calcular una primitiva directamente. Ese es el motivo por el que dividimos el
intervalo en trozos: quitar ese valor absoluto. Si slo pretendemos calcular el valor numricamente, entonces el valor absoluto no es un impedimento y podemos calcular directamente la integral
olvidndonos de puntos de corte o de qu funcin es mayor:

(%i41)

quad_qags(abs(x 2-sqrt(8x)),x,0,2);

(%o41)

[2.666666666666668,2.9605947323337525 1015 ,189,0]

143

Aplicaciones

Integracin

No siempre es tan evidente qu funcin es mayor. En esos casos la continuidad nos permite
utilizar el Teorema de los ceros de Bolzano para averiguarlo.
Ejemplo 8.5. Calculemos el rea entre la funcin f (x) = 2 x3 + x2 2 x 1 y el eje OX.
La funcin es un polinomio de grado 3 que puede, por tanto, tener hasta tres races reales. Si le
echamos un vistazo a su grfica

(%i42)

f(x):=2x 3+x 2-2x-1$

(%i43)

plot2d(f(x),[x,-2,2]);

(%o43)

15

10

2*x +x -2*x-1

-5

-10
-2

-1.5

-1

-0.5

0
x

0.5

1.5

se ve que tiene tres races. Pero cmo sabamos que tenamos que dibujar la funcin entre -2 y 2?
En realidad el camino correcto es, en primer lugar, encontrar las races del polinomio:

(%i44)
(%o44)

solve(f(x)=0,x);
1
[x=- ,x=-1,x=1]
2

Ahora que sabemos las races se entiende por qu hemos dibujado la grfica de la funcin en ese
intervalo particular
yh no en otro. Si las races son 21 , 1 y 1 sabemos que f no se anula en el
i
intervalo en 1, 21 ni en ] 12 , 1[ pero, cul es su signo en cada uno de dichos intervalos?
Aqu es donde entra en juego el Teorema
de
i
h los ceros de Bolzano. Si f , una funcin continua, s
cambiase de signo en ] 12 , 1[ o en 1, 12 tendra que anularse, cosa que no ocurre. Por tanto, f
siempre tiene el mismo signo en cada iuno de esos
h intervalos. Cul? Slo es cuestin de mirar el
valor de f en un punto cualquiera. En 1, 12

(%i45)

f(-0.75);

(%o45)

0.21874999813735

i
h
la funcin es positiva. Y en 21 , 1

(%i46)

f(0);

(%o46)

-1

la funcin es negativa. Por tanto, la integral que queremos hacer es

144

Integracin

Aplicaciones

| f (x) | dx =

12

f (x) dx

f (x) dx,
12

o, lo que es lo mismo,

(%i47)
(%o47)

integrate(f(x),x,-1,-1/2)+integrate(-f(x),x,-1/2,1);
71
48

Observacin 8.6. Por cierto, recuerda que podramos haber usado la opcin filled_func y
fill_color para maquillar un poco el dibujo del rea dibujando por un lado la funcin y por
otro el rea sombreada:

(%i48)

(%o48)

draw2d(
filled_func=0, fill_color=grey,
explicit(f(x),x,-1,1),
filled_func=false,
color=blue, line_width=2,
explicit(f(x),x,-1,1),
xaxis=true);
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
-1.2
-1.4
-1

8.3.2

-0.5

0.5

Longitud de curvas
Si f es una funcin definida en el intervalo [a, b], la longitud del arco de curva entre (a, f (a)) y
(b, f (b)) se puede calcular mediante la frmula
Z bq
longitud =
1 + f 0 (x)2 dx
a

Por ejemplo, la
semicircunferencia superior de radio 1 centrada en el origen es la grfica de la
funcin f (x) = 1 x2 , con x variando entre -1 y 1. Si aplicamos la frmula anterior podemos
calcular la longitud de una circunferencia.

(%i49)

f(x):=sqrt(1-x 2);

(%o49)

f(x):=sqrt(1- x2 )

(%i50)

diff(f(x),x);

145

Aplicaciones

Integracin

(%i51)

x
-
1-x2
integrate(sqrt(1+diff(f(x),x) 2),x,-1,1);

(%o51)

(%o50)

Observa que hemos calculado la longitud de media circunferencia, ya que la longitud de la


circunferencia completa de radio 1 es 2.
Esto que hemos visto es un caso particular de la longitud de una curva en el plano. Ya vimos
curvas cuando hablamos de dibujar en paramtricas. Una curva es una aplicacin de la forma
x 7 ( f (x), g(x)), a x b. La longitud de dicha curva es
Z bq
f 0 (x)2 + g0 (x)2 dx
longitud =
a

Por ejemplo, la circunferencia unidad la podemos parametrizar como t 7 (cos(t), sen(t)) con
0 t 2. Por tanto, la longitud de dicha circunferencia es

8.3.3

(%i52)

integrate(sqrt(sin(t) 2+cos(t) 2),x,0,2*%pi);

(%o52)

Volmenes de revolucin
Los cuerpos de revolucin o slidos de revolucin son regiones de R3 que se obtienen girando
una regin plana alrededor de una recta llamada eje de giro. En la Figura 8.4 tienes el slido de
revolucin engendrado al girar alrededor del eje OX la grfica de la funcin seno entre 0 y .

0.5

1
-0.5

0.8
1

-1

0.6

0
0.5

0.4
1

0.2
2

0.5

1.5

2.5

-0.5

3
3

Funcin seno

-1

Funcin seno girada


Figura 8.4

Giro de una curva y = f (x) respecto al eje X


Sea f : [a, b] R una funcin continua. Girando la regin del plano comprendida entre la
curva y = f (x), el eje de abscisas con x entre a y b, alrededor del eje OX obtenemos un slido de
revolucin con volumen igual a

146

Integracin

Aplicaciones

Vol() =

f (x)2 dx
a

Veamos algunos ejemplos.


Ejemplo 8.7. Calculemos el volumen de una esfera de radio R vindola como superficie de revo
lucin. La curva que consideramos es f (x) = R2 x2 con x [R, R] y, por tanto, el volumen lo
calculamos aplicando la frmula anterior :

(%i53)

%pi*integrate(R 2-x 2,x,-R,R);

(%o53)

4R3
3

Ejemplo 8.8. Vamos ahora a calcular el volumen de un cono circular recto. Un cono circular
recto de altura h y radio de la base R se obtiene girando la recta y = Rx/h entre 0 y h. Su volumen
es igual a

%piintegrate(R 2x 2/h 2,x,0,h);

(%i54)

hR2

(%o54)

Giro de una curva y = f (x) respecto al eje Y


Consideremos la grfica de una funcin positiva y = f (x) en un intervalo [a, b]. Por ejemplo la
funcin 1 x2 en [0, 1].
Si giramos respecto al eje OY obtenemos la Figura 8.5.

0.8

name: giroy
file: giroy

0.6

state: unknown
0.4

0.2

0
0

0.2

0.4

0.6

0.8

Figura 8.5 Funcin 1 x2 girada respecto al eje OY


Pues bien, el volumen de la regin as obtenida, , viene dado por
Z b
Volumen() = 2
x f (x) dx
a

Ejemplo 8.9.

147

Aplicaciones

Integracin

Consideremos el toro T obtenido al girar el disco


de centro (a, 0), a > 0, y radio R alrededor del
eje OY. Puedes verlo para a = 2 y R = 1 en la
Figura 8.6.
Por simetra, su volumen es el doble del volumen
del slido obtenido al girar la semicircunferencia
p
y = R2 (x a)2 ,

1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
3
2
1
-2

0
-1

-1
1

Figura 8.6

con a R x a + R alrededor del eje OY. Por


tanto
Z a+R p
volumen(T ) = 4
x R2 (x a)2 dx

-2
3 -3

Toro

aR

integral que calculamos con wxMaxima:

(%i55)

4*%pi*integrate(x*sqrt(R 2-(x-a) 2),x,a-R,a+R);

(%o55)

22 aR2

Observa que, aunque aqu hemos escrito la salida automticamente, sin embargo, wxMaxima hace
varias preguntas sobre los valores de las constantes a y R para poder calcular la integral.
Grficamente, podemos conseguir este efecto girando la circunferencia de radio 1 que podemos
parametrizar de la forma (cos(t), sen(t)), pero que tenemos que trasladar dos unidades. se es el
motivo de sumar 2 en la siguiente representacin en coordenadas paramtricas.

(%i56)

with_slider_draw3d(
n,makelist(0.1%pii,i,1,20),
surface_hide=true,
xrange=[-3,3],
yrange=[-3,3],
parametric_surface(cos(u)(2+cos(v)),sin(u)(2+cos(v)),sin(v),
u,0,n,v,0,2*%pi)
)

En la Figura 8.7 tienes algunos de los pasos intermedios de esta animacin.

8.3.4

rea de superficies de revolucin


Igual que hemos visto cmo podemos calcular el volumen de una figura obtenida girando una
funcin respecto a alguno de los ejes, tambin podemos calcular el rea de la superficie obtenida
al girar respecto al eje OX una funcin f . El rea al girar f en el intervalo [a, b] es
Z 4
q
rea() = 2
f (x) 1 + f 0 (x)2 dx
a

Por ejemplo, una esfera de radio 1 la podemos obtener girando respecto del eje OX la funcin
1 x2 .

148

Integracin

Ejercicios

1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
-1

1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
3

2
-3

1
-2

-1

-3

-2

-1
1

0
-1

-2

-1
1

3 -3

1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
-1

-2
3 -3

1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
3

2
-3

1
-2

-3

0
-1

1
-2

-1
1

0
-1

-2

-1
1

3 -3

-2
3 -3

Figura 8.7 Cmo conseguir un toro girando una circunferencia

(%i57)

integrate(f(x)*sqrt(1+diff(f(x),x) 2), x, -1, 1);

(%o57)

2 2 a R2

8.4 Ejercicios
Integracin
Ejercicio 8.1. Calcula una primitiva de las siguientes funciones.
a) f (x) = cos5 (x),
b) f (x) = 1/(1 + x4 ),

c) f (x) = 1 x2 ,
Sabes calcularlas sin usar Maxima?
Ejercicio 8.2. Calcula numricamente las integrales en el intervalo [0, 2] de los primeros 20
polinomios de Taylor centrados en cero de la funcin coseno.

Teorema fundamental del Clculo


Ejercicio 8.3.

Calcula la derivada de la funcin f (x) =

149

x2 +1

sen(t) dt.
x

Ejercicios

Integracin

Ejercicio 8.4. Estudia los extremos relativos de la funcin f (x) =

R (2x7)2
0

t3 2t dt.

rea entre curvas


Ejercicio 8.5. Calcula:
2
a) rea limitada por y = xex , el eje OX, la ordenada en el punto x = 0 y la ordenada en el
mximo.
b) rea de la figura limitada por la curva y = x3 x2 y el eje OX.
c) rea comprendida entre la curva y = tan(x), el eje OX y la recta x = /3.
d) rea del recinto limitado por las rectas x = 0, x = 1, y = 0 y la grfica de la funcin f : R R
definida por f (x) = (1+x1 2 )2 .
e) las dos reas en los que la funcin f (x) = |x| xsen(x)e x divide a la bola unidad x2 + y2 = 1.
Ejercicio 8.6. Calcula el rea entre las curvas:
a) y = x2 2x e y = x2 4, para 3 x 1. e) (y x)2 = x 3, y x = 7.
b) y2 = x, x2 + y2 = 8.
f) y = x4 + x3 + 16x 4 y y = x4 + 6x2 + 8x 4.
2
3
2
c) x = 12y 12y y x = 2y 2y.
g) y = xe x, y = x2 e x, x 0.
d) y = sec2 (x), y = tan2 (x), /4 x /4.

Longitud de curvas
Ejercicio 8.7.
a) Calcula la longitud del arco de la cicloide x = t sen(t), y = 1 cos(t), (0 t 2).
b) Calcula la longitud del arco de curva y = x2 + 4 entre x = 0 y x = 3.
Ejercicio 8.8. Calcula la longitud de una circunferencia de radio arbitrario R.
Ejercicio 8.9. Sea f (x) = cos(x) + e x y P su polinomio de orden 5 centrado en el origen. Cul
es la diferencia entre las longitudes de las grficas de f y de P en el intervalo [0, 3]?

Volumen de cuerpos de revolucin


Ejercicio 8.10. Calcular el volumen del slido generado al rotar respecto al eje OX las siguiente
curvas:
a) y = sec(x), x [0, 3 ]
c) y = 9 x2

d) y = e x , x [0, ln(3)]
b) y = cos(x), x [0, 2 ]
Ejercicio 8.11. Calcular el volumen del slido generado al rotar respecto al eje OY las siguiente
curvas:

2
c) y = e x , x [1, 3]
a) y = 1/x, x [1, 3]
1
b) y = 1+x
2 , x [0, 1]
Ejercicio 8.12.
a) Calcular la superficie de una esfera de radio R.
b) Calcular la superficie de la figura que se obtiene al girar la funcin y = tan(x), x [0, /4]
alrededor del eje OX.

150

Integracin

Ejercicios

Ejercicio 8.13.
a) Calcular el volumen del toro engendrado al girar el crculo de centro (2, 0) y radio 3 alrededor
del eje OY.
b) Calcular el volumen del slido engendrado al girar alrededor del eje OY la regin limitada por
la parbolas y2 = x, x2 = y.
Ejercicio 8.14. Sea f (x) = x5 +4x3 +2x2 +8. Calcula el volumen al girar dicha funcin alrededor
del eje OX entre los valores donde f alcanza su mximo y su mnimo relativos.

rea de superficies de revolucin


Ejercicio 8.15.
a) Calcula el rea de una esfera de radio R.
b) Calcula el rea de la figura obtenida al girar la parbola y2 = 4x y la recta x = 5 alrededor del
eje OX.
c) Calcula el rea lateral de un cono de radio R y altura h.
Ejercicio 8.16. Calcular:
a) La integral de f (x) = x12 con x [1, +].
b) El volumen y la superficie lateral del slido obtenido al girar la grfica de la anterior funcin
respecto del eje OX.
c) dem a los dos anteriores con g(x) = 1x con x [1, +].

151

152

Interpolacin polinmica

Interpolacin polinmica

Interpolacin polinmica
9
9.1 Interpolacin polinmica 153
nomio de Taylor 157

9.2 Interpolacin de Lagrange 154

9.3 Poli-

9.1 Interpolacin polinmica


Dados dos puntos del plano (x1 , y1 ), (x2 , y2 ), sabemos que hay una recta que pasa por ellos.
Dicha recta es la grfica de un polinomio de grado 1, en este caso la funcin es
f (x) = f (x2 ) +

f (x2 ) f (x1 )
(x x2 ) .
x2 x1

Por ejemplo, la recta que pasa por los puntos (1, 2) y (3, 1) es

(%i1)

recta(x1,y1,x2,y2):=y2+(x-x2)*(y2-y1)/(x2-x1)$

(%i2)

recta(1,2,3,1);
3-x
+1
2

(%o2)

y la grfica

(%i3)

wxplot2d(recta(1,2,3,1),[x,0,4]);

(%t3)

El problema general es cmo se busca una funcin que tome unos valores en unos puntos concretos. Tambin se puede exigir que las derivadas de algn orden tengan un valor predeterminado.

153

Interpolacin de Lagrange

Interpolacin polinmica

9.2 Interpolacin de Lagrange


El problema ms clsico de interpolacin es la interpolacin de Lagrange:
Dados n+1 pares de puntos (x0 , y0 ), (x1 , y1 ),..., (xn , yn ), encuntrese el polinomio
P de grado menor o igual que n tal que P(xi ) = yi , i = 0, 1, ..., n.
Los puntos x0 , x1 ,..., xn se llaman nodos de interpolacin.

9.2.1

Dos o tres nodos


Comencemos con un caso sencillo. Dada una lista de un par de puntos y un par de valores, cul
es el polinomio que pasa por esos puntos?

(%i4)

nodos:[1,2];

(%o4)

[1,2]

(%i5)

valor:[3,7];

(%o5)

[3,7]

Necesitamos un polinomio de grado uno:

(%i6)

define(f(x),a*x+b);

(%o6)

f(x):=ax+b

que debe verificar que f (1) = 3, f (2) = 7. Con estas dos condiciones planteamos un sistema de
ecuaciones que nos permite calcular a y b:

(%i7)

solve([f(nodos[1])=valor[1],f(nodos[2])=valor[2]],[a,b]);

(%o7)

[[a=4,b=-1]]

Podemos aplicar la misma tcnica para encontrar el polinomio, de grado 2 en este caso, que
pasa por los puntos (1, 3), (2, 7) y (3, 1):

(%i8)

nodos:[1,2,3]$

(%i9)

valor:[3,7,1]$

(%i10)

define(f(x),a*x 2+b*x+c)$

(%i11)

solve([f(nodos[1])=valor[1],f(nodos[2])=valor[2],
f(nodos[3])=valor[3]],[a,b,c]);

(%o11)

[[a=-5,b=19,c=-11]]

Vamos a resolver este mismo problema de otra forma. Busquemos tres polinomios de orden 2, L1,
L2 y L3 verificando que valen 1 en uno de los nodos y cero en el resto. En concreto, buscamos L1,

154

Interpolacin polinmica

Interpolacin de Lagrange

L2 y L3 tales que L1(1)=1, L2(2)=1, L3(3)=1 y que valen cero en los otros puntos. Si encontramos
estos polinomios, entonces la solucin a nuestro problema es
3 L1+ 7 L2 + L3.
Comencemos con L1: el polinomio (x 2)(x 3) se anula en 2 y en 3, pero su valor en 1,
(1 2)(1 3), no es 1. Si dividimos por dicha cantidad
(x 2)(x 3)
L1(x) =
(1 2)(1 3)
ya hemos encontrado el primer polinomio que estbamos buscando. Anlogamente
(x 1)(x 3)
(2 1)(2 3)
(x 1)(x 2)
L3(x) =
(3 1)(3 2)

L2(x) =

Con estos tres polinomios ya podemos interpolar cualesquiera tres valores en 1, 2 y 3.

9.2.2

Caso general
Si ahora tenemos n + 1 nodos distintos, podemos hacer una construccin anloga.
Definicin 9.1. Dados xi , i = 0, 1, 2,..., n nmeros reales distintos, los polinomios
Li (x) =

n
Y
(x x j )
, i = 0, 1, 2, . . . , n
(xi x j )
j=0
j6=i

se llaman polinomios de Lagrange de grado n en los puntos x0 , x1 , ... , xn .


Qu propiedades tienen? Fjate que son muy fciles de evaluar en los puntos xi . Si evaluamos
en el mismo ndice
n
Y
(xi x j )
Li (xi ) =
= 1,
(xi x j )
j=0
j6=i

ya que numerador y denominador coinciden. Si evaluamos en xk con k 6= i, entonces


n
Y
(xk x j )
Li (xk ) =
= 0,
(xi x j )
j=0
j6=i

ya que uno de los factores del numerador, en concreto cuando j = k, se anula. Resumiendo, los
polinomios de Lagrange valen

1, si i = k,
Li (xk ) =
0, si i 6= k.
para i, k = 0, 1,..., n. Observa que hemos dado el valor de los polinomios de Lagrange en n + 1
puntos diferentes y, por tanto, estos valores los determinan completamente.
Con los polinomios Li ahora podemos calcular fcilmente un polinomio que tome valores yi en
los nodos xi . En efecto, el polinomio

155

Polinomio de Lagrange

Interpolacin de Lagrange

Interpolacin polinmica

P(x) = y0 L0 (x) + y1 L1 (x) + + yn Ln (x)


cumple que P(xi ) = yi para i = 0, 1,...,n. El siguiente teorema recoge toda la informacin que
hemos presentado.
Teorema 9.2. Sean x0 , x1 ,..., xn nmeros reales distintos. Entonces dados y0 , y1 ,..., yn existe
un nico polinomio Pn (x) de grado menor o igual que n verificando que
Pn (xi ) = yi , i = 0, 1, . . . , n.
Frmula de Lagrange del polinomio de interpolacin

Dicho polinomio viene dado por


P(x) = y0 L0 (x) + y1 L1 (x) + + yn Ln (x),

(9.1)

donde
Li (x) =

(x x0 )(x x1 ) (x xi1 )(x xi+1 ) (x xn )


(xi x0 )(x0 x1 ) (xi xi1 )(xi xi+1 ) (xi xn )

para i = 0, 1,..., n.
La identidad (9.1) se llama frmula de Lagrange del polinomio de interpolacin.

Ventajas e inconvenientes
Los polinomios de Lagrange son muy fciles de calcular. Es por ello que se utilizan como uno
de los primeros ejemplos de polinomios interpoladores. Su inters prctico es limitado y suelen
presentarse ms bien como ejemplo terico de interpolacin.
Su principal inconveniente se presenta cuando el conjunto de nodos es muy grande. En ese caso
el grado del polinomio tambin es muy grande. Esto implica dificultades para el clculo y, adems,
hay una alta tendencia a que el polinomio oscile mucho entre dos nodos.

9.2.3

El paquete interpol
Puedes pensar en alguna forma de calcular los polinomios de Lagrange en un conjunto de nodos, pero en Maxima disponemos del paquete interpol que calcula el polinomio interpolador de
Lagrange. En primer lugar cargamos el mdulo

(%i12)

load(interpol)$

y podemos usar la orden lagrange para calcular el polinomio que interpola una lista de pares
(nodo, valor)

(%i13)
(%o13)
(%i14)
(%o14)

lagrange([[1,3],[2,1],[3,4]]);
3(2-x)(x-3)
2(x-2)(x-1)-(x-3)(x-1)2
expand(%);
5x 2 19x

+10
2
2

156

Interpolacin polinmica

Polinomio de Taylor

o, en el caso de que los nodos sea 1, 2, 3, 4, etc., simplemente dando la lista de valores

(%i15)
(%o15)

expand(lagrange([3,1,4]));
5x 2 19x

+10
2
2

lagrange([[nodo1,valor1],[nodo2,valor2],...])
lagrange([valor1,valor2,...])

9.2.4

polinomio de Lagrange
polinomio de Lagrange

Ejercicios

Ejercicio 9.1. Cul es el error cuando aproximamos 102 utilizando el valor de la funcin raz
cuadrada en 81, 100 y 121? Representa las grficas de la funcin raz cuadrada y comprala con
la grfica del polinomio.
Ejercicio 9.2. Utiliza los valores de la funcin raz cuadrada en n = 2, 3, . . . , 10 puntos, elegidos
por t, para calcular el polinomio de interpolacin y aproximar el valor en 102. Haz una animacin
que represente la funcin raz cuadrada y el polinomio de interpolacin de Lagrange en funcin
de su grado.
Ejercicio 9.3. Calcula la frmula de la suma de los cubos de los primeros n naturales sabiendo
que es un polinomio de grado cuatro.

9.3 Polinomio de Taylor


En el Captulo 7 hemos visto cmo la recta tangente a una funcin en un punto aproxima localmente a dicha funcin en ese punto. Es decir, que si sustituimos una funcin por su recta tangente en
un punto, estamos cometiendo un error como se puede ver. En efecto, si dibujamos en una misma
grfica la funcin f (x) = cos(x) y su recta tangente en cero, es decir t(x) = f (0) + f 0 (0)(x 0) = 1
obtenemos

(%i16)

f(x):=cos(x);

(%o16)

f(x):=cos(x)

(%i17)

t(x):=1;

(%o17)

t(x):=1

(%i18)

plot2d([f(x),t(x)],[x,-3,3],[y,-2,2]);

(%o18)

cos(x)
1

1.5
1

0.5
0
-0.5
-1
-1.5
-2
-3

-2

-1

0
x

157

Polinomio de Taylor

Interpolacin polinmica

En cuanto nos alejamos un poco del punto de tangencia


(en este caso el 0), la funcin coseno y su tangente no se
parecen en nada. La forma de mejorar la aproximacin
ser aumentar el grado del polinomio que usamos, y la
cuestin es, fijado un grado n, qu polinomio de grado
menor o igual al fijado es el que ms se parece a la funcin. El criterio con el que elegiremos el polinomio ser
hacer coincidir las sucesivas derivadas, esto es, el polinomio de Taylor de orden n de una funcin f en un punto
a:
f 00 (a)
T ( f, a, n)(x) = f (a) + f 0 (a)(x a) +
(x a)2
Figura 9.1 Ventana para el clculo
2!
del polinomio de Taylor
f n) (a)
f 000 (a)
(x a)3 + +
(x a)n
+
3!
n!
n
X
f k) (a)
=
(x a)k
k!
k=1
taylor

El programa tiene una orden que permite calcular directamente el polinomio de Taylor centrado
en un punto a. Se trata del comando taylor. En concreto, el comando taylor(f(x),x,a,n )
nos da el polinomio de Taylor de la funcin f centrado en a y de grado n. Haciendo uso del
men podemos acceder al comando anterior desde AnlisisCalcular serie. Entonces se abre
una ventana de dilogo en la que, escribiendo la expresin de la funcin, la variable, el punto en
el que desarrollamos y el orden del polinomio de Taylor, obtenemos dicho polinomio. Como en
otras ventanas similares, si marcamos la casilla de Especial, podemos elegir o e como centro
para el clculo del desarrollo.

taylor(f(x),x,a,n )

polinomio de Taylor de la
funcin f en el punto a y de orden n

trunc(polinomio )
taylorp(polinomio )

convierte polinomio de Taylor en un polinomio


devuelve true si el polinomio
es un polinomio de Taylor

Veamos un ejemplo.

(%i19)

taylor(cos(x),x,0,5);

(%o19)

(%i20)

taylor(log(x),x,1,7);

(%o20)

x1

x2 x4
+
+ ...
2
24
(x 1)2 (x 1)3 (x 1)4 (x 1)5 (x 1)6 (x 1)7
+

+
+ ...
2
3
4
5
6
7

En teora, un polinomio de Taylor de orden ms alto debera aproximar mejor a la funcin.


Ya hemos visto cmo aproxima la recta tangente a la funcin coseno. Vamos ahora a dibujar las
grficas de la funcin f (x) = cos(x) y de su polinomio de Taylor de orden 8 en el cero para
comprobar que la aproximacin es ms exacta.

158

Interpolacin polinmica

(%i21)

Polinomio de Taylor

plot2d([f(x),taylor(f(x),x,0,8)],[x,-4,4],[y,-2,2]);

(%o21)

cos(x)
1-x2/2+x4/24-x6/720+x8/40320

1.5
1

0.5
0
-0.5
-1
-1.5
-2
-3

-2

-1

Pero si aumentamos el dominio podemos ver que el polinomio de Taylor se separa de la funcin
cuando nos alejamos del origen.

(%i22)

plot2d([f(x),taylor(f(x),x,0,8)],[x,-8,8],[y,-2,2]);

(%o22)

cos(x)
2
4
6
8
1-x /2+x /24-x /720+x /40320

1.5
1

0.5
0
-0.5
-1
-1.5
-2
-8

-6

-4

-2

0
x

Esto es lo esperable: la funcin coseno est acotada y el polinomio de Taylor, como todo polinomio no constante, no lo est. Eso s, si aumentamos el grado del polinomio de Taylor vuelven a
parecerse:

(%i23)

plot2d([f(x),taylor(f(x),x,0,14)],[x,-8,8],[y,-2,2]);

(%o23)

2
cos(x)
1-x2/2+x4/24-x6/720+x8/40320-x10/3628800+x12/479001600-x14/87178291200
1.5
1

0.5
0
-0.5
-1
-1.5
-2
-8

-6

-4

-2

0
x

El hecho de que la funcin coseno y su polinomio de Taylor se parezcan tanto como se quiera, con slo aumentar el grado del polinomio lo suficiente, no es algo que le ocurra a todas las
funciones. Para la funcin arcotangente la situacin no es tan buena:

159

Polinomio de Taylor

Interpolacin polinmica

(%i24)

g(x):=atan(x);

(%o24)

g(x):=atan(x)

(%i25)

plot2d([g(x),taylor(g(x),x,0,8)],[x,-8,8],[y,-2,2]);

(%o25)

atan(x)
3
5
7
x-x /3+x /5-x /7

1.5
1

0.5
0
-0.5
-1
-1.5
-2
-8

-6

-4

-2

0
x

slo se parecen, al menos eso se ve en la grfica, en el intervalo ] 1, 1[ (a ojo).


Observacin 9.3. Maxima tiene dos formas de representar internamente los polinomios. Sin
entrar en detalles, no se guardan de la misma forma un polinomio de Taylor y un polinomio cualquiera. Esto puede dar lugar a algunas sorpresas. Por ejemplo, hemos visto cmo el polinomio
de Taylor nos sirve para aproximar una funcin, pero, en lugar de representar la funcin y dicho
polinomio, podramos representar la diferencia. Veamos que ocurre 10. Definimos las funciones,

(%i26)

f(x):=cos(x);

(%o26)

f(x):=cos(x)

(%i27)

define(g(x),taylor(f(x),x,0,5));
x2 x4
g(x):=1+
+...
2 24

(%o27)

y dibujamos la diferencia

(%i28)

plot2d(f(x)-g(x),[x,-5,5]);

(%o28)

+0

0.5

-0.5

-1

-4

-2

Cmo puede salir 0? Es que no hay diferencia? S la hay. Ya lo sabemos: si evaluamos en algn
punto podemos ver que el resultado no es cero.
10

Este ejemplo est hecho con la versin 5.18 de Maxima. Es posible que el resultado sea distinto en otras versiones.

160

Interpolacin polinmica

(%i29)
(%o29)

Polinomio de Taylor

f(2)-g(2);
3 cos(2) + 1
3

Como hemos avisado antes, Maxima maneja de forma diferente un polinomio de Taylor y un polinomio normal. Puedes comprobarlo preguntando a Maxima si g(x) es un polinomio de Taylor o
no.

(%i30)

taylorp(g(x));

(%o30)

true

(%i31)

taylorp(1+ x2 );

(%o31)

false

La orden trunc(polinomio de Taylor ) nos permite pasar de polinomio de Taylor a polino- trunc
mio normal. Con estos ya no tenemos este problema.

(%i32)

plot2d(f(x)-trunc(g(x)),[x,-5,5]);

(%o32)

0
-2

-6

cos(x)-x /24+x /2-1

-4

-8
-10
-12
-14
-16
-4

-2

0
x

Animaciones con polinomios


Hasta aqu hemos visto cmo comparar la grfica de una funcin con la de su polinomio de
Taylor. Ahora bien, en lugar de ir dibujando una funcin y un polinomio de Taylor, parece ms
interesante dibujar la funcin y varios polinomios para ir comprobando si se parecen o no a dicha
funcin cuando aumenta su orden. La orden with_slider (que ya conoces) nos va a permitir
hacer animaciones de la grfica de una funcin y sus polinomios de Taylor. Por ejemplo:

(%i33)

f(x):=sin(x)+cos(x);

(%o33)

f(x):=sin(x)+cos(x)

(%i34)

tay(n,x):=block([ts:taylor(f(z),z,0,n)],subst(z=x,ts));

(%o34)

tay(n,x):=block([ts:taylor(f(z),z,0,n)],subst(z=x,ts))

(%i35)

with_slider(n,makelist(i,i,1,20),
[f(x),(tay(n,x))],[x,-10,10],[y,-3,3]);

161

Polinomio de Taylor

Interpolacin polinmica

nos permite dibujar los primeros 20 polinomios de Taylor de la funcin f . En la Figura 9.2 tienes
algunos pasos intermedios representados.
Observacin 9.4. Hemos usado la orden block para definir una funcin intermedia que nos
permita realizar la animacin. No vamos a entrar en ms detalles sobre cmo utilizarla en la definicin de funciones. Puedes consultar la ayuda de Maxima, si tienes inters, donde encontrars una
explicacin detallada de su uso.
3

sin(x)+cos(x)
1+x-x2/2-x3/6+x4/24+x5/120

-1

-1

-2

-2

-3
-10

-5

0
x

-3
-10

10

sin(x)+cos(x)
fun2

-5

Orden 5
3

sin(x)+cos(x)
fun2

-1

-1

-2

-2

-3
-10

-5

0
x

10

Orden 10

0
x

-3
-10

10

Orden 15

sin(x)+cos(x)
fun2

-5

0
x

10

Orden 20

Figura 9.2 Funcin sen(x) + cos(x) y sus polinomios de Taylor

9.3.1

Ejercicios
Ejercicio 9.4. Es cierto o falso que el polinomio de Taylor de una funcin al cuadrado es el
cuadrado del polinomio?
Ejercicio 9.5. Estudia los extremos relativos del polinomio de orden 5 centrado en el origen de
la funcin f (x) = cos(x) + e x .

162

Derivacin e integracin numrica

Derivacin numrica

Derivacin e integracin numrica


10
10.1 Derivacin numrica 163 10.2 Integracin numrica 164
simples 165 10.4 Mtodos de aproximacin compuestos 167

10.3 Mtodos

El clculo de la derivada de o de la integral de una funcin no siempre es fcil. En este captulo


vamos a ver cmo podemos aproximarlos. Una de las herramientas claves es la interpolacin. Para
polinomios s es factible calcular derivadas e integrales. Aprovecharemos tanto la interpolacin de
Lagrange como la de Taylor para aproximar una funcin por un polinomio.

10.1 Derivacin numrica


A veces ocurre que calcular la derivada de una funcin f en un punto a del interior de dominio
no es fcil, ya sea por la complejidad de la funcin dada, ya sea porque slo dispongamos de una
tabla de valores de f . En esta seccin vamos a establecer mtodos para calcular f 0 (a). No es que
vayamos a calcular la funcin derivada primera de f , sino que vamos a aproximar los valores de
sta en un punto dado a.
Hemos visto en este captulo que la derivada de una funcin f : I R en un punto a I es
f 0 (a) = lim

xa

f (x) f (a)
(a + h) f (a)
= lim
.
h0
xa
h

Si consideramos un valor de h suficientemente pequeo, podemos dar una primera aproximacin


f 0 (a)

10.1.1

f (a + h) f (a)
.
h

Frmulas de derivacin numrica


En las frmulas que vamos a estudiar en este apartado aparecen dos valores: el que aproxima
y el error cometido. Aunque este ltimo no se calcula explcitamente, s se puede dar una
acotacin del mismo. Notemos que dicho error se obtiene gracias al desarrollo de Taylor de f
centrado en a.
En lo que sigue, el parmetro h se suele tomar positivo y pequeo.
a) Frmula de dos puntos:
f 0 (a)

f 0 (a) =

1
h
( f (a) f (a h)) + f 00 () , ]a h, a[
h
2

Esta frmula se llama regresiva porque utiliza informacin de f en a y en a h.


f 0 (a) =

h
1
( f (a + h) f (a)) f 00 () , ]a, a + h[
h
2

Esta frmula se llama progresiva porque utiliza informacin de f en a y en a + h.

163

Integracin numrica

Derivacin e integracin numrica

El primer sumando de ambas frmulas nos da una aproximacin de f 0 (a), y el segundo nos
indica el error cometido.
b) Frmula de tres puntos:
f 0 (a) =

1
h2 000
( f (a + h) f (a h))
f () , ]a h, a + h[
2h
6

Esta frmula se llama central porque utiliza informacin de f en a h y en a + h.


f 0 (a) =

1
h2 000
(3 f (a) + 4 f (a + h) f (a + 2h)) +
f () , ]a, a + 2h[
2h
3

Esta frmula es progresiva.


c) Fmula de cinco puntos:
f 0 (a) =

h4 (5)
1
( f (a 2h) 8 f (a h) + 8 f (a + h) f (a + 2h))
f () , ]a2h, a+2h[
12h
30

sta es central.
h4
1
(25 f (a) + 48 f (a + h) 36 f (a + 2h) + 16 f (a + 3h) 3 f (a + 4h))+ f (5) () , ]a, a+4h[
f 0 (a) =
12h
5
Esta es progresiva.
Unas observaciones sobre el trmino del error:
a) Cuanto mayor es el exponente de h en la frmula del error, mejor es la aproximacin.
b) Cuanto menor es la constante que aparece en la frmula del error, mejor es la aproximacin.
c) Cuidado con los errores de redondeo cuando trabajemos con h excesivamente pequeo. Puede
ocurrir que por la aritmtica del ordenador, la aproximacin numrica sea peor cuanto ms
pequo sea h.
Ejemplo 10.1. FALTA (PARA PRCTICAS)

10.2 Integracin numrica


10.2.1

Introduccin
El clculo de la integral de una funcin en un intervalo [a, b] a travs de la regla de Barrow
puede ser en algunos casos no slo complicado, sino prcticamente imposible por varias razones,
principalmente dos.
La primera razn es que nos sea imposible calcular una primitiva elemental de la funcin a
integrar, este caso es muy usual. Por ejemplo la funcin f (x) = (1 + x2 )1/3 no somos capaces de
calcularle una primitiva expresable con funciones elementales. Otro ejemplo, muy usual ste, es
2
la funcin de densidad f (x) = ex que tantas veces aparece.
La segunda razn para no poder aplicar la regla de Barrow es que no conozcamos la expresin
de la funcin que queremos integrar o simplemente que no conozcamos el valor de la funcin en
todos los puntos del intervalo donde est definida (le llamaremos [a, b]) sino solamente en algunos
puntos de dicho intervalo
Por todo lo anterior, a veces hay que recurrir a mtodos de aproximacin para calcular el valor
de la integral de una funcin en un intervalo. Ya que la propia definicin de la integral viene dada
por un lmite (de sumas superiores y sumas inferiores), una aproximacin a dicho lmite podra
considerarse un primer mtodo de aproximacin numrica de la integral.

164

Derivacin e integracin numrica

Mtodos simples

Los mtodos de aproximacin del clculo de la integral que veremos se llaman mtodos o reglas
de integracin numrica y consisten, bsicamente, en dada f : [a, b] R continua, aproximamos
dicha funcin por un polinomio adecuado. As, la integral de dicho polinomio ser una aproximacin de la integral de f . Estos mtodos son los llamados mtodos simples, que, si bien son muy
sencillos de enunciar, la aproximacin que dan deja mucho que desear en muchos casos. Un anlisis posterior nos dar los mtodos compuestos que producen una aproximacin ms buena. Primero
veremos los simples.

10.3 Mtodos simples


10.3.1

Mtodo del trapecio simple


El mtodo del trapecio simple consiste en considerar como polinomio de aproximacin de la
funcin f en el intervalo [a, b] el polinomio de interpolacin de Lagrange de la funcin f en x0 = a
Rb
Rb
y x1 = b y se toma a P1 (x)dx como aproximacin de a f (x)dx. El polinomio de interpolacin
de Lagrange es
P1 (x) = f (a)

xa
xb
+ f (b)
,
ab
ba

lo que nos proporciona


b

Z
f (x)dx

P1 (x)dx =

ba
( f (a) + f (b)).
2

El nombre de mtodo o regla del trapecio est claro si observamos en el siguiente dibujo que
aproximacin estamos dando de la integral: Si tenemos una funcin f : [a, b] R y suponemos
que es positiva, la aproximacin dada por el mtodo del trapecio es el rea del trapecio formado
por los puntos (a, 0), (b, 0), (b, f (b)) y (a, f (a)).
(b, f (b))

(a, f (a))

Figura 10.1 Mtodo del trapecio simple


Esta aproximacin solo es exacta cuando la funcin f es un polinomio de grado 1. En cualquier
caso tenemos que el error que se comete al aplicar esta regla viene dado por
Z b
1
ba
( f (a) + f (b)) = (b a)3 f 00 ()
f (x)dx
2
12
a
para conveniente ]a, b[.

165

Mtodos simples

10.3.2

Derivacin e integracin numrica

Regla del punto medio simple


Para construir esta aproximacin de la integral de la funcin f en el intervalo [a, b] se considera
P0 el polinomio de aproximacin de Lagrange de la funcin en el punto x0 = a+b
2 y se toma
Rb
Rb
a+b
P0 (x)dx como aproximacin de a f (x)dx. Como P0 (x) = f ( 2 ), entonces la aproximacin
a
queda
Z b
Z b
a+b
f (x)dx
P0 (x)dx = (b a) f (
)
2
a
a
que, si f es positiva en el intervalo [a, b], nos da como aproximacin del rea que queda entre el
eje de abscisas y la grfica de f entre a y b, el rea del rectngulo de base b a (la longitud de
intervalo [a, b]) y altura f ( a+b
2 ).
Claramente esta frmula es exacta cuando la funcin f es constante en el intervalo [a, b], y, en
general, el error cometido al tomar esta aproximacin es
Z b
a+b
1
f (x)dx (b a) f (
) = (b a)3 f 00 (),
2
24
a
para algn ]a, b[.
(b, f (b))


a+b
2 ,

a+b
2



(a, f (a))

a
Figura 10.2

10.3.3

a+b
2

Mtodo del punto medio simple

Regla de Simpson simple


En este caso se toma como aproximacin de la funcin P2 , el polinomio de interpolacin de
Lagrange de la funcin f en los puntos x0 = a, x1 = a+b
2 y x2 = b. Como aproximacin de
Rb
Rb
f (x)dx se toma a P2 (x)dx. As el mtodo de Simpson simple nos da
a
!
!
Z b
(b a)
a+b
f (x)dx
f (a) + 4 f
+ f (b) .
6
2
a
Est mtodo es exacto cuando la funcin f es un polinomio de grado menor o igual que 3. El
error cometido al sustituir el valor exacto de la integral por la aproximacin que nos da la regla de
Simpson vale
!
!
Z b
(b a)
a+b
1
f (x)dx
f (a) + 4 f
+ f (b) =
(b a)5 f 4) (),
6
6
2
90

2
a
para algn ]a, b[.

166

Derivacin e integracin numrica

Mtodos de aproximacin compuestos

(b, f (b))


a+b
2 ,

a+b
2



(a, f (a))

a
Figura 10.3

a+b
2

Regla de Simpson simple

Est claro que, al ser P2 una mejor aproximacin, en general, que P0 y P1 , la regla de Simpson
es mejor aproximacin a la integral que la regla del trapecio y la del punto medio. La siguiente
tabla muestra las aproximaciones dadas por las tres reglas que hemos presentado.
ahora viene una tabla que tengo que hacer.
En vista de las frmulas de los errores cometidos al tomar como aproximacin cualquiera de las
frmulas anteriores, estos errores dependen mucho de la longitud del intervalo [a, b]. En todos las
frmulas de los errores aparece un trmino (b a) elevado a una potencia. Est claro que si (b a)
es muy grande la aproximacin no es muy buena. Este hecho adems responde a la intuicin: no
podemos pretender que si el intervalo de definicin de la funcin es muy grande al tomarnos como
aproximacin de la funcin un polinomio de grado 0 (e incluso 1 o 2) obtengamos una muy buena
aproximacin.
Si en el ejemplo de la tabla anterior aumentamos la longitud del intervalo veamos qu ocurre:
Otra tabla con el mismo ejemplo con un intervalo ms grande y comentar los errores que se
cometen ahora.

10.4 Mtodos de aproximacin compuestos


Una forma de resolver este problema consiste en dividir el intervalo [a, b] en n subintervalos de
idntica longitud y aplicar un mtodo de aproximacin simple en cada uno de los subintervalos
obtenidos y despus sumar las aproximaciones obtenidas. La aditividad de la integral respecto al
intervalo nos garantiza que la suma obtenida es una aproximacin de la integral de la funcin en
el intervalo [a, b]. Estos mtodos de aproximacin se llaman mtodos de aproximacin compuesta
y vamos a comentar brevemente los tres correspondientes a los mtodos de aproximacin simple
que acabamos de estudiar.
Lo primero que tenemos que hacer, en los tres mtodos, es dividir el intervalo en n subintervalos
de igual longitud. Para tal fin consideramos los puntos
xk = a + k

ba
, k = 0, 1, . . . n,
n

(10.1)

donde n es un nmero natural. Estos puntos xk , para k = 0, 1, . . . , n reciben el nombre de nodos.


Si ahora aplicamos cada uno de los mtodos de aproximacin simples a la funcin en cada uno de
los intervalos [xk , xk+1 ] obtenemos en cada caso las siguientes frmulas:

167

Mtodos de aproximacin compuestos

Derivacin e integracin numrica

Mtodo del trapecio compuesto


Rb
Sean x0 , x1 , . . . , xn los nodos dados por (10.1). La aproximacin de la integral a f (x)dx utilizando el mtodo del trapecio compuesto con los subintervalos dados por los anteriores nodos nos
proporciona

n1
X

(b a)
f (a) + 2
f (xi ) + f (b) ,
Tn =
2n
i=1
y el error cometido queda estimado por la frmula
Z b
1 (b a)3 00
f (x)dx T n =
f ()
12 n2
a
donde es un nmero del intervalo ]a, b[.

Mtodo del punto medio compuesto


Considerando los mismos nodos que en el apartado anterior la regla del punto medio compuesto
nos da una aproximacin
!
n1
(b a) X
(2i + 1) (b a)
Mn =
f a+
.
n
2
n
i=0
En este caso la expresin del error nos queda
Z b
(b a)3 00
f ()
f (x)dx Mn =
24n2
a
para ]a, b[.

Mtodo de Simpson compuesto


En este caso necesitamos que el nmero n sea par. Usando el mtodo de Simpson en cada
intervalo [xk , xk+1 ] obtenemos la aproximacin
Sn =

(b a) 
( f (x0 ) + 4 f (x1 ) + f (x2 )) + ( f (x2 ) + 4 f (x3 ) + f (x4 )) +
3n

+ ( f (xn2 ) + 4 f (xn1 ) + f (xn )) .

Haciendo un fcil cambio de variable obtenemos que la anterior expresin coincide con
n/2

Sn =


(b a) X 
f (x2i2 ) + 4 f (x2i1 ) + f (x2i )
3n i=1

y el error que se comete viene dado por


Z b
1 (b a)5 4)
f (x)dx S n =
f ()
180 n4
a
para un ]a, b[.

168

Derivacin e integracin numrica

Mtodos de aproximacin compuestos

El error en los tres mtodos depende inversamente del nmero de nodos n. Pero mientras que en
el mtodo del trapecio y en del punto medio el error es inversamente proporcional a n2 en el mtodo
de Simpson es inversamente proporcional a n4 . Est claro por tanto que el mtodo de Simpson es
ms exacto que los otros dos cuando aumentamos el nmero de nodos.
Ejemplo 10.2. Consideremos la integral de la funcin f (x) = e x sen(x) en el intervalo [0, 1].
A esta funcin se le puede calcular una primitiva fcilmente integrando por partes (hgase!) y
evaluando en 0 y en 1 queda
Z 1
e x sen(x)dx = 0.90933067363148.
0

Trapecio

Aproximacin

Error

n=20
n=40
n=100
Punto medio

0.9670887643
0.9380661609
0.9207904171
Aproximacin

5.78 102
2.87 102
1.15 102
Error

n=20
n=40
n=100
Simpson

0.9090435575
0.9092588997
0.9093191900
Aproximacin

2.87 104
7.18 105
1.15 105
Error

n=20
n=40
n=100

0.9093305474
0.9093306657
0.9093306734

1.26 107
7.89 109
2.02 1010

Tabla 10.1

Frmulas de integracin compuesta

169

Mtodos de aproximacin compuestos

Derivacin e integracin numrica

170

Nmeros complejos

Nmeros complejos
A
Despus de calcular la raz cuadrada de 2, la primera idea que se nos ocurre a todos es probar
con nmeros negativos a ver que pasa:

(%i1)
(%o1)

sqrt(-2);

2 %i

Correcto. Ya habamos comentado con anterioridad que %i representa a la unidad imaginaria. En


Maxima podemos trabajar sin problemas con nmeros complejos. Se pueden sumar, restar, multiplicar, dividir

(%i2)

((2+3%i)+(3-%i);

(%o2)

2 %i+5
rectform(expresin )
realpart(expresin )
imagpart(expresin )
polarform(expresin )
abs(expresin )
cabs(expresin )
carg(expresin )
conjugate(expresin )
demoivre(expresin )

exponentialize(expresin )

expresin en forma cartesiana o binmica


parte real de expresin
parte imaginaria de expresin
forma polar de expresin
mdulo o valor absoluto de expresin
mdulo de expresin compleja
argumento de expresin
conjugado de expresin
expresa el nmero complejo
utilizando senos y cosenos
expresa el nmero complejo
utilizando exponenciales

Si multiplicamos o dividimos nmeros complejos, hemos visto que Maxima no desarrolla completamente el resultado, pero si pedimos que nos lo de en forma cartesiana, por ejemplo,

(%i3)
(%o3)
(%i4)

(2+3%i)/(1-%i);
3 %i+2
1-%i
rectform((2+3%i)/(1-%i));

171

Nmeros complejos

(%o4)

5 %i 1

2
2

De la misma forma podemos calcular la parte real y la parte imaginaria, el mdulo o la forma
polar de un nmero complejo

(%i5)

realpart(2-%i);

(%o5)

(%i6)

abs(1+3%i);

10

(%o6)
(%i7)
(%o7)

carg

polarform(1+3%i);

10%e%i atan(3)

No hace falta calcular la forma polar para conocer el argumento principal de un nmero complejo, carg se encarga de de ello:

(%i8)

carg(1+3%i);

(%o8)

atan(3)

(%i9)

carg(exp(%i));

(%o9)

Recuerda que muchas funciones reales tienen una extensin al plano complejo. Por ejemplo,
exp nos da la exponencial compleja,

(%i10)
(%o10)

exp(%i%pi/4);

2%i
2
+
2
2

log nos da el logaritmo principal


(%i11)

log(%i);

(%o11)

log(%i)

(%i12)

log(-3);

(%o12)

log(-3)

siempre que se lo pidamos

172

Nmeros complejos

(%i13)

(%i14)

rectform(log(%i));
%i
2
rectform(log(-3));

(%o14)

log(3)+%i

(%o13)

Podemos calcular senos o cosenos,

(%i15)

cos(1+%i);

(%o15)

cos(%i+1)

(%i16)

rectform(%);

(%o16)

cos(1)cosh(1)-%i sin(1)sinh(1)

si preferimos la notacin exponencial, exponentialize escribe todo en trminos de exponenciales

(%i17)

exponentialize(%);

(%o17)

(%e+%e1 )(%e%i +%e%i ) (%e-%e1 )(%e%i -%e%i )

4
4

y demoivre utiliza senos y cosenos en la salida en lugar de las exponenciales:

(%i18)

demoivre(%);

(%o18)

(%e+%e1 ) cos(1) (%e-%e1 ) i sin(1)

2
2

Observacin A.1. La orden abs calcula el mdulo de la expresin pedida como ya hemos comentado

(%i19)
(%o19)

abs(1+%i);

pero en algunas ocasiones el resultado no es el esperado

(%i20)

abs(log(-3));

(%o20)

-log(-3)

En este caso, cabs nos da el resultado correcto

173

cabs

Nmeros complejos

(%i21)
(%o21)

cabs(log(-3));
p
log(3)2 + 2

174

Avisos y mensajes de error

Avisos y mensajes de error


B
Este apndice no es, ni pretende ser, un repaso exhaustivo de los errores que podemos cometer
utilizando Maxima, sino ms bien una recopilacin de los errores ms comunes que hemos cometido mientras aprendamos a usarlo. La lista no est completa y habra que aadirle la manera ms
tpica de meter la pata: inventarse los comandos. Casi todos utilizamos ms de un programa de
clculo, simblico o numrico, y algn lenguaje de programacin. Es muy fcil mezclar los corchetes de Mathematica ( by Wolfram Research) y los parntesis de Maxima. Se poda utilizar
ln como logaritmo neperiano o eso era en otro programa? Muchas veces utilizamos lo que creemos que es una funcin conocida por Maxima sin que lo sea. En esos casos un vistazo a la ayuda
nos puede sacar de dudas. Por ejemplo, qu sabe Maxima sobre ln?

(%i1)

??ln -- Funcin: belln (<n>)


Representa el n-simo nmero de Bell, de modo que belln(n)
es
el nmero de particiones de un conjunto de <n> elementos.
El argumento <n> debe ser un ...

No es precisamente lo que esperbamos (al menos yo).

(%i2)

2x+1
Incorrect syntax: X is not an infix operator
2x+

Es necesario escribir el smbolo de multiplicacin, entre 2 y x.

(%i3)

factor((2 x+1) 2)
Incorrect syntax: X is not an infix operator
factor((2Spacex+

Es necesario escribir el smbolo de multiplicacin, entre 2 y x. No es suficiente con un espacio


en blanco.

175

Avisos y mensajes de error

(%i4)

plot2d(sin(x),[x,0,3]])
Incorrect syntax: Missing )
ot2d(sin(x),[x,0,3]]

Repasa parntesis y corchetes: en este caso hay un corchete de ms.

(%i5)

g(x,y,z):=(2x,3cos(x+y))$

(%i6)

g(1,%pi);
Too few arguments supplied to g(x,y,z):
[1,]
-- an error. To debug this try debugmode(true);

La funcin tiene tres variables y se la estamos aplicando a un vector con slo dos componentes.

(%i7)

f(x):3x+cos(x)
Improper value assignment:
f(x)
-- an error. To debug this try debugmode(true);

Para definir funciones se utiliza el signo igual y dos puntos y no slo dos puntos.

(%i8)

solve(sin(x)=0,x);
solve is using arc-trig functions to
get a solution. Some solutions will be lost.

(%o8)

[x=0]

Para resolver la ecuacin sen(x) = 0 tiene que usar la funcin arcoseno (su inversa) y Maxima
avisa de que es posible que falten soluciones y, de hecho, faltan.

(%i9)

integrate(1/x,x,0,1);
Is x + 1 positive, negative, or zero? positive;
Integral is divergent
-- an error. To debug this try debugmode(true);

La funcin

1
x

no es integrable en el intervalo [0, 1].

176

Avisos y mensajes de error

(%i10)

find_root(x 2,-3,3);
function has same sign at endpoints
[f(-3.0)=9.0,f(3.0)=9.0]
-- an error. To debug this try debugmode(true);

Aunque x2 se anula entre 3 y 3 (en x = 0 obviamente) la orden find_root necesita dos


puntos en los que la funcin cambie de signo.

(%i11)

A:matrix([1,2,3],[2,1,4],[2.1,4]);
All matrix rows are not of the same length.
-- an error. To debug this try debugmode(true);

En una matriz, todas las filas deben tener el mismo nmero de columnas: hemos escrito un
punto en lugar de una coma en la ltima fila.

(%i12)

A:matrix([1,2,3],[2,1,4],[2,1,4])$

(%i13)

B:matrix([1,2],[2,1],[3,1])$

(%i14)

B.A
incompatible dimensions - cannot multiply
-- an error. To debug this try debugmode(true);

No se pueden multiplicar estas matrices. Repasa sus rdenes.

177

178

Bibliografa

Bibliografa
C
a) La primera fuente de documentacin sobre Maxima es el propio programa. La ayuda es muy
completa y detallada.
b) En la pgina del programa Maxima, http://maxima.sourceforge.net/es/, existe una seccin dedicada a documentacin y enlaces a documentacin. El manual de referencia de Maxima es una
fuente inagotable de sorpresas. Para cualquier otra duda, las listas de correo contienen mucha
informacin y, por supuesto, siempre se puede pedir ayuda.
c) Primeros pasos en Maxima de Mario Rodrguez Riotorto es, junto con la siguiente referencia,
la base de estas notas. Se puede encontrar en
http://www.telefonica.net/web2/biomates/
d) Maxima con wxMaxima: software libre en el aula de matemticas de Rafael Rodrguez Galvn es el motivo de que hayamos usado wxMaxima y no cualquier otro entorno sobre Maxima.
Este es un proyecto que se encuentra alojado en el repositorio de software libre de RedIris
https://forja.rediris.es/projects/guia-wxmaxima/
e) Edwin L. Woollett est publicando en su pgina, captulo a captulo unas notas (ms bien un
libro) sobre Maxima y su uso. El ttulo lo dice todo: Maxima by example. Su pgina es
http://www.csulb.edu/ woollett/
f) Esta bibliografa no estara completa sin mencionar que la parte ms importante de esto sigue
siendo la asignatura de Clculo. La bibliografa de sta ya la conoces.

179

180

Glosario

Glosario

.
?
??
%

18
120
57
27
28
9

a
abs 172
acos 14
algsys 78
allroots 85
apply 59
asin 14
atan 14
b
bfallroots 86
bfloat 10
block 161
c
cabs 173
carg 172
ceiling 95
charpoly 68
col 65
color 48
cos 14, 173
cosh 173
cot 14
csc 14
d
define 32, 120
demoivre 173
denom 22
describe 27
determinant 64
diagmatrix 66
diff 107, 119120, 123, 126
do 91

draw 50
draw2d 39
e
eigenvalues 68
eigenvectors 68
ellipse 43
entermatrix 66
erf 134
ev 24
evolution 105
example 29
exp 13, 172
expand 21
explicit 39, 41
exponentialize 173
f
factor 23
fill_color 4748, 145
filled_func 47, 145
find_root 87, 177
first 56
flatten 57
float 8, 10
for 89
forget 17
fpprec 11
fullratsimp 25
functions 32
fundef 33
g
genmatrix 67
grid 45
h
head_angle 44
head_length 44
i
if

181

91

Glosario

implicit 39, 41
ind 112
infinity 113
integrate 133
interpol 156
interpolacin
de Lagrange 154
invert 64
k
key 49
kill 19
l
lagrange 156
last 56
length 58
lhs 71
limit 111
line_width 48
linsolve 77
lista 55
listp 62
local 98
log 13, 172
logexpand 22
m
mtodo
de la secante 109
de regula falsi 109
makelist 43, 50, 58, 140141
map 59, 75
matrix 60
matrixp 61
matriz_size 61
minor 65
mnewton 108
mtodo
del punto medio compuesto 168
del punto medio simple 166
del trapecio compuesto 168
del trapecio simple 165
de Newton-Raphson 106
de Simpson compuesto 168
de Simpson simple 166
multiplicities 73

n
nodo
de interpolacin 154
nticks 43, 49
nullspace 66
num 22
numer 10, 94
p
parametric 51
part 56, 74
partfrac 21
plot2d 35
points 43
point_size 46
point_type 46
polarform 172
polinomio
de Lagrange 155
print 91
q
quadpack 138
quad_qagi 138139
quad_quags 138
r
radcan 25
radexpand 22
random 15, 43, 141142
rank 64
ratsimp 25
realonly 78
realpart 172
realroots 8586
recta
normal 124
tangente 123
rectangle 42
rectform 171
remfunction 33
remvalue 19
rhs 71, 74
romberg 138
row 65

182

Glosario

s
sec 14
second 56
sin 14, 173
sinh 173
solve 75
solve_rec 114115
sort 58
sqrt 8
staircase 105
submatrix 65
subst 101
sum 142
t
tan 14
taylor 158
tenth 56
teorema
de Newton-Raphson 107
title 45
tolerancia 106
to_poly_solve 76
transpose 64
triangularize 65
trigexpand 2526
trigexpandplus 26
trigexpandtimes 26
trigreduce 25
trigsimp 25
trunc 161

u
und 112
union 76
unique 57
unless 91
v
valor
principal
values 19
vector 44

136

w
while 91
with_slider 50, 161
with_slider_draw 50
with_slider_draw3d 148
wxplot2d 37
x
xaxis 46
xlabel 46
xrange 45
y
yaxis 46
ylabel 46
yrange 45
z
zlabel

183

46

184

185

Das könnte Ihnen auch gefallen