Code:
program determinante
real, dimension(:,:),allocatable::array1 !array1 bis array4 arrays von der Größe 5 bis 2
real, dimension(:,:),allocatable::array2
real, dimension(:,:),allocatable::array3
real, dimension(:,:),allocatable::array4
integer, dimension(100)::vorzeichen !Vorzeichen für die einzelnen Arrays
real, dimension(100)::faktor !Faktor für die einzelnen Arrays nach Zeilen
real, dimension(100)::zwischenergebnis !Zwischenergebnis der einzelnen Ebenen
real ::det !Zwischenergebnis der zweier Matrix
integer :: spalte, matrix_groesse !Größe der Matrix, spalte der zweier Matrix
integer :: i,j,zaehler !Durchlaufvariablen
character(len=10)::hilf !Wird nur für die sichtbare Lösung aus Start der Exe-Datei benötigt
zaehler=1
! Öffnen der Eingabedatei, Einlesen und Zuweisen der Matrixgröße
!**************************************************************************!
open(10,file='Matrix.txt')
read(10,*) matrix_groesse
allocate(array1(matrix_groesse,matrix_groesse))
! Einlesen der Matrix und Schließen der Eingabedatei
!**************************************************************************!
do i=1,matrix_groesse
read(10,*) (array1(i,j),j=1,matrix_groesse)
end do
close(10)
!Initialisieren der arrays vorzeichen, zwischenergebnis und faktor
do i=1,matrix_groesse
vorzeichen(i)=1
zwischenergebnis(i)=0
faktor(i)=0
end do
!Darstellung der zu berechnenden 5er Matrix
print*,'Matrix ='
do i=1,matrix_groesse
do j=1,matrix_groesse
write(*,'(F12.5)',advance="no") array1(i,j)
end do
print*
end do
print*
spalte=1
matrix_groesse=matrix_groesse-1 !Matrixgröße wird vorbereitet auf nächsttiefere Ebene
!Benötigter Speicher der Arrays wird bereitgestellt
allocate(array2(matrix_groesse,matrix_groesse))
allocate(array3(matrix_groesse-1,matrix_groesse-1))
allocate(array4(matrix_groesse-2,matrix_groesse-2))
!zaehler wird um 1 erhöht (Index für die Arrays vorzeichen, Faktor und zwischensumme
zaehler=zaehler+1
do i=1, matrix_groesse+1
array2=laplace(array1,matrix_groesse+1,i) !4er Matrix wird in Abhängigkeit der zu berechnenden Matrix und der aktuellen Spalte gebildet.
faktor(zaehler)=array1(1,i)*vorzeichen(zaehler) !Der Faktor wird in Abhängigkeit des aktuellen Vorzeichens gebildet.
!Vorbereitung für nächsttiefere Ebene 3er Matrix
matrix_groesse=matrix_groesse-1
zaehler=zaehler+1
vorzeichen(zaehler)=1
do j=1,matrix_groesse+1
array3=laplace(array2,matrix_groesse+1,j) !3er Matrix wird in Abhängigkeit der zu berechnenden Matrix und der aktuellen Spalte gebildet.
faktor(zaehler)=array2(1,j)*vorzeichen(zaehler) !Der Faktor wird in Abhängigkeit des aktuellen Vorzeichens gebildet.
!Vorbereitung für tiefste Ebene 2er Matrix
matrix_groesse=matrix_groesse-1
zaehler=zaehler+1
vorzeichen(zaehler)=1
do spalte=1,matrix_groesse+1
array4=laplace(array3,matrix_groesse+1,spalte) !2er Matrix wird in Abhängigkeit der zu berechnenden Matrix und der aktuellen Spalte gebildet.
det=determinante_matrix_2(array4) !Die Determinante der zweier Matrix wird berechnet
zwischenergebnis(zaehler)=zwischenergebnis(zaehler)+array3(1,spalte)*det*vorzeichen(zaehler) !zwischenergebnis aus Ergebnis der 2er Matrix mit dem aktuellen Faktor der aktuellen 3er Matrix
vorzeichen(zaehler)=vorzeichen(zaehler)*(-1) !Vorzeichen anpassen 1,-1,1,-1,...
end do
!Rückkehr zur nächsthöhere Ebene 3er Matrix
matrix_groesse=matrix_groesse+1
zaehler=zaehler-1
!Berechnung des Zwischenergebnisses und auf 0 Stellung der Zwischensumme der nächsttieferen Ebene
vorzeichen(zaehler)=vorzeichen(zaehler)*(-1)
zwischenergebnis(zaehler+1)=zwischenergebnis(zaehler+1)*faktor(zaehler)
zwischenergebnis(zaehler)=zwischenergebnis(zaehler)+zwischenergebnis(zaehler+1)
zwischenergebnis(zaehler+1)=0
end do
!Rückkehr zur nächsthöhere Ebene 4er Matrix
matrix_groesse=matrix_groesse+1
zaehler=zaehler-1
!Berechnung des Zwischenergebnisses und auf 0 Stellung der Zwischensumme der nächsttieferen Ebene
vorzeichen(zaehler)=vorzeichen(zaehler)*(-1)
zwischenergebnis(zaehler+1)=zwischenergebnis(zaehler+1)*faktor(zaehler)
zwischenergebnis(zaehler)=zwischenergebnis(zaehler)+zwischenergebnis(zaehler+1)
zwischenergebnis(zaehler+1)=0
end do
!Freigeben des Speichers der Arrays
deallocate(array4)
deallocate(array3)
deallocate(array2)
deallocate(array1)
!Ergebnisausgabe
print*
print*,'Determinante = ', zwischenergebnis(zaehler)
!Unterbrechung damit das Programm mit sichtbaren Ergebnis auch bei Start der Exe-Datei angezeigt bleibt. Weiter mit beliebiger Eingabe und Return
read *, hilf
contains
!Liefert die Determinante einer 2er Matrix zurück
function determinante_matrix_2(array)result(d)
real, dimension(2,2) :: array
real ::d
d= (array(1,1)*array(2,2))-(array(1,2)*array(2,1))
end function determinante_matrix_2
!Reduziert eine quadratische Matrix nach dem laplaceschem Verfahren um 1 (5er Matrix zu einer 4er Matrix, 4er zu einer 3er Matrix, usw.
function laplace(array, groesse_matrix, spalte)result(array_)
integer :: groesse_matrix,spalte
real, dimension(groesse_matrix,groesse_matrix), intent(in) :: array
real, dimension(groesse_matrix-1,groesse_matrix-1) :: array_
integer:: k,l
integer:: i,j
k=1
l=1
do i=2,groesse_matrix!beginn mit zeile 2, da zeile 1 immer die ausgewählte Zeile ist (Kann man optimieren, in dem man die Zeile oder Spalte raussucht mit den meisten Nullen)
do j=1,groesse_matrix
if(j/=spalte) then!aktuelle spalte wird nicht berücksichtigt
array_(k,l)=array(i,j)
l=l+1
end if
end do
k=k+1
l=1
end do
end function laplace
end program determinante