1. Determinante de matriz
Referencia: Rodríguez 4.3.9 p129, Burden 6.4 p296, Chapra 9.1.2 p250.
El determinante de una matriz cuadrada triangular superior también puede calcularse como el producto de los coeficientes de la diagonal principal, considerando el número de cambios de fila del pivoteo k.
det(A) = (-1)^k \prod_{i=1}^n a_{i,i}Si observamos que en las secciones anteriores se tiene desarrollado los algoritmos para obtener la matriz triangular superior en el método de Gauss, se usan como punto de partida para obtener los resultados del cálculo del determinante.
2. Ejercicio
Referencia: 1Eva_IIT2010_T2 Sistema ecuaciones, X0 = unos, Chapra Ejemplo 9.12 p277
Calcular el determinante de la matriz A del sistema A.X=B dado por
A= \begin{pmatrix} 0.4 & 1.1 & 3.1 \\ 4 & 0.15 & 0.25 \\2 & 5.6 & 3.1 \end{pmatrix} B= [7.5, 4.45, 0.1]El algoritmo para ejercicio se convierte en una extensión de los algoritmos anteriores.
A = [[0.4, 1.1 , 3.1],
[4.0, 0.15, 0.25],
[2.0, 5.6 , 3.1]]
B = [7.5, 4.45, 0.1]
3. Algoritmo en Python
El algoritmo parte de lo realizado en método de Gauss, indicando que la matriz a procesar es solamente A. Se mantienen los procedimientos de pivoteo parcial por filas y eliminación hacia adelante.
Para contar el número de cambios de filas, se añade un contador de pivoteado dentro del condicional para intercambio de filas.
Para el resultado del operador multiplicación, se usan todas las casillas de la diagonal al acumular las multiplicaciones.
# Determinante de una matriz A
# convirtiendo a diagonal superior
import numpy as np
# INGRESO
A = [[0.4, 1.1 , 3.1],
[4.0, 0.15, 0.25],
[2.0, 5.6 , 3.1]]
B = [7.5, 4.45, 0.1]
# PROCEDIMIENTO
# Matrices como arreglo, numeros reales
A = np.array(A,dtype=float)
B = np.array(B,dtype=float)
# Matriz aumentada AB
B_columna = np.transpose([B])
AB = np.concatenate((A,B_columna),axis=1)
AB0 = np.copy(AB) # copia de AB
# Pivoteo parcial por filas
tamano = np.shape(AB)
n = tamano[0]
m = tamano[1]
# Para cada fila en AB
pivoteado = 0 # contador para cambio fila
for i in range(0,n-1,1):
# columna desde diagonal i en adelante
columna = abs(AB[i:,i])
dondemax = np.argmax(columna)
if (dondemax !=0): # NO en diagonal
# intercambia filas
temporal = np.copy(AB[i,:])
AB[i,:] = AB[dondemax+i,:]
AB[dondemax+i,:] = temporal
pivoteado = pivoteado + 1 # cuenta cambio fila
# Actualiza A y B pivoteado
AB1 = np.copy(AB)
# eliminación hacia adelante
for i in range(0,n-1,1):
pivote = AB[i,i]
adelante = i + 1
for k in range(adelante,n,1):
factor = AB[k,i]/pivote
AB[k,:] = AB[k,:] - AB[i,:]*factor
# calcula determinante
multiplica = 1
for i in range(0,n,1):
multiplica = multiplica*AB[i,i]
determinante = ((-1)**pivoteado)*multiplica
# SALIDA
print('Pivoteo parcial por filas')
print(AB1)
print('Cambios de fila, pivoteado: ',pivoteado)
print('eliminación hacia adelante')
print(AB)
print('determinante: ')
print(determinante)
Se aplica la operación de la fórmula planteada para el método, y se presenta el resultado:
Pivoteo parcial por filas
[[4. 0.15 0.25 4.45]
[2. 5.6 3.1 0.1 ]
[0.4 1.1 3.1 7.5 ]]
Cambios de fila, pivoteado: 2
eliminación hacia adelante
[[ 4. 0.15 0.25 4.45 ]
[ 0. 5.525 2.975 -2.125 ]
[ 0. 0. 2.49076923 7.47230769]]
determinante:
55.04599999999999
4. Algoritmo como función en Numpy
El resultado se puede verificar usando la función de Numpy:
>>> np.linalg.det(A)
55.04599999999999