FC_GaussAlgorithm

 

FC_GaussAlgorithm - Allgemeine Informationen

Übersicht

Typ

Funktion

Verfügbar ab:

V1.0.3.0

Versionen:

Aktuelle Version

Aufgabe

Löser für lineare Gleichungssysteme, die im Gauss-Algorithmus mit Pivotisierung verwendet werden.

Beschreibung

Die Funktion berechnet den Vektor SolutionVector, sodass die Gleichung Matrix * SolutionVector = Vector erfüllt ist.

Schnittstelle

Eingang

Datentyp

Beschreibung

i_diDim

DINT

Anzahl der Gleichungen des zu lösenden Systems bzw. Zeilen-/Spaltenzahl der zugehörigen Matrix. Muss >= 2 sein.

i_lrZeroLimit

LREAL

Numerische Nullgrenze. Matrixelemente, die betraglich kleiner als diese Zahl sind, werden als null betrachtet. Dient dazu, die Rundungsfehlerfortpflanzung zu begrenzen. Der günstigste Wert hängt von den numerischen Eigenschaften der Matrix ab. Muss > 0,0 sein. Ein gängiger Wert ist beispielsweise 1E-12.

i_plrMatrix

POINTER TO LREAL

Zeiger auf den Beginn des Speicherbereichs, in dem die Matrix des linearen Gleichungssystems abgelegt ist. Dieser Bereich muss zusammenhängend sein und mindestens Speicherplatz für i_diDim * i_diDim LREALs bieten.

i_plrVector

POINTER TO LREAL

Zeiger auf den Beginn des Speicherbereichs, in dem der Inhomogenitätsvektor („rechte Seite“) des linearen Gleichungssystems abgelegt ist. Dieser Bereich muss zusammenhängend sein und mindestens Speicherplatz für i_diDim LREALs bieten.

i_plrSolutionVector

POINTER TO LREAL

Zeiger auf den Beginn des Speicherbereichs, in den der Lösungsvektor des linearen Gleichungssystems kopiert werden soll. Dieser Bereich muss zusammenhängend sein und mindestens Speicherplatz für i_diDim LREALs bieten.

Ausgang

Datentyp

Beschreibung

q_etDiag

GD.ET_Diag

Allgemeingültige, bibliotheksunabhängige Aussage zur Diagnose.

Ein Wert ungleich ET_Diag.Ok entspricht einer Diagnosemeldung.

q_etDiagExt

ET_DiagExt

POU-spezifischer, diagnosebezogener Ausgang.

q_etDiag = ET_Diag.Ok -> Statusmeldung

q_etDiag <> ET_Diag.Ok -> Diagnosemeldung

Hinweise

oDiese POU benötigt (i_diDim + 1) * i_diDim * SIZEOF(LREAL) Bytes dynamischen Speicher. Es muss daher sichergestellt sein, dass der Parameter LMCx00C\C\Konfiguration\Programm\DynIECDataSize (gesamter zur Verfügung stehender dynamischer Speicher) auf einen hinreichend großen Wert gesetzt ist.

oDie korrekte Größe der Speicherbereiche, auf die die Zeiger i_plrMatrix, i_plrVector und i_plrSolutionVector zeigen, muss sorgfältig geprüft werden, da die POU sonst einen Speicherzugriffsfehler verursacht.

oFür die Belegung und das Lesen von Elementen der Matrix und der beteiligten Vektoren stehen die Funktionen FC_GetMatrixElement(), FC_GetVectorElement(), FC_SetMatrixElement() und FC_SetVectorElement() zur Verfügung.

oSind die Matrix und der Inhomogenitätsvektor des Gleichungssystems durch Arrays gegeben, so können diese auch direkt (ohne Benutzung der zuvor genannten Hilfsfunktionen) belegt werden. Der erste Index von A ist dann der Zeilenindex der Matrix, der zweite der Spaltenindex.

Diagnosemeldungen

q_etDiag

q_etDiagExt

Enumerationswert

Beschreibung

OK

Ok

0

OK

ControllerConditionInvalid

DynIecDataSizeTooSmall

75

Es ist zu wenig dynamischer Speicher reserviert.

InputParameterInvalid

DimRange

72

Dim ist außerhalb des gültigen Bereichs.

InputParameterInvalid

MatrixSingular

77

Die Matrix ist singulär.

InputParameterInvalid

PointerMatrixInvalid

69

Der Zeiger Matrix ist ungültig.

InputParameterInvalid

PointerSolutionVectorInvalid

71

Der Zeiger SolutionVector ist ungültig.

InputParameterInvalid

PointerVectorInvalid

70

Der Zeiger Vector ist ungültig.

InputParameterInvalid

ZeroLimitRange

74

ZeroLimit ist außerhalb des gültigen Bereichs.

UnexpectedProgramBehavior

UnexpectedFeedback

1

Es ist ein unbeabsichtigter Fehler während der Ausführung aufgetreten.

DimRange

Enumerationsname:

DimRange

Enumerationswert:

72

Beschreibung:

Dim ist außerhalb des gültigen Bereichs.

Problem

Ursache

Lösung

-

Am Eingang i_diDim wurde ein ungültiger Wert übergeben.

Es muss gelten: i_diDim > 1

DynIecDataSizeTooSmall

Enumerationsname:

DynIecDataSizeTooSmall

Enumerationswert:

75

Beschreibung:

Es ist zu wenig dynamischer Speicher reserviert.

Problem

Ursache

Lösung

-

Es steht kein oder nicht genügend dynamischer Speicher zu verfügung.

Erhöhen Sie den dynamischen Speicher Controller > Konfiguration > Programm > DynIECDataSize.

MatrixSingular

Enumerationsname:

MatrixSingular

Enumerationswert:

77

Beschreibung:

Die Matrix ist singulär.

Problem

Ursache

Lösung

-

Die Matrix am Eingang i_plrMatrix ist singulär.

Dem Eingang i_plrMatrix muss eine reguläre Matrix übergeben werden.

Ok

Enumerationsname:

Ok

Enumerationswert:

0

Beschreibung:

OK

Das Gleichungssystem wurde erfolgreich gelöst.

PointerMatrixInvalid

Enumerationsname:

PointerMatrixInvalid

Enumerationswert:

69

Beschreibung:

Der Zeiger Matrix ist ungültig.

Problem

Ursache

Lösung

-

Am Eingang i_plrXMatrix wurde ein Nullzeiger übergeben.

Dem Eingang i_plrXMatrix muss die Addresse des Speichers übergeben werden, in dem die Matrix liegt.

PointerSolutionVectorInvalid

Enumerationsname:

PointerSolutionVectorInvalid

Enumerationswert:

71

Beschreibung:

Der Zeiger SolutionVector ist ungültig.

Problem

Ursache

Lösung

-

Am Eingang i_plrSolutionVector wurde ein Nullzeiger übergeben.

Dem Eingang i_plrSolutionVector muss die Addresse des Speichers übergeben werden, in dem der Lösungsvektor liegt.

PointerVectorInvalid

Enumerationsname:

PointerVectorInvalid

Enumerationswert:

70

Beschreibung:

Der Zeiger Vector ist ungültig.

Problem

Ursache

Lösung

-

Am Eingang i_plrVector wurde ein Nullzeiger übergeben.

Dem Eingang i_plrVector muss die Addresse des Speichers übergeben werden, in dem der Vektor liegt.

UnexpectedFeedback

Enumerationsname:

UnexpectedFeedback

Enumerationswert:

1

Beschreibung:

Es ist ein unbeabsichtigter Fehler während der Ausführung aufgetreten.

ZeroLimitRange

Enumerationsname:

ZeroLimitRange

Enumerationswert:

74

Beschreibung:

ZeroLimit ist außerhalb des gültigen Bereichs.

Problem

Ursache

Lösung

-

Am Eingang i_lrZeroLimit wurde eine Zahl <= 0 angelegt.

i_lrZeroLimit muss größer sein als 0.