Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
548 views
1
subroutine lupiv(a, ip, det)
2
3
!Obtención de la factorización LU aplicando el método del pivote parcial
4
!Entrada: a (matriz de coeficientes)
5
!Salida: a (triangular inferior: L (sin los 1 de la diagonal) y triangular superior: U)
6
! ip (puntero de las permutaciones)
7
! det (determinante de la matriz)
8
9
implicit none
10
real(8), intent (inout) :: a(:,:)
11
integer, intent (out) :: ip(:)
12
real(8), intent (out) :: det
13
real(8) :: piv
14
integer :: i, j, k, n, ipiv, ipi, ipk, index
15
16
n = size(ip)
17
18
!Inicialización del determinante
19
det = 1d0
20
!Inicialización de la permutación de filas
21
ip = (/(i, i=1, n)/)
22
!Inicialización del contador de cambios
23
index = 0
24
!Etapa k-ésima de la eliminación
25
do k = 1, n-1
26
!Búsqueda del pivote y de la fila en la que se encuentra
27
piv = a(ip(k), k)
28
ipiv = k
29
do i = k+1, n
30
if(dabs(piv) < dabs(a(ip(i), k)))then
31
piv = a(ip(i), k)
32
ipiv = i
33
end if
34
end do
35
!Comprobación de que el k-ésimo pivote no es nulo
36
if(abs(piv) < 1d-12) then
37
print*, "Pivote nulo en la etapa: ", k
38
print*, "¡La matriz del sistema es Singular!"
39
stop
40
end if
41
!Puesta al día de la permutación, si el pivote no está en la fila k
42
if(ipiv /= k) then
43
ipk = ip(ipiv)
44
ip(ipiv) = ip(k)
45
ip(k) = ipk
46
index = index + 1
47
else
48
ipk = ip(k)
49
end if
50
!Actualización del determinante
51
det = det*piv
52
!Eliminación
53
do i = k+1, n
54
ipi = ip(i)
55
a(ipi, k) = a(ipi, k)/piv
56
do j = k+1,n
57
a(ipi, j) = a(ipi, j)-a(ipi, k)*a(ipk, j)
58
end do
59
end do
60
end do
61
!Comprobación de que el último pivote no es nulo
62
piv = a(ip(n), n)
63
if(dabs(piv) < 1d-12) then
64
print*, "Pivote nulo en la etapa: ", n
65
print*, "¡La matriz del sistema es Singular!"
66
stop
67
end if
68
!Finalización del cálculo del determinante
69
det = det*piv*(-1)**index
70
print*, "Determinante: ", det
71
72
return
73
end subroutine lupiv
74