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