# Thomas-Algorithmus

Der Thomas-Algorithmus (nach Llewellyn Thomas) oder auch Tridiagonalmatrix-Algorithmus (TDMA) ist eine vereinfachte Form des Gaußschen Eliminationsverfahrens, der zum schnellen Lösen von linearen Gleichungssystemen mit einer Tridiagonalmatrix benutzt wird.

## Verfahren

Ein tridiagonales System mit n Unbekannten $x_{i}\,\!$ kann geschrieben werden als
    $a_{i}x_{i-1}+b_{i}x_{i}+c_{i}x_{i+1}=d_{i},\,\!$
wobei gelten soll: $a_{1}=0\,$ und $c_{n}=0\,$.
In Matrizenform wird das System geschrieben als: $\left[{\begin{matrix}{b_{1}}&{c_{1}}&&&{0}\\{a_{2}}&{b_{2}}&{c_{2}}&&\\&{a_{3}}&{b_{3}}&\ddots &\\&&\ddots &\ddots &{c_{n-1}}\\{0}&&&{a_{n}}&{b_{n}}\\\end{matrix}}\right]\left[{\begin{matrix}{x_{1}}\\{x_{2}}\\{x_{3}}\\\vdots \\{x_{n}}\\\end{matrix}}\right]=\left[{\begin{matrix}{d_{1}}\\{d_{2}}\\{d_{3}}\\\vdots \\{d_{n}}\\\end{matrix}}\right].$
Beispiele für diese Matrizen entstehen üblicherweise aus der Diskretisierung der eindimensionalen Poisson-Gleichung (z. B. eindimensionale Diffusionsprobleme) und aus der natürlichen kubischen Spline-Interpolation.
Für solche Systeme kann die Lösung mit dem Thomas-Algorithmus nach ${\mathcal {O}}(n)$ Operationen gefunden werden: Ein erster Durchlauf eliminiert die $a_{i}$s, anschließend erhält man die Lösung mit Hilfe eines Rückwärts-Einsetzverfahrens.
Der erste Schritt ist es, die Koeffizienten folgendermaßen rekursiv zu modifizieren (die „neuen“ modifizierten Koeffizienten sind mit einem Strich gekennzeichnet):
    $c'_{i}={\begin{cases}{\begin{array}{lcl}{\cfrac {c_{1}}{b_{1}}}&;&i=1\\{\cfrac {c_{i}}{b_{i}-c'_{i-1}a_{i}}}&;&i=2,3,\dots ,n-1\\\end{array}}\end{cases}}\,$
    $d'_{i}={\begin{cases}{\begin{array}{lcl}{\cfrac {d_{1}}{b_{1}}}&;&i=1\\{\cfrac {d_{i}-d'_{i-1}a_{i}}{b_{i}-c'_{i-1}a_{i}}}&;&i=2,3,\dots ,n\\\end{array}}\end{cases}}\,$
Dies ist der vorwärts gerichtete Durchlauf. Die Lösung ergibt sich dann durch ein Rückwärts-Einsetzverfahren:
    $x_{n}=d'_{n}\,$
    $x_{i}=d'_{i}-c'_{i}x_{i+1}\qquad ;\ i=n-1,n-2,\ldots ,1$

## Varianten

In manchen Situationen, insbesondere in solchen mit periodischen Randbedingungen, kann es sein, dass eine leicht veränderte Form des tridiagonalen Systems zu lösen ist:
    ${\begin{aligned}a_{1}x_{n}+b_{1}x_{1}+c_{1}x_{2}&=d_{1},\\a_{i}x_{i-1}+b_{i}x_{i}+c_{i}x_{i+1}&=d_{i},\quad \quad i=2,\ldots ,n-1\\a_{n}x_{n-1}+b_{n}x_{n}+c_{n}x_{1}&=d_{n}.\end{aligned}}$
In Matrizenform: $\left[{\begin{matrix}{b_{1}}&{c_{1}}&&&{a_{1}}\\{a_{2}}&{b_{2}}&{c_{2}}&&\\&{a_{3}}&{b_{3}}&\ddots &\\&&\ddots &\ddots &{c_{n-1}}\\{c_{n}}&&&{a_{n}}&{b_{n}}\\\end{matrix}}\right]\left[{\begin{matrix}{x_{1}}\\{x_{2}}\\{x_{3}}\\\vdots \\{x_{n}}\\\end{matrix}}\right]=\left[{\begin{matrix}{d_{1}}\\{d_{2}}\\{d_{3}}\\\vdots \\{d_{n}}\\\end{matrix}}\right].$
In diesem Fall kann die Sherman-Morrison-Woodbury-Formel benutzt werden, um den Thomas-Algorithmus zu nutzen und die zusätzlichen Operationen des Gaußschen Eliminationsverfahrens zu vermeiden.
In anderen Fällen kann das Gleichungssystem block-tridiagonal sein, d. h. die Elemente des obigen Gleichungssystems sind kleinere Blockmatrizen (z. B. bei der zweidimensionalen Poisson-Gleichung). Für diese Fälle wurden ebenfalls vereinfachte Varianten der Gauß-Elimination entwickelt.
Eine weitere Variante des Thomas-Algorithmus ist der Hu-Gallash-Algorithmus, der statt des Rückwärts-Einsetzverfahrens ein Vorwärts-Einsetzverfahren nutzt.

## Herleitung

Die Unbekannten seien $x_{1},\ldots ,x_{n}$. Die zu lösenden Gleichungen seien:
    ${\begin{aligned}b_{1}x_{1}+c_{1}x_{2}&=d_{1};&i&=1\\a_{i}x_{i-1}+b_{i}x_{i}+c_{i}x_{i+1}&=d_{i};&i&=2,\ldots ,n-1\\a_{n}x_{n-1}+b_{n}x_{n}&=d_{n};&i&=n\end{aligned}}$
Die zweite Gleichung ($i=2$) wird nun wie folgt mit der ersten Gleichung modifiziert:
    $({\mbox{Gleichung 2}})\cdot b_{1}-({\mbox{Gleichung 1}})\cdot a_{2}$
Dies ergibt:
    ${\begin{aligned}(a_{2}x_{1}+b_{2}x_{2}+c_{2}x_{3})b_{1}-(b_{1}x_{1}+c_{1}x_{2})a_{2}&=d_{2}b_{1}-d_{1}a_{2}\\(b_{2}b_{1}-c_{1}a_{2})x_{2}+c_{2}b_{1}x_{3}&=d_{2}b_{1}-d_{1}a_{2}\,\end{aligned}}$
Dadurch wurde $x_{1}$ aus der zweiten Gleichung eliminiert. Mit einer analogen Vorgehensweise ergibt sich aus der modifizierten zweiten und der dritten Gleichung:
    ${\begin{aligned}(a_{3}x_{2}+b_{3}x_{3}+c_{3}x_{4})(b_{2}b_{1}-c_{1}a_{2})-((b_{2}b_{1}-c_{1}a_{2})x_{2}+c_{2}b_{1}x_{3})a_{3}&=d_{3}(b_{2}b_{1}-c_{1}a_{2})-(d_{2}b_{1}-d_{1}a_{2})a_{3}\\(b_{3}(b_{2}b_{1}-c_{1}a_{2})-c_{2}b_{1}a_{3})x_{3}+c_{3}(b_{2}b_{1}-c_{1}a_{2})x_{4}&=d_{3}(b_{2}b_{1}-c_{1}a_{2})-(d_{2}b_{1}-d_{1}a_{2})a_{3}\,\end{aligned}}$
Jetzt wurde $x_{2}$ eliminiert. Wird diese Vorgehensweise bis zur $n$-ten Zeile wiederholt, enthält die modifizierte $n$-te Gleichung nur eine Unbekannte. Diese Gleichung wird nun gelöst und das Ergebnis genutzt, um die $(n-1)$-te Gleichung zu lösen. Dies wird so lange fortgeführt, bis alle Unbekannten bekannt sind.
Verständlicherweise werden die Koeffizienten mit jedem Schritt komplizierter, wenn sie explizit dargestellt werden. Die Koeffizienten können jedoch auch rekursiv dargestellt werden:
    ${\begin{aligned}{\tilde {a}}_{i}&=0\\{\tilde {b}}_{1}&=b_{1}\\{\tilde {b}}_{i}&=b_{i}{\tilde {b}}_{i-1}-{\tilde {c}}_{i-1}a_{i}\\{\tilde {c}}_{1}&=c_{1}\\{\tilde {c}}_{i}&=c_{i}{\tilde {b}}_{i-1}\\{\tilde {d}}_{1}&=d_{1}\\{\tilde {d}}_{i}&=d_{i}{\tilde {b}}_{i-1}-{\tilde {d}}_{i-1}a_{i}\,\end{aligned}}$
Um den Lösungsprozess weiter zu beschleunigen, wird ${\tilde {b}}_{i}$ herausdividiert (wenn ${\tilde {b}}_{i}\neq 0$). Die neuen Koeffizienten lauten:
    ${\begin{aligned}a'_{i}&=0\\b'_{i}&=1\\c'_{1}&={\frac {c_{1}}{b_{1}}}\\c'_{i}&={\frac {c_{i}}{b_{i}-c'_{i-1}a_{i}}}\\d'_{1}&={\frac {d_{1}}{b_{1}}}\\d'_{i}&={\frac {d_{i}-d'_{i-1}a_{i}}{b_{i}-c'_{i-1}a_{i}}}\,\end{aligned}}$
Dies ergibt:
    ${\begin{array}{llcl}x_{i}+c'_{i}x_{i+1}&=d'_{i}\qquad &;&\ i=1,\ldots ,n-1\\x_{n}&=d'_{n}\qquad &;&\ i=n\\\end{array}}\,$
Die letzte Gleichung enthält nur eine Unbekannte. Bestimmt man sie, reduziert man die Anzahl der Unbekannten in der vorletzten Gleichung auf eins, so dass dieses Rückwärts-Einsetzverfahren genutzt werden kann, um alle Unbekannten zu bestimmen.
    ${\begin{aligned}x_{n}&=d'_{n}\\x_{i}&=d'_{i}-c'_{i}x_{i+1}\qquad ;\ i=n-1,n-2,\ldots ,1\end{aligned}}$