Startseite Mathematik-Online        Themenliste

Mathematik-Online, Excel-VBA

Wenige Zeilen VBA-Code genügen, um mit Excel lineare Gleichungssysteme zu lösen:

Excel-VBA: lineare Gleichungssysteme

Anfrage: Clemens Kazubek, arcor
Ich möchte mit Excel lineare Gleichungssysteme lösen, ohne umständlich den Solver benutzen zu müssen. Für 2 Gleichungen mit 2 Unbekannten ist das auch kein Problem. Ist es aber möglich, 3 Gleichungen mit 3 Unbekannten, 4 Gleichungen mit 4 Unbekannten usw. mit einem VBA-Makro zu lösen? Mein Problem ist einfach, dass die Anzahl der Zeilen und Spalten variabel sein soll und der ganze Code darauf angepasst werden muss.

Antwort:

Folgendes Makro funktioniert für beliebige (eindeutig lösbare) lineare Gleichungssysteme, wobei wir uns der Übersichlichkeit halber auf maximal 10 Gleichungen/Unbekannte beschränken:

Sub LGS() 'LGS ist die Abkürzung für "lineares Gleichungssystem".

Dim n As Integer, m As Integer, j As Integer, c As Range

For j = 2 To 11 'Gleichungen und Unbekannte zählen:
n = n + Sgn(Application.CountA(Range(Cells(j, 2), Cells(j, 11))))
m = m + Sgn(Application.CountA(Range(Cells(2, j), Cells(11, j))))
Next j

'Namen festlegen:
Range(Cells(2, 2), Cells(n + 1, m + 1)).Name = "matrix"
Range("L2:L" & n + 1).Name = "vektor_b"

'Leerstellen im Gleichungssystem durch Nullen ersetzen:
For Each c In Union([matrix], [vektor_b])
If c = "" Then
c = 0
End If
Next c

'Vorherige Arrayformeln löschen:
Union([b22:k31], [o2:o11]).ClearContents

'Eingabe auf Fehler/Lösbarkeit prüfen:
If Not IsNumeric(Application.MDeterm([matrix])) Then
MsgBox "Fehlende bzw. falsche Einträge !"

ElseIf Application.MDeterm([matrix]) = 0 Then
MsgBox "Keine bzw. unendlich viele Lösungen !"

Else 'Lösung berechnen:
Range(Cells(22, 2), Cells(21+n, 1+m)).Name = "inverse"
[inverse].FormulaArray = "=MINVERSE(matrix)"
Range("o2:o" & n+1).FormulaArray = "=MMUlT(inverse,vektor_b)"
End If

End Sub


Mathematik-Online, Excel-VBA   lineare Gleichungssysteme

Tabellenblatt

Wir schauen uns das Tabellenblatt zum obigen Makro an, mit Eingabe und Lösung des linearen Gleichungssystems

2x1 + x2 + 3x3 = 4
5x1 + 8x3 = -1
-2x1 + 5x2 + x3 = 12

Ansicht Tabellenblatt zu linearen Gleichungssystemen

Die Koeffizienten geben wir also ab Zelle B2 in den grauen Bereich und die Konstanten in den grünen Bereich ein. Das Pluszeichen muss man nicht eintippen, und Leerstellen werden automatisch durch Nullen ersetzt (siehe Programm-Code). Die Lösung   x1 = 3,   x2 = 4,   x3 = -2 in Spalte O ist gelb unterlegt. Der graue Bereich bietet Platz für maximal 10 Gleichungen mit 10 Unbekannten - Makro und Tabellenblatt kann man aber leicht modifizieren, so dass dann auch wesentlich größere Systeme gelöst werden können


Mathematik-Online, Excel-VBA   lineare Gleichungssysteme

Anmerkungen zum Programm-Code

'Gleichungen und Unbekannte zählen - also n und m berechnen :
Für jede Zeile und Spalte des Eingabebereichs B2:K11 wird überprüft, ob Einträge existieren, ggf. erhöhen sich die Werte von n bzw. m um jeweils 1. Dabei verwenden wir die Signum-Funktion "Sgn" und ersparen uns somit IF-Prozeduren. Die Standard-Methoden zum Zählen von Zeilen und Spalten sind hier ungeeignet, weil die eingegebenen Koeffizienten mitunter keinen zusammenhängenden Bereich bilden.

Hinweis: Auf Excel-Tabellenfunktionen kann man in VBA mit dem Zusatz "Application.WorksheetFunction" zugreifen. Wann dieser Code tatsächlich erforderlich ist, hängt von der Objekt-Bibliothek ab, in der sich die Funktion befindet. In den unterschiedlichen Excelversionen ist das nicht einheitlich geregelt. Wir haben im obigen Makro nur "Application" vorangestellt - in den aktuellen Excelversionen funktioniert das einwandfrei.

'Namen festlegen:
Mit den Zahlen n und m lässt sich nun der genaue Koeffizienten-Bereich (im obigen Beispiel B2:D4) bestimmen und benennen ("matrix"), ebenso die Zellen in Spalte L ("vektor_b").

'Leerstellen im Gleichungssystem durch Nullen ersetzen :
Leerstellen in den Bereichen "matrix" und "vektor_b" werden nun durch Nullen ersetzt, damit kann man beide Bereiche mathematisch als Matrix bzw. Vektor verwenden.

'Vorherige Arrayformeln löschen :
Teile von Arrayformeln lassen sich nicht überschreiben - wir löschen einfach die Inhalte der reservierten Bereiche für die inverse Matrix und die Lösung.

'Eingabe auf Fehler/Lösbarkeit prüfen:
Im Fall "If Not IsNumeric ..." stimmt die Anzahl n der Gleichungen nicht mit der Anzahl m der Unbekannten überein, oder es liegen nichtnumerische Einträge vor. Im Fall "Else-IF" hat die Determinante der Koeffizientenmatrix den Wert Null, und dann gibt es keine oder unendlich viele Lösungen.

'Lösung berechnen:
Die drei letzten Programmzeilen sind der wesentliche Teil des Makros. Wenn MDeterm eine Zahl ungleich Null liefert, hat das LGS eine eindeutige Lösung, die sich durch Multiplikation der inversen Matrix mit den Zahlen aus Spalte L ergibt. Die entsprechende Array-Formel in der Spalte O liefert dann die gesuchte Lösung.


Mathematik-Online, Excel-VBA   lineare Gleichungssysteme

Mathematische Erläuterungen

Die Koeffizienten eines linearen Gleichungssystems mit n Gleichungen und n Unbekannten kann man zu einer quadratischen Matrix A anordnen und die Determinante det(A) berechnen. Im Fall det(A) ≠ 0 existiert die zu A inverse Matrix A-1, und das Gleichungssystem hat genau eine Lösung.

Hierzu schauen wir uns das Gleichungssystem aus dem Tabellenblatt an:

2x1 + x2 + 3x3 = 4
5x1 + 8x3 = -1
-2x1 + 5x2 + x3 = 12

Ansicht Tabellenblatt zu linearen Gleichungssystemen

Weil die Determinante von A ungleich Null ist, existiert die inverse Matrix A-1. Somit können wir A·x = b von links mit A-1 multiplizieren. Die Lösung des linearen Gleichungssystem lautet also: x = A-1·b - in VBA übersetzt: "=MMULT(inverse,vektor_b)".

Bei sehr umfangreichen Berechnungen ist es wegen der unvermeidlichen Rechenungenauigkeit von Computersystemen ratsam, die Lösung mit einer Fehlerabschätzung zu überprüfen und ggf. automatisch zu korrigieren.

Wenn es weniger Gleichungen als Unbekannte gibt oder im Fall det(A) = 0, existieren entweder unendlich viele oder überhaupt keine Lösungen. Die Matrix A ist dann nicht invertierbar, und der Programmieraufwand steigt erheblich. Zu den unendlich vielen Lösungen bleibt anzumerken, dass dies natürlich nicht auf Systeme zutrifft, die sich auf endliche Zahlenstrukturen beziehen (etwa bei der Nachrichtenverschlüsselung).

Falls es mehr Gleichungen als Unbekannte gibt, ist das LGS im Allgemeinen nicht lösbar; solche überbestimmten Gleichungssysteme resultieren etwa aus Messfehlern. Zwar existiert keine exakte Lösung, aber unter allen "falschen Lösungen" ist diejenige gesucht, die den theoretischen Vorgaben am besten entspricht. Diese sogenannten Ausgleichsprobleme lassen sich mit Excel und VBA grundsätzlich gut lösen - auch in nichtlinearen Fällen.
Themenliste Herleitung der Ausgleichsrechnung