MAESTRA EN INGENIERA
ESPECIALIDAD: MECATRNICA
REPORTE DE PRCTICA: 05
CLCULO DE UN DETERMINANTE
INTRODUCCIN Se implementar el clculo de un determinante de una matriz de 4 x 4 insertada desde el teclado. Esto se har utilizando el simulador PCSpim. Para calcular el determinante de una matriz de n x n se hace referencia a las siguientes definiciones: Considrese el caso de la matriz general de n x n
a11 a A = 21 ... a n1
El ij-simo cofactor de A, denotado por Aij, es: Aij = (1) i + j M ij Mij es la matriz de (n 1)x(n 1) que se obtiene de A, al eliminar el i-simo rengln y la j-sima columna de A. Sea A una matriz de n x n. Entonces el determinante de A, escrito det A, o bien |A|, est dado por
det A = A = a11 A11 + a12 A12 + a13 A13 + ... + a1n A1n =
n k =1
a1k A1k
A la expresin del lado derecho de la ecuacin anterior se le conoce como desarrollo por cofactores. (1) Para una matriz de 4 x 4:
a11 a A = 21 a 31 a 41
Su determinante est dado por:
a12 a 22 a32 a 42
a13 a 23 a 33 a 43
a14 a 24 a 34 a 44
DESARROLLO Para el desarrollo del programa y ejecucin de los clculos, se utilizarn distintos registros y localidades de memoria de la arquitectura MIPS. Registros $t0 a $t9 Son registros que son guardados por la rutina llamada, y son utilizados para almacenar cantidades temporales que no necesitan ser preservadas a travs de las llamadas. Si se necesita usar el valor de uno de esos registros despus de una llamada, deber guardarse en otro antes de la misma. Registros $s0 a $s7 Son registros que almacenan valores, los cuales son preservados durante una llamada a rutina. Registros $a0 y $v0 Se utilizan como argumentos de funciones. (2)
Figura 1. PCSpim
El procedimiento para calcular un determinante de 4x4 por el mtodo de cofactores, implica calcular cuatro determinantes de 3x3 y cada uno se resuelve de la misma manera, por lo que se har uso de llamadas a una subrutina, solo cambiando el valor de cada elemento de la matriz de 3x3 en cada llamada. Como el valor de cada elemento de esas matrices no se vuelve a utilizar despus de la llamada, se har uso de los registros $t0-$t9. Para comenzar se guardan en memoria los 16 valores de los elementos de la matriz original ingresada por medio del teclado.
El clculo del primer cofactor se hace asignando los valores guardados en memoria a los registros $t de la siguiente manera: t0 t1 t 2 t 3 A= t 4 t5 t 6 t 7 t8 t 9 a11 A11 = t 0[(t1)(t 5)(t 9) + (t 2)(t 6)(t 7) + (t 4)(t 8)(t 3) (t 7)(t 5)(t 3) (t 8)(t 6)(t1) (t 4)(t 2)(t 9)] No se alterarn los elementos de la matriz original, sino que el valor de cada elemento se asignar a un registro $t, segn la distribucin mostrada en la matriz anterior. Para el segundo cofactor: A= t0 t1 t 2 t 3
t 4 t5 t 6 t 7 t8 t 9 a12 A12 = t 0[(t1)(t 5)(t 9) + (t 2)(t 6)(t 7) + (t 4)(t 8)(t 3) (t 7)(t 5)(t 3) (t 8)(t 6)(t1) (t 4)(t 2)(t 9)] Para el tercer cofactor: t0 t1 t 2 t 3 A= t 4 t5 t 6 t 7 t8 t 9
a13 A13 = t 0[(t1)(t 5)(t 9) + (t 2)(t 6)(t 7) + (t 4)(t 8)(t 3) (t 7)(t 5)(t 3) (t 8)(t 6)(t1) (t 4)(t 2)(t 9)] Para el cuarto cofactor: t0 t1 t 2 t 3 A= t 4 t5 t 6 t 7 t8 t 9 a14 A14 = t 0[(t1)(t 5)(t 9) + (t 2)(t 6)(t 7) + (t 4)(t 8)(t 3) (t 7)(t 5)(t 3) (t 8)(t 6)(t1) (t 4)(t 2)(t 9)]
Lo nico que cambia en cada serie de operaciones, es el dato almacenado en los registros $t y el signo de $t0; mientras que las multiplicaciones, sumas y restas son anlogas en cada caso. Al final, se hallar el determinante de la manera antes mencionada:
A = 3 2 0 1 2 4 0 1 + 0 4 2 1 (1) 4 2 0 1 3 2 0 3 2 0 1 2 0 1 3
A = 3[(5)(0)(2) + (1)(1)(1) + (2)(3)(6) (1)(0)(6) (3)(1)(5) (2)(1)(2)]
2[(1)(0)(2) + (1)(1)(0) + (4)(3)(6) (0)(0)(6) (3)(1)(1) (4)(1)(2)] + 0[(1)(2)(2) + (5)(1)(0) + (4)(1)(6) (0)(2)(6) (1)(1)(1) (4)(5)(2)] (1)[(1)(2)(3) + (5)(0)(0) + (4)(1)(1) (0)(2)(1) (1)(0)(1) (4)(5)(3)]
A = 3(1 + 36 + 15 + 4) 2(72 + 3 8) + 0(4 + 24 + 12 1 40) (1)(6 + 4 + 60) A = 3(56) 2(77) + 1(70) = 168 + 154 + 70 A = 392
En la simulacin, se ingresaron los datos, obteniendo como resultado lo mostrado en la siguiente figura:
1 3 4 A =1 1 2
0 3 4
0 1 4 1 2
9 6 32 9 6 + 52 4 8 3 4 8 3
6 22 8 3
CONCLUSIONES Existen varios mtodos para calcular determinantes. Se eligi el mtodo de cofactores, ya que solo maneja operaciones de adicin, sustraccin y multiplicacin, sin operaciones entre filas o columnas. El procedimiento requiere de calcular cuatro determinantes; se opt por definir una subrutina que hiciera el procedimiento, en vez de escribir el mismo cdigo en repetidas ocasiones. Para dar un seguimiento al funcionamiento del programa, la ventana principal de PCSpim facilit la tarea, ya que muestra el contenido de los registros y memorias, entre otros datos de utilidad. En la figura 4 se observa cmo se modifican los registros despus de la ejecucin del programa, as como la memoria, la cual se utiliz para almacenar la matriz original de 4 x 4.
REFERENCIAS
(1) (2)
Grossman, Stanley I.: lgebra Lineal, Ed. Iberoamrica. Larus, James R.: Assemblers, Linkers and the SPIM simulator, Microsoft Research.
# MUESTRA MENSAJE DE INTRODUCCION DE DATOS loop1: la $a0, strIntro li $v0, 4 # imprimir cadena syscall # MUESTRA INDICE DEL ELEMENTO EN LA MATRIZ li $v0, 1 # imprimir entero move $a0,$s1 syscall li $v0, 1 move $a0,$s0 syscall addi $s0, 1 bne $s0, 5, rst2 rst1: li $s0, 1 addi $s1, 1 rst2: la $a0, strIntro2 li $v0, 4 syscall # LECTURA DE DATOS li $v0, 5 # leer entero syscall
# ALMACENA DATO EN MEMORIA sw $v0, matriz($t8) addi $t8, 4 blt $t8,64, loop1 li $s7,0 #VALOR INICIAL PARA LA SUMA # VALORES PARA EL PRIMER DETERMINANTE li $t8, 0 lw $t0, matriz($t8) li $t8, 20 lw $t1, matriz($t8) li $t8, 24 lw $t2, matriz($t8) li $t8, 28 lw $t3, matriz($t8) li $t8, 36 lw $t4, matriz($t8) li $t8, 40 lw $t5, matriz($t8) li $t8, 44 lw $t6, matriz($t8) li $t8, 52 lw $t7, matriz($t8) li $t8, 56 lw $t8, matriz($t8) li $t9, 60 lw $t9, matriz($t9) jal calculo # VALORES PARA EL SEGUNDO DETERMINANTE li $t8, 4 lw $t0, matriz($t8) li $t8, -1 mul $t0, $t0,$t8 li $t8, 16 lw $t1, matriz($t8) li $t8, 24 lw $t2, matriz($t8) li $t8, 28 lw $t3, matriz($t8) li $t8, 32 lw $t4, matriz($t8) li $t8, 40 lw $t5, matriz($t8) li $t8, 44 lw $t6, matriz($t8) li $t8, 48 lw $t7, matriz($t8) li $t8, 56 lw $t8, matriz($t8) li $t9, 60 lw $t9, matriz($t9) jal calculo
# VALORES PARA EL TERCER DETERMINANTE li $t8, 8 lw $t0, matriz($t8) li $t8, 16 lw $t1, matriz($t8) li $t8, 20 lw $t2, matriz($t8) li $t8, 28 lw $t3, matriz($t8) li $t8, 32 lw $t4, matriz($t8) li $t8, 36 lw $t5, matriz($t8) li $t8, 44 lw $t6, matriz($t8) li $t8, 48 lw $t7, matriz($t8) li $t8, 52 lw $t8, matriz($t8) li $t9, 60 lw $t9, matriz($t9) jal calculo # VALORES PARA EL CUARTO DETERMINANTE li $t8, 12 lw $t0, matriz($t8) li $t8, -1 mul $t0, $t0,$t8 li $t8, 16 lw $t1, matriz($t8) li $t8, 20 lw $t2, matriz($t8) li $t8, 24 lw $t3, matriz($t8) li $t8, 32 lw $t4, matriz($t8) li $t8, 36 lw $t5, matriz($t8) li $t8, 40 lw $t6, matriz($t8) li $t8, 48 lw $t7, matriz($t8) li $t8, 52 lw $t8, matriz($t8) li $t9, 56 lw $t9, matriz($t9) jal calculo # MOSTRAR EL RESULTADO la $a0, strDeter li $v0, 4 syscall li $v0,1 move $a0,$s7 syscall # FINALIZAR EL PROGRAMA li $v0, 10 syscall
# ================================== # SUBPROCEDIMIENTO DE CLCULO # DE CADA DETERMINANTE # ================================== calculo: mul $s0, $t1, $t5 mul $s0, $s0, $t9 mul $s1, $t2, $t6 mul $s1, $s1, $t7 mul $s2, $t4, $t8 mul $s2, $s2, $t3 mul $s3, $t7, $t5 mul $s3, $s3, $t3 mul $s4, $t8, $t6 mul $s4, $s4, $t1 mul $s5, $t4, $t2 mul $s5, $s5, $t9 add $s6, $s0, $s1 add $s6, $s6, $s2 sub $s6, $s6, $s3 sub $s6, $s6, $s4 sub $s6, $s6, $s5 mul $s6,$t0,$s6 add $s7,$s7,$s6 jr $ra;