AJO_1415_Practica5

995 days ago by sevillad1415

Práctica 5 de Ajuste de Observaciones


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 EST_1415_Practica2_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 sevillad1415 mediante el botón Share de arriba a la derecha.
  3. Trabaja la práctica: los ejercicios marcados "opcional" son solo para subir nota.
  4. Cuando hayas terminado, haz una copia en un único 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 el botón Print de arriba e imprimir la nueva página a fichero.
    • Una alternativa es hacer capturas de pantalla (JPG, PNG...) de la hoja a imprimir, y convertirlas a PDF uniendo después los distintos ficheros generados.
  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.


En el tutorial vimos que Sage también hace cálculos de álgebra lineal. Entremos en detalles.

Para crear un vector fila usamos vector(). Para crear un vector columna convertimos un vector fila ya creado.

v = vector([1,2,3]) w = v.column() v; w 
       
(1, 2, 3)
[1]
[2]
[3]
(1, 2, 3)
[1]
[2]
[3]

Podemos construir una matriz de muchas maneras. Dos de ellas son a partir de sus filas, y directamente escribiendo toda la matriz como una lista con sublistas.

v1=vector([1,2,3]) v2=vector((4,5,6)) matrix([v1,v2]) 
       
[1 2 3]
[4 5 6]
[1 2 3]
[4 5 6]
var('x,y,z') matrix([[1,x,3,4],[y+z,6,7,8]]) 
       
[    1     x     3     4]
[y + z     6     7     8]
[    1     x     3     4]
[y + z     6     7     8]

Algunos tipos especiales de matrices se pueden crear más rápidamente, por ejemplo las matrices diagonales (dando solo los elementos de la diagonal) y más en particular la matriz identidad (diciendo simplemente la dimensión).

diagonal_matrix([1,2,3]) 
       
[1 0 0]
[0 2 0]
[0 0 3]
[1 0 0]
[0 2 0]
[0 0 3]
identity_matrix(5) 
       
[1 0 0 0 0]
[0 1 0 0 0]
[0 0 1 0 0]
[0 0 0 1 0]
[0 0 0 0 1]
[1 0 0 0 0]
[0 1 0 0 0]
[0 0 1 0 0]
[0 0 0 1 0]
[0 0 0 0 1]

Por supuesto es posible hacer las operaciones habituales con vectores y matrices. En el siguiente código, la última operación da un error (¿por qué?).

m1 = matrix([[1,2,3],[4,5,6]]) v1 = vector([1,2,3,4,5]) m2 = matrix([[2,3,4],[3,2,1]]) v2 = vector([7,6,5,4,3]) m1; v1; m2; v2 
       
[1 2 3]
[4 5 6]
(1, 2, 3, 4, 5)
[2 3 4]
[3 2 1]
(7, 6, 5, 4, 3)
[1 2 3]
[4 5 6]
(1, 2, 3, 4, 5)
[2 3 4]
[3 2 1]
(7, 6, 5, 4, 3)
m1+m2; 3*v1+2*v2; m1*transpose(m2); m1*m2; 
       
[3 5 7]
[7 7 7]
(17, 18, 19, 20, 21)
[20 10]
[47 28]
Traceback (click to the left of this block for traceback)
...
IndexError: Number of columns of self must equal number of rows of
right.
[3 5 7]
[7 7 7]
(17, 18, 19, 20, 21)
[20 10]
[47 28]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "_sage_input_10.py", line 10, in <module>
    exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("bTErbTI7IDMqdjErMip2MjsgbTEqdHJhbnNwb3NlKG0yKTsgbTEqbTI7"),globals())+"\\n"); execfile(os.path.abspath("___code___.py"))
  File "", line 1, in <module>
    
  File "/tmp/tmpQVTSUW/___code___.py", line 3, in <module>
    exec compile(u'm1+m2; _sage_const_3 *v1+_sage_const_2 *v2; m1*transpose(m2); m1*m2;
  File "", line 1, in <module>
    
  File "element.pyx", line 2726, in sage.structure.element.Matrix.__mul__ (build/cythonized/sage/structure/element.c:20031)
  File "matrix_integer_dense.pyx", line 790, in sage.matrix.matrix_integer_dense.Matrix_integer_dense._matrix_times_matrix_ (build/cythonized/sage/matrix/matrix_integer_dense.c:10529)
  File "matrix_integer_dense.pyx", line 734, in sage.matrix.matrix_integer_dense.Matrix_integer_dense._multiply_classical (build/cythonized/sage/matrix/matrix_integer_dense.c:10049)
IndexError: Number of columns of self must equal number of rows of right.

La inversa se puede calcular con una función o como una potencia. Fíjate en que separamos las dos matrices con un comando print para crear una línea en blanco.

A = Matrix([[1,2,3],[3,2,1],[1,1,4]]) A.inverse(); print; A^(-1) 
       
[-7/12  5/12   1/3]
[11/12 -1/12  -2/3]
[-1/12 -1/12   1/3]

[-7/12  5/12   1/3]
[11/12 -1/12  -2/3]
[-1/12 -1/12   1/3]
[-7/12  5/12   1/3]
[11/12 -1/12  -2/3]
[-1/12 -1/12   1/3]

[-7/12  5/12   1/3]
[11/12 -1/12  -2/3]
[-1/12 -1/12   1/3]
 
       

Si tienes una matriz numérica puedes aplicarle el método .n(digits=X) donde X es el número de cifras significativas que quieres.

M = diagonal_matrix([sqrt(2.5),1]) M; print; M.n(digits=4) 
       
[ 1.58113883008419 0.000000000000000]
[0.000000000000000  1.00000000000000]

[ 1.581 0.0000]
[0.0000  1.000]
[ 1.58113883008419 0.000000000000000]
[0.000000000000000  1.00000000000000]

[ 1.581 0.0000]
[0.0000  1.000]

Puedes ver una lista completa y concisa de funciones y comandos de álgebra lineal en http://wiki.sagemath.org/quickref?action=AttachFile&do=get&target=quickref-linalg.pdf


Si necesitas calcular derivadas de funciones en varias variables, la sintaxis es la misma que para una variable: diff(fun, var) o bien fun.diff(var). Recuerda que si defines la función en Sage indicando las variables (primero tienes que decirle a Sage cuáles son), luego podrás evaluar directamente las funciones.

var('x,y,z') f(x,y,z) = x^3+y*sin(z) fz = f.diff(z) f; fz; fz(3,2,1) 
       
(x, y, z) |--> x^3 + y*sin(z)
(x, y, z) |--> y*cos(z)
2*cos(1)
(x, y, z) |--> x^3 + y*sin(z)
(x, y, z) |--> y*cos(z)
2*cos(1)

Si tenemos varias funciones en varias variables podemos calcular también la matriz jacobiana. Esta vez definimos $f$ como una función de dos componentes; podríamos haber definido funciones separadas $f,g,\ldots$

En el ejemplo siguiente no le ponemos variables a $f$ cuando la definimos. Ponle tú las variables a $f$ en la segunda línea para que veas la diferencia.

var('x,y,z') f = (x^3+y*sin(z), x*y*z) jacobian(f,(x,y,z)) 
       
[   3*x^2   sin(z) y*cos(z)]
[     y*z      x*z      x*y]
[   3*x^2   sin(z) y*cos(z)]
[     y*z      x*z      x*y]

En los problemas que resolveremos aparecerán funciones trigonométricas, recuerda que en Sage funcionan en radianes. Debajo tienes un recordatorio de la conversión de unidades de ángulo.

sin(90).n(); sin(pi/2) 
       
0.893996663600558
1
0.893996663600558
1
grad2rad = 1/180*pi 90 * grad2rad 
       
1/2*pi
1/2*pi

Ejercicio 1. Las variables $x_1$ e $x_2$ se miden de manera independiente con precisiones $\sigma_1=0.1$ y $\sigma_2=0.5$ respectivamente. Calcula las precisiones de $y_1=x_1+x_2$ e $y_2=x_1-x_2$, y las correlaciones entre las cuatro variables.

 
       

Ejercicio 2. En el ejercicio anterior, explica por qué hay una correlación negativa fuerte entre $y_1$ e $y_2$.

 
       

Ejercicio 3. Se conocen sin error los ángulos $A=74.3834^g$ y $B=37.2157^g$ y se mide el lado $a=50.45$ m con $\sigma_a=0.06$ m. Calcula los valores y precisiones del resto de lados y ángulos y el área del triángulo. (Pista: para ángulos y lados de triángulos, suelen ser útiles los teoremas del coseno y del seno. Para el área hay multitud de fórmulas.)

 
       

Ejercicio 4. Repite el ejercicio anterior suponiendo ahora que $A$ y $B$ son conocidos con precisión $\sigma_A=\sigma_B=0.01^g$.

 
       

Ejercicio 5. Se han medido las siguientes longitudes con las desviaciones típicas indicadas. Calcula el área de la figura (unión de un semicírculo, un rectángulo, y un triángulo rectángulo).

  • $AB = 50$ con $\sigma_{AB}=0.2$
  • $CD = 75$ con $\sigma_{CD}=0.2$
  • $AC = 25$ con $\sigma_{AC}=0.1$
 
       

Ejercicio 6 (opcional). En el ejercicio 1, supongamos que tenemos la posibilidad de repetir la medición de $x_2$ tantas veces como queramos. Estudia la precisión de $x_1+x_2$ en función del número de mediciones de $x_2$.