CAv_1617_Practica3

hace 336 días por sevillad1617

Práctica 3 de Cálculo Avanzado

Límite de entrega de esta práctica: ver tarea en Moodle. Hasta una semana de retraso: vale el 50% como máximo.

Instrucciones:

  1. Haz una copia de la hoja pública y renómbrala: si tu correo es usuario@alumnos.unex.es añade al final del título _usuario, por ejemplo CAv_1314_Practica7_sevillad.
    • Para cambiar el nombre pulsa en el título de la hoja (arriba del todo, entre el logo de Sage y el menú "Archivos...")
  2. Comparte la hoja de trabajo con el usuario sevillad1617 mediante el botón Compartir de arriba a la derecha.
  3. Trabaja la práctica: los ejercicios opcionales son solo para subir nota.
  4. Cuando hayas terminado, haz una copia en un fichero PDF y ponlo en el campus virtual. Esa será la versión que se evaluará. La hoja no se considera entregada si no se ha compartido (punto 2).
    • Para generar el PDF lo más sencillo es usar Imprimir arriba e imprimir la nueva página a fichero.
    • Una alternativa es hacer capturas de pantalla (JPG, PNG...) y convertirlas a un único fichero PDF.

 

Uno de los elementos fundamentales para trabajar con datos en Sage es la lista. Algunos ejemplos básicos:

[1,3,5] 
       
[1, 3, 5]
[1, 3, 5]
[3..7] 
       
[3, 4, 5, 6, 7]
[3, 4, 5, 6, 7]
[1,"Hola",e^x] 
       
[1, 'Hola', e^x]
[1, 'Hola', e^x]

Para añadir un elemento más al final de una lista, usa su método .append(elemento). Para extraer un elemento usa [posicion], recordando que Sage empieza a contar desde cero. Hay mucho más, pero no entraremos en detalles; observa estos ejemplos.

l = [3..6] l.append(19) l 
       
[3, 4, 5, 6, 19]
[3, 4, 5, 6, 19]
l[1] # el segundo elemento, no el primero 
       
4
4

Una de las maneras más habituales de construir listas es aplicar una función a todos los elementos de una lista existente. Eso se hace creando una lista básica (ver el segundo ejemplo de arriba) y usando el comando for dentro de ella de la manera siguiente.

l = [1..6] [n^2 for n in l] 
       
[1, 4, 9, 16, 25, 36]
[1, 4, 9, 16, 25, 36]
l = [sin(n*x) for n in [1..3]] [f for f in l] 
       
[sin(x), sin(2*x), sin(3*x)]
[sin(x), sin(2*x), sin(3*x)]

Finalmente, si tenemos una lista podemos sumar todos sus elementos usando sum. Recuerda que la suma de gráficos es un gráfico que los contiene a todos, por lo que sumar una lista de gráficos tiene bastante utilidad.

l = [4..6] sum(l) 
       
15
15
p = [plot(x^n,(x,0,1)) for n in [1..6]] q = sum(p) q.show(figsize=4,aspect_ratio=1) 
       

Ejercicio 1. ¿Cuántos términos de la serie armónica necesitamos para que la suma parcial sea mayor que 5? ¿Y que 10? ¿Y que 15?

 
       
 
       
 
       

Otra manera de trabajar con sucesiones es usar bucles. Debajo tienes un ejemplo que suma diez términos de la serie $\sum 1/n^2$ imprimiendo cada resultado parcial. Puedes ver los detalles en los comentarios (líneas que empiezan por #).

# primero creamos una variable con el valor cero, a la que iremos sumando los términos s = 0 # a continuación usamos "for" para crear un bucle que recorra una lista # fíjate en que las líneas dentro del bucle, tienen espacios a la izquierda for n in [1..10]: s = s + 1/n^2 print n,"sumandos:",s,"=",s.n() # la siguiente línea se ejecuta fuera del bucle, por eso no tiene espacios a la izquierda print "suma final:",s.n() 
       
1 sumandos: 1 = 1.00000000000000
2 sumandos: 5/4 = 1.25000000000000
3 sumandos: 49/36 = 1.36111111111111
4 sumandos: 205/144 = 1.42361111111111
5 sumandos: 5269/3600 = 1.46361111111111
6 sumandos: 5369/3600 = 1.49138888888889
7 sumandos: 266681/176400 = 1.51179705215420
8 sumandos: 1077749/705600 = 1.52742205215420
9 sumandos: 9778141/6350400 = 1.53976773116654
10 sumandos: 1968329/1270080 = 1.54976773116654
suma final: 1.54976773116654
1 sumandos: 1 = 1.00000000000000
2 sumandos: 5/4 = 1.25000000000000
3 sumandos: 49/36 = 1.36111111111111
4 sumandos: 205/144 = 1.42361111111111
5 sumandos: 5269/3600 = 1.46361111111111
6 sumandos: 5369/3600 = 1.49138888888889
7 sumandos: 266681/176400 = 1.51179705215420
8 sumandos: 1077749/705600 = 1.52742205215420
9 sumandos: 9778141/6350400 = 1.53976773116654
10 sumandos: 1968329/1270080 = 1.54976773116654
suma final: 1.54976773116654

Ejercicio 2. Utiliza un bucle como el anterior para hacer lo siguiente: dibujar en un mismo gráfico las primeras cincuenta sumas parciales de la serie geométrica $\displaystyle\sum_{n=0}^\infty \left(\frac{4-i}{5}\right)^n$ (ojo, empieza por $n=0$). Hazlo de la siguiente manera:

  • Antes del bucle crea la variable suma con valor cero, y también la variable imagen cuyo valor sea una gráfica vacía; esto último se hace con Graphics().
  • En cada iteración:
    • Calcula la siguiente suma parcial acumulando en la variable suma.
    • Añade a la variable imagen la gráfica del nuevo punto.
  • Cuando termine el bucle muestra la gráfica contenida en imagen.

¿Puedes adivinar a qué converge la serie a partir del dibujo? También puedes calcular su suma con la fórmula que conocemos.

 
       

Todavía no hemos usado la potencia de cálculo de Sage, solo hemos hecho aproximaciones y representaciones gráficas. Hagamos algunos de los cálculos que hemos aprendido a hacer a mano para determinar la convergencia de una serie.

A veces funciona el preguntar simplemente por la suma de la serie. El símbolo para infinito dos dos letras "o" juntas.

var('n') sum(1/n^2,n,1,oo) 
       
1/6*pi^2
1/6*pi^2
var('n') sum(1/n,n,1,oo) 
       
#0: simplify_sum(expr='sum(1/_SAGE_VAR_n,_SAGE_VAR_n,1,inf))
Traceback (click to the left of this block for traceback)
...
ValueError: Sum is divergent.
#0: simplify_sum(expr='sum(1/_SAGE_VAR_n,_SAGE_VAR_n,1,inf))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "_sage_input_6.py", line 10, in <module>
    exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("dmFyKCduJykKc3VtKDEvbixuLDEsb28p"),globals())+"\\n"); execfile(os.path.abspath("___code___.py"))
  File "", line 1, in <module>
    
  File "/tmp/tmpg_o7sn/___code___.py", line 4, in <module>
    exec compile(u'sum(_sage_const_1 /n,n,_sage_const_1 ,oo)
  File "", line 1, in <module>
    
  File "/usr/local/sage-6.3/local/lib/python2.7/site-packages/sage/misc/functional.py", line 698, in symbolic_sum
    return expression.sum(*args, **kwds)
  File "expression.pyx", line 10123, in sage.symbolic.expression.Expression.sum (build/cythonized/sage/symbolic/expression.cpp:44331)
  File "/usr/local/sage-6.3/local/lib/python2.7/site-packages/sage/calculus/calculus.py", line 619, in symbolic_sum
    return maxima.sr_sum(expression,v,a,b)
  File "/usr/local/sage-6.3/local/lib/python2.7/site-packages/sage/interfaces/maxima_lib.py", line 872, in sr_sum
    raise ValueError("Sum is divergent.")
ValueError: Sum is divergent.

Sage también sabe calcular límites. Veamos que la serie $\sum \frac{n-1}{n}$ es divergente porque sus términos no tienden a cero:

var('n') z = (n-1)/n z.limit(n=oo) 
       
1
1

Veamos que $\sum \frac{1}{n!}$ converge por el criterio del cociente:

var('n') z(n) = 1/factorial(n) (z(n+1)/z(n)).limit(n=oo) 
       
0
0

También podemos hacer comparaciones. Suponamos que queremos comparar la serie $\sum 1/(n+1)$ con la serie armónica. Para un valor concreto es muy fácil:

1/5 < 1/4 
       
True
True

Podemos comparar muchos valores a la vez con una lista, como comentábamos al principio de la práctica. Ojo, con esto no basta para hacer una comparación de verdad, que debería ser para todos los (infinitos) términos.

[1/(n+1) < 1/n for n in [1..20]] 
       
[True, True, True, True, True, True, True, True, True, True, True, True,
True, True, True, True, True, True, True, True]
[True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True]

Para no tener que inspeccionar a ojo una larga lista, podemos usar la función all, que aplicada a una lista nos dice si todos los valores son verdaderos. Como dijimos antes, esto vale para experimentar o para hacerse una idea, pero solo nos vale un razonamiento que valga para todo $n$ para estar seguros/as de la convergencia o divergencia de una serie. Haría falta comprobar infinitos valores, cosa que Sage no puede hacer.

l = [1/(n+1) < 1/n for n in [1..500]] all(l) 
       
True
True

Una manera de ver si una fracción es mayor que otra es el calcular su diferencia y razonar después si es mayor que cero.

( 1/n - 1/(n+1) ).simplify_rational() 
       
1/(n^2 + n)
1/(n^2 + n)

Vemos que tanto el numerador como el denominador son positivos; por eso concluimos que el primer término de la resta es mayor que el segundo, siempre.

 

Ejercicio 3. Decide la convergencia o divergencia de cuatro de los ejercicios de series numéricas del final de los apuntes (parte 1), utilizando solamente Sage.

 
       
 
       
 
       

Ejercicio 4. Dibuja los círculos de convergencia de dos de los ejercicios de series de potencias de los apuntes (parte 2), utilizando solamente Sage.

 
       
 
       
 
       

(Lo que sigue es opcional)

Finalmente, haremos una animación. Encontrarás algunas en http://wiki.sagemath.org/animate.Es tan sencillo como crear una lista de gráfica y aplicar a esa lista el comando animate. Adaptemos un ejemplo de más arriba.

l = [sin(n*x) for n in [1..10]] gr = [plot(f,figsize=4) for f in l] animate(gr).show(delay=40) 
       

El siguiente código crea una lista mediante un bucle, y luego la anima. ¿Qué representa esta animación?

# la variable "imagenes" acabará conteniendo una lista de gráficas que se animará imagenes = [] I = CC.0 var('n') s(n) = 1/(n+1) valores = [] # en cada iteración del bucle siguiente se añade una gráfica a "imagenes" for i in [0..10]: valores.append(s(i).n()) suma = sum(valores) plot_valores_suma = sum([point((v.real(),v.imag()),size=25) for v in valores]) + point((suma.real(),suma.imag()),color='red',size=30) imagenes.append(plot_valores_suma) # la línea siguiente anima la lista "imagenes" animate(imagenes,xmin=-0.5,xmax=3.5,ymin=-1,ymax=1,figsize=6,aspect_ratio=1).show(delay=50) 
       

Ejercicio 5 (opcional). Haz una animación de la serie del ejercicio 2 haciendo los siguientes cambios:

  • Antes del bucle haz que imagen sea una lista vacía con imagen=[].
  • En medio del bucle, añade a la lista imagen otro elemento que seala gráfica de la suma parcial. Puedes usar el método .append de la lista, o bien investigar la suma de listas.
  • El resultado del bucle será una lista de gráficas. Haz con ella una animación como arriba.