Beruflich Dokumente
Kultur Dokumente
de
ordenador
con
con wxMaxima
wxMaxima
13 noviembre 2011
Reconocimiento-No
comercial 3.0 Espaa
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
Listas y matrices 55
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
9.3 Polinomio de
ndice
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
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
(%i1)
2+3;
(%o1)
5
Figura 1.1 Ventana inicial de wxMaxima
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
(%i2)
35;
(%o2)
15
(%i3)
5 4;
(%o3)
(%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
(%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);
(%i17)
float( 5);
(%o17)
2.23606797749979
Primeros pasos
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
(%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.
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
(%i20)
(%o20)
%o4+%o5;
146
7
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 )
Si slo queremos conocer una aproximacin decimal de un resultado exacto, tenemos a nuestra
disposicin las rdenes float y bfloat.
10
Primeros pasos
(%i27)
float(sqrt(2));
(%o27)
1.414213562373095
(%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
(%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
(%i34)
625 (1/4);
(%o34)
(%i35)
(%o35)
21/3 54/3
12
Primeros pasos
Funciones usuales
(%i36)
%e 2;
(%o36)
%e2
(%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)
(%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.
(%i45)
(%o45)
sin(%pi/4)
1
(%i46)
(%i47)
atan(1);
4
sec(0);
(%o47)
(%o46)
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
Primeros pasos
(%i52)
random(1.0);
(%o52)
0.9138095996129
(%i53)
is(3<5);
(%o53)
true
is(expresin )
assume(expresin )
forget(expresin )
and
or
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
(%i55)
(%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
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]
(%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
(%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
(%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
(%i5)
p:(x+2)(x-1);
(%o5)
(x-1)(x+2)
(%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 )
(%i8)
expand(p);
(%o8)
x2 +x-2
expand
y cocientes.
(%i9)
expand(p/q);
(%o9)
x2
x
2
+
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
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)
(%i14)
log(ab);
22
Primeros pasos
Expresiones simblicas
(%o14)
log(a b)
(%i15)
sqrt(xy)
xy
(%o15)
(%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 )
La orden factor realiza la operacin inversa a expand. La podemos utilizar tanto en nmeros
(%i19)
factor(100);
(%o19)
22 52
(%i20)
factor(x 2-1);
(%o20)
(x-1)(x+1)
(%i21)
(x-y)(xy-3x 2);
(%o21)
(x-y)(xy-3x2 )
(%i22)
expand(%);
(%o22)
(%i23)
factor(%);
(%o23)
-x(y-3x)(y-x)
23
factor
Expresiones simblicas
Primeros pasos
ev
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
(%i25)
p,x=7;
(%o25)
54
(%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)
(%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 )
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)
(%o30)
1.6.3
(%i31)
(%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)
(%i35)
(%o35)
32 cos(x)5 sin(x)2
(%i36)
(%o36)
+
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
describe(expr )
example(expr )
apropos("expr ")
??expr
(%i43)
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)
(%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)
(%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
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.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)
(%i2)
(%o2)
f(%pi/4);
1
(%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)
(%i7)
g(x,y);
Too few arguments supplied to g(x,y,z):
[x,y]
-- an error. To debug this try debugmode(true);
(%i8)
g(x,y,z);
(%o8)
[2x,3cos(y+x)]
32
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)
(%i11)
remfunction(f);
(%o11)
[f]
(%i12)
remfunction(all);
(%o12)
[g,h]
33
remfunction
fundef
Funciones
Grficos
(%i13)
(%o13)
(%i14)
f(-2);
(%o14)
(%i15)
f(2);
(%o15)
o dibujarla
(%i16)
plot2d(f(x),[x,-3,3]);
(%o16)
30
20
25
15
10
0
-3
-2
-1
R3
3
0
x
f (x) dx:
(%i17)
integrate(f(x),x,-3,3);
(%o17)
R3
3
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$
(%i20)
(%o20)
integrate(f1(x),x,-3,0)+integrate(f2(x),x,0,3);
117
4
34
Grficos
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)
(%i22)
[g(-3),g(2),g(5)];
(%o22)
[9,sin(2),-4]
(%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
(%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)
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)
(%o26)
x/(x -4)
-2
-4
-6
-6
-4
-2
0
x
(%i27)
(%o27)
x/(x2-4)
-2
-4
-6
-6
-4
-2
0
x
37
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
(%i29)
(%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)
38
Grficos
(%o30)
x else x3
y luego la representamos
(%i31)
plot2d(f(x),[x,-9,9],[y,-1,6],
[gnuplot_preamble,"set zeroaxis;"])$
(%o31)
-1
-8
-6
-4
-2
0
x
(%i32)
load(draw)$
gr2d(opciones, objeto grfico,... )
draw(opciones, objeto grfico,... )
draw2d(opciones, objeto grfico,... )
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
draw2d
Grficos
(%i33)
coseno:gr2d(
color=blue,
explicit(cos(x),x,0,4*%pi))$
(%i34)
draw(coseno);
(%o34)
0.5
-0.5
-1
0
10
12
(%i35)
(%o35)
draw2d(
color=blue,
explicit(cos(x),x,0,4*%pi)
);
1
0.5
-0.5
-1
0
10
12
(%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
(%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
(%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)
-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
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
(%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
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
(%o44)
draw2d(
color=blue,nticks=100,
implicit(xy=1,x,-3,3,y,-3,3),
grid=true)$
3
-1
-2
-3
-3
-2
-1
title ="ttulo de la ventana" nos permite poner un ttulo a la ventana donde aparece el resultado
final. Es una opcin global.
45
(%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
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
(%o49)
Grficos
1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
0
10
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
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)
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)
(%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")$
0.5
0.5
-0.5
-0.5
-1
-1
-0.5
0.5
-1
t =
-1
-0.5
0.5
y = 3/2
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]);
seno
coseno
0.5
-0.5
-1
-1
Figura 2.6
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.
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]
(%i2)
[x,x 2,x 3]
(%o2)
[x,x2 ,x3 ]
(%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)
(%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
(%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
(%i20)
sort(v1);
(%o20)
[-1,0,1]
(%i21)
length(v1);
(%o21)
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)
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]
(%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)]
(%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
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
(%i29)
apply("",makelist(i,i,1,100)) (1/100);
(%o29)
(%i30)
float(%);
(%o30)
37.9926893448343
(%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)
Introducir valores
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
(%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
(%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
(%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
(%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
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
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)
(%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
(%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
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
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
(%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
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
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
k
70
Resolucin de 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.
expresin1=expresin2
lhs(expresin1=expresin2)
rhs(expresin1=expresin2)
ecuacin
expresin1
expresin2
(%i1)
(%o1)
x3 +2x2 +2x=4x2
(%i2)
(%o2)
(%i3)
eq-4x 2;
(%o3)
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)
Resolucin de ecuaciones
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)
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)
(%o6)
(%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)
(%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
(%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
(%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)
(%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)
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)
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
(%i26)
solve([x+y=0,x+y=1],[x,y]);
[]
(%i27)
(%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)
(%o28)
[[x=%r3,y=%r2]]
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
(%i30)
(%o30)
to_poly_solve(3*x=sqrt(x 2+1),x);
1
%union [x = (3/2) ]
2
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]
(%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
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)
77
linsolve
Resolucin de ecuaciones
4.2.4
Resolucin de ecuaciones
Algsys
algsys([ecuaciones ],[variables ])
realonly
algsys
(%i35)
eq:x 2-4x+3;
(%o35)
x 2-4x+3
(%i36)
algsys([eq],[x]);
(%o36)
[[x=3],[x=1]]
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
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.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);
81
(%i2)
sqrt(2),numer;
(%o2)
1.414213562373095
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
(%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
(%o9)
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
(%i11)
is(h+1.0=1.0);
(%o11)
true
(%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
(%i15)
is((11.3+10(14))+(-(10)14)=11.3+(10(14)+(-(10)14)));
(%o15)
false
5.1.3
(%i16)
is((113/10+10(14))+(-(10)14)=113/10+(10(14)+(-(10)14)));
(%o16)
true
(%i17)
a:1242123.78$
b:1242123.79$
a 2-b 2;
(a-b)*(a+b);
(%o18)
-24842.4755859375
(%o18)
-24842.47572313636
(%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
(%o23)
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.
allroots(polinomio )
bfallroots(polinomio )
realroots(polinomio )
realroots(polinomio, error )
nroots(polinomio,a,b )
algsys([ecuaciones ],[variables ])
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)
(%i28)
allroots(eq);
85
(%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]
(%i29)
(%o29)
realroots
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)
(%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)
86
(%i34)
multiplicities;
(%o34)
[3,1]
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)
(%i36)
nroots((x-2) 2*eq1,0,2);
(%o36)
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
f(x):=exp(x)+log(x);
87
(%o37)
f(x):=exp(x)+log(x)
(%i38)
f(1)
(%o38)
%e
(%i39)
f(exp(-3));
(%o39)
%e%e +3
(%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.
88
ex
2
1
x
i
h
en el intervalo 0, 2 .
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.
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
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)
(%o43)
done
Se puede conseguir el mismo efecto sumando en lugar de multiplicando. Por ejemplo, los mltiplos
de 5 hasta 25 son
(%i44)
(%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
print(expr1,expr2,... )
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).
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)
(%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.
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)
91
(%o48)
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)
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
El mtodo de biseccin
(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
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)
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
94
El mtodo de biseccin
ceiling(a)
! log ba
ba
err
=
.
err
log(2)
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)
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
(%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 */
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)
97
El mtodo de biseccin
local
(%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,..)
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
El mtodo de biseccin
(%i66)
(%o66)
(%i67)
fact(5);
(%o67)
120
(%i68)
loga(x):=log(x)/log(a)$
(%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)
)$
(%i71)
(%o71)
loga(3,4);
log(3)
log(4)
(%i72)
(%o72)
log(3,-1);
No calculamos logaritmos con base 1
log(3)
log(-1)
99
El mtodo de biseccin
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
(%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)
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
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
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 .
102
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
Ln1
L
| xn xn1 |
| x2 x1 | .
1L
1L
(%i81)
find_root((cos(x)+x 2)/4-x,x,0,1);
(%o81)
.2583921443715997
103
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 .
104
5.5.1
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
(%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
(%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
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
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
(%o89)
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
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)
109
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.4 Ejerci-
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)
(%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
(%i5)
limit(cos(1/x),x,0);
(%o5)
ind
La funcin cos
su grfica.
(%i6)
1
x
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)
(%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
(%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]
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)
(%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.
diff(expr,variable )
diff(expr,variable,n )
derivada de expr
derivada n-sima de expr
(%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)
(%i3)
(%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)
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
(%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.
(%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
(%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.
y = f (a) + f 0 (a)(x a)
f (x)
f (x)
f (a)
Figura 7.2
Recta tangente
122
Derivacin
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)
(%o19)
(%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)
(%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
(%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
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
(%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
Derivacin
(%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)
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)
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)
(%i38)
plot2d(f(x),[x,-4,4])$
(%o38)
600
500
400
300
200
100
0
-100
-200
-300
-4
-3
-2
-1
0
x
(%i39)
define(d1f(x),diff(f(x),x));
(%o39)
(%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
(%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)
(%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
(%i44)
(%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
(%i46)
define(d1f(x),diff(f(x),x))$
(%i47)
d1f(5);
128
Derivacin
(%o47)
(%i48)
define(d2f(x),diff(f(x),x,2))$
(%i49)
d2f(5);
(%o49)
-18
(%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
x2
x
x2
1
= x(A x ) + = A x (8 + 3)x2
8
2
8
8
(%i52)
f(x):=Ax-(1/8)(8+3%pi)x 2$
(%i53)
define(d1f(x),diff(f(x),x))$
129
(%i54)
(%o54)
(%i55)
(%o55)
Derivacin
solve(diff(f(x),x),x);
4A
[x=
]
3+8
%[1];
4A
x=
3+8
(%i56)
a:rhs(%)$
(%i57)
define(d2f(x),diff(f(x),x,2))$
(%i58)
d2f(a);
3+8
(%o58)
(%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]
(%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
131
132
Integracin
Clculo de integrales
Integracin
8
8.1 Clculo de integrales 133
nes 142 8.4 Ejercicios 149
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.
integrate(f(x),x)
integrate(f(x),x,a,b)
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
(%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
(%i4)
(%o4)
(%i5)
(%o5)
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)
(%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
(%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
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);
(%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
(%i17)
quad_qags(xsin(x),x,%pi/2,%pi);
(%o17)
(%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
137
Clculo de integrales
Integracin
(%i19)
(%o19)
(%i20)
(%o20)
integrate(exp(-x 2),x);
erf(x)
2
integrate(exp(-x 2),x,0,1);
erf(1)
2
(%i21)
float(%);
(%o21)
0.74682413281243
quadpack
(%i22)
quad_qags(exp(-x 2),x,0,1);
(%o22)
(%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)
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.
y = f (x)
a
x0 x1 x2
...
a
x0 x1 x2
b
xn1 xn x
Figura 8.2
y = f (x)
139
...
b
xn1 xn x
Sumas de Riemann
Integracin
S ( f, P) =
n
X
i=1
n
X
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)
(%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
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
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
(%i34)
(%i35)
integrate(f(x),x,a,b);
77
12
%,numer
(%o35)
6.416666666666667
(%o34)
(%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
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)
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)
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)
(%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
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)
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)
(%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
146
Integracin
Aplicaciones
Vol() =
f (x)2 dx
a
(%i53)
(%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
(%i54)
hR2
(%o54)
0.8
name: giroy
file: giroy
0.6
state: unknown
0.4
0.2
0
0
0.2
0.4
0.6
0.8
Ejemplo 8.9.
147
Aplicaciones
Integracin
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
-2
3 -3
Toro
aR
(%i55)
(%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)
)
8.3.4
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
(%i57)
(%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.
149
x2 +1
sen(t) dt.
x
Ejercicios
Integracin
R (2x7)2
0
t3 2t dt.
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]?
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.
151
152
Interpolacin polinmica
Interpolacin polinmica
Interpolacin polinmica
9
9.1 Interpolacin polinmica 153
nomio de Taylor 157
9.3 Poli-
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.1
(%i4)
nodos:[1,2];
(%o4)
[1,2]
(%i5)
valor:[3,7];
(%o5)
[3,7]
(%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) =
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
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
(9.1)
donde
Li (x) =
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.
(%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
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 )
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
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
(%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
-4
-8
-10
-12
-14
-16
-4
-2
0
x
(%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
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 numrica
10.3 Mtodos
xa
f (x) f (a)
(a + h) f (a)
= lim
.
h0
xa
h
10.1.1
f (a + h) f (a)
.
h
f 0 (a) =
1
h
( f (a) f (a h)) + f 00 () , ]a h, a[
h
2
h
1
( f (a + h) f (a)) f 00 () , ]a, a + h[
h
2
163
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
1
h2 000
(3 f (a) + 4 f (a + h) f (a + 2h)) +
f () , ]a, a + 2h[
2h
3
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)
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
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.
xa
xb
+ f (b)
,
ab
ba
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))
165
Mtodos simples
10.3.2
a+b
2 ,
a+b
2
(a, f (a))
a
Figura 10.2
10.3.3
a+b
2
2
a
para algn ]a, b[.
166
(b, f (b))
a+b
2 ,
a+b
2
(a, f (a))
a
Figura 10.3
a+b
2
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.
ba
, k = 0, 1, . . . n,
n
(10.1)
167
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[.
(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
168
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
169
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
(%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 )
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(%i);
(%o11)
log(%i)
(%i12)
log(-3);
(%o12)
log(-3)
172
Nmeros complejos
(%i13)
(%i14)
rectform(log(%i));
%i
2
rectform(log(-3));
(%o14)
log(3)+%i
(%o13)
(%i15)
cos(1+%i);
(%o15)
cos(%i+1)
(%i16)
rectform(%);
(%o16)
cos(1)cosh(1)-%i sin(1)sinh(1)
(%i17)
exponentialize(%);
(%o17)
4
4
(%i18)
demoivre(%);
(%o18)
2
2
Observacin A.1. La orden abs calcula el mdulo de la expresin pedida como ya hemos comentado
(%i19)
(%o19)
abs(1+%i);
(%i20)
abs(log(-3));
(%o20)
-log(-3)
173
cabs
Nmeros complejos
(%i21)
(%o21)
cabs(log(-3));
p
log(3)2 + 2
174
(%i1)
(%i2)
2x+1
Incorrect syntax: X is not an infix operator
2x+
(%i3)
factor((2 x+1) 2)
Incorrect syntax: X is not an infix operator
factor((2Spacex+
175
(%i4)
plot2d(sin(x),[x,0,3]])
Incorrect syntax: Missing )
ot2d(sin(x),[x,0,3]]
(%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
176
(%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);
(%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);
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