CAv_1819_Practica3

228 days ago by sevillad1819

Práctica 3 de Cálculo Avanzado

Límite de entrega de esta práctica: ver tarea en Moodle o calendario de la asignatura. Hasta una semana de retraso: cuenta hasta el 50% de la nota. Más de una semana de retraso: no cuenta para la nota.

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ú "File...")
  2. Comparte la hoja de trabajo con el usuario sevillad1819 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 añade al final [posición], 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]] 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 15 (4 puntos). Queremos saber cuántos términos de la serie armónica necesitamos sumar que la suma parcial sea mayor que 15.

  1. Hemos demostrado que la serie armónica diverge comparando los términos con potencias de dos; ¿cuántos términos de esa serie necesitaríamos para llegar a 15? ¿Qué se puede deducir sobre el número de términos necesarios con la serie armónica?
  2. Calcula exactamente cuántos términos de la serie armónica hay que sumar para llegar a 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 16 (8 puntos). Haremos un gráfico de las primeras cincuenta sumas parciales de una serie geométrica.

Para determinar la serie geométrica:

  • Elige un número complejo que no sea real.
  • Calcula el $z$ adecuado para que la suma de la serie sea tu número elegido.
  • Si ese $z$ no tiene módulo menor que 1, repite desde el principio.

Cuando tengas la serie, puedes hacerlo 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.

Confirma que la suma se parece gráficamente al valor que elegiste.

 
       
 
       
 
       
 
       

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 17 (4 puntos). Demuestra la convergencia o divergencia de dos de los ejercicios de series numéricas del final de los apuntes (parte 1) utilizando solamente Sage.

 
       
 
       
 
       

Ejercicio 18 (4 puntos). 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áficos y aplicar a esa lista el comando animate. Adaptemos un ejemplo de más arriba.

l = [sin(n*x) for n in [1..10]] # lista de funciones a dibujar gr = [plot(f,figsize=4) for f in l] # lista de gráficos de cada función 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) s(n) = (0.8*I)^n s(n) = (0.7+0.5*I)^n valores = [] # en cada iteración del bucle siguiente se añade una gráfica a "imagenes" for i in [0..40]: 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=-2,xmax=2,ymin=-1,ymax=3,figsize=6,aspect_ratio=1).show(delay=30) 
       

Ejercicio 19 (8 puntos, opcional). Haz una animación de la serie del segundo ejercicio de esta práctica, haciendo los siguientes cambios al código que escribiste antes:

  • Ahora la serie a sumar es $a_n=i^n/n!$ para $n\geq0$.
  • 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 sea la 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.