Mostrando entradas con la etiqueta Laplace. Mostrar todas las entradas
Mostrando entradas con la etiqueta Laplace. Mostrar todas las entradas

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)