MF_LUdecompose MD_LUdecompose ME_LUdecompose
MCF_LUdecompose MCD_LUdecompose MCE_LUdecompose
FunktionLU-Faktorisierung (engl. LU decomposition)
Syntax C/C++#include <MFstd.h>
int MF_LUdecompose( fMatrix LU, uVector Ind, fMatrix MA, ui len );
int MF_LUdecomposewEdit( fMatrix LU, uVector Ind, fMatrix MA, ui len, float thresh );
C++ MatObj#include <OptiVec.h>
void matrix<T>::LUdecompose( vector<unsigned> Ind, const matrix<T>& MA );
void matrix<T>::LUdecompose( vector<unsigned>* Ind, const matrix<T>& MA );
void matrix<T>::LUdecomposewEdit( vector<unsigned> Ind, const matrix<T>& MA, T thresh );
void matrix<T>::LUdecomposewEdit( vector<unsigned>* Ind, const matrix<T>& MA, T thresh );
Pascal/Delphiuses MFstd;
function MF_LUdecompose( MLU:fMatrix; Ind:uVector; MA:fMatrix; len:UIntSize ):Integer;
function MF_LUdecomposewEdit( MLU:fMatrix; Ind:uVector; MA:fMatrix; len:UIntSize; thresh:Single ):Integer;
BeschreibungMA wird in ein Produkt MA = L * U zerlegt, wobei L eine untere Dreiecksmatrix ist (engl. lower-triangular), deren Diagonal-Elemente alle gleich 1 sind, und U ist eine obere Dreiecks-Matrix (engl. upper-triangular). Da die Gesamtzahl der nicht-trivialen Elemente von L und U gerade in eine Matrix derselben Dimensionen wie MA paßt, wird das Ergebnis in einer einzelnen Matrix LU anstelle von getrennten Matrizen L und U abgelegt. Tatsächlich sind es auch gar nicht die "wahren" Matrizen L und U, die zu MLU kombiniert werden, sondern eine Zeilen-Permutation, deren Indizes in dem Vektor Ind angegeben sind.

MA darf von MLU überschrieben werden, falls gewünscht.

Es gibt Anwendungen, wo es sinnvoll ist, (nahezu) singuläre Matrizen durch "Pivot-Editierung" zerlegbar zu machen, indem man für die bei der Zerlegung verwandte partielle Pivotisierung einen Minimalwert festlegt. Falls bei der Pivotisierung kein Diagonal-Element gefunden werden kann, das betragsmäßig größer als der Minimalwert ist, wird auf diesen anstelle des verschwindenden Diagonalelementes normalisiert. Auf diese Weise werden Divisionen durch Zahlen nahe oder gleich Null vermieden.
Standardmäßig ist Pivot-Editierung ausgeschaltet. Um sie für alle Aufrufe von MF_LUdecompose sowie den auf LU-Zerlegung basierenden Funktionen MF_inv und MF_solve einzuschalten, kann MF_LUDsetEdit aufgerufen werden. Da diese Methode nicht fiber-sicher ist, sollte sie aber nicht angewandt werden, um bei verschiedenen Aufrufen von MF_LUdecompose, MF_inv oder MF_solve verschiedene Minimalwerte einzustellen. Zu diesem Zweck dient vielmehr die Funktion MF_LUdecomposewEdit, die die gewünschte Editier-Schwelle als zusätzliches Argument thresh übernimmt.
Der Rückgabewert von MF_LUdecompose und MF_LUdecomposewEdit zeigt an, ob die Zerlegung erfolgreich war und ob die Anzahl der Permutationen gerade war oder ungerade:
 
RückgabewertBedeutung
0Matrix singulär, Ergebnis komplett unbrauchbar
+1Matrix erfolgreich zerlegt; gerade Anzahl von Permutationen
-1Matrix erfolgreich zerlegt; ungerade Anzahl von Permutationen
+2Matrix nahezu singulär; konnte durch Pivot-Editierung zerlegt werden; Ergebnis nur teilweise brauchbar; gerade Anzahl von Permutationen
+2Matrix nahezu singulär; konnte durch Pivot-Editierung zerlegt werden; Ergebnis nur teilweise brauchbar; ungerade Anzahl von Permutationen

Um zu prüfen, ob MF_LUdecompose erfolgreich war, kann in Single-Thread-Programmen auch MF_LUDresult aufgerufen werden, deren Rückgabewert FALSE (0) sein wird, wenn MA fehlerfrei faktorisiert werden konnte, und TRUE (1) für eine singuläre Eingabe-Matrix A. Da in Multithread-Programmen ggf. nicht klar ist, auf welche Instanz von MF_LUdecompose sich MF_LUDresult bezieht, sollte hier nicht MF_LUDresult aufgerufen, sondern immer nur der Rückgabewert von MF_LUdecompose überprüft werden.

FehlerbehandlungIm Falle einer singulären Matrix bleibt MLU undefiniert, und der Rückgabewert wird auf 0 bzw. +-2 gesetzt. Zusätzlich wird ein internes Register gesetzt, das durch Aufruf von MF_LUDresult ausgelesen werden kann.
RückgabewertCode 0, +-1 oder +-2, der Erfolg sowie gerade oder ungerade Anzahl von Zeilen-Permutationen anzeigt, s.o.
QuerverweisKap. 10

MatrixLib Inhaltsverzeichnis  OptiVec Home