Algo.Verbesserung zur LU-Zerl. < Lin. Gleich.-systeme < Numerik < Hochschule < Mathe < Vorhilfe
|
Status: |
(Frage) überfällig | Datum: | 20:30 So 21.11.2010 | Autor: | MaHe |
Hallo,
ich habe letzte Woche ein Fortran-Programm zur LU-Zerlegung geschrieben. Das Programm funktioniert, aber ich würde das Programm gerne verbessern. Meine Frage ist also, welche wichtigen Bestandteile sollte so ein Programm noch haben? Wird normalerweise noch eine Zeilenskalierung angewendet? Wenn nein, wieso? Totalpivotisierung? Wie steht es mit einer Überprüfung, ob die Matrix regulär ist? Und mit welchem Verfahren macht man das am besten? Kann man am Programmcode noch etwas verbessern? Was ist bei Programmpacketen, wie LAPACK, noch enthalten?
Ich hoffe, ihr könnt mir Tipps geben. Ich gebe hier mal die Subroutine an. Keine Gewähr für die englischen Kommentare!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! Subroutine does LU-Factorisation for square Matrices. The result of this !!
!! subroutine is written over the incoming Matrix. This subroutine uses !!
!! pivotisation. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
SUBROUTINE LU_decomposition( A_Matrix, P_vector, [mm] Dim_n [/mm] )
!Input vriables
REAL, INTENT(INOUT), DIMENSION(:,:) :: A_Matrix !Matrix to factorise
INTEGER, INTENT(OUT), [mm] DIMENSION(Dim_n) [/mm] :: P_vector !Permutation matrix
INTEGER, INTENT(IN) :: [mm] Dim_n [/mm] !Dimension of A_Matrix
!Counting variables
INTEGER :: ii, jj, kk, gg
INTEGER :: ll, mm, nn
!Row factor
REAL :: l
!Temporary storage variable
REAL :: Temp
!Initialisation
l = 0
!Initialising Permutation Vector
DO [mm] ii=1,Dim_n
[/mm]
P_vector(ii) = ii
END DO
!Loop over columns
DO [mm] jj=1,Dim_n
[/mm]
!Start value
gg=jj
!Find Pivot element in the actual column
DO [mm] kk=jj+1,Dim_n [/mm]
!Gets maximum column value
IF ( ABS(A_Matrix( kk, jj )) > ABS(A_Matrix( gg, jj )) ) THEN
gg = kk
END IF
END DO
IF ( gg /= jj ) THEN
Temp = P_vector(jj)
P_vector(jj) = P_vector(gg)
P_vector(gg) = Temp
!Swap rows
DO [mm] ll=1,Dim_n
[/mm]
Temp = A_Matrix( jj, ll )
A_Matrix( jj, ll ) = A_Matrix( gg, ll )
A_Matrix( gg, ll ) = Temp
END DO
END IF
!Calculate Matrix entries
DO mm= jj + 1, [mm] Dim_n
[/mm]
l = A_Matrix( mm, jj ) / A_Matrix( jj, jj )
A_Matrix( mm, jj ) = l
DO nn= jj + 1 , [mm] Dim_n [/mm]
A_Matrix( mm, nn ) = A_Matrix( mm, nn ) - l * A_Matrix( jj, nn )
END DO
END DO
END DO
END SUBROUTINE LU_decomposition
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 21:20 Sa 27.11.2010 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|