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)
hola, gracias por el código
ResponderEliminaruna consulta, se pude fusionar o determinar una sola función para hallar la determinante para una matriz nxn?
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