12 de mayo de 2016

21. Cálculo del determinante de una matriz n x n. PR08.

Lectura recomendada: Teorema de Laplace.

El ejercicio 08 consiste , primero, que el alumno/a entienda, paso a paso, cómo se obtiene el cálculo del determinante de una matriz. Una vez comprendido los pasos 1 y 2, debería poder explicar el código del paso 3 (4 depurado).

Como ejercicio programa PR08, que consistiría en rehacer el programa usando clases.

Paso 1: matriz 2 x 2


# *-* coding:utf-8 *-*

A = []

for i in range(2):
    A.append([0]*2)

for i in range(2):
    for j in range(2):
        cadena = "Dime el índice %d,%d: " % (i, j)
        A[i][j] = float(raw_input(cadena))

for i in range(2):
    print ("| %s |") % (A[i])

# determinante
det = A[0][0]*A[1][1]-A[0][1]*A[1][0]

print ("Determinante = %f") % (det)
 
= = =  
 

Paso 2 : Matriz 2x2  funciones. 


Este programa contiene una función que es capaz de pedir una matriz de rango "n" pero sólo calcula el determinante de rango dos de los índices 0 y 1.

# *-* coding:utf-8 *-*

# Funciones

def introduce(m):
    A = []
    for i in range(m):
        A.append([0] * m)
    for i in range(m):
        for j in range(m):
            cadena = "Dime el índice %d,%d: " % (i, j)
            A[i][j] = float(raw_input(cadena))
    for i in range(m):
        print ("| %s |") % (A[i])
    return A


def determinante(A):
    return A[0][0] * A[1][1] - A[0][1] * A[1][0]

# Programa principal
rango = int(raw_input("¿Qué rango tiene?"))

B = introduce(rango)
# determinante
det = determinante(B)
print ("Determinante = %f") % (det)

= = = 

Paso 3: matriz n x n


# *-* coding:utf-8 *-*


# Funciones

det = 0


def introduce(m):
    A = []
    for i in range(m):
        A.append([0] * m)
    for i in range(m):
        for j in range(m):
            cadena = "Dime el índice %d,%d: " % (i, j)
            A[i][j] = float(raw_input(cadena))
    imprime(A)
    return A


def imprime(A):
    print ("\n")
    for i in range(len(A)):
        print ("| %s |") % (A[i])
    print("\n")


"""
def determinante2(l):
    n=len(l)
    if (n>2):
        i=1
        t=0
        suma=0.0
        while t<=n-1:
            d={}
            t1=1
            while t1<=n-1:
                m=0
                d[t1]=[]
                while m<=n-1:
                    if (m != t):
                        d[t1].append(l[t1][m])
                    m+=1
                t1+=1
            l1=[d[x] for x in d]
            suma = suma + i * l[0][t] * determinante2(l1)
            i=i*(-1)
            t+=1
        return suma
    else:
        return (l[0][0]*l[1][1]-l[0][1]*l[1][0]) """

def determinante(A):
    B = [k[:] for k in A]
    n = len(A)
    suma = 0.0
    if n > 2:
        # print("\nEntrada Matriz de rango %d") % (n)
        # imprime(B)
        for i in range(n):
            factor = B[0][i]
            signo = -2 * (i % 2) + 1
            B.remove(B[0])
            # imprime(B)
            for j in range(0, n - 1):
                # B[j][i] = -1000  B[j].remove(B[j][i])
                # No se puede poner remove pues QUITA EL PRIMER
                # elemento de la lista, no el que está en la posición
                # correcta. Para ello usar POP
                B[j].pop(i)
            # imprime(B)
            suma = suma + factor * signo * determinante(B)
            # if n > 3:
                # print ("Factor: %.3f ; signo: %d ; suma arrastrada: %.3f") % (factor, signo, suma)
                # imprime(B)
            B = [k[:] for k in A]
        return suma
    else:
        # print ("determinante orden 2: %.3f") % ((B[0][0] * B[1][1]) - (B[0][1] * B[1][0]))
        # imprime(B)
        return (B[0][0] * B[1][1]) - (B[0][1] * B[1][0])

# Programa principal
rango = int(raw_input("¿Qué rango tiene?: "))

C = introduce(rango)
# determinante
det=determinante(C)
print ("Determinante de la matriz = %f") % (det)

= = =

Paso 4: matriz n x n código depurado

# *-* coding:utf-8 *-*

# =========
# Funciones
# =========

# Función que sirve para introducir los valores de la matriz.
def introduce(m):
    # define la matriz A
    A = []
    # por cada valor hasta el rango
    for i in range(m):
        # Añade una fila de m ceros
        # La matriz de rango n x n se compone de n listas, cada una de n elementos
        A.append([0] * m)
    # Recorre los índices, e introduce
    for i in range(m):
        for j in range(m):
            cadena = "Dime el índice %d,%d: " % (i + 1, j + 1)
            A[i][j] = float(raw_input(cadena))
    imprime(A)
    return A

# Función que muestra los valores de la matriz en forma de determinante
def imprime(A):
    print ("\n")
    for i in range(len(A)):
        print ("| %s |") % (A[i])
    print("\n")

# Función recursiva que calcula el determinante de una matriz
def determinante(A):
    # Copia CORRECTA de la matriz A en la de B.
    B = [k[:] for k in A]
    n = len(A)
    suma = 0.0
    if n > 2: # Si el rango es mayor que 2
        for i in range(n):
            factor = B[0][i] # saca el factor de la primera fila i
            signo = -2 * (i % 2) + 1 # calcula su signo
            B.remove(B[0]) # Borra la primera fila
            for j in range(0, n - 1):
                # B[j].remove(B[j][i]). NO SE PUEDE PONER REMOVE porque lo que quita es el elemento de la primera posición
                B[j].pop(i) # Quita, de cada fila de B, el factor i, o sea, quita esa columna.
            suma = suma + factor * signo * determinante(B) # El determinante es la suma anterior más lo que calcule
            B = [k[:] for k in A] # reconstruye la matriz B
        return suma # retorna la suma
    else:
        return (B[0][0] * B[1][1]) - (B[0][1] * B[1][0]) # devuelve el determinante del rango 2

# ==================
# Programa principal
# ==================
rango = int(raw_input("¿Qué rango tiene?: "))

# Introduce los datos del determinante
C = introduce(rango)

# determinante. Cálculo
det=determinante(C)
print ("Determinante de la matriz = %f") % (det)


 
 

2 comentarios:

  1. hola, gracias por el código
    una consulta, se pude fusionar o determinar una sola función para hallar la determinante para una matriz nxn?

    ResponderEliminar
  2. Prueba [https://github.com/numpy/numpy/blob/master/numpy/linalg/linalg.py] en la línea 2105, es de la librería numPy. o busca "def det" con F3

    ResponderEliminar