MF_solve MD_solve ME_solve
MCF_solve MCD_solve MCE_solve
MCF_solve MCD_solve MCE_solve
MF_solvewEdit MD_solvewEdit ME_solvewEdit
MCF_solvewEdit MCD_solvewEdit MCE_solvewEdit
   
MFb_solve MDb_solve MEb_solve
MCFb_solve MCDb_solve MCEb_solve
MFb_solvewEdit MDb_solvewEdit MEb_solvewEdit
MCFb_solvewEdit MCDb_solvewEdit MCEb_solvewEdit
   
MFb_solve_sizeBuf MDb_solve_sizeBuf MEb_solve_sizeBuf
MCFb_solve_sizeBuf MCDb_solve_sizeBuf MCEb_solve_sizeBuf
   
MFsym_solve MDsym_solve MEsym_solve
Funktionlineares Gleichungssystem lösen
Syntax C/C++#include <MFstd.h>
int MF_solve( fVector X, fMatrix MA, fVector B, ui len );
int MF_solvewEdit( fVector X, fMatrix MA, fVector B, ui len, float thresh );
int MCF_solvewEdit( cfVector X, cfMatrix MA, cfVector B, ui len, float thresh );
int MFsym_solve( fVector X, fMatrix MA, fVector B, ui len );
C++ MatObj#include <OptiVec.h>
void vector<T>::solve( const matrix<T>& MA, const vector<T>& B );
void vector<T>::solvewEdit( const matrix<T>& MA, const vector<T>& B, T thresh );
void vector<T>::sym_solve( const matrix<T>& MA, const vector<T>& B );
Pascal/Delphiuses MFstd;
function MF_solve( X:fVector; MA:fMatrix; B:fVector; len:UIntSize ): Integer;
function MF_solvewEdit( X:fVector; MA:fMatrix; B:fVector; len:UIntSize; thresh:Single ): Integer;
function MCF_solvewEdit( X:cfVector; MA:cfMatrix; B:cfVector; len:UIntSize; thresh:Single ): Integer;
function MFsym_solve( X:fVector; MA:fMatrix; B:fVector; len:UIntSize ): Integer;
BeschreibungDiesen Funktionen lösen das lineare Gleichungs-System MA * X = B. Im allgemeinen Fall, MF_solve, wird hierfür eine LU-Faktorisierung durchgeführt. Für den Spezialfall symmetrischer Matrizen bietet MFsym_solve einen etwa doppelt so schnellen Weg mittels Cholesky-Faktorisierung.

Zuerst wird MF_solve beschrieben. MFsym_solve folgt am Schluss.

MF_solve hat immer dann Erfolg, wenn das Gleichungssystem eine eindeutige Lösung besitzt. In diesem Fall wird FALSE (0) zurückgegeben.
Wenn sich das Gleichungs-System aber als unter-determiniert herausstellt, was immer dann geschieht, wenn eine oder mehrere der Gleichungen tatsächlich Linearkombinationen anderer Gleichungen desselben Systems darstellen, wird die Matrix singulär, und die Lösung schlägt fehl mit einem Rückgabewert von TRUE (1).

Um in Situationen, wo man mit unter-determinierten Matrizen zu rechnen hat, Singularitäten zu umgehen, kann man einen Minimalwertes für die Pivotisierung bei der LU-Faktorisierung definieren. Standardmäßig ist diese 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_solvewEdit, die die gewünschte Editier-Schwelle als zusätzliches Argument thresh übernimmt.
Der Rückgabewert von MF_solve und MF_solvewEdit zeigt an, ob die Lösung des Gleichungssystems erfolgreich war:
 
RückgabewertBedeutung
0Matrix MA ist regulär; Gleichungssystem konnte erfolgreich gelöst werden
1Matrix MA ist singulär; Ergebnis X komplett unbrauchbar
2Matrix MA (nahezu) singulär; durch Pivot-Editierung konnte eine der unendlich vielen Lösungen gefunden werden; ob dieses Ergebnis brauchbar ist, hängt von der spezifischen Anwendung ab

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

Alternativ zur Pivot-Editierung kann man auch MF_safeSolve oder MF_solveBySVD anstelle des einfachen MF_solve verwenden.

Für symmetrische Matrizen bietet MFsym_solve wie erwähnt einen schnelleren Weg zur Lösung. Diese Routine führt zunächst eine Cholesky-Faktorisierung durch. Nur in dem Fall, dass sich die Eingabe-Matrix dabei als nicht-positiv-definit herausstellt, wird doch wieder LUD angewandt. Der Rückgabewert von MFsym_solve zeigt an, ob das lineare Gleichungssystem erfolgreich gelöst werden konnte:
 
RückgabewertBedeutung
0Matrix MA ist regulär; Gleichungssystem konnte erfolgreich entweder über Cholesky oder über LUD gelöst werden
1Matrix MA ist singulär; sowohl Cholesky als auch LUD scheiterten; Ergebnis X komplett unbrauchbar
2Matrix MA (nahezu) singulär; über LUD konnte durch Pivot-Editierung eine der unendlich vielen Lösungen gefunden werden; ob dieses Ergebnis teilweise brauchbar ist, hängt von der spezifischen Anwendung ab

RückgabewertEin Code 0, 1 oder 2, siehe oben
QuerverweisMF_LUdecompose,   MF_CholeskyLdecompose,   MF_inv,   Kap. 10

MatrixLib Inhaltsverzeichnis  OptiVec Home