AJO_1617_Practica1

hace 226 días por sevillad1617

Práctica 1 de AJO 2016-17

Límite de entrega de esta práctica: ver tarea en Moodle o calendario de la asignatura. Hasta una semana de retraso: vale hasta el 50%. 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 sevillad1617 mediante el botón Compartir de arriba a la derecha.
  3. Trabaja la práctica.
  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.
  5. Ve al campus virtual, al registro de horas no presenciales, y pon allí las dedicadas a esta práctica (recuerda descontar las presenciales de laboratorio), indicando en "observaciones" la actividad.

 

 

Con Sage podemos resolver ecuaciones de muchos tipos, incluso sistemas. La herramienta principal es la función solve, donde los argumentos son la ecuación y la variable:

s = solve(x^2-1,x) s 
       
[x == -1, x == 1]
[x == -1, x == 1]

La respuesta es una lista, de donde se pueden extraer los elementos usando corchetes (el primer elemento de la lista es s[0], el segundo es s[1], etc.)

s[0]; s[1] 
       
x == -1
x == 1
x == -1
x == 1

Si lo que queremos es usar las soluciones para calcular con ellas, debemos extraerlas de la expresión que nos devuelve solve. Podemos hacerlo por ejemplo con rhs() que significa "right-hand side", la mitad derecha de una igualdad.

s = solve(x^2-4,x) s 
       
[x == -2, x == 2]
[x == -2, x == 2]
a = s[1] a 
       
x == 2
x == 2
a = a.rhs() a 
       
2
2
 
       

La función solve admite muchas más opciones. Luego usaremos alguna más.

 

En general, siempre que obtengas una respuesta con Sage y la necesites después puedes teclearla, o copiarla y pegarla; pero lo mejor es meterla en una variable y usarla después. Así evitamos errores en el proceso de copiado, y además si cambiamos los datos iniciales no tenemos que volver a pegar los resultados intermedios.

 

Ejercicio 1. De una magnitud hacemos tres mediciones, obteniendo 10.5, 10.4 y 10.9. Minimiza la suma de cuadrados con Sage; escribe el código de manera que nos valga para cualquier conjunto de tres datos, es decir, que en medio no haya datos copiados y pegados a mano. Si lo haces bien serás capaz de ponerlo todo en una celda y que solo haya que cambiar los datos iniciales.

Luego comprueba que la media de los datos es igual a la estimación por mínimos cuadrados.

 
       
 
       
 
       

Además de gráficas de funciones, también podemos dibujar puntos individuales en el plano.

point([(10,2),(12,0),(15,1)], figsize=3) 
       

De hecho también podemos aplicar estilos de dibujo a los puntos (tamaño y color sobre todo), sumarles otras gráficas, etc. Intenta entender el código siguiente.

p1 = plot(x^3-x,(x,-2,2)) p2 = point([(-1,1),(0,0)],size=50,marker="^",color="orange",markeredgecolor="black") p3 = point((1,2),size=200,color='red') p = p1 + p2 + p3 p.show(figsize=3) 
       
 
       

Ejercicio 2. Con los datos siguientes: 44.03, 43.99, 44.02, 44.00, 44.02, dibuja en un solo gráfico la función suma de cuadrados y los siguientes puntos en el eje horizontal: las mediciones (azules) y la estimación (rojo).

 
       
 
       
 
       

Para minimizar una función de varias variables empezamos por calcular los puntos críticos; en Sage es relativamente fácil. Las derivadas parciales también se calculan con .diff(), indicando la variable. Recuerda definir como variables las letras que vayas a usar.

var('x,y') f = x^3+y*x-12*y f.diff(y) 
       
x - 12
x - 12

Para resolver un sistema de ecuaciones también usamos solve. Se ponen las ecuaciones en una lista y las variables después. Si las ecuaciones se escriben sin igualdades, se entiende que se igualan a cero las expresiones dadas.

solve([x^2-4,y^2-y],(x,y)) 
       
[[x == -2, y == 0], [x == 2, y == 0], [x == -2, y == 1], [x == 2, y ==
1]]
[[x == -2, y == 0], [x == 2, y == 0], [x == -2, y == 1], [x == 2, y == 1]]
 
       

Ejercicio 3. Usaremos el método de mínimos cuadrados para encontrar la recta que mejor se ajusta a este conjunto de datos: en los años 2012 a 2014 se ha medido una cierta magnitud obteniendo los valores 11.81, 11.64 y 11.70.

  • Escribe la función $f$ que calcula la suma de cuadrados de los errores en función de los dos coeficientes de la recta. Ten en cuenta que las coordenadas $x$ de los puntos son los años, luego no tienen error; el ajuste se hace solo con las coordenadas $y$.
  • Calcula los puntos críticos de esa función.
 
       
 
       
 
       
 
       

En el siguiente ejercicio localizaremos visualmente el mínimo que buscábamos en el ejercicio anterior. Para dibujar gráficas de funciones en dos variables usemos plot3d. A continuación un ejemplo.

var('x,y') plot3d(x^2-y^2,(x,-2,2),(y,-2,2),figsize=3) + point([0,0,0],color="red",size=10) 
       

Si pulsas en la gráfica anterior se vuelve interactiva: podrás girarla con el ratón y hacer otras cosas.

 
       

Ejercicio 4. Con los cálculos del ejercicio anterior:

  • Evalúa $f$ en los puntos críticos para ver dónde vale menos.
  • Dibuja la gráfica de $f$ para comprobar visualmente el mínimo.
  • Dibuja la recta de ajuste con los datos iniciales.
 
       
 
       
 
       

Para el ajuste de rectas (u otras curvas) a conjuntos de datos, Sage tiene una función específica llamada find_fit. Hay que pasarle dos cosas: la lista de datos, y el modelo de función. A continuación un ejemplo en el que ajustamos unos puntos con una onda (una función seno); la forma concreta de la función depende de unos parámetros, que son los que se calculan.

datos = [(0,0),(1,0),(2,-1),(3,-1),(4,1)] point(datos,size=30,figsize=3) 
       
var('a,b,c') p(x) = a*sin(b*x-c) s = find_fit(datos,p,solution_dict=True) s 
       
{c: 2.7040954498115752, b: 1.749841497085374, a: -0.8737398734498667}
{c: 2.7040954498115752, b: 1.749841497085374, a: -0.8737398734498667}

Hemos obtenido los datos en un formato llamado "diccionario", gracias al último parámetro que hemos añadido a solve. Lo único que necesitaremos saber sobre diccionarios es que podemos acceder a los valores simplemente con corchetes.

s[b] 
       
1.749841497085374
1.749841497085374

Comprobemos el ajuste de manera visual.

point(datos,size=30,figsize=3) + plot(s[a]*sin(s[b]*x-s[c]),(x,-0.5,4.5)) 
       
 
       

Ejercicio 5. Con los datos del ejercicio 3 utiliza la función find_fit para calcular la mejor aproximación rectilínea. Compara el resultado con el de ejercicios anteriores.

 
       
 
       
 
       

Ejercicio 6 (opcional). Encuentra la recta que mejor se ajusta a los puntos (0,0), (1,1) y (2,1). Al contrario que en el caso anterior, ambas coordenadas tienen errores.