In diesem Text werden die theoretischen Grundlagen, die u.a. zu den zyklischen Verfahren von Tendler (1973) führten, angeschnitten. Es werden die Begriffe $A[\alpha]$- und $S[\delta]$-Stabilität eingeführt. Die naheliegenden weiteren Definitionen von $A_\infty^r[\alpha]$- und $S_\infty^r[\delta]$-Stabilität werden ebenso diskutiert. Diese Definitionen weichen gelegentlich von den Definitionen ab, wie sie in der Literatur zu finden sind. Die Begriffe $A_\infty^r[\alpha]$- und $S_\infty^0[\delta]$-Stabilität werden hier nur so benutzt, wie sie an dieser Stelle erklärt werden. Diese Stabilitätsmerkmale ermöglichen einen Vergleich verschiedener Verfahren gleicher Ordnung und damit eine Abschätzung über ihre Brauchbarkeit bei einem Einsatz in einem Programmpaket. Dennoch setzen diese Stabilitätsdefinitionen gewisse idealisierte Bedingungen voraus. Aus diesem Grunde ist es ratsam, ihnen nicht unangemessen großes Gewicht beizumessen. Erfüllt also ein Verfahren diese Eigenschaft besonders “gut”, so heißt dies nicht automatisch, daß es sich in einem Rechenprogramm auch immer “gut” verhalten würde.
Schließlich wird dargelegt, wie die neuen zyklischen Formeln generiert wurden. Das letzte ist von Interesse, wenn versucht werden sollte, die von J.M. Tendler gefundenen Formeln weiter zu verbessern. Von seinen prinzipiellen Grundbestandteilen her sind die Tendlerschen Zyklen vergleichsweise einfach aufgebaut, nämlich als lineares Komposituum linear unabhängiger Mehrschrittformeln. Dennoch ist die tatsächliche Erzeugung, insbesondere die systematische Generierung nicht ganz einfach. Es handelt sich hier nicht um einen einfach erlernbaren Kalkül, sondern um einen iterativen Suchvorgang.
Bibliographisch: Tendler, Joel Marvin: "A Stiffly Stable Integration Process Using Cyclic Composite Methods", Ph.D. Diss., Syracuse University, Syracuse, New York, 26.Feb.1973, viii+iv+172 S.
$\ldots$ wird sich diese Störung allerdings erst später einstellen, aber auf alle Fälle wird die Integration nach ausreichend vielen Schritten gründlich verpfuscht. Man nennt diese Erscheinung numerische Instabilität. Sie ist nicht etwa eine Folge der Akkumulation von Rundungsfehlern, denn die Formel beschreibt den Integrationsprozeß unter der Annahme, daß vollständig exakt gerechnet wird.
Eduard Stiefel (1968)
Ausschließlich Differentialgleichungen vom Typ
werden hier betrachtet. Es sei für diesen und alle weiteren Abschnitte angenommen, daß $f$ und damit $y$ so oft differenzierbar sind, wie es für die jeweilige Betrachtung nötig ist. Es wird nun $t_n=t_0+nh$ gesetzt, und $y_n$ bezeichnet die berechneten Näherung für $y(t_n)$, für $n=m\ell+j$ und $j=1,\ldots,\ell$, die durch die folgenden $\ell$ Mehrschrittformeln bestimmt wurden
wobei $\dot y_i = f(t_i,y_i)$ ist.
Ausführlich aufgeschrieben lautet der obige Ausdruck z.B. für ein dreistufiges Verfahren mit drei Startwerten, also $\ell=3$, und $k=3$, wie untenstehend. Hier und im weiteren wird häufig die Abkürzung $z_i=hf_i=h\dot y_i$ benutzt.
Der obige Ausdruck wird zyklisch, falls gilt
Gälte $\alpha_{ij}\ne0$ oder $\beta_{ij}\ne0$ für ein $i<j$, so wäre das zusammengesetzte Verfahren blockimplizit. Der Aufwand zur “Beseitigung” der Implizitheit der Formeln wäre dann größer als bei (einstufigen) linearen Mehrschrittformeln.
Bei zyklischen Verfahren ist der Aufwand zur Berechnung der Näherungen nicht größer als wie bei Mehrschrittverfahren. Andererseits hat man jedoch nun die Möglichkeit, da nicht alle Stufen gleich gewählt werden müssen, Stabilitätseigenschaften zu erreichen die u.U. den Stufen überlegen sind. Die Stufen müssen untereinander nicht verschieden sein. Einige oder auch alle dürfen übereinstimmen. Praktische Ergebnisse deuten auf den merkwürdigen Umstand hin, daß die dreifache Wiederholung der BDF2 als zyklisches Verfahren entsprechend programmiert, ggü. der dreifachen Anwendung von 3 Schritten mit der BDF2 mit einem Programm konzipiert für einstufige Verfahren, Vorteile bieten kann.
Während bis jetzt noch jede Stufe des Zykluses $2(k+i)$ Parameter, d.h. noch nicht bestimmte Koeffizienten, enthält, sei noch zusätzlich angenommen, um die die Anzahl der der Bedingungen zu reduzieren, daß gelte
D.h., daß jede Stufe ein lineares $k$-Schrittverfahren ist. Es verbleiben jetzt noch $2(k+1)$ Parameter. Aus Vereinfachungsgründen wird nun verlangt, daß jede Stufe die gleiche Konsistenzordnung $p=k$ hat. Berücksichtigt man die Konsistenzbedingungen, so verbleiben noch $k+1$ Parameter. Diese werden dazu benutzt die gewünschten Stabilitätseigenschaften des Verfahrens zu erreichen.
Zur Untersuchung des Lösungsverhaltens der Differenzengleichung, welche man zur numerischen Lösung von Differentialgleichungen einsetzt, betrachtet man die sehr spezielle Testgleichung
Da man durch Linearisierung viele Differentialgleichung zumindestens in einer kleinen Umgebung auf diese obige Form zurückführen kann, liefert die Untersuchung dieser speziellen Gleichung einen ersten Eindruck was man wohl im allgemeineren Falle zu erwarten hat. Desweiteren kann man damit gewisse Ineffizienzen von Programmen verstehen und erklären. Zur Wiederholung seien in sehr salopper Form die beiden bekanntesten Stabilitätsdefinitionen angegeben:
Eine Formel heißt stabil, wenn die sämtlichen berechneten Lösungen für $H=0$ nicht unbeschränkt wachsen können; $H=h\lambda$.
Die Formel heißt $A$-stabil, wenn sämtliche berechneten Lösungen eine Nullfolge bilden, für alle $H\in\mathbb{C}^-$. Ausführlicher
1. Definition: nach Germund Dahlquist, Dahlquist (1963). Ein lineares $k$-Schrittverfahren heißt $A$-stabil, falls alle Lösungen von
gegen Null gehen ($n\to\infty$), wenn das Verfahren mit fester Schrittweite $h$ auf Differentialgleichungen der Form $\dot y=\lambda y$ angewendet wird, mit einer festen komplexen Konstante $\lambda$, mit negativen Realteil.
Die Beschränkung auf lineare $k$-Schrittverfahren ist unwesentlich. Die Beschäftigung mit zyklischen linearen Verfahren hat zu einem nicht unmaßgeblichen Teil ihren Ursprung in der zweiten Dahlquist-Barriere. Diese besagt, daß $A$-stabile, lineare Mehrschrittformeln keine beliebig hohe Ordnung erreichen können: maximal die Ordnung zwei. Durch die drastische Einschränkung der Vielfalt $A$-stabiler, linearer Mehrschrittverfahren werden zwei Erweiterungen nahegelegt: Abschwächung des Begriffes der $A$-Stabilität und Hinzufügung größerer Klassen von Verfahren. Zur Quantifizierung von Stabilitätseigenschaften einerseits und zur Abschwächung der $A$-Stabilität andererseits dienen die nachstehenden Definitionen.
2. Definition: Bezeichne ${\cal S}[\delta]$ eine zusammenhängende und offene Teilmenge der komplexen Ebene mit dem Ursprung als Randpunkt, die mindestens einen unendlich großen Teil der linken Halbebene enthält mit Elementen $z$ der Form
Nun heißt ein Verfahren $S[\delta]$-stabil, falls so eine Menge ${\cal S}[\delta]$ existiert derart, daß wenn man das Verfahren auf die lineare und zeitinvariante Differentialgleichung $\dot y=\lambda y$ anwendet, die mit dem Verfahren berechneten Lösungen $y_n$ gegen Null streben, wenn $n\to\infty$, für eine feste positive Schrittweite $h$, falls immer $\lambda h=H \in {\cal S}[\delta]$. Existiert kein unendlich großer Bereich der linken Halbebene, so werde von nicht $S[\delta]$-stabil gesprochen. Im Falle der Existenz heißt das betragsmässig kleinste $\delta$ die Widlund-Distanz, nach Olof B. Widlund.
Diese Definition hat eine sehr anschauliche Interpretation, wenn man das Gebiet ${\cal S}[\delta]$ aufzeichnet. Von besonderem Interesse ist hier das betragsmässig kleinstmögliche $\delta$. Nur von diesem kleinstmöglichen $\delta$ wird im weiteren überhaupt noch die Rede sein. Gleiche Anschaulichkeit hat auch die folgende Definition.
3. Definition: Sei ${\cal A}[\alpha]$ eine zusammenhängende und offene Teilmenge der komplexen Zahlenebene mit Elementen $z$ der Form
Jetzt heißt das Verfahren $A[\alpha]$-stabil, wenn es w.o. eine derartige Menge ${\cal A}[\alpha]$ gibt derart, daß die berechneten Näherungen dieses Verfahren gegen Null streben, für $n\to\infty$, wenn man das Verfahren auf die Differentialgleichung $\dot y = \lambda y$ anwendet. Diese Abklingeigenschaft soll immer dann gelten, wenn $\lambda h=H \in {\cal A}[\alpha]$ gilt, für feste positive Schrittweite $h$. Für $\alpha\notin\left[0,90^\circ\right]$ werde von nicht $A[\alpha]$-stabil gesprochen. Im Falle der Existenz nennt man den größtmöglichen Winkel $\alpha$ auch den Widlund-$\alpha$-Winkel, ebenfalls nach Olof B. Widlund.
In sinnfälliger Verallgemeinerung nennt man ein Verfahren $A[0]$-stabil, wenn es ein $\alpha$ gibt, sodaß das Verfahren $A[\alpha]$-stabil ist. ${\cal A}[0]$ ist in $\mathbb{C}$ nicht offen. Wie die obige Definition kann man diese Eigenschaft wiederum sehr anschaulich deuten. Hier gilt je größer der Winkel $\alpha$, desto besser. Bei der vorherigen Definition galt je kleiner $\delta$, desto günstiger. Durch ein größeres $\alpha$, bzw. kleineres $\delta$, werden die entsprechenden Mengen ${\cal A}[\alpha]$, bzw. ${\cal S}[\delta]$, “größer”.
Bei den beiden Defintionen beachte man, daß ${\cal S}[\delta]$ die Menge bezeichnet und $S[\delta]$ die dazugehörige Eigenschaft. Entsprechend gilt dies für ${\cal A}[\alpha]$ und $A[\alpha]$. Man stellt schnell fest, daß ein Verfahren stets $A[\alpha]$-stabil ist, für ein gewisses $\alpha(\delta)$, wenn es $S[\delta]$-stabil ist. Die Umkehrung ist nicht notwendig richtig. Bei den noch folgenden Eigenschaften $A_{\infty}[\alpha]$ und $S_{\infty}[\delta]$ wird dies jedoch der Fall sein. Ist $\delta = 0$ oder $\alpha = 90^\circ$, so ist dies das gleiche wie $A$-Stabilität. Beide Werte führen zur selben Menge, nämlich der gesamten linken komplexen Halbebene ohne die imaginäre Achse.
4. Beispiele: (1) Die impliziten BDF der Ordnung $p=1$ bis $p=6$ erfüllen mit gewissen $\alpha$ und $\delta$ die obigen Stabilitätseigenschaften.
(2) Sämtliche zyklischen Verfahren von Tendler (1973), oder Tendler/Bickart/Picel (1978) sind ebenfalls Beispiele für Verfahren, die $A[\alpha]$- bzw. $S[\delta]$-stabil sind. Zusätzlich sind die Formeln von Tendler auch $A_\infty^0[\alpha]$- und $S_\infty^0[\delta]$-stabil. (Definition folgt.)
(3) Genauso sind auch alle zyklischen Formeln von Peter E. Tischer (1983) und Tischer/Sacks-Davis (1983) alle $A[\alpha]$- bzw. $S[\delta]$-stabil, sogar $A_\infty^0[\alpha]$- und $S_\infty^0[\delta]$-stabil.
(4) Die 10 blockimpliziten Verfahren von Bickart/Picel (1973) sind alle $A[\alpha]$- und $S[\delta]$-stabil, sogar $A_\infty^0[\alpha]$- und $S_\infty^0[\delta]$-stabil.
(5) Explizite Verfahren mit konstanter Schrittweite erfüllen die obigen Eigenschaften nicht. Das explizite Euler-Verfahren mit konstanter Schrittweite ist also weder $A[\alpha]$- noch $S[\delta]$-stabil und zwar für kein $\alpha$ und kein $\delta$.
Bibliographisch: Tischer, Peter E.: "The Cyclic Use of Linear Multistep Formulas for the Solution of Stiff Differential Equations", Ph.D. Thesis, Department of Computer Science, Monash University, Clayton, Victoria, Australia, August 1983, x+180 S.
Tischer, Peter E. und Sacks-Davis, Ron: "A New Class of Cyclic Multistep Formulae for Stiff Systems", SIAM Journal on Scientific and Statistical Computing, Vol 4, No 4, December 1983, pp.733—747.
Bickart, Theodore A. und Picel, Zdenek: "High Order Stiffly Stable Composite Multistep Methods for Numerical Integration of Stiff Differential Equations", BIT, Vol 13, 1973, pp.272—286
1. Wann nun ein Verfahren diese Eigenschaften hat, wird durch sein charakteristisches Polynom bestimmt. Dieses Polynom in zwei komplexen Veränderlichen erhält man nun wie folgt.
Den gesamten $\ell$-stufigen Zyklus
kann man als eine einzige Matrixdifferenzengleichung notieren, nämlich
mit $\kappa=\lceil k/\ell \rceil$. $\kappa$ ist hierbei die kleinste ganze Zahl, die größer oder gleich $k/\ell$ ist. Die insgesamt $\kappa+1$ Matrizen $A_i$, $B_i$ haben die Größe $\ell\times\ell$. Es genügen genau dann zwei Matrizen $A_1$ und $A_0$, bzw. $B_1$ und $B_0$, wenn $\kappa=1$ ist, also $k\le\ell$.
Vergrößert man die Dimensionen der Matrizen $A_i$ und $B_i$ mit Hilfe von sogenannten Trivialstufen ($1=1$ Stufen), so läßt sich natürlich die Anzahl der Matrizen verringern, z.B. auf genau zwei, also $A_0$ und $A_1$, bzw. $B_0$ und $B_1$. Bei den zyklischen Verfahren von J.M. Tendler ist stets $\kappa\le2$, d.h. man kommt mit jeweils höchstens drei Matrizen zur Beschreibung der Matrixdifferenzengleichung aus.
2. Die Matrizen $A_i$ und $B_i$, für $i=0,\ldots,\kappa$ lauten:
und
beziehungsweise
und so weiter bis zu den Matrizen $A_0$, $B_0$ und Vektoren $Y_m$. Allgemein also
für $i=0,\ldots,\kappa$. Die $B_i$ analog wie die $A_i$.
3. Bei einer vektorwertigen Funktion mit $n$ Komponenten hat man die oben angegebenen Matrizen zu ersetzen durch
Hierbei ist $I_n$ die $n\times n$-Einheitsmatrix und $\otimes$ bezeichnet das Kroneckerprodukt, nach Leopold Kronecker (1823—1891). In den meisten Fällen kann man auf diese gesonderte Notierung verzichten, u.a. weil gilt $\left|A\otimes I_n\right| = \left|A\right|$.
4. Beispiele: (1) Im Falle einstufiger Zyklen, also $\ell=1$, reduziert sich die obige Matrixdifferenzengleichung zu der gewöhnlichen skalaren Differenzengleichung für lineare Mehrschrittverfahren, mit $A_i=\alpha_i$, $B_i=\beta_i$ und $Y_i=y_i$.
(2) Das lineare zweistufige zyklische $A_\infty^0$-stabile Verfahren der Ordnung 4, also $k=4$, $p=4$ und $\ell=2$, von Tischer (1983) und Tischer/Sacks-Davis (1983), soll in der obigen Schreibweise angegeben werden. Die zu den Werten
gehörigen Koeffizienten lauten
wobei alle Koeffizienten auf eine Stelle hinter dem Komma gerundet worden sind, also der “Konsistenzschnelltest” $\rho(1)=0$ hier immer $\pm0.1$ ergibt.
In der Schreibweise als Matrixdifferenzengleichung w.o. ergibt sich nun unmittelbar
Eine typische Eigenschaft der Formeln von Tischer (1983) und Tischer/Sacks-Davis (1983) ist die relativ geringe Äquilibrierung der $\beta_{ij}$-Werte. Bei diesem Verfahren beträgt sie über 1:20. Für die Ordnung $p=8$ hat man sogar Verhältnisse von 1:130. Maßgeblich betrifft dies stets die letzte Stufe der immer zweistufigen Zyklen.
Die Formeln von Tendler (1973) besitzen diese Eigenschaften nicht. Bei gewöhnlichen Quadratur- und Kubaturformeln für $y=\int_a^b f(x) dx$ ist bekannt, daß diese Eigenschaft unerwünscht ist.
(3) Das zweistufige, zyklische Verfahren DH3 von Donelson/Hansen (1971)
Donelson III, John und Hansen, Eldon: "Cyclic Composite Multistep Predictor-Corrector Methods", SIAM Journal on Numerical Analysis, Vol 8, 1971, pp.137—157
Die Stabilität definierenden Matrizen sind:
Die charakteristische Gleichung ist
Keinesfalls müssen zyklische Verfahren nur zweistufig sein. Die Stufenzahl eines zyklischen Verfahrens unterliegt keiner Schranke, außer, daß diese Anzahl nicht unendlich ist und daß diese Anzahl dabei fest ist. Gleichzeitig erkennt man, daß eine formale Übertragung $\det Q(\mu,H)={\cal O}(H^{p+1})$ ($\mu=e^H$) scheitert, weil z.B. für DH3 gilt
nach Substitution von $\mu=e^H$.
5. Es ist natürlich ebenso möglich die Linearisierung des obigen Matrixpolynoms zu betrachten, jedoch werden dann die Dimensionen der Matrizen größer, falls $\kappa>1$, also $k>\ell$ ist. Das Verfahren schreibt sich dann in der Form $z_{n+1}=Az_n+h\varphi_n$, oder $Lz_{n+1}=Uz_n+h\varphi_n$.
1. Das charakteristische Polynom lautet
Man beweist jetzt, daß das verwendete Verfahren genau dann $A[\alpha]$-stabil bzw. $S[\delta]$-stabil ist, wenn die sämtlichen Nullstellen $\mu$ von $\det Q(\mu,H)=0$, alle betragsmässig kleiner eins sind, für alle $H \in {\cal A}[\alpha]$, bzw. alle $H \in {\cal S}[\delta]$. Die Eigenschaft eines Polynomes $Q(\mu,H)$ für ein spezielles $H_0$ sämtliche Wurzeln in der offenen Einheitskreisscheibe zu haben, nennt man absolut-stabil. ${\cal A}[\alpha]$ und ${\cal S}[\delta]$ sind also Mengen der absoluten Stabilität.
Äquivalent hierzu ist, daß das Verfahren genau dann $A[\alpha]$-stabil ist, bzw. $S[\delta]$-stabil ist, falls alle Nullstellen $H$ von $\det Q(\mu,H)=0$ im Komplement von ${\cal A}[\alpha]$, bzw. im Komplement von ${\cal S}[\delta]$, liegen, für alle $\mu$ aus dem Komplement der offenen Einheitskreisscheibe. Man erhält somit den folgenden Test.
2. Test A: Ein Verfahren ist genau dann $A[\alpha]$-stabil, bzw. $S[\delta]$-stabil, falls
Leider sind Verfahren, die die obigen beiden Eigenschaften erfüllen, noch nicht wirklich gut zur Integration von steifen Differentialgleichungen geeignet. Dies liegt u.a. daran, daß wenn $\mathopen|H\mathclose|$ $(\mathop{\rm Re}\nolimits H<0)$ immer größer wird, die Nullstellen $\mu$ von $\det Q(\mu,H)=0$ betragsmässig gegen eins streben könnten. Integriert man jedoch $\dot y = \lambda y$ ($\mathop{\rm Re}\nolimits \lambda<0$) so würde dies heißen, daß es eine Lösung gibt mit $\mathopen|y_{n+1}/y_n\mathclose| \to 1$. Diese Eigenschaft spiegelt sicherlich nicht das wahre Verhalten der Lösung wider. Diese Eigenheit hat z.B. die Trapezregel
Aus diesem Grunde sind Verfahren günstiger bei denen die Nullstellen $\mu$ bei $\mathop{\rm Re}\nolimits H=-\infty$ von $\det Q(\mu,H)=0$ in der offenen Einheitskreisscheibe liegen, also keinerlei Wurzeln des Betrages eins auftauchen. Damit hätte man die Trapezregel als zwar $A$-stabiles Verfahren, letztlich ausgesondert. Um diesen Wunsch zu präzisieren und um handliche Begriffe bereitzustellen, seien diese Anforderungen nun nomenklaturmässig genauer festgelegt.
Suppose, for example, that it is known that the planetary system is stable “in the past”. If it captures a new body, say, a speck of dust arriving from “infinity”, then the newly formed system of bodies looses its stability: with probability one, either a collision occurs, or one of the bodies escapes again at infinity. Moreover, it is by no means necessary that the speck of dust is the one that leaves the Solar system: Jupiter, or even the Sun may equally well leave.
V.I. Arnold, V.V. Kozlov, A.I. Neishtadt (1988), Mathematical Aspects of Classical and Celestial Mechanics
Bibliographisch: Vladimir Arnold (1937—2010), Valery Vislevich Kozlov (*1950), Anatoly Neishtadt.
Es liegt nun nahe, die Begriffe $A[\alpha]$-Stabilität und $S[\delta]$-Stabilität zu verfeinern. Hierzu wird das Verhalten der Differenzengleichung für $\mathop{\rm Re}\nolimits H\to-\infty$ mit in die Nomenklatur integriert. Dies führt jetzt zur
1. Definition: (1) Ein $S[\delta]$-stabiles Matrixpolynom $Q(\mu,H)$ mit der Eigenschaft, daß die sämtlichen Nullstellen $\mu$ für $\mathop{\rm Re}\nolimits H\to-\infty$ in der offenen, Kreisscheibe $\{z\in\mathbb{C}: \mathopen|z\mathclose|<r\}$ liegen, nennt man $S_\infty^r[\delta]$-stabil. Für $r=1$ sagt man abkürzend nur $S_\infty[\delta]$-stabil.
(2) Analog definiert man $A_\infty^r[\alpha]$-Stabilität als Erweiterung der $A[\alpha]$-Stabilität. Erneut bezeichnet $A_\infty[\alpha]$-Stabilität die Abkürzung für $A_\infty^1[\alpha]$-Stabilität.
(3) Für $r=0$ ist $r\to0$ gemeint, also: Die sämtlichen Nullstellen $\mu$ für $\mathop{\rm Re}\nolimits H\to-\infty$ verschwinden. Hierfür schreibt man $A_\infty^0[\alpha]$- bzw. $S_\infty^0[\delta]$-stabil.
(4) Der Wert $r$ bei der $S_\infty^r[\delta]$- bzw. $A_\infty^r[\alpha]$-Stabilität heißt Widlund-Endradius. I.a. wird ein kleinstmöglicher Wert angegeben und von dem Widlund-Endradius gesprochen.
Hat ein Verfahren das Matrixpolynom $Q(\mu,H)$, so vererbt sich der entsprechende Name auf das Verfahren. Genauso hätte man auch die $A[\alpha]$- bzw. $S[\delta]$-Stabilität einführen können. Die Werte $\alpha$ und $\delta$ bei den Stabilitätsdefinitionen werden in der Schreibweise unterdrückt, wenn die Wert $\alpha=90^\circ$, bzw. $\delta=0$ betragen, genau w.o. auch.
Die Definition von $A_\infty^0$-Stabilität verallgemeinert offensichtlich den Begriff der L-Stabilität für Einschrittverfahren.
Offensichtlich ist jedes $A_\infty^{r_1}[\alpha]$-stabiles Polynom auch $A_\infty^{r_2}[\alpha]$-stabil, falls $r_1<r_2$, nicht jedoch immer umgekehrt. Gleiches gilt für die entsprechend andere Stabilitätseigenschaft, also jedes $S_\infty^{r_1}[\delta]$-stabile Polynom ist natürlich auch $S_\infty^{r_2}[\delta]$-stabil, falls $r_1<r_2$. Insbesondere ist jedes $A_\infty^0[\alpha]$-stabile Polynom auch $A_\infty[\alpha]$- und $A[\alpha]$-stabil.
I.d.R. wird man ein kleinstmögliches $r$ bei größtmöglichen $\alpha$, bzw. ein kleinstmögliches $r$ bei kleinstmöglichem $\delta$, anstreben.
Welche der Eigenschaften insgesamt am günstigsten ist, kann allgemein nicht gesagt werden. Man hat hier einen Zielkonflikt. Dies hängt auch von der zu lösenden Differentialgleichung ab. Weiß man im voraus, daß beispielsweise die zu lösende lineare Differentialgleichung $\dot y=Ay$ eine Jacobimatrix $A$ mit nur negativen reellen Eigenwerten hat, so ist ein großer Widlund-$\alpha$-Winkel unerheblich. Aber selbst einer beliebigen festen Matrix anzusehen, ob sie nur reelle Eigenwerte hat, ist keine triviale Aufgabe.
2. Beispiele: (1) Die BDF der Ordnung $p=1$ bis $p=6$, die Formeln von Peter Tischer aller Ordnungen und auch die Formeln von Tendler aller Ordnungen sind $A_\infty^0[\alpha]$- und $S_\infty^0[\delta]$-stabile Verfahren. Aber auch die blockimpliziten Verfahren von Bickart/Picel (1973) sind $A_\infty^0[\alpha]$- und $S_\infty^0[\delta]$-stabile Verfahren.
(2) Liniger/Gagnebin (1974) zeigten u.a., daß
$A_\infty^0=S_\infty^0$-stabil ist für $0\le\xi\le16$. Der lokale Fehler ist hierbei
Für $\xi=-4$ erhält man die BDF3, welche $A_\infty^0[86.03^\circ]$- und $S_\infty^0[0.083]$-stabil ist.
Werner Liniger (1927—2017) und Gagnebin, Thierry: "Construction of a Family of Second Order, $A$-Stable $k$-Step Formulas Depending on the Maximum Number, $2k-2$, of Parameters", in "Stiff Differential Systems", Editor Ralph A. Willoughby, Plenum Press, New York and London, 1974, pp.217—227
(3) Für ein nicht-triviales Beispiel, wo diese Eigenschaften erfüllt, aber auch möglicherweise nicht erfüllt sind, kann man wie folgt vorgehen. Kombiniert man in zyklischer Reihenfolge $i$-mal das explizite und $j$-mal das implizite Eulerverfahren, so erhält man sofort für die Nullstelle $\mu$ von $\det Q(\mu,H)$ die Gleichung
der man augenblicklich ansieht, daß für betragsmässig große $H$ mit negativem Realteil, die Nullstelle $\mu$ sich wie untenstehend verhält:
Interessant hierbei ist, daß eine Kombination impliziter Verfahren mit expliziten Verfahren dennoch $A_\infty^0[\alpha]$-stabil, bzw. $S_\infty^0[\delta]$-stabil sein kann. Bei partiellen Differentialgleichungen, wo die Implizitheit von Formeln häufig noch schwerlastiger auf die gesamte Rechenzeit einwirken, werden sogar tatsächlich Kombinationen von expliziten und impliziten Verfahren verwendet, beispielsweise beim leapfrog-DuFort/Frankel-Verfahren, oder beim odd-even-hopscotch-Verfahren.
Schwächt man noch weiter ab, daß also nicht mehr konstante Schrittweiten zu nehmen sind, sondern auch variable Schrittweiten, so kann man sogar alleine mit expliziten Verfahren prinzipiell auskommen. Der Hinweis auf das Prinzipielle deswegen, weil die resultierenden Verfahren nicht notwendig auch im praktischen Gebrauch gut einsetzbar sind.
Beim expliziten Eulerverfahren liegen die Verhältnisse besonders durchsichtig vor. Hier ist
und offensichtlicherweise kann man durch ein geeignet gewähltes $H_i$, mit $1\le i\le\nu$ das obige Produkt zum Verschwinden bringen. Bei vektorwertigen Differentialgleichungen liegen die Verhältnisse nicht mehr so einfach. John (Jack) D. Lambert in Lambert (1986) äußert sich hier in größerem Umfange zu dieser Problematik. Hans Jörg Stetter reißt dieses Thema kurz in seinem Buch "Analysis of Discretization Methods for Ordinary Differential Equations" von 1973 an, in dem Abschnitt über die Stabilitätsbereiche zyklischer Verfahren.
3. Weiteren Aufschluß über die Stabiltät eines linearen Verfahrens erhält man, wenn man versucht zu quantifizieren, wie schnell die vom Verfahren gelieferten Näherungswerte abklingen. Für genügend rasch abfallende Lösungen ist die folgende Stabilitätsmenge von Interesse:
Dies sind also diejenigen Zahlen $H$, sodaß $\det Q(\mu,H)$ verschwindet, dabei $\mu$ aber stets aus der offenen Kreisscheibe $D_r$ ist. Weiter werden jetzt die Mengen ${\cal A}[\alpha]$ und ${\cal S}[\delta]$ verallgemeinert zu Mengen, die den Radius $r$ mit berücksichtigen. Hier ist insbesondere natürlich $0<r<1$ von Interesse. Es seien also die Mengen betrachtet
und
Zur Zeichnung des Randes $\partial{\cal Y}_r$ löst man genügend oft das verallgemeinerte Eigenwertproblem in $H$ zu
Mit $\varphi$ durchläuft man dann eine diskrete Teilmenge von $[0^\circ,180^\circ]$, zum Beispiel $\varphi = 0^\circ, 20^\circ, \ldots, 160^\circ, 180^\circ$. Mit $r$ wandert man von $r=1$ beispielsweise in $(-1/10)$ Schritten nach $r=0.1$. Damit erhält man also die Höhenlinien der “Funktion” $H(r)$, bzw. von $H(\mu)$. Die “Funktion” $H(r)$ ist implizit definiert. Die Betragsfunktion $\left|\cdot\right|$ wähle dann unter den mehreren möglichen “Funktionswerten”, den betragsmässig größten aus, ordnet also letztlich jedem $re^{i\varphi}$ eine komplexe Zahl $H$ zu. Das bivariable Polynom $\det Q(\mu,H)$ ist natürlich algebraisch. Lösungsäste algebraischer Funktionen haben höchstens algebraische Singularitäten. $\partial{\cal Y}_r$ kann aus mehreren Zusammenhangskomponenten bestehen, insbesondere für kleiner werdende $r$ ziehen sich die “kreisförmigen” Komponenten immer mehr zu den Nullstellenpunkten von $\det Q(\mu,0)=0$ zusammen.
Ein mehr geometrisch-anschaulich motivierter Ansatz geht von der Betrachtung von $\mu(H)$ aus. Dann löst man das verallgemeinerte Eigenwertproblem in $\mu$ zu
auf einem Gitter von $\mathbb{C}$ für genügend viele $H$ und zeichnet entweder nur die betragsmässig größten $\mu$, oder zeichnet mehrere Schichten ein. Eine räumliche Veranschaulichung dieses Sachverhaltes findet man in Wanner (1987).
Wanner, Gerhard: "Order Stars and Stability", in "The State of the Art in Numerical Analysis", Proceedings of the joint IMA/SIAM conference held at the University of Birmingham, 14–18 April 1986, Edited by A. Iserles and M.J.R. Powell, Clarendon Press, Oxford, 1987, 451—471
Für das verallgemeinerte Eigenwertproblem empfehlen sich die Unterprogramme
cqzhes()
, cqzval()
und cqzvec()
von
Burton S. Garbow (1978), und
Garbow (1984), welche eine Implementierung des
QZ-Algorithmuses von Moler/Stewart (1973)
darstellen.
Aufgrund der Reellität der Matrixkoeffizienten, also
ist das Stabilitätsgebiet stets
achsensymmetrisch zur reellen Achse $\mathbb{R}\subset\mathbb{C}$.
Die Eigenvektoren mittels cqzvec()
werden für obige Stabilitätsüberlegungen nicht benötigt.
Bibliographisch: Cleve Moler und G.W. "Pete" Stewart. Verfahrensbeschreibung: An Algorithm for the Generalized Matrix Eigenvalue Problem Ax = Lambda Bx. Ferner Burton S. Garbow.
4. Bei dem, wie schon oben angegebenen charakteristischen Polynom
erhält man für immer mehr dominierendes $H$ schließlich im Grenzfalle das Polynom $\det Q(\mu,\infty)$ zu
in etwas nachlässiger, aber sehr suggestiver Schreibweise. Es ist hier interessant zu vermerken, daß jetzt $A_{\infty}[\alpha]$- und $S_{\infty}[\delta]$-Stabilität zueinander äquivalent sind, für geignete $\alpha$ und $\delta$. Dies ist ein weitergehendes Ergebnis, als man es von der $A[\alpha]$- und $S[\delta]$-Stabilität her kannte.
5. Um nun zu überprüfen ob ein Verfahren sogar $A_{\infty}[\alpha]$-stabil, bzw. $S_{\infty}[\delta]$-stabil ist, erweitert man die 1.te Bedingung im Test A zu einer neuen Bedingung (1) und erhält damit den
6. Test B: Ein Verfahren ist $A_\infty^r[\alpha]$-stabil, bzw. $S_\infty^r[\delta]$-stabil genau dann, wenn:
7. Eine Möglichkeit die Bedingung (1) bei Test B zu erfüllen ist, wie es u.a. Gear (1968) vorgeschlagen hat, daß man alle Nullstellen $\mu$ von $\det Q(\mu,\infty)=0$ zu Null setzt. Dies ist z.B. der Fall, wenn man fordert:
Eine einfache, notwendige und hinreichende Bedingung wird später angegeben. Von der Sicht des Speicherplatzes, des Rechenbedarfs und der programmiermässigen Einfachheit, sind diese Nullen besonders vorteilhaft einsetzbar. Diese Vorteile werden in dem Programm TENDLER genutzt. Das Programm ODIOUS kann diese Vorteile natürlich nicht nutzen, aufgrund $B_i\ne0$, für $i=0,\ldots,\kappa$.
Zusammen mit der Bedingung (LMSV) ergibt nun die Bedingung (NULL), daß
Nun enthält jede Stufe des Zykluses der Ordnung $p=k$, die der Bedingung (LMSV) und (Null) genügt, noch $\min\{i,k+1\}$ Parameter. Jede Stufe kann aber noch skaliert werden, ohne die Stabilitätseigenschaften zu verändern, d.h. von jeder Stufe muß man noch einen freien Parameter abziehen. Es bleiben dann $\min\{i-1,k\}$ völlig frei bestimmbare Parameter für die $i$-te Stufe, also ist
Wählt man die $\beta_{ij}$ für $0<j<i$, alle zu Null, so erhält man wieder die BDF. In diesem Sinne kann man die zyklischen Formeln von J.M. Tendler als echte Verallgemeinerung der einstufigen BDF auffassen. In der Tat unterscheiden sich die Formeln auch nicht allzu sehr in ihren Eigenschaften und in ihren Ergebnissen, die sie liefern, insbesondere ist bei den zyklischen Verfahren von Tendler die erste Stufe auch immer gleich der entsprechenden BDF.
8. Die sämtlichen bisherigen Stabilitätsdefinitionen gehören zur “Begriffswelt” der absoluten Stabilität, nicht jedoch zur relativen Stabilität. Für den Begriff der relativen Stabilität benötigt man die folgenden Überlegungen. Sei
Dann ist
Sei $\mu=1$ einfache Nullstelle von
Da dann $\mu=1$ separiert ist, folgt aufgrund der stetigen Abhängigkeit der Wurzeln für genügend kleine $h$
das ist die Fortpflanzung der Separiertheit für genügend kleine $h$. Jetzt muß aber
gelten, damit $Q(\mu,H)={\cal O}(h^{p+1})$ für $\mu=e^H$, aufgrund der Konsistenz von $L$.
9. Definition: Ein Matrixpolynom
heißt konsistent mit mindestens der Konsistenzordnung $p$ genau dann, wenn die formale Ersetzung der Skalare $\mu^i$ ($i=0,\ldots,k$) durch die Vektoren
($\mu=e^H$) dann liefert
Das Matrixpolynom $Q(\mu,H)$ ist konsistent mit der genauen Ordnung $\min_{i=1}^\ell p_i$. Gilt $p_i\ge1$ ($\forall i$), so heißt das Matrixpolynom konsistent. Möchte man die besondere Form
besonders betonen, so spricht man von polynomial-konsistent.
Die obige Definition verallgemeinert $\rho(e^h)-h\sigma(e^h)={\cal O}(h^{p+1})$ auf $\ell$-Mehrstufigkeit mit $m$-facher Ableitung für äquidistante Gitter. Die Konsistenz nach obiger Festlegung ist eine Eigenschaft des Matrixpolynomes. Sie vererbt sich sinngemäß auf das Verfahren, welches dem Matrixpolynom i.d.R. zugrunde liegt.
Zur besseren Unterscheidung zwischen absoluter und relativer Stabilität seien beide einander gegenübergestellt.
10. Definition: (10.1) Ein Matrixpolynom $Q\mu,H)$ heißt absolut-stabil für ein $H_0$ genau dann, wenn für die sämtlichen Nullstellen $\mu$ von $\det Q(\mu,H_0)=0$ gilt: $\mathopen|\mu\mathclose|<1$.
(10.2) Die Menge ${\cal Y}_1$ derjenigen $H$, für die das Matrixpolynom $Q(\mu,H)$ absolut-stabil ist, also
heißt Menge der absoluten Stabilität.
Offensichtlich gilt: Enthält ${\cal Y}_1$ die offene, linke komplexe Halbebene $\mathbb{C}^-$, so ist das Verfahren $A$-stabil.
11. Definition: (11.1) Ein konsistentes Matrixpolynom $Q(\mu,H)$, für welches $\mu=1$ einfache Nullstelle von $\det Q(\mu,0)=0$ ist, heißt relativ-stabil für ein $H_0$ genau dann, wenn gilt
$\mu_1(H)$ ist also die zu $\mu_1(0)=1$ gehörende Nullstelle, wobei $Q(\mu_i(H),H)=0$ ($i\ge1$). Hat $\det Q(\mu,H)$ in $\mu$ nur den Grad 1, so sei das Matrixpolynom $Q(\mu,H)$ relativ-stabil.
(11.2) Die Menge $\cal Z$ derjenigen $H$, für die das Matrixpolynom $Q(\mu,H)$ relativ-stabil ist, also
heißt Menge der relativen Stabilität.
Im Falle eines linearen Differentialgleichungssystems $\dot y=Ay\in\mathbb{R}^n$ mit diagonalähnlicher Matrix $A$ entstehen bei Transformation $n$ skalare Differentialgleichungen. Eigenwerte von $A$ mit stark negativen Realteil, also $\mathop{\rm Re}\nolimits \lambda\ll0$, führen zu schnell abklingenden Lösungen. In diesem Falle zu forden, daß die Nebenwurzeln $\mu_i(H)$ die Hauptwurzel $\mu_1(H)$ nicht betragsmässig übersteigen ist nur wichtig, wenn man an sehr hoher relativer Genauigkeit interessiert ist, sonst allerdings nicht. Wesentlicher ist in diesem Falle die absolute Stabilität. Man ist an Exponentialtermen nur so lange interessiert, wie sie einen im Rahmen der Rechengenauigkeit signifikanten Einfluß auf das Gesamtergebnis besitzen. Spielen stark abklingende Terme keine Rolle mehr, so genügt absolute Stabilität. Dies motiviert die
12. Definition: (12.1) Ein konsistentes Matrixpolynom $Q\mu,H)$ heißt $LR$-$S[\delta]$-stabil genau dann, wenn es $S[\delta]$-stabil ist und das um den Ursprung angeordnete Rechteck
mit $a_1<0<a_2$, $b_1<0<b_2$ Teilmenge der Menge der relativen Stabilität ist.
(12.2) Analog definiert man $LR$-$S_\infty^r[\delta]$- und $LR$-$A_\infty^r[\alpha]$-Stabilität.
$LR$ soll an lokal-relativ erinnern. Die Festlegung auf ein Rechteck ist nicht wesentlich. Genauso gut hätte man eine Kreisscheibe, eine elliptische Scheibe, ein Hexagon, etc. nehmen können, solange es um den Ursprung angeordnet ist. Je umfassender $\cal R$ ist, desto günstiger. Die Begrenzung in $b_1$ und $b_2$ rührt daher, daß Exponentialterme mit stark imaginären Anteil, aber geringen negativen Realteil als Exponent, noch mehr Eigenschaften benötigen als relative Stabilität. Für Differentialgleichungen mit periodischen Lösungen sind gesonderte Formeln besser geeignet.
Abweichend von der Definition in Gear (1968) und auch abweichend von der Definition in Werner/Arndt (1986), aber völlig sinnentsprechend wie in Tendler/Bickart/Picel (1978), in Bickart/Picel (1973) und in Albrecht (1979), sei wie folgt definiert.
13. Definition: Ein konsistentes Matrixpolynom $Q(\mu,H)$, welches einer oder mehrerer der Bedingungen der $A[\alpha]$-, $S[\delta]$-, oder $LR$-$A[\alpha]$-, $LR$-$S[\delta]$-Stabilität genügt, heißt steif-stabil.
Bibliographisch: C. William Gear (1935—2022), Theodore A. Bickart (1936—2023), obituary, Werner, Helmut (1931--1985), Arndt, Herbert, Gear, Charles William (1935--2022), Peter Albrecht.
Bickart, Theodore A. und Picel, Zdenek: "High Order Stiffly Stable Composite Multistep Methods for Numerical Integration of Stiff Differential Equations", BIT, Vol 13, 1973, pp.272—286
A computer program for plotting both the Lambda and Zeta Loci was presented and described. Using an interactive version of this program new and efficient cyclic composite linear multistep methods of orders three through seven were obtained. $\ldots$
The test for stiff stability of a composite linear multistep method presented herein is entirely graphical. $\ldots$
Interactive communication was via a teletypewriter, the only device available for this purpose at the computer facility used.J.M. Tendler (1973)
1. In diesem Abschnitt wird darauf eingegangen, wie die in dem Programm TENDLER verwendeten Formeln, von Tendler (1973) entwickelt wurden. Neben der schon mehrfach erwähnten Dissertation von J.M. Tendler, findet man eine Darstellung der Parametrisierung von Verfahren in dem Aufsatz von Donelson/Hansen (1971). U.a. weitere Hinweise zur Konstruktion generell zyklischer Verfahren und auch steif-stabiler zyklischer Verfahren, einschließlich entsprechender Parametrisierungen, findet man in dem Buch von Albrecht (1979).
Die beiden Aufsätze von Mihelčić (1977), Mihelčić (1978), die Veröffentlichung von Mihelčić/Wingerath (1981), und die Disserattion von Tischer (1983), die Arbeit Tischer/Sacks-Davis (1983)](https://doi.org/10.1137/0904051) bzw. Tischer/Gupta (1985), liefern ebenfalls Aufschluß über die Gewinnung zyklischer, steif-stabiler Verfahren. Tischer/Gupta (1985) äußern sich dort mehr zu den Erfahrungen mit den von Tischer (1983)2 und Tischer/Sacks-Davis (1983)3 gewonnen Formeln, wobei auch weitere zyklische Formeln in die Bewertung mit eingeschlossen werden.
Die Dissertation von Tischer (1983) und die Arbeit von Tischer/Sacks-Davis (1983) geben sogar zweistufige $A_\infty^0$-stabile zyklische Verfahren an bis zur Ordnung $p\le4$. Über der Ordnung $p>4$ sind die weiterhin zweistufigen Zyklen noch $A_\infty^0[\alpha]$-stabil, mit $\alpha$=$86^\circ$, $76^\circ$, $57^\circ$, und $22^\circ$. Die Formeln erfüllen sogar noch zahlreiche weitere wünschenswerte Eigenschaften, allerdings haben sie auch gewisse Nachteile.
Bibliographisch. Matija (Miško) Mihelčić (1935—2011), Peter E. Tischer.
Matija Mihelčić: "Fast $A$-stabile Donelson-Hansensche zyklische Verfahren zur numerischen Integration von 'stiff'-Differentialgleichungssystemen", Angewandte Informatik, 1977, Vol 19, Heft 7, pp.299—305
Matija Mihelčić: "$A(\alpha)$-Stable Composite Multistep Methods of Order 5", Computing, Vol 20, 1978, pp.267—272
Matija Mihelčić und K. Wingerath: "$A(\alpha)$-stable Cyclic Composite Multistep Methods of Orders 6 and 7 for Numerical Integration of Stiff Ordinary Differential Equations", ZAMM, Band 61, 1981, pp.261—264
Tischer, Peter E.: "The Cyclic Use of Linear Multistep Formulas for the Solution of Stiff Differential Equations", Ph.D. Thesis, Department of Computer Science, Monash University, Clayton, Victoria, Australia, August 1983, x+180 S.
Tischer, Peter E. und Sacks-Davis, Ron: "A New Class of Cyclic Multistep Formulae for Stiff Systems", SIAM Journal on Scientific and Statistical Computing, Vol 4, No 4, December 1983, pp.733—747.
2. Für die gestellte Aufgabe zur Gewinnung neuerer und besserer Verfahren für die Integration steifer Differentialgleichungen ging Tendler (1973) wie folgt vor: Man entwerfe zyklische Formeln der Konvergenzordnung 1 bis 6, die Ordnung für Ordnung bessere Stabilitätseigenschaften besitzen als die BDF. Falls möglich sollten sogar Verfahren mit einer Ordnung höher als 6 entwickelt werden. Als Vergleichsmaßstab wurde der Widlund-$\alpha$-Winkel gewählt. Andere Kriterien spielten keine Rolle.
Die Bedingungen (Null) und (LMSV) an die Koeffizienten $\alpha_{ij}$ und $\beta_{ij}$, sorgen dafür, daß der Zyklus stets die folgende Form hat
Die BDF erster und zweiter Ordnung
sind beide $A_{\infty}^0[\alpha]$-stabil mit optimalen Widlund-Winkel von $\alpha=90^\circ$ und optimaler Widlund-Distanz $\delta=0$, sodaß damit eine weitere Verbesserung nicht mehr möglich ist, wenn man wie gesagt nur den Widlund-$\alpha$-Winkel als Vergleichsmaßstab nimmt. Diese beiden Verfahren werden daher auch für $p=1$ und entsprechend für $p=2$ in dem Programm TENDLER verwendet.
Die $i$ Parameter in der $i$-ten Stufe deuten darauf hin, daß $i$ linear unabhängige Formeln in geeigneter Kombination ausreichen, um ein neues Verfahren zu konstruieren. Für die Ordnungen $p=3$ und höher, wurde daher wie folgt die Suche nach besseren Formeln durchgeführt:
Beim ersten Schritt ging man wie folgt vor. Zuerst wurde eine Folge von $k+1$ linear unabhängigen Mehrschrittformeln aufgestellt, sodaß die $\beta$-Koeffizienten eine Diagonalmatrix bilden. Wegen der linearen Unabhängigkeit ist dies immer zu erreichen. Diese Diagonalform erleichtert das Generieren von Zyklen mit der Eigenschaft
Da nur Linearkombinationen von diesen Mehrschrittformeln gebildet werden, ist das Erfülltsein von (LMSV) ebenfalls sofort klar. Dann wurde für jedes $i=1,\ldots,\ell$ eine Linearkombination dieser Formeln berechnet um daraus die $i$-te Stufe des Zykluses zu bilden. Die Stufenzahl $\ell$ wurde versucht so klein wie möglich zu halten.
Um das Vorgehen zu illustrieren ein längeres Beispiel.
3. Beispiel: Es seien die $k+1=4$ linear unabhängigen Mehrschrittformeln $F1$ bis $F4$ der Konsistenzordnung 3 betrachtet:
Jede Zeile der Matrix ist dabei das entsprechende Mehrschrittverfahren, also die erste Zeile ist F1, die zweite ist F2 und so fort. Das Verfahren $F1$ ist implizit, während hingegen $F2$, $F3$ und $F4$ explizite Verfahren sind. Wie so häufig gilt auch hier, daß die einzelnen Stufen instabil sind, mit Ausnahme der ersten, welche gerade die BDF3 ist, mit den Nullstellen 1 und $0.3\overline{18}\pm 0.284i$. Die Nullstellen der zweiten “Zeile” liegen bei 1, $-2.686$ und $0.186$. Die dritte “Zeile” hat die Nullstellen 1, $5.372$ und $-0.372$ und schließlich die letzte vierte Zeile hat die Nullstellen 1 und $1.75\pm 1.561i$. Diese Instabilität der Stufen bzw. von Komponenten der Stufen, überträgt sich nicht automatisch auf den Gesamtzyklus. Die Stabilität des Gesamtzyklus wird getrennt überprüft.
Von diesem Arsenal an Formeln wurde nun der Zyklus für das Verfahren dritter Ordnung, wie folgt aufgebaut: Jede Stufe wurde als Linearkombination der $F1$ bis $F4$ erhalten, d.h. die $i$-te Stufe ist gleich
Um nun die Bedingung (NULL) zu erfüllen, muß offensichtlich $c_{ij}=0$ für $j>i$ gelten. Der Widlund-$\alpha$-Winkel wurde jetzt für die Werte maximiert:
Der so gebildete Zyklus der Ordnung $p=3$ kann daher wie folgt geschrieben werden:
Weil der Widlund-$\alpha$-Winkel grösser und damit besser als der entsprechende Winkel für BDF3 ausgefallen war, wurde der Zyklus akzeptiert. Die Formeln der Konvergenzordnung $p=4$ bis $p=7$ wurden auf genau die oben beschriebene Art und Weise erhalten. Daß bei diesem Beispiel die ersten beiden Stufen gleich sind, nämlich hier gleich BDF3, ist mehr oder minder Zufall. Mit der Bedingung $c_{ij}=0$ für $i>j$ hat dies nichts zu tun. Beim zyklischen Verfahren sechster Ordnung sind auch tatsächlich alle Stufen untereinander verschieden. Bei allen anderen Verfahren hingegen, außer eben bei $p=6$, sind die ersten beiden Stufen gleich und zwar gleich der entsprechenden BDF.
4. Es waren 3 Stufen nötig für die Verfahren 3.ter und 4.ter Ordnung und 4 Stufen für die Formeln 5.ter, 6.ter und 7.ter Ordnung. Die genauen Zahlenwerte für die Koeffizienten aller Zyklen werden später in einem Schema angegeben. Es sei angemerkt, daß immer die ersten beiden Stufen des $i$-ten Zykluses mit BDF$i$ beginnen. Dies gilt bei allen Verfahren, außer bei der Ordnung $p=6$. Dort ist es nur die 1.te Stufe.
5. Zum Vergleich seien einmal die Werte für den Widlund-$\alpha$-Winkel für die neuen zyklischen Mehrschrittverfahren, die in dem Programm TENDLER verwendet werden, mit denen der BDF in der untenstehenden Tabelle gegenübergestellt. Auch findet man die entsprechenden Werte für die Formeln, die in der Dissertation Tischer (1983), bzw. Tischer/Sacks-Davis (1983) entwickelt haben, unter der Spalte ODIOUS. BP73 bezeichnet hier die blockimpliziten Verfahren von Bickart/Picel (1973). Die BDF$i$, für alle $i\ge7$, sind nicht $D$-stabil, also natürlich erst recht nicht $A[\alpha]$- bzw. $S[\delta]$-stabil. Einen Beweis und alternative Beweisansätze findet man in dem Buch von Hairer/Wanner/Nørsett (1987) oder hier Hairer/Wanner (1983): On the Instability of the BDF Formulas.
Zyklische Verfahren über der Ordnung $p=7$ werden in dem Programm TENDLER nicht verwendet. Die Programme LSODE, LSODA und LSODAR benutzen die BDF lediglich bis zur Ordnung $p=5$. Rechts daneben ist auch eine Gegenüberstellung der $\delta$-Werte bei der $S_{\infty}[\delta]$-Stabilität.
Widlund-$\alpha$-Winkel
p | TENDLER | BDF | ODIOUS | BP73 |
---|---|---|---|---|
1 | 90.00 | 90.00 | 90.00 | 90.0 |
2 | 90.00 | 90.00 | 90.00 | 90.0 |
3 | 89.43 | 86.03 | 90.00 | 88.9 |
4 | 80.88 | 73.35 | 90.00 | 87.7 |
5 | 77.48 | 51.84 | 86.64 | 85.5 |
6 | 63.25 | 17.84 | 76.32 | 82.7 |
7 | 33.53 | * | 57.66 | 79.5 |
8 | * | * | 22.15 | 76.0 |
9 | * | * | * | 72.5 |
10 | * | * | * | 69.6 |
Widlund-Distanz $\delta$
p | TENDLER | BDF |
---|---|---|
1 | 0 | 0 |
2 | 0 | 0 |
3 | 0.0048 | 0.083 |
4 | 0.24 | 0.67 |
5 | 1.4 | 2.3 |
6 | 2.9 | 6.1 |
7 | 10.2 | * |
Die Widlund-Winkel der BDF können exakt bestimmt werden: Gander/Wanner (2020): Exact BDF stability angles with maple und Akrivis/Katsoprinakis (2019): Maximum angles of $A(\vartheta)$-stability of backward difference formulae, PDF.
6. Die besseren Stabilitätseigenschaften, die sich durch den größeren Widlund-$\alpha$-Winkel bemerkbar machen, erlauben nun einem Programm, welches die hergeleiteten Formeln benutzt, früher die Schrittweite zu erhöhen, da sie nicht durch Stabilitätsbeschränkungen verkleinert werden muß. Insbesondere für Differentialgleichungen, bei denen die Eigenwerte der Jacobimatrix nahe der imaginären Achse sind, sollten besser integriert werden können.
Das Suchverfahren nach steif-stabilen zyklischen Formeln wird beschrieben in der Dissertation von Tendler (1973). Dort wird auch ein Programm zur Berechnung des Widlund-$\alpha$-Winkels angegeben, basierend auf einem Polynomlöser. Das hier beschriebene Suchverfahren hängt von einem Programm zur Berechnung des Widlund-Winkels ab.
Man beachte, daß alle Verfahren interaktiv gefunden wurden:
“Probieren-gucken”, “probieren-gucken”, $\ldots$
Wenn also hier von “maximiert” gesprochen wird, ist damit gemeint,
daß durch Suchen, nicht jedoch kalkülmässig, in geschlossener Form,
eine Maximierung stattgefunden hat.
Sieht man einmal von grundsätzlichen Einstellungen ab, so kann man diesem
pragmatischen Ansatz seine Bedeutung nicht absprechen.
Es wurde auch versucht ein Verfahren der Konvergenzordnung $p=8$ zu erhalten, welches steif-stabil ist, doch gelang dies nicht. Dies führt Tendler (1973) darauf zurück, daß eben nur interaktiv gesucht wurde. Eine andere Möglichkeit wird darin gesehen, daß die Begrenzung der Anzahl der Stufen auf $\ell=4$ zu restriktiv gewesen sei.
Testläufe haben ergeben, daß die Auffindung von zyklischen Verfahren mit
mehr als 4 Stufen durchaus sinnvoll sein kann.
Oder m.a.W., die Erfahrungen mit dem Programm TENDLER deuten darauf hin,
daß Zyklen mit mehr als 4 Stufen nicht krass den praktischen Bedürfnissen
widerstreben.
Ob diese Erfahrung grundsätzlich für geeignete vielstufige Zyklen sich
bestätigen könnte, kann selbstverständlich nicht pauschal postuliert werden.
Ein Einbau solcher Formeln in das Programm TENDLER zumindestens wäre völlig
unproblematisch.
Da jede Stufe Element einer ringzyklischen Liste ist, macht es keinen
Aufwand hier eine weiteres Ringelement einzufügen.
Zudem ist die Konstante 4 als Programmkonstante MAXYRING
abgelegt.
Außer Konstantenänderungen sind keine Änderungen nötig, insbesondere keine algorithmischen, vorausgesetzt es handelt sich um echte Verallgemeinerungen der BDF, wie es beispielsweise die Tendlerschen Zyklen darstellen. Man beachte hierzu die Ausführungen bzgl. der Prädiktorformeln. Zu berücksichtigen ist jedoch, daß der Speicherplatzbedarf dann größer wird, allerdings nur in linearen Termen der Dimension $n$ der Differentialgleichung. Dies nur, falls die Ordnung 7 übersteigt. Dies liegt an der Notwendigkeit zur Bildung rückwärtsgenommener Differenzen bis zur Ordnung $p+1$ in dem Programm TENDLER.
1. Die Bestandteile der zyklischen Formeln von Tendler (1973) lauten:
Die in jeder Tabelle ganz rechts stehende Formel, ist immer die BDF. Die restlichen Formeln sind explizite Verfahren. Alle unten aufgeführten Formeln benötigen $k$ Startwerte und besitzen die Konsistenzordnung $p=k$. Die im folgenden angegebenen Basisformeln sind also ersteinmal nur für die Konstruktion von Zyklen der Konvergenzordnung $p=k$ geeignet. Wünscht man andere Konvergenzordnungen, bei anderer Schrittzahl, so gelten die Überlegungen jedoch entsprechend. Berücksichtigt man den Effekt der annullierten Dominanz, so sind die angegebenen Basisformeln auch für zyklische Verfahren der Konvergenzordnung $p=k+1$ geeignet. Unter den Verfahren befindet sich stets der entsprechende, gänzlich unskalierte Fehlerfaktor, der berechnet wurde nach der Vorschrift
Die Basisformeln im einzelnen.
2. Die Werte zur Bildung der Linearkombination der zyklischen Formeln von Tendler lauten in der Reihenfolge $p=3,4,5$ und $p=6,7$ wie folgend:
Es folgt die Definition von Äquilibrierungsmaßen für eine konsistente Formel $F$ der Form
1. Definition: Eine Formel $F$ hat
(1) Gaußsches-$\alpha$-Äquilibrierungsmaß
(2) Gaußsches-$\beta$-Äquilibrierungsmaß $\mu_\beta^G := \lVert F\rVert_2^2/\beta_\kappa^2$,
(3) Gauß-Henrici-Äquilibrierungsmaß $\mu_H^G := \lVert F\rVert_2^2 / (\sigma(1))^2$,
(4) Tschebyscheff-$\alpha$-Äquilibrierungsmaß
(5) Tschebyscheff-$\beta$-Äquilibrierungsmaß $\mu_\beta^T := \lVert F\rVert_\infty / \lVert\beta_\kappa\rVert$,
(6) Tschebyscheff-Henrici-Äquilibrierungsmaß $\mu_H^T := \lVert F\rVert_\infty / \lVert\sigma(1)\rVert$.
Sollten Zyklen mit geringem Äquilibrierungsmaß in den führenden Koeffizienten stark flukturieren, so kann man daran denken, bei der Suche nach günstigen Formeln die folgende Deviation der führenden Koeffizienten klein zu halten. Sei $\gamma:=\beta_{ii}/\alpha_{ii}$. Es gibt $({\ell\atop2})$ zyklusinterne Deviationen. Man begrenzt dann beispielsweise die Gaußsche Deviation der Koeffizienten, nämlich $\sum_{i<j}(\gamma_i-\gamma_j)^2$.
2. Beispiel: Sei $\ell=3$. Es gibt ${\ell\choose2} = {3\choose2}=3$ Deviationen. Man fordert Beschränktheit, oder in besonderen Situationen auch Minimalität, durch
Es sollen nun einige Eigenschaften der Äquilibrierungsmaße hergeleitet werden. Es handelt sich hier um direkt aus der Definition herleitbare Aussagen.
3. Satz: Es gelten
(1) $\mu_\beta^T\ge1$, $\mu_\alpha^T\ge1$. Die Ungleichungen sind scharf, beispielsweise für die beiden Euler-Verfahren
(2) $\mu_\alpha^G>1$, $\mu_\beta^G>1$.
(3) $\mu_H^T$ und $\mu_H^G$ sind stets definiert für $D$-stabile Verfahren, wegen $\rho'(1)=\sigma(1)\ne0$, da 1 keine mehrfache Nullstelle sein darf.
Die $\alpha$-Äquilibrierungsmaße treten vornehmlich im Zusammenhang mit expliziten gewöhnlichen Differentialgleichungen der Form $\dot y=f(t,y)$ auf. Die $\beta$-Äquilibrierungsmaße treten bei DAE auf, die man mit linearen Mehrschrittverfahren löst, und die Henrici-Äquilibrierungsmaße treten gehäuft im Zusammenhang mit Einbein-Verfahren auf. Man ist grundsätzlich, ersteinmal ohne Einschränkungen, an möglichst kleinen Äquilibrierungsmaßen interessiert. Bei Quadraturformeln ist aus Erfahrung bekannt, daß große Äquilibrierungsmaße ungünstig sind, da diese Quadraturformeln zu Oszillationen neigen. Jedoch bedeuten kleine Äquilibrierungsmaße nicht auch automatisch kleine Fehlerkonstanten. Gegenbeispiele anhand numerisch gewonnener Formeln sind bekannt.
]]>I do not use cookies or any JavaScript libraries to track users. Instead I only analyze the web-server logs using a Perl script. To doublecheck the accuracy of this Perl script I occasionally inserted analytics code from
These analytics provider used cookies, and JavaScript. Therefore my site was not cookie-free, when I employed them.
Nowadays I no longer employ those bulky JavaScript libraries. I resort to the web-server logfile. There are a number of advantages and disadvantages.
Advantages:
Disadvantages:
accesslogFilter
blogurlcnt
Below are the statistics for the year 2024. Some key figures using filtered data.
pagefind-ui.js
, i.e., someone not loading this JavaScript is in many cases not a real readerBelow is the output of the Perl script blogurlcnt
.
The generated output uses JavaScript DataTables. DataTables allow easy filtering and sorting within the table.
Combine that with Apache ECharts to show histograms to get a visual representation of the development of various URLs over time.
Year | Month | Week |
---|---|---|
5. AUR package. I maintain an AUR package: XHProf.
]]>Université Paris Cité, CNRS, IRIF, Paris, France
We present a $\mathsf{BQSPACE}(O(\log n))$-procedure to count $st$-paths on directed graphs for which we are promised that there are at most polynomially many paths starting in $s$ and polynomially many paths ending in $t$. For comparison, the best known classical upper bound in this case just to decide $st$-connectivity is $\mathsf{DSPACE}(O(\log^2 n/ \log \log n))$. The result establishes a new relationship between $\mathsf{BQL}$ and unambiguity and fewness subclasses of $\mathsf{NL}$. Further, some preprocessing in our approach also allows us to verify whether there are at most polynomially many paths between any two nodes in $\mathsf{BQSPACE}(O(\log n))$. This yields the first natural candidate for a language problem separating $\mathsf{BQL}$ from $\mathsf{L}$ and $\mathsf{BPL}$. Until now, all candidates separating these classes were promise problems.
Graph connectivity is a central problem in computational complexity theory, and it is of particular importance in the space-bounded setting. Given a graph $G$ and two vertices $s$ and $t$, the task is to decide whether there is a path from $s$ to $t$. For undirected graphs the problem is denoted as $\mathrm{USTCON}$. Aleliunas, Karp, Lipton, Lovász and Rackoff [AKL+79] showed that doing a random walk for a polynomial number of steps can solve it in randomized logspace, $\mathsf{RL}$. After a long line of work, Reingold [Rei05] was able to derandomize the result and showed that the problem is already contained in deterministic logspace, $\def\L{\mathsf{L}}\L$, and is in fact complete for that class. In the directed graph setting the problem is denoted as $\mathrm{STCON}$, and it is complete for non-deterministic logspace, $\mathsf{NL}$. The best known deterministic algorithm for $\mathrm{STCON}$ in terms of space complexity is due to Savitch [Sav70] and runs in space $O(\log^2 n)$. We have the following well-known inclusions
where $\mathsf{DET}$, introduced by Cook [Coo85], is the class of languages that are $\mathsf{NC}^1$ Turing reducible to the computation of the determinant of an integer matrix and $\mathsf{L}^2$ is the class of languages decidable in deterministic space $O(\log^2 n)$. We refer to [AB06] for further details on reductions and basic complexity classes.
The most studied quantum space-bounded complexity class is bounded error quantum logspace, denoted $\mathsf{BQL}$. This is the class of languages decided in $\mathsf{BQSPACE}(O(\log n))$, i.e., decided by a quantum Turing machine with error $1/3$ running in space $O(\log n)$ and time $2^{O(\log n)}$. The quantum Turing machine has unrestricted access to the input on a classical input tape and can write on a uni-directional output tape which does not count towards the space complexity. The class $\mathsf{BQL}$ lies in between $\mathsf{RL}$ and $\mathsf{DET}$. In fact, it was recently shown by Fefferman and Remscrim [FR21] that certain restricted versions of the standard $\mathsf{DET}$-complete matrix problems are complete for $\mathsf{prBQL}$, where $\mathsf{prBQL}$ is the promise version of $\mathsf{BQL}$, i.e. the class of promise problems decided in $\mathsf{BQSPACE}(O(\log n))$. This extended the earlier work of Ta-Shma [Ta-13], who showed how to invert well-conditioned matrices in $\mathsf{BQSPACE}(O(\log n))$ building on the original idea of Harrow, Hassidim and Lloyd [HHL09]. We restate two of Ta-Shma's main results:
The first result above directly implies a $\mathsf{BQL}$-procedure for deciding $\mathrm{USTCON}$ (alternatively, this follows from the containment $\mathsf{RL}\subseteq \mathsf{BQL}$). To see this, note that (i) $\mathrm{USTCON}$ can be reduced to counting the number of connected components, (ii) the dimension of the kernel of the random walk Laplacian $I-P$ is equal to the number of connected components, and (iii) for undirected graphs the spectral gap of $I-P$, that is its smallest non-zero eigenvalue, is inverse polynomially bounded from zero. Here $I$ is the identity and $P$ is the transition matrix of a random walk. This ties to the fact that a random walk on an undirected graph takes polynomial time to traverse the graph (see, e.g., Chapter 12 in [LPW08]). Unfortunately, for directed graphs the situation is more complicated. Importantly, the smallest non-zero singular value of the random walk Laplacian can be inverse exponentially small, and similarly the time it takes a random walk to find connected nodes can be exponential. Hence, it is not obvious how Ta-Shma's results should be of any help in this setting.
Somewhat surprisingly, we show that by analyzing a different matrix which we call the counting Laplacian $L = I-A$ we can use Ta-Shma's second result to solve instances of $\mathrm{STCON}$ in $\mathsf{BQSPACE}(O(\log n))$ that seem hard classically. Here $A$ denotes the adjacency matrix of a graph. While the random walk Laplacian is spectrally well-behaved if a random walk is efficient, we find that the counting Laplacian is spectrally well-behaved if the underlying graph is acyclic and contains only few paths. We remark that the number of paths in a graph can be totally unrelated to the success probability of a random walk finding specific nodes. Even if there exist very few paths, it can happen that a random walk has an extreme bias to only pick paths we are not interested in. Consider for instance the following graph:
The number of paths between any two nodes is at most one. Nonetheless, a random walk starting at node $1$ only has probability $1/2^{n-1}$ to reach node $2n$.
Remark: There does exist a folklore algorithm running in $\mathsf{DSPACE}(O(\log n))$ for solving $\mathrm{STCON}$ on this graph, and directed trees more generally, as mentioned in, e.g., [kannan2008stcon]. The algorithm builds on a divide-and-conquer strategy that is specifically tailored to these graphs.
Given a directed graph $G=(V,E)$ with nodes $i,j\in V$ let us denote by $N(i,j)$ the number of paths from $i$ to $j$. By a path from $i$ to $j$ we mean a sequence of edges $(e_1,\ldots,e_k)$ which joins a sequence of nodes $(v_0,\ldots,v_k)$ such that $e_i = (v_{i-1},v_i)$ for all $i\in [k]$.
Remark: Some authors call this a walk and disallow a path to visit any vertex more than once. We follow [AL98,kannan2008stcon] in our definition. By convention we also count the empty sequence as a path from any node to itself such that $N(i,i)\geq 1$ for all $i\in V$.
As our first result, and as a primer for the rest of the paper, we show that we can count the number of $st$-paths on directed graphs for which there are at most polynomially many paths between any two nodes in $\mathsf{BQSPACE}(O(\log n))$. In particular, this allows to decide $\mathrm{STCON}$ on such graphs.
Theorem 1.1. Fix a polynomial $p:\mathbb{N} \rightarrow \mathbb{N}$. Let $G$ be a directed graph with $|V(G)|=n$ nodes such that
There is an algorithm running in $\mathsf{BQSPACE}(O(\log n))$ that, given access to the adjacency matrix $A$ of $G$ and $s,t\in V(G)$, returns the number of paths from $s$ to $t$.
Proof: Note that $A^k(i,j)$ is equal to the number of paths of length $k$ from node $i$ to node $j$. Since that number is finite for all pairs of nodes by assumption, we find that the graph is acyclic. In other words, $A$ is nilpotent, i.e., $A^{n}=0$. As a consequence we obtain that the inverse of the counting Laplacian exists and is equal to
Clearly, its entries simply count the total number of paths from $i$ to $j$, i.e. $L^{-1}(i,j) = N(i,j)$. By assumption, we thus have
Now observe that the $\max$-norm of a matrix can be used to bound its spectral norm. More precisely, we have that
Using also that $| L |_{\max} = 1$, we find bounds for the largest and smallest singular value of $L$,
Thus, the counting Laplacian is poly-conditioned and we can apply Ta-Shma's matrix inversion algorithm, the second restated result above, to approximate entry $L^{-1}(s,t) = N(s,t)$ up to additive error $1/3$ in $\mathsf{BQSPACE}(O(\log n))$. Rounding to the closest integer gives the number of paths from $s$ to $t$. ☐
The proof of theorem 1.1 uses a reduction of summing matrix powers to matrix inversion. The idea for this is well-known, and appeared in this context in early work by Cook, and more recently in for instance FR21. Though, to the best of our knowledge, no study of the implications to $\mathrm{STCON}$ has been made yet.
In section 3 we push the algorithmic idea of theorem 1.1 further by doing a more fine-grained analysis of the counting Laplacian's singular values and singular vectors. We show that we can already count $st$-paths in $\mathsf{BQSPACE}(O(\log n))$ on directed graphs for which only the number of paths starting from $s$ and the number of paths ending in $t$ are polynomially bounded. We state the formal result here.
Theorem 1.2. Fix a polynomial $p: \mathbb{N} \rightarrow \mathbb{N}$. Let $G$ be a directed graph with $|V(G)|=n$ nodes such that
There is an algorithm running in $\mathsf{BQSPACE}(O(\log n))$ that, given access to the adjacency matrix $A$ of $G$ and $s,t\in V(G)$, returns the number of paths from $s$ to $t$.
Classically (deterministically or randomly), the best known space bound just to decide $\mathrm{STCON}$ on graphs promised to satisfy a polynomial bound on the number of paths between any two nodes as in theorem 1.1 or only on the number of paths starting from $s$ and on the number of paths ending in $t$ as in theorem 1.2 is $\mathsf{DSPACE}(O(\log^2(n)/\log\log(n)))$ [AL98,GSTV11]. Alternatively, as noticed in [Lan97,BJLR91] we can also solve such $\mathrm{STCON}$ instances simulatenously in deterministic polynomial time and space $O(\log^2 n)$. We elaborate on these bounds in the next section.
Previous works studied restrictions on the path count in connection to "unambiguity" of configuration graphs of space-bounded Turing machines. The notion of unambiguity was introduced to interpolate between determinism and non-determinism, and gives rise to complexity classes between $\L$ and $\mathsf{NL}$. We formally introduce these classes in section 2. As a direct consequence of theorem 1.1 we obtain:
Corollary 1.3. $\mathsf{StrongFewL} \subseteq \mathsf{BQL}$
Where $\mathsf{StrongFewL}$ denotes the class of languages which are decidable by an $\mathsf{NL}$-Turing machine whose configuration graphs for all inputs are strongly-few, that is graphs for which there are at most polynomially many paths between any two nodes. Since $\mathsf{StrongFewL}$ is not known to lie in $\mathsf{BPL}$, this already implies the existence of a language in $\mathsf{BQL}$ not known to lie in $\mathsf{BPL}$. However, we can obtain an explicit language by doing some preprocessing in the algorithm of theorem 1.1: we can actually check in $\mathsf{BQSPACE}(O(\log n))$ whether a given graph is strongly-few. Unfortunately, we see no way to do the same for the weaker promise of theorem 1.2.
We obtain the subsequent language containment (notably, the containment of this language in $\mathsf{StrongFewL}$ is not known).
Theorem 1.4. The language \begin{align*} \mathrm{STCON}_{\mathrm{sf}} = { \langle G,s,t,1^k\rangle \text{ }|\text{ }\forall i,j\in V(G): N(i,j)\leq k \text{ and } N(s,t) \geq 1 } \end{align*} is contained in $\mathsf{BQL}$.
These seem to be the first examples of languages in $\mathsf{BQL}$ not known to lie in $\L$ or $\mathsf{BPL}$. As far as we are aware, before this work only promise problems were known that lie in $\mathsf{prBQL}$ but which are potentially not contained in $\mathsf{prBPL}$ [Ta-13,FL18,FR21,GLW23].
We now summarize briefly what is known classically. A language similar to $\mathrm{STCON}_{\mathrm{sf}}$, namely
has been studied before. It was first introduced by Lange [Lan97] who showed that it is complete for $\mathsf{ReachUL}$, which is the class of languages decidable by an $\mathsf{NL}$-Turing machine whose configuration graphs for all inputs are reach-unambiguous, meaning that there is a unique computation path from the start configuration to any reachable configuration.
Remark: Note that the $\mathsf{ReachUL}$-hardness of $\mathrm{STCON}_{\mathrm{ru}}$ is trivial but the completeness is not. This is because the uniqueness in the definition of the complexity class is used as a restriction on the machine, while it is used as an acceptance criterion in the definition of the language.
Further, it was noticed in [Lan97, BJLR91] that $\mathsf{ReachUL}$ is contained in $\mathsf{SC}^2$, which is the class of languages decidable simulatenously in deterministic polynomial time and space $O(\log n)$. Additionally, Allender and Lange [AL98] found that $\mathrm{STCON}$ on graphs promised to be reach-unambiguous is solvable in deterministic space $O(\log^2(n)/ \log\log(n))$ implying
In particular, these results put $\mathrm{STCON}_{\mathrm{ru}}$ in $\mathsf{SC}^2$ and in $\mathsf{DSPACE}(O(\log^2(n)/ \log\log(n)))$. Also, more recently Garvin, Stolee, Tewari and Vinodchandran [GSTV11] proved that $\mathsf{ReachUL}$ is equal to $\mathsf{ReachFewL}$, where $\mathsf{ReachFewL}$ is the class of languages decidable by an $\mathsf{NL}$-Turing machine whose configuration graphs for all inputs are reach-few, i.e., they have at most polynomially many computation paths from its start configuration to any reachable configuration. We thus have \begin{align*} \mathsf{StrongFewL} \subseteq \mathsf{ReachFewL} = \mathsf{ReachUL} \subseteq \mathsf{SC}^2, \quad \mathsf{DSPACE}(O(\log^2(n)/ \log \log(n))). \end{align*} Notably, while [GSTV11] implies a procedure to solve $\mathrm{STCON}$ on graphs promised to be reach-few in $\mathsf{DSPACE}(O(\log^2(n) / \log \log(n)))$ (in particular, this includes the graphs from theorem 1.1 and 1.2), this does not allow to verify whether a general graph satisfies this promise. Indeed, none of the upper bounds for $\mathrm{STCON}_{\mathrm{ru}}$ directly carry over to $\mathrm{STCON}_{\mathrm{sf}}$, for which the best known classical upper bound to date seems to be $\mathsf{DET}$.
Summarizing, we show that in quantum logspace we can count $st$-paths on graphs for which even solving $st$-connectivity is not known to be possible in classical (deterministic or randomized) logspace. Further, we obtain the first (non-promise) language in $\mathsf{BQL}$ not known to lie in $\mathsf{BPL}$. Our work also yields a number of open questions.
An obvious first question is whether $\mathrm{STCON}_{\mathrm{sf}}$ really separates $\mathsf{BQL}$ and $\mathsf{BPL}$. A first step towards answering this might be tackling the related question, whether we can carry over some of the known upper bounds for $\mathrm{STCON}_{\mathrm{ru}}$ to $\mathrm{STCON}_{\mathrm{sf}}$. That is, is $\mathrm{STCON}_{\mathrm{sf}}$ also contained in $\mathsf{SC}^2$ or in $\mathsf{DSPACE}(O(\log^2(n)/\log\log(n)))$? Note that the known $\mathsf{prBQL}$-complete promise problems are not known to satisfy these upper bounds [Ta-13,FL18,FR21,GLW23].
Further, we wonder whether it is possible to improve the $O(\log^2(n)/ \log \log(n))$ space bound by Allender and Lange. In fact, Allender recently asked this in an article [All23] in which he reflects on some open problems he encountered throughout his career. Allender suspects that for the restricted case of strongly-unambiguous graphs, also called mangroves, for which the number of paths between any two nodes is bounded by one, there should exist an algorithm deciding $\mathrm{STCON}$ running in deterministic space $O(\log n)$. He even offers a $1000 reward for any improvement of their space bound, already for this restricted case. A dequantization of our results would thus yield some good pocket money.
Remark: Even if the dequantization were randomized, i.e. in $\mathsf{BPSPACE}(O(\log n))$, it would still imply a $\mathsf{DSPACE}(O(\log^{3/2} n))$ bound by the inclusion $\mathsf{BPSPACE}(O(\log n)) \subseteq \mathsf{DSPACE}(O(\log^{3/2} n))$ due to Saks and Zhou [SZ99].
Another natural question is whether in $\mathsf{BQSPACE}(O(\log n))$ we can solve $\mathrm{STCON}$ on graphs promised to be reach-few, where only the number of paths from $s$ is polynomially bounded. This relaxes our promise in theorem 1.2. Unfortunately, our current approach of using an effective pseudoinverse seems to require our stronger promise. More generally, we feel that a better understanding of the singular values and vectors of directed graph matrices will yield further insights into the utility of quantum space-bounded computation for solving problems on directed graphs.
Finally, the link between poly-conditionedness and bounds on the path count raises the question of whether some variation of $\mathrm{STCON}$ could be proven complete for $\mathsf{BQL}$.
In 2.1 we introduce the Turing machine model of space-bounded computation and define the most important appearing language classes. We mainly follow the definitions from Ta-Shma [Ta-13] and refer to Section 2.2 in [FR21] for a discussion on the equivalence of the quantum Turing machine model and the quantum circuit model. In Complete (promise) problems we mention some complete problems of promise versions of the defined complexity classes.
A deterministic space-bounded Turing machine (DTM) acts according to a transition function $\delta$ on three semi-infinite tapes: A read-only tape where the input is stored, a read-and-write work tape and a uni-directional write-only tape for the output. The TMs computation time is defined as the number of transition steps it performs on an input, and its computation space is the number of used cells on the work tape, i.e. we do not count the number of cells on the input or output tape towards its computation space. DTMs with space-bound $s(n)$ for inputs of length $n$ give rise to $\mathsf{DSPACE}(s(n))$. We define $\L$ as the class of languages decided in $\mathsf{DSPACE}(O(\log n))$ and $\L^2$ as the class of languages decided in $\mathsf{DSPACE}(O(\log^2 n))$.
A non-deterministic Turing machine (NTM) is similar to a DTM except that it has two transition functions $\delta_0$ and $\delta_1$. At each step in time the machine non-deterministically chooses to apply either one of the two. It is said to accept an input if there is a sequence of these choices so that it reaches an accepting configuration and it is said to reject the input if there is no such sequence of choices. We obtain $\mathsf{NSPACE}(s(n))$. Further, $\mathsf{NL}$ is the class of languages decided in $\mathsf{NSPACE}(O(\log n))$.
A probabilistic space-bounded Turing machine (PTM) is again similar to a DTM but with the additional ability to toss random coins. This can be conveniently formulated by a fourth tape that is uni-directional, read-only and initialized with uniformly random bits at the start of the computation. It does not count towards the space. A language is said to be decided in $\mathsf{BPSPACE}_{a,b}(s(n))$ if there is a PTM running in space $s(n)$ and time $2^{O(s(n))}$ deciding it with completeness error $a\in[0,1]$ and soundness error $b\in[0,1]$, that is every input in the language is accepted with probability at least $a$ and every input not in the language is accepted with probability at most $b$.
Remark: The time bound does not follow from the space-bound and is equivalent to demanding that the TM absolutely halts for all possible assignments of the random coins tape.
Also, we write $\mathsf{BPSPACE}(s(n))$ for $\mathsf{BPSPACE}_{\frac{1}{3},\frac{2}{3}}(s(n))$ and $\mathsf{RSPACE}(s(n))$ for $\mathsf{BPSPACE}_{\frac{1}{2},0}(s(n))$. Further, $\mathsf{BPL}$ is the class of languages decided in $\mathsf{BPSPACE}(O(\log n))$ and $\mathsf{RL}$ is the class of languages decided in $\mathsf{RSPACE}(O(\log n))$.
A quantum space-bounded Turing machine (QTM) is a DTM with a fourth tape for quantum operations instead of a random coins tape. The transition function $\delta$ is still classically described. The tape cells of the quantum tape are qubits and initialized in state $\ket{0}$ at the start of the computation. There are two tape heads moving in both directions on the quantum tape. At each step during the computation, the machine can either perform a measurement to a projection in the standard basis or apply a gate from some universal gate set, say ${\mathrm{HAD},\mathrm{T},\mathrm{CNOT}}$, to the qubits below its tape heads. The used cells on the quantum tape count towards the computation space. As before, we say a language is decided in $\mathsf{BQSPACE}_{a,b}(s(n))$ if there is a QTM running in space $s(n)$ and time $2^{O(s(n))}$ deciding it with completeness error $a$ and soundness error $b$. Also, we mean $\mathsf{BQSPACE}_{\frac{2}{3},\frac{1}{3}}(s(n))$ by $\mathsf{BQSPACE}(s(n))$ if not mentioned otherwise. Finally, $\mathsf{BQL}$ is the class of languages decided in $\mathsf{BQSPACE}(O(\log n))$. The particular choice of the universal gate set does not affect the resulting complexity class due to the space-efficient version of the Solovay-Kitaev theorem of van Melkebeek and Watson [MW10]. The same applies to disallowing intermediate measurements, thanks to the space-efficient "deferred measurement principle" proven by Fefferman and Remscrim [FR21] building on the earlier work of Fefferman and Lin [FL18] (see also [GRZ21,GR21] for an alternative time- and space-efficient version of this principle). Also, the chosen success probability of $2/3$ can be amplified by sequentially repeating computations.
In this work we only consider language classes. In particular, we present the first candidate to distinguish $\mathsf{BQL}$ and $\mathsf{BPL}$. Note that candidates for distinguishing the promise versions of these classes, $\mathsf{prBQL}$ and $\mathsf{prBPL}$, are well-known. As mentioned in the introduction, Fefferman and Remscrim [FR21] showed that well-conditioned promise versions of all the standard $\mathsf{DET}$-complete matrix problems are complete for $\mathsf{prBQL}$. Let us highlight that matrix powering is one of these problems. Restricted to stochastic matrices it is easily seen to be complete for $\mathsf{prBPL}$, and restricted to matrices for which the largest singular values of its powers grow at most polynomially, it is complete for $\mathsf{prBQL}$. Indeed, this seems to indicate that powering the adjacency matrix of a graph, to which our approach in theorem 1.1 essentially boils down to, rather than powering the corresponding random walk matrix, truly exploits a quantum advantage. A similar distinction of $\mathsf{prBQL}$ and $\mathsf{prBPL}$ is expected from the approximation of the spectral gap of matrices. Doron, Sarid and Ta-Shma [DST17] showed that a promise decision version of this problem is $\mathsf{prBPL}$-complete for stochastic matrices while it is $\mathsf{prBQL}$-complete for general hermitian matrices. More recently, Le Gall, Liu and Wang [GLW23] presented another group of $\mathsf{prBQL}$-complete problems based on state testing.
In section 3.1 we introduce the notions of unambiguity and fewness in space-bounded computation. In section 3.2 we prove theorem 1.4 presenting a language in $\mathsf{BQL}$ not known to lie in $\mathsf{BPL}$.
The computation of a Turing machine can be viewed as a directed graph on configurations, and certain restrictions on the Turing machine translate to natural restrictions on the corresponding configuration graph. The notions of "unambiguity" and "fewness" of a Turing machine relate to the following graph-theoretic notions.
Definition 3.1. Let $G=(V,E)$ be a directed graph and let $k$ be an integer. Then $G$ is called
In the case of $k=1$, we simply say $G$ is unambiguous, reach-unambiguous or strongly unambiguous, respectively. Furthermore, a family of directed graphs ${G_x}_{x\in X}$ is called few-unambiguous with respect to nodes $s_x, t_x \in V(G_x)$, reach-few with respect to nodes $s_x \in V(G_x)$ or strongly-few if there exists a polynomial $p:\mathbb{N} \rightarrow \mathbb{N}$ such that each of the graphs $G_x$ from the family with $|V(G_x)|=n$ nodes is $p(n)$-unambiguous with respect to $s_x$ and $t_x$, $p(n)$-reach-unambiguous with respect to $s_x$ or $p(n)$-strongly unambiguous, respectively.
Consider the following examples of the above definition due to Lange [Lan97]:
The left graph is unambiguous with respect to nodes $1$ and $6$ but not reach-unambiguous with respect to node $1$, the middle one is reach-unambiguous with respect to node $1$ but not strongly unambiguous and the right one is strongly unambiguous.
These notions of unambiguity and fewness naturally give rise to six complexity classes between $\L$ and $\mathsf{NL}$. We follow the original paper of Buntrock, Jenner, Lange and Rossmanith [BJLR91] and define
as the classes of languages that are decidable by an $\mathsf{NL}$-Turing machine $M$ with unique accepting configuration whose family of configuration graphs for inputs $x\in\Sigma^*$, $\{G_{M,x}\}_{x\in\Sigma^*}$, satisfies the corresponding unambiguity or fewness restriction with respect to its starting and its accepting configuration.
Recall that theorem 1.1 implies the inclusion:
Corollary 1.3. $\mathsf{StrongFewL} \subseteq \mathsf{BQL}$
Putting this together with the trivial containments and the previously mentioned results in [BJLR91,Lan97,AL98,GSTV11], we obtain the following inclusion diagram to be read from left to right:
Observe that theorem 1.1 only shows that we can decide $st$-connectivity on directed graphs that are promised to be strongly-few. We now show that we can also check whether this promise holds in $\mathsf{BQSPACE}(O(\log n))$, i.e. we obtain a language containment. We restate the result mentioned in the introduction:
Theorem 1.4. The language \begin{align*} \mathrm{STCON}_{\mathrm{sf}} = \{ \langle G,s,t,1^k\rangle \text{ }|\text{ }\forall i,j\in V(G): N(i,j)\leq k \text{ and } N(s,t) \geq 1 \} \end{align*} is contained in $\mathsf{BQL}$.
The idea for proving the above theorem is to use Ta-Shma's spectrum approximation procedure to estimate the smallest singular value of the counting Laplacian $L$. In case the smallest singular value is below some threshold, this gives us a lower bound for $|L^{-1}|_{\max}$, the maximum number of paths, so that we can correctly reject graphs with too many paths. In case it is higher than the threshold, we know that $L$ is poly-conditioned and we can proceed as in theorem 1.1 to compute the number of paths between any pair of nodes exactly. Note that for this approach to work, the graph needs to be acyclic so that the counting Laplacian is invertible. We ensure this by first mapping the input graph to a layered graph that is guaranteed to be acyclic, similar as in [GSTV11]. We make the following definition.
Definition 3.2. Let $G=(V,E)$ be a directed graph with $|V|=n$ vertices. We define the layered graph $\mathrm{lay}(G)$ on the vertex set $V':=V\times{0,1,...,n}$ with two types of edges:
It is easy to see that the paths in the first $n$ layers of $\mathrm{lay}(G)$ directly correspond to paths of length less than $n$ in $G$. The last layer in $\mathrm{lay}(G)$ just serves as a catch basin for all paths of different lengths. Let us now prove the above theorem.
Proof of theorem 1.4. Let $\braket{G,s,t,1^k}$ be a given input graph instance with $|V(G)|=n$ nodes. Without loss of generality assume that $k\leq p(n)$ for some fixed polynomial $p:\mathbb{N}\rightarrow\mathbb{N}$. We first construct $\mathrm{lay}(G)$. Note that this is possible in $\mathsf{AC}^0$. We consider the counting Laplacian $L$ of $\mathrm{lay}(G)$ and run Ta-Shma's spectrum approximation algorithm (compare Theorem 5.2 in [Ta-13]) to approximate its singular values with error $\varepsilon=1/6$ and accuracy $\delta = 1/(2n\cdot k)$. If we obtain a singular value smaller than $\delta$, then we have with probability at least $5/6$,
which implies $\max_{i,j \in V(G)} N(i,j) \geq \max_{i,j\in V(\mathrm{lay}(G))} N(i,j) > k$. In this case we reject the input. Otherwise, if we do not obtain a singular value smaller than $\delta$, then we know with the same probability that the counting Laplacian of $\mathrm{lay}(G)$ is poly-conditioned. Thus, we can proceed as in theorem 1.1 and run Ta-Shma's matrix inversion algorithm to determine all entries of $L^{-1}$ with total error $\varepsilon'=1/6$ and accuracy $1/3$. For all $i\in V(G)$ we check in this way whether $L^{-1}((i,0),(i,n)) \geq 2$. If this is the case for some $i\in V(G)$, then there is a cycle in $G$ containing $i$, i.e. $N(i,i)=\infty$ in $G$, and we reject the input. Otherwise, we further check whether all entries of $L^{-1}$ are upper bounded by $k$ and if $L^{-1}((s,0),(t,n)) \geq 1$. The former implies $N(i,j)\leq k$ for all $i,j\in V(G)$, and the latter implies $N(s,t)\geq 1$ in $G.$ If both conditions are satisfied, we accept the input. Otherwise, we reject it. The total error probability of the algorithm is no higher than $\varepsilon + \varepsilon' = 1/3$. ☐
In this section we show how to push the algorithmic idea behind theorem 1.1 to obtain theorem 1.2, which shows how to count $st$-paths on graphs with a polynomial bound on the number of paths leaving $s$, and on the number of paths arriving in $t$, in $\mathsf{BQSPACE}(O(\log n))$. For this, we need the notion of an effective pseudoinverse, which we introduce in section 4.1. The proof of theorem 1.2 is in section 4.2.
A close look at Ta-Shma's matrix inversion algorithm shows that it can be easily altered to also handle ill-conditioned matrices as input and only invert them on their well-conditioned part. In order to appropriately state this observation we make the following definition.
Definition 4.1 Effective pseudoinverse. Let $M$ be an $n\times n$ matrix with singular value decomposition $M=\sum_{j=1}^n \sigma_j \ket{u_j} \bra{v_j}$. For $\zeta>0$ we define the $\zeta$-effective pseudoinverse of $M$ as the matrix
Note that in the definition we essentially drop the largest terms of the actual inverse $M^{-1}=\sum_{j=1}^n \sigma_j^{-1} \ket{v_j} \bra{u_j}$. While this produces significant error to approximate $M^{-1}$ as a whole, we find that it can still give a good approximation for some relevant entries. We now state the refined version of Ta-Shma's matrix inversion algorithm which allows us to compute effective pseudoinverses of general matrices.
Theorem 4.2. Fix $\varepsilon(n), \zeta(n), \delta(n) > 0$ and $Z(n) \geq 1$. Let $M$ be an $n \times n$ matrix such that $Z \geq \sigma_1(M) \geq \cdots \geq \sigma_n(M)$. There is an algorithm running in $\mathsf{BQSPACE}(O(\log \frac{nZ}{\epsilon\delta}))$ that given $M$ and two indices $s,t\in [n]$ outputs an $\varepsilon$-additive approximation of the entry $M_{\widetilde{\zeta}}^+(s,t)$, where $\widetilde{\zeta}$ is a random value that is fixed at the beginning of the computation and is $\delta$-close to $\zeta$.
While it is a simple modification of [Ta-13], for completeness we provide a proof of this theorem in the appendix. The fact that we cannot control the exact threshold $\zeta$ of which singular values should be ignored during the effective pseudoinversion is a consequence of the ambiguity of quantum phase estimation, yet its uncertainty is limited by using Ta-Shma's consistent phase estimation procedure.
We now have the necessary tools to prove our final result which we recall here:
Theorem 1.2. Fix a polynomial $p: \mathbb{N} \rightarrow \mathbb{N}$. Let $G$ be a directed graph with $|V(G)|=n$ nodes such that
The idea for the proof is to approximate the effective pseudoinverse entry of the counting Laplacian $L_{\tilde{\zeta}}^+(s,t)$ for some small enough $\tilde{\zeta} = 1/\mathop{\rm poly}(n)$ instead of the actual inverse entry $L^{-1}(s,t)$. While ignoring the smallest singular values during the effective pseudoinversion normally leaves out the largest terms, we find that our path bounds imply low overlap of $\braket{s|v_j}$ and $\braket{u_j|t}$ for small singular values $\sigma_j$ such that entry $L^+_{\tilde{\zeta}}(s,t)$ is close to $L^{-1}(s,t)$.
Proof: We again consider the counting Laplacian and its singular value decomposition $L=I-A = \sum_{j=1}^n \sigma_j \ket{u_j}\bra{v_j}$. Its inverse is $L^{-1} = \sum_{j=1}^n \sigma_j^{-1} \ket{v_j}\bra{u_j}$. Now consider the vectors $(L^{-1})^T \ket{s}$ and $L^{-1}\ket{t}$. They contain as entries the number of paths starting in $s$ and the number of paths ending in $t$, respectively. Hence, we find for their squared $l_2$-norms:
where the last equalities of both lines follow because the $\{\ket{u_j}\}_{j\in[n]}$ and $\{\ket{v_j}\}_{j\in[n]}$ are orthonormal bases. As a consequence we obtain for each $j \in [n]$
Combining the two we find as a bound for the $j$-th term of the singular value decomposition of $L^{-1}$,
This allows us to estimate the error for computing an effective pseudoinverse entry $L_{\widetilde{\zeta}}^+(s,t)=\sum_{\sigma_j \geq \widetilde{\zeta}} \sigma_j^{-1} \left|\braket{s|v_j} \braket{u_j|t}\right|$ instead of the actual inverse entry $L^{-1}(s,t) = N(s,t)$. In fact, for $\widetilde{\zeta}\leq1/(5n^2\cdot p(n)^2)$ we have
Choosing $Z=n$, $\varepsilon=1/5$ and $\delta = \zeta = 1/(10n^2\cdot p(n)^2)$ in theorem 4.2 ensures $\widetilde{\zeta} \leq 1/(5n^2 \cdot p(n)^2)$ and yields an additive $2/5$ approximation of $L^{-1}(s,t)$ within the desired space complexity. Rounding to the closest integer gives the number of paths from $s$ to $t$. ☐
A natural open question is whether the simultaneous polynomial bound on (i) the number of paths starting from $s$ and on (ii) the number of paths ending in $t$ is really necessary for a $\mathsf{BQSPACE}(O(\log n))$ procedure. Unfortunately, at least with our approach above, this seems to be the case. Note that (i) implies low overlap of $\ket{s}$ with the left singular vectors $\ket{v_j}$ of $L^{-1}$ and (ii) implies low overlap of $\ket{t}$ with the right singular vectors $\ket{u_j}$ of $L^{-1}$. It turns out that if only one of the two is small, then the contribution of $\sigma_j^{-1} \braket{s|v_j} \braket{u_j|t}$ to $L^{-1}(s,t)$ can still be significant for very small $\sigma_j$ but will be ignored in the pseudoinversion.
We thank François Le Gall for discussions about the differences between language and promise classes. He made us aware that our results can be seen as first evidence that the language classes $\mathsf{BQL}$ and $\mathsf{BPL}$ are distinct. We further acknowledge useful discussions with Klaus-Jörn Lange and we thank Lior Eldar, Troy Lee and Ronald de Wolf for valuable comments on an earlier draft. RE was supported by the Program QuanTEdu-France (ANR-22-CMAS-0001). SA was partially supported by French projects EPIQ (ANR-22-PETQ-0007), QUDATA (ANR18-CE47-0010), QUOPS (ANR-22-CE47-0003-01) and HQI (ANR-22-PNCQ-0002), and EU project QOPT (QuantERA ERA-NET Cofund 2022-25).
[AB06] S. Arora and B. Barak. Computational Complexity: A Modern Approach. Cambridge University Press, 2006.
[AKL+79] Romas Aleliunas, Richard M. Karp, Richard J. Lipton, László Lovász, and Charles Rackoff. Random walks, universal traversal sequences, and the complexity of maze problems. In 20th Annual Symposium on Foundations of Computer Science, pages 218--223, 1979.
[AL98] Eric Allender and Klaus-Jörn Lange. RUSPACE($\log n$) $\subseteq$ DSPACE($\log^2 n/\log \log n$). Theory of Computing Systems, 31, 1998.
[All23] Eric Allender. Guest column: Parting thoughts and parting shots. SIGACT News, 54(1):63–81, 2023.
[BJLR91] Gerhard Buntrock, Birgit Jenner, Klaus-Jörn Lange, and Peter Rossmanith. Unambiguity and fewness for logarithmic space. In Fundamentals of Computation Theory, pages 168--179. Springer, 1991.
[Coo85] Stephen A. Cook. A taxonomy of problems with fast parallel algorithms. Information and Control, 64(1):2--22, 1985.
[DSTS17] Dean Doron, Amir Sarid, and Amnon Ta-Shma. On approximating the eigenvalues of stochastic matrices in probabilistic logspace. Computational Complexity, 26:393--420, 2017.
[FL18] Bill Fefferman and Cedric Yen-Yu Lin. A complete characterization of unitary quantum space. In 9th Innovations in Theoretical Computer Science Conference, volume 94 of Leibniz International Proceedings in Informatics, pages 4:1--4:21, 2018.
[FR21] Bill Fefferman and Zachary Remscrim. Eliminating intermediate measurements in space-bounded quantum computation. In Proceedings of the 53rd Annual ACM SIGACT Symposium on Theory of Computing, 2021.
[GLW23] François Le Gall, Yupan Liu, and Qisheng Wang. Space-bounded quantum state testing via space-efficient quantum singular value transformation. arXiv preprint arXiv:2308.05079, 2023.
[GR22] Uma Girish and Ran Raz. Eliminating intermediate measurements using pseudorandom generators. In 13th Innovations in Theoretical Computer Science Conference, volume 215, pages 76:1--76:18, 2022.
[GRZ21] Uma Girish, Ran Raz, and Wei Zhan. Quantum logspace algorithm for powering matrices with bounded norm. In 48th International Colloquium on Automata, Languages, and Programming, volume 198, pages 73:1--73:20, 2021.
[GSTV11] Brady Garvin, Derrick Stolee, Raghunath Tewari, and N. V. Vinodchandran. ReachFewL = ReachUL. In Computing and Combinatorics, pages 252--258. Springer, 2011.
[HHL09] Aram W. Harrow, Avinatan Hassidim, and Seth Lloyd. Quantum algorithm for linear systems of equations. Physical Review Letters, 103(15), 2009.
[kannan2008stcon] Sampath Kannan, Sanjeev Khanna, and Sudeepa Roy. STCON in directed unique-path graphs. In IARCS Annual Conference on Foundations of Software Technology and Theoretical Computer Science, 2008.
[Lan97] Klaus-Jörn Lange. An unambiguous class possessing a complete set. In STACS 97, pages 339--350. Springer, 1997.
[LPW08] D.A. Levin, Y. Peres, and E.L. Wilmer. Markov Chains and Mixing Times. American Mathematical Society, 2008.
[MW12] Dieter van Melkebeek and Thomas Watson. Time-space efficient simulations of quantum computations. Theory of Computing, 8(1):1--51, 2012.
[Rei08] Omer Reingold. Undirected connectivity in log-space. Journal of the ACM, 55(4):1--24, 2008.
[Sav70] Walter J. Savitch. Relationships between nondeterministic and deterministic tape complexities. Journal of Computer and System Sciences, 4(2):177--192, 1970.
[SZ99] Michael Saks and Shiyu Zhou. $\mathrm{BP}_\mathrm{H}\mathrm{SPACE}(S) \subseteq \mathrm{DSPACE}(S^{3/2})$. Journal of computer and system sciences, 58(2):376--403, 1999.
[TS13] Amnon Ta-Shma. Inverting well conditioned matrices in quantum logspace. In Proceedings of the 45th Annual ACM Symposium on Theory of Computing, page 881–890, 2013.
The algorithm for the effective pseudoinversion is essentially identical to Ta-Shma's matrix inversion procedure except for a small change in the rotation step to appropriately treat ill-conditioned matrices. For completeness we describe it here but refer to [Ta-13] for the detailed complexity and error analysis.
Proof sketch of theorem 4.2. We make the following two simplifying assumptions:
It is easily verified that the eigenpairs of $H$ are given by
such that
Now, let the spectral decomposition of the matrix be given by $M=H=\sum_{j=1}^n \lambda_j \ket{h_j}\bra{h_j}$ and let $\ket{t} = \sum_{j=1}^n \beta_j \ket{h_j}$. The algorithm works on four registers: An input register $I$, an estimation register $E$, a shift register $S$ and an ancillary register $A$ of dimension at least three.
1. We start by preparing the initial state
2. We then apply the consistent phase estimation procedure (compare Section 5.2 in [Ta-13]) to the input, estimation and shift register and obtain a state close to
where $s(j)$ is the j-th section number, that is a fixed classical value depending on $h_j$ only, from which we can recover a $\delta$-approximation $\widetilde{\lambda}_j = \widetilde{\lambda}(s(j))$ of the eigenvalue $\lambda_j$.
3. We next approximately apply a unitary map acting on the shift and ancillary register partially described by
4. We reverse the consistent phase estimation and are left with a state close to
Note that the approximations of the eigenvalues are monotone in the sense that $\lambda_i \leq \lambda_j$ implies $\widetilde{\lambda}_i \leq \widetilde{\lambda}_j$. From this we get the existence of $\widetilde{\zeta}_+ > 0$ and $\widetilde{\zeta}_- < 0$, both in absolute value $\delta$-close to $\zeta$, such that
Choosing and combining symmetric shifts for the positive and negative eigenvalues during the consistent phase estimation allows to assume $|\widetilde{\zeta}_+| = |\widetilde{\zeta}_-|$. Denoting this value by $\tilde{\zeta}$ we find
5. Finally, we measure the ancillary register. If the measurement outcome is $\ket{\text{well}}_A$, this leaves us with a state close to the normalized desired one
In fact, estimating the success-probability of this measurement outcome gives a good approximation of
from which we recover $\Big|M_{\widetilde{\zeta}}^+\ket{t}\Big|_2$.
Repeating the steps above sufficiently many times lets us create multiple copies of the desired state, assuming $\Big|M_{\widetilde{\zeta}}^+\ket{t}\Big|_2$ is non-negligible. We then use Ta-Shma's space-efficient tomography procedure Theorem 6.1 in [Ta-13] to approximately learn the state, and in particular entry
☐
This document is in arXiv: 2408.12473.
]]> 17 42 438 ./Makefile.am
123 403 3037 ./sshguard.in
708 2765 22860 ./Makefile.in
130646 622873 7655483 ./parser/attack_scanner.c
401 1202 11249 ./parser/attack_parser.y
584 2862 22115 ./parser/tests.txt
2061 9087 79252 ./parser/attack_parser.c
2 5 47 ./parser/test-sshg-parser
36 201 1219 ./parser/parser.h
56 178 1965 ./parser/attack.c
1035 4286 36122 ./parser/Makefile.in
146 366 3757 ./parser/parser.c
21 42 418 ./parser/Makefile.am
392 1959 22246 ./parser/attack_scanner.l
284 1276 11808 ./parser/attack_parser.h
25 62 425 ./fw/sshg-fw-ipset.sh
688 2706 23910 ./fw/Makefile.in
51 202 1296 ./fw/fw.h
38 88 574 ./fw/sshg-fw-iptables.sh
30 70 1089 ./fw/Makefile.am
36 88 586 ./fw/sshg-fw-ipfilter.sh
23 56 302 ./fw/sshg-fw-pf.sh
27 70 486 ./fw/sshg-fw-ipfw.sh
32 72 612 ./fw/sshg-fw.in
23 52 363 ./fw/sshg-fw-null.sh
384 1162 10702 ./fw/hosts.c
33 80 920 ./fw/sshg-fw-firewalld.sh
56 175 1147 ./fw/sshg-fw-nft-sets.sh
19 51 353 ./sshg-logtail
132 465 4383 ./blocker/sshguard_options.c
47 272 1673 ./blocker/sshguard_blacklist.h
137 605 3830 ./blocker/sshguard_whitelist.h
26 146 924 ./blocker/sshguard_log.h
129 607 3823 ./blocker/fnv.h
137 354 3929 ./blocker/blocklist.c
415 1580 14356 ./blocker/sshguard_whitelist.c
31 116 1097 ./blocker/attack.c
152 502 5019 ./blocker/sshguard_blacklist.c
145 670 3972 ./blocker/hash_32a.c
678 2598 25839 ./blocker/Makefile.in
45 285 1906 ./blocker/sshguard_options.h
302 1199 10354 ./blocker/blocker.c
13 19 236 ./blocker/blocklist.h
21 39 432 ./blocker/Makefile.am
30 73 646 ./common/sandbox.c
51 237 2163 ./common/address.h
41 104 1242 ./common/service_names.c
996 4757 31742 ./common/simclist.h
167 698 4909 ./common/config.h.in
16 31 310 ./common/sandbox.h
1512 5612 47636 ./common/simclist.c
77 441 3410 ./common/attack.h
143277 673891 8088612 total
The binary size is ca. 4MB for sshg-parser
:
$ ls -l /usr/lib/sshguard
total 4928
-rwxr-xr-x 1 root root 34912 Jul 29 16:06 sshg-blocker*
-rwxr-xr-x 1 root root 1532 Jul 29 16:06 sshg-fw-firewalld*
-rwxr-xr-x 1 root root 18448 Jul 29 16:06 sshg-fw-hosts*
-rwxr-xr-x 1 root root 1198 Jul 29 16:06 sshg-fw-ipfilter*
-rwxr-xr-x 1 root root 1098 Jul 29 16:06 sshg-fw-ipfw*
-rwxr-xr-x 1 root root 1181 Apr 17 2022 sshg-fw-ipset*
-rwxr-xr-x 1 root root 1186 Jul 29 16:06 sshg-fw-iptables*
-rwxr-xr-x 1 root root 1759 Jul 29 16:06 sshg-fw-nft-sets*
-rwxr-xr-x 1 root root 975 Jul 29 16:06 sshg-fw-null*
-rwxr-xr-x 1 root root 914 Jul 29 16:06 sshg-fw-pf*
-rwxr-xr-x 1 root root 353 Jul 29 16:06 sshg-logtail*
-rwxr-xr-x 1 root root 4630632 Jul 29 16:06 sshg-parser*
The main annoyance with SSHGuard was that sometimes it did not stop properly when stopped via systemd. During powering down one machine this is especially enerving as this increases overall downtime.
As SSHGuard has this quite clean architecture where parsing and block-indication are so clearly separated, it is easy to find out what it actually tries to block.
In addition at looking at the source code of the Flex rules in parser/attack_scanner.l
I now wrote Simplified SSHGuard in less than 20 lines of Perl.
In Arch Linux you can use ssshguard.
Firewall setup is similar to SSHGuard.
# Generated by iptables-save v1.8.6 on Sun Dec 20 13:29:18 2020
*raw
:PREROUTING ACCEPT [207:14278]
:OUTPUT ACCEPT [180:113502]
COMMIT
# Empty iptables rule file
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i eth0 -p tcp --dport 22 -m set --match-set reisbauerHigh src -j DROP
-A INPUT -i eth0 -p tcp --dport 22 -m set --match-set reisbauerLow src -j DROP
COMMIT
The sets in ipset
are defined in file /etc/ipset.conf
and are:
create -exist reisbauerHigh hash:net family inet hashsize 65536 maxelem 65536 counters
create -exist reisbauerLow hash:net family inet hashsize 65536 maxelem 65536 counters
The set reisbauerLow
is not needed.
However, sometimes it is convenient to have an already defined set, to which you can swap:
ipset swap reisbauerHigh reisbauerLow
Once you power down your machine all firewall rules and all ipset sets are lost.
On rebooting the machine you initialize iptables and ipset again.
Though, the actual set content is forgotten.
Therefore you might run a cron-job to periodically save the reisbauerHigh set to reisbauerLow and filter for the ten most used IP addresses and store them in /etc/ipset.conf
.
For example:
$ ipset save reisbauerLow | tail -n +2 | sort -rnk7 | cut -d' ' -f1-3 | head
add reisbauerLow 180.101.88.244
add reisbauerLow 170.64.232.196
add reisbauerLow 170.64.204.232
add reisbauerLow 170.64.202.190
add reisbauerLow 5.135.90.165
add reisbauerLow 170.64.133.48
add reisbauerLow 61.177.172.136
add reisbauerLow 139.59.4.108
add reisbauerLow 159.223.225.209
add reisbauerLow 103.164.8.158
Above command prints the ten most offending IP addresses which can be appended to /etc/ipset.conf
via cron.
See Periodic seeding.
Similar to SSHGuard, the simplified version reads its input from journalctl
.
Certain output lines of journalctl
then trigger the blocking via ipset
.
The logic is that all unsuccessful login attempts result in an entry in an ipset, which then permanently bans that IP address from any further login attempts.
I.e., the ssh daemon no longer even sees that.
You are blocked "forever", unless:
ipset del reisbauerHigh <IP-address>
ipset flush reisbauerHigh
All triggering keywords or phrases are highlighted below.
#!/bin/perl -W
# Simplified version of SSHGuard with just Perl and ipset
use strict;
my ($ip, %B);
my %whiteList = ( '192.168.0' => 1 );
open(F,'-|','/usr/bin/journalctl -afb -p info -n1 -t sshd -t sshd-session -o cat') || die("Cannot read from journalctl");
while (<F>) {
if (/Failed password for (|invalid user )(\s*\w*) from (\d+\.\d+\.\d+\.\d+)/) { $ip = $3; }
elsif (/authentication failure; .+rhost=(\d+\.\d+\.\d+\.\d+)/) { $ip = $1; }
elsif (/Disconnected from (\d+\.\d+\.\d+\.\d+) port \d+ \[preauth\]/) { $ip = $1; }
elsif (/Unable to negotiate with (\d+\.\d+\.\d+\.\d+)/) { $ip = $1; }
elsif (/(Connection closed by|Disconnected from) (\d+\.\d+\.\d+\.\d+) port \d+ \[preauth\]/) { $ip = $2; }
elsif (/Unable to negotiate with (\d+\.\d+\.\d+\.\d+) port \d+/) { $ip = $1; }
else { next; }
#print "Blocking $ip\n";
next if (defined($B{$ip})); # already blocked
next if (defined($whiteList{ substr($ip,0,rindex($ip,'.')) })); # in white-list
$B{$ip} = 1;
`ipset -quiet add -exist reisbauerHigh $ip/32 `;
}
close(F) || die("Cannot close pipe to journalctl");
Wait, isn't that more than 20 lines of code?
Yes, but if you remove comments and empty lines, drop the close()
, which is not strictly needed, then you come out at below 20 lines of source code, including configuration.
The whiteList
hash variable contains all those class C networks, which you do not want to block, even if the passwords are given wrong multiple times.
Adding class C addresses to %whitelist
should be obvious.
For example:
my %whiteList = ( '10.0.0' => 1, '192.168.0' => 1, '192.168.178' => 1 );
Starting and stopping via systemd is exactly the same as SSHGuard. systemd script is stored here:
/etc/systemd/system/multi-user.target.wants/sshguard.service
The systemd script is as below:
[Unit]
Description=Simplified SSHGuard - blocks brute-force login attempts
After=iptables.service
After=ip6tables.service
After=libvirtd.service
After=firewalld.service
After=nftables.service
[Service]
ExecStart=/usr/sbin/ssshguard
Restart=always
[Install]
WantedBy=multi-user.target
Below Perl script can be run every few hours to save the current set of IP addresses and store them in /etc/ipset.conf
.
#!/bin/perl -W
# The top most IP addresses from reisbauerLow+High are retained in reisbauerLow,
# or more exact, every ipset which blocked more than 99 packets.
# This program must be run as root: ipset command needs this privilege
#
# Command line argument:
# -m minimum number of packets blocked so far, default is 100
use strict;
use Getopt::Std;
my %opts = ('m' => 100);
getopts('m:',\%opts);
my $minBlock = defined($opts{'m'}) ? $opts{'m'} : 100;
my @F;
open(F,'-|','/bin/ipset save -sorted') || die("Cannot read from ipset");
print "create -exist reisbauerHigh hash:net family inet hashsize 65536 maxelem 65536 counters\n";
print "create -exist reisbauerLow hash:net family inet hashsize 65536 maxelem 65536 counters\n";
while (<F>) {
next if (! /^add reisbauer/);
chomp;
@F = split(/ /);
if ($minBlock > 0) {
next if ($#F < 6);
next if ($F[4] < $minBlock);
}
printf("add -exist reisbauerLow %s\n",$F[2]);
}
close(F) || die("Cannot close pipe to ipset");
Added 03-Jan-2024: Also see Using iptables by Remy Noulin. He builds a simple solution with just 7 commands, which rate limits any SSH connections. No Perl or scanning of journalctl is required.
iptables -N LOG_DROP_TOO_MANY
iptables -A LOG_DROP_TOO_MANY -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "INPUT:DROP TOO MANY: " --log-level 6
iptables -A LOG_DROP_TOO_MANY -j DROP
ipset create too_many hash:ip family inet hashsize 32768 maxelem 65536 timeout 600
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 3 -j SET --add-set too_many src
iptables -A INPUT -p tcp --dport 22 -m set --match-set too_many src -j LOG_DROP_TOO_MANY
]]>The Slashdot effect usually refers to the fact, when the web-server in question goes down, or is overloaded. In my case, the web-server could handle that all without any hickups.
2. Normally, I have roughly 1,000 monthly visitors to my blog. One can clearly spot the spike, where visits go up to more than 4,000. Below charts show:
Above numbers are based on hefty filtering in the web-server log.
Below are the numbers, which I filter out of the access.log
file from NGINX.
access.log
had 3,101,246 lines.
Filtering | number of suppressed lines | % |
---|---|---|
class B addresses | 1,527,803 | 49.3 |
class C addresses | 136,109 | 4.4 |
raw IP addresses | 32,566 | 1.1 |
bots identifying as bots | 863,515 | 27.8 |
empty user-agent | 0 | 0 |
short user-agent (<=3) | 40,925 | 1.3 |
no transmitted bytes | 280 | 0 |
all lowercase user-agent | 8,581 | 0.3 |
HTTP code | 182,837 | 5.9 |
But in July this jumped to almost 5,000 monthly visits. Initially I thought this is another bot just reading my blog.
One can clearly see that there is a spike, then a sharp decline, after the initial "hype" is over.
Above two graphs show the filtered results, i.e., filtering out bots, and other accesses, which are not "real" visitors.
3. Below graph shows the monthly 30,000 to 90,000 unfiltered visits to my web-server. One can clearly see the spike going up to 174,000 visits.
Below is the unfiltered statistics for the GitLab post:
Added 16-Aug-2024: I update my web-server on a regular basis.
This time I noticed that php-fpm recommended to change max_children
parameter.
Below warning is way after the initial boom as described above.
Aug 02 16:20:20 ryzen php-fpm[958]: [WARNING] [pool www] server reached pm.max_children setting (20), consider raising it
Aug 02 16:20:22 ryzen sshd[979]: drop connection #0 from [170.64.236.223]:58996 on [192.168.0.20]:22 penalty: failed authentication
Aug 02 16:20:26 ryzen sshd[979]: drop connection #0 from [170.64.236.223]:36880 on [192.168.0.20]:22 penalty: failed authentication
Aug 02 16:20:26 ryzen php-fpm[958]: [WARNING] [pool www] server reached pm.max_children setting (20), consider raising it
Aug 02 16:20:29 ryzen sshd[979]: drop connection #0 from [170.64.236.223]:42996 on [192.168.0.20]:22 penalty: failed authentication
Aug 02 16:20:32 ryzen sshd[979]: drop connection #0 from [170.64.236.223]:49112 on [192.168.0.20]:22 penalty: failed authentication
Aug 02 16:20:35 ryzen php-fpm[958]: [WARNING] [pool www] server reached pm.max_children setting (20), consider raising it
]]>Below text is based on the results in
Bibliography:
Consider the ordinary differential value problem with initial condition:
Nomenclature and assumptions:
Runge-Kutta methods are written in their nonlinear form
with
$s$ is the number of internal stages of the Runge-Kutta method. $s$ is usually in the range of 2 to 9. The higher $s$ is, the more work you have to do for each step $j$.
Substituting $k_i$ with $y_{j+c_i}$ we obtain
We have
and thus get the $(s+1)$-stage linear representation
In matrix notation this is
Using the matrix
we could write the whole process as $\tilde y_{j+1} = E \tilde y_j + \cdots$.
Here we use $c$ as vector and multiindex simultaneously:
and
This corresponds to the classical Runge-Kutta Butcher tableau:
=++$c?>. Definition. Above method is called an s-stage Runge-Kutta method.
In the following we use componentwise multiplications for the vector $c$:
See the book Peter Albrecht, "Die numerische Behandlung gewöhnlicher Differentialgleichungen: Eine Einführung unter besonderer Berücksichtigung zyklischer Verfahren", 1979.
The classical Runge-Kutta method of order 4 with 4 stages.
Kutta's method or 3/8-method of order 4 with 4 stages.
Gill's method of order 4 with 4 stages.
Above examples show that order $p$ could be obtained with $s=p$ stages. Butcher showed that for $p\ge5$ this is no longer possible.
Butcher method of order 5 with 6 stages.
Runge-Kutta-Fehlberg method of order 4 with 5 internal stages. Also called RKF45. The embedded 5-th order method is only used for step-size control.
Dormand-Prince method of order 4 with internal 5 stages, called DOPRI45.
Implicit Gauß-method of order 4 with 2 internal stages.
Implicit Gauß-method of order 6 with 3 internal stages.
Erwin Fehlberg (1911-1990), John C. Butcher (1933), Carl Runge (1856-1927), Martin Wilhelm Kutta (1867-1944).
The local discretization error is when you insert the exact solution into the numerical formula and look at the error that ensues.
There are two local discretization errors $d_{j+c}\in\mathbb{R}^s$ and $d_{j+1}\in\mathbb{R}$: one for the "internal" stages, and one for the "last" stage.
2. Definition. The $d_{j+c}$ and $d_j$ are called local discretization errors.
Using
and by Taylor expansion at $t_j$ for $Y_j$ we get for index $i=1$:
The other indexes $i=2,\ldots,s$ are similar. We thus get for all the stages
Using
the "error vectors" $\gamma_\ell\in\mathbb{R}^s$ and the error factor $\hat\gamma_\ell\in\mathbb{R}$ are
The "internal" stages are consistent iff $\gamma_\ell=0\in\mathbb{R}^s$ for $\ell=1,\ldots,p$. Now comes the kicker:
the last stage of the method may furnish approximations of order $p$ even if $\gamma_\ell=0$ does not hold.
Define the global error for $y_j$:
and for $f(t,y)$:
=++$c?>. Theorem. (General order condition.) Assume that the local discretization errors $\hat d_j$ is $\cal O(h^p)$, $\forall j$.
(a) The Runge-Kutta method then converges with order $p$, i.e., $\hat q_j = \cal O(h^p)$, iff
(b) This happens iff for the global error $q_{j+c}$ of the internal stages the following holds:
Proof: Use the fact that
Then
☐
Above theorem gives the general order condition for Runge-Kutta methods. However, in this form it is not practical to find the parameters $c,$ $b,$ and $A$.
Further outline:
By one-dimensional Tayler expansion the $Q_{j+c}$ are expressed by $q_{j+c}$.
Let
Further
= $ge = ++$c?>. Theorem. With above definitions the $Q_{j+c}$ can be expressed by powers of $q_{j+c}$:
Proof: The $i$-th component of $Q_{j+c}$ is
Taylor expansion at $y=Y_{j+c_i}$ gives
Hence
☐
The following two nonlinear equations vanish:
The right side is analytical at $h=0$, $Q_{t+c}=0$, and $q_{j+c}=0$. The theorem of implicit functions says:
Once can see that the term with $h^0$ and $h^1$ are equal to zero.
The general order condition $b^T Q_{t+c} = 0$ reduces to below orthogonal relations:
In below recap we are interested in the formula, not the convergence conditions, therefore skip these conditions.
=++$c?>. Theorem. (Cauchy product formula for finitely many power series.) Multiply $n$ power series:
with the multiindex notation:
Similarly, when the power series start at some index $\beta_i$.
=++$c?>. Theorem. (Cauchy product formula for finitely many power series.) Multiply $n$ power series:
with the multiindex notation:
=++$c?>. Theorem. (Cauchy product formula for infinite many power series.) Multiply infinite many power series:
with the infinite multiindex notation:
For the special case $z_1=z_2=\cdots$
you can substitute the right power of $z$ with $z^{|\alpha|+\nu_0}$, therefore
=++$c?>. Theorem. (Recursion 0.) The $r_i$ and $w_i$ from (T) can be obtained from below recursion formula for $i=2,3,\ldots,p$:
and using the infinite multiindex $\alpha=(\alpha_1,\alpha_2,\ldots)$
Proof: The original proof by Albrecht is using induction. This proof is direct and uses the Cauchy product.
We omit $t_j$ in the following. According theorem =$ge?> and (T) we have
Now use (G) and Cauchy product formula:
Now group by common powers of $h$ and you get the formula for $w_i$. ☐
Recursion 0 is the basis of all further considerations. With the Ansatz
Hosea (1995) in his program rktec.c computes these $\rho_{i\ell}$ and $\sigma_{i\ell}$.
Main result: The condition $b^T w_i(t_j)=0$ must be satisfied for any $f$, and thus for various $e_{i\ell}$. This is the case if
Thus the order condition becomes independent of the $e_{i\ell}$, i.e., independent of the initial value problem at hand.
Recursion 1:
=++$c?>. Theorem. (Main result) Let the $\alpha_{i\ell}\in\mathbb{R}^s$ be obtained from Recursion 1. The Runge-Kutta method then converges with order $p\ge3$ if the last stage has order of consistency of $p$, i.e.,
and if
Hosea (1995) notes that
]]>Through order sixteen, for instance, ... implies a total of 1,296,666 terms (including the quadrature error coefficients) while there are "only" 376,464 distinct order conditions.
GitHub provides every user the possibility to host static web pages on GitHub. Similar to GitLab. Here are the steps to do that.
1. Create the repository eklausme.github.io
.
Change eklausme
to your GitHub username.
2. In menu "Settings", check that the default branch is set to master
, or whatever you use.
3. Create a file static.yml
in the directory .github/workflow
, which controls the CI process and is as below:
# Simple workflow for deploying static content to GitHub Pages
name: Deploy static content to Pages
on:
# Runs on pushes targeting the default branch
push:
branches: ["master"]
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
contents: read
pages: write
id-token: write
# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
concurrency:
group: "pages"
cancel-in-progress: false
jobs:
# Single deploy job since we're just deploying
deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Pages
uses: actions/configure-pages@v5
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
# Upload entire repository
path: '.'
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
This CI was taken from:
4. Contrary to GitLab, where you put your static content in a specific directoy, in GitHub you place all static content under the root directory. Add the content as usual.
git add .
git commit -m"..."
git push
Once you push to your Git repository a job will be started governed by above static.yml
and produces the intended website.
This website is then accessible at
https://eklausme.github.io/
5. This blog uses Simplified Saaze. I use below command to generate all my static HTML pages:
php saaze -mortb /tmp/build
Then add your images, PDF, JS, CSS, redirects, etc.
6. Limitations. Contrary to GitLab, GitHub does have some "hidden" limitations, which GitLab does not have.
Either the number of files or the sum of files is limited in GitHub.
I had to delete my /img
directory, because otherwise GitHub would not host it.
Therefore I would recommend GitLab over GitHub.
GitLab provides every user the possibility to host static web pages on GitLab. Here are the steps to do that.
1. Create a public repository, i.e., with the name p
. GitLab also calls it project.
I chose a repository name which is short, as this repository name will be part of the URL.
2. In menu "Deploy", go to "Pages":
Then deselect unique domain:
3. Create a file .gitlab-ci.yml
at the top level (not below public
), which controls the CI process and is as below:
image: busybox
pages:
stage: deploy
script:
- echo 'Nothing to do...'
artifacts:
paths:
- public
expire_in: 1 day
rules:
- if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
4. GitLab requires all static content under directory public
.
Therefore, add your content to the public
directory, commit, and push in Git as usual:
git add .
git commit -m"..."
git push
Once you push to your Git repository a job will be started governed by above .gitlab-ci.yml
and produces the intended website.
This website is then accessible at
https://eklausme.gitlab.io/p
As the repository name is part of the URL I made it short.
5. This blog uses Simplified Saaze.
I use below command to generate all my static HTML pages with /p
as prefix, or "relative base":
time RBASE=/p php saaze -mortb /tmp/build
The time
command is only there because I am obsessed with speed.
Then add your images, PDF, JS, CSS, redirects, etc. to the /tmp/build
directory.
Added 28-Jul-2024: Referenced in Hacker News and my web-server experienced a light Slashdot effect, i.e., 3,000 real visitors, and 24,000 accesses in total from bots, aggregators, etc.
]]>Bei zusammengesetzten Verfahren, also Verfahren mit mehr als einer Stufe, besitzt ersteinmal jede Stufe für sich eine eigene Fehlerkonstante im herkömmlichen Sinne. Dennoch zeigt z.B. die zyklische Hintereinanderausführung des impliziten und expliziten Euler-Verfahrens, daß das Einzelverhalten der Stufen nicht unbedingt auch das Gesamtverhalten des Zykluses wiedergibt. Das implizite Euler-Verfahren für sich alleine betrachtet hat die Konvergenzordnung 1, ebenso hat das explizite Euler-Verfahren für sich alleine betrachtet die Konvergenzordnung 1. Das zusammengesetzte Verfahren hat allerdings schon die Konvergenzordnung 2. Es ist nun naheliegend zu fragen, ob noch höhere Konvergenzordnungssprünge möglich sind. Desweiteren wird man für diesen Sprung der Konvergenzordnung eine Erklärung wünschen.
Allerdings wird man nicht in so unstetigen Übergängen denken wollen. Bei den klassischen Verfahren, wie linearen Mehrschrittformeln oder Runge-Kutta-Verfahren, ist bekannt, daß ein sehr genaues Verfahren der Ordnung $p$, sich ähnlich verhält wie ein sehr ungenaues Verfahren der eins höheren Ordnung $p+1$. Man erwartet also vielmehr einen gleitenden Übergang zwischen Verfahren. Paradebeispiel ist hierfür übrigens das $\vartheta$-Verfahren
Für $\vartheta=1/2$ erhält man die implizite Trapezregel mit der Ordnung 2 und in allen anderen Fällen nur Verfahren der Ordnung 1, insbesondere für $\vartheta=0$ ein explizites Verfahren. Es zeigt sich nun, daß der primäre dominante lokale Fehler eine erste Auskunft gibt über das Fehlerverhalten. Verschwindet der primäre dominante lokale Fehler, liegt also der Fall der annullierten Dominanz vor, so gibt der sekundäre dominante lokale Fehler ein weiteres Bild über das Fehlerverhalten.
Zuerst erscheint zur Klarstellung der Bezeichnungen, die Festlegung des Konsistenzbegriffes. Anschliessend werden eine Reihe von zueinander äquivalenten Beschreibungsmöglichkeiten für hohe Konsistenzordnung gegeben. Diese Beschreibungen sind direkt anwendbar zur Berechnung neuer Verfahren. Eine Reihe von Fehlerkonstanten werden miteinander verglichen und Gemeinsamkeiten deutlich gemacht.
Es sei
ein lineares $k$-Schrittverfahren. An die Koeffizienten des linearen $k$-Schrittverfahrens sind gewisse Einschränkungen zu stellen, damit die Lösungen, die durch das $k$-Schrittverfahren berechnet werden, auch etwas mit der Lösung der Differentialgleichung zu tun haben. Man unterscheidet zweierlei Bedingungsarten: einmal Konsistenzbedingungen und zum anderen Stabilitätsbedingungen. Es zeigt sich nachher, daß die Stabilitätsbedingung die einschränkendere Bedingung ist. Die Konsistenzbedingungen führen auf lineare Gleichungssyteme. Die Stabilitätsbedingungen führen auf nicht-lineare und Gleichungs- und Ungleichungssysteme.
Die Konsistenzbedingungen sind:
Die Konsistenzmatrix $C_{p,k}$ für lineare $k$-Schrittverfahren der Konsistenzordnung $p$ lautet im Verein mit dem Koeffizientenvektor des Verfahrens und der entsprechenden Bedingung
Beispielsweise lautet die Konsistenzmatrix $C_{p,k}$ bei spezieller Wahl von $p$ und $k$, wie folgt:
1. Beispiel: Konsistenzmatrix $C_{p+1,k}$ für $p=3$ und $k=3$:
und für $p=5$, $k=5$ lautet $C_{p+1,k}$ mithin
2. Ein lineares $k$-Schrittverfahren mit mindestens der Konsistenzordnung $p$ muß also im Kern der Matrix $C_{p,k}\in\mathbb{Z}^{(p+1)\times(2k+2)}$ liegen, also
Erweitert man die Matrix $C_{p,k}$ in offensichtlicher Weise unten um eine weitere Zeile und damit zur Matrix $C_{p+1,k}\in\mathbb{Z}^{(p+2)\times(2k+2)}$, und ist dann das Matrix-Vektor Produkt nicht mehr der Nullvektor, so hat das Verfahren die genaue Konsistenzordnung $p$, und die von Null verschiedene Komponente des Ergebnises ist ein unskalierter Fehlerfaktor $c_{p+1}$. Wenn auf die Unskalierung besonders hingewiesen werden soll auch $\lambda c_{p+1}$, mit $\lambda\in\{\alpha_k,\beta_k,\sigma(1),\ldots\}$. Man hat also
Den Wert $c_{p+1}$ teilt man jetzt noch durch $(p+1)!$, aus später ersichtlichen Gründen, die mit einer Taylorentwicklung zu tun haben.
Übliche Skalierungsgrößen sind nun $\alpha_k$ oder $\sum_{i=0}^k \beta_i$. Skaliert man mit der letztgenannten Summe, so heiße der resultierende Faktor auch Henrici's Fehlerkonstante. Sie tritt in natürlichster Art und Weise auf bei der Behandlung von differential-algebraischen Gleichungen, die man mit Verfahren löst, wie man sie bei gewöhnlichen Differentialgleichungen einsetzt.
Bibliographisch: Henrici, Peter Karl Eugen (1923--1987).
3. Die Minus-Zeichen in der Konsistenzmatrix $C_{p,k}\in\mathbb{Z}^{(p+1)\times(k+1)(m+1)}$ (bisher $m=1$) tauchen nicht mehr auf, wenn man statt
einfach
schreibt (oben für $m=2$).
4. Bei Diskretisierungen zur Lösung von Gleichungen der From $F(t,y,\dot y)=0$, hier insbesondere linearen Mehrschrittverfahren, wird man unmittelbar dazu geführt, die Gleichung
wie folgt zu interpretieren. Die linke Summe stellt eine Näherung für die Ableitung $\dot y$ an einer hier nicht weiter interessierenden Zwischenstelle dar. Die rechte Summe ist genau dann ein gewichtetes Mittel der Werte $\dot y_i$, wenn sich die $\beta_i$-Summanden genau zu eins aufsummieren. Das letzte kann man aber stets erreichen durch geeignete Vormultiplikation der obigen Gleichung mit dem Kehrwert der Summe $\sum_{i=0}^k\beta_i$. Aufgrund der sofort offensichtlichen Linearität der Konsistenzbedingungen, erscheint die entsprechende Summe dann auch in dem Fehlerfaktor $c_{p+1}$.
Genauso ist aber auch
interpretierbar als Näherung eben an der Stelle $t_{n+k}$.
5. Es gibt mehrere weitere Möglichkeiten die Fehlerkonstante von Henrici abzuleiten.
Insbesondere durch Überlegungen bzgl. des Einflußes der lokalen Fehler auf den globalen Fehler. Dies sind die Überlegungen, wie man sie in den Aufsätzen von Skeel (1976) und Albrecht (1985) findet. In dem letztgenannten Aufsatz werden diese Überlegungen in allgemeinster Form unter Berücksichtigung von mehrfachen Eigenwerten $\mu=1$ durchgeführt. Ähnliche Erwägungen werden in der Dissertation von Tischer (1983) durchgeführt. U.a. findet man eine Darstellung und Ableitung der Fehlerkonstanten von Henrici in dem Buche von Hairer/Wanner/Nørsett (1987) und natürlich in dem Buche von Henrici (1962) selber. Die Fehlerkonstante von Henrici ist nicht originär von Henrici erfunden worden. Sie taucht ebenfalls bei zahlreichen anderen Autoren auf, wie z.B. bei Hull/Newberry (1961).
Bibliographisch: Henrici, Peter Karl Eugen (1923--1987), Hairer, Ernst (*1949), Wanner, Gerhard (*1942), Nørsett, Syvert Paul, Thomas E. Hull, A.C.R. Newberry, Robert David Skeel, Peter Albrecht.
Peter E. Tischer: "The Cyclic Use of Linear Multistep Formulas for the Solution of Stiff Differential Equations", Ph.D. Thesis, Department of Computer Science, Monash University, Clayton, Victoria, Australia, August 1983, x+180 pages.
Bei linearen Verfahren, die der starken Wurzelbedingung genügen, ergibt sich die Fehlerkonstante $C_A$ zu
Hierbei ist also $v$ der Linkseigenvektor zum Matrixpolynom $A_1\mu+A_0$ zum Eigenwert $\mu=1$ und $w$ ist der Rechtseigenvektor zum gleichen Matrixpolynom und gleichem Eigenwert. Um eine eindeutige Konstante zu erhalten, wird der letzte Vektor $w$ noch normiert z.B. durch die Norm
Das starke Wurzelkriterium garantiert, daß $vA_1w$ nicht verschwindet. Genauer: die Tatsache, daß $\mu=1$ einziger Eigenwert inklusive Multiplizität ist, garantiert das Nichtverschwinden.
1. Um mit Einbein-Verfahren differential-algebraische Gleichungen der Form
zu lösen, rechnet man
Die differential-algebraische Gleichung enthalte vermittels $G$ eindeutig als rein algebraische Restriktionen identifizierbare Gleichungen. Das Einbein-Verfahren für gewöhnliche Differentialgleichungen der Form $\dot x=f(t,x)$, ist gegeben durch
und
Die Operatoren $\rho_n$ und $\sigma_n$ sind wie üblich
Ebenfalls mögliche Diskretisierungen des Gleichungspaares $F(t,\dot x,x,y)=G(t,x,y)=0$ sind
was sich besonders dann anbietet, falls bei einer differential-algebraischen Gleichung, die Trennung zwischen “reiner” Differentialgleichung und rein algebraischen Restriktionen, nicht klar zutage tritt. Dies ist beispielsweise bei dem Problem P9 der Fall.
2. Für lineare Mehrschrittverfahren der Form
stets mit der Normierung $\sum_{\nu=0}^k\beta_{\nu,n}=1$, gewinnt man eine Diskretisierung für die Gleichung $F(t,\dot x,x,y)=G(t,x,y)=0$, wie folgt. Man fügt temporär eine zusätzliche Variable $w:=\dot x$ dem System $F=G=0$ hinzu und erhält dann nach Diskretisierung, unter Beachtung von $w_n:=\dot x_n$, das vergrößerte System
mit den Unbekannten $x_n$, $y_n$ und $w_n$. Die letzte Gleichung ist allerdings sehr leicht nach $w_n$ aufzulösen. Man erhält
mit
Der Operator $\sigma'_n$ wirkt also lediglich auf schon zurückliegende berechnete Werte. Einsetzen des so aufgelösten $w_n$, führt auf
zur Bestimmung von $(x_n,{\mskip 3mu}y_n)$.
3. Prinzipiell sind auch explizite Operatoren $(\rho_n,\sigma_n$) denkbar. Entsprechend erhält man dann
wobei $\sigma''_n$ noch einen Term weniger enthält. Der Vorteil der leichteren Auflösbarkeit oder gar der Vermeidung von Nichtlinearitäten solcher Diskretisierungen, ist jedoch im Falle von differential-algebraischen Gleichungen nicht mehr vorhanden. Es muß in jedem Falle in jedem Zeitschritt ein i.d.R. nicht-lineares Gleichungssystem gelöst werden.
Zu dieser Diskretisierung schreibt Liniger (1979):
although to the author's knowledge, thus far such methods have not been used practically …
Der Einsatz von linearen Mehrschrittverfahren und Einbein-Verfahren, und die Ableitung von Diskretisierungen bei differential-algebraischen Gleichungen, wird bei Liniger (1979) untersucht. Insbesondere Fragen der Konsistenzordnung der Diskretisierung findet man bei Liniger (1979). Stabilitätsuntersuchungen sind für differential-algebraische Gleichungen schwieriger und werden daher auch dort nicht behandelt. Einen Konvergenzbeweis für die BDF findet man bei Petzold/Lötstedt (1986a). Eine gute übergreifende Darstellung bietet Griepentrog/März (1986).
Bibliographisch: Werner Liniger (1927--2017), Linda Ruth Petzold (*1954), Eberhard Griepentrog (1933--2023), Roswitha März (*1940), Per Lötstedt.
An dieser Stelle sollen eine Reihe von gleichwertigen Charakterisierungen angegeben werden, die garantieren, daß ein lineares Mehrschrittverfahren der Form
mindestens die Konsistenzordnung $p$ hat. Unter Umständen hat das Verfahren sogar eine noch höhere Ordnung.
1. Es sei
und
2. Satz: Nun sind die folgenden 9 Aussagen paarweise zueinander äquivalent.
(1) $C_{p,k}{\alpha\choose\beta}= {\bf0}$, also $(\alpha,\beta)^\top\in\ker C_{p,k}$.
(2) $\sum_{i=0}^k \alpha_i i^q = q\sum_{i=0}^k \beta_i i^{q-1}$, für $q=0,1,\ldots,p$.
(3) $\rho(e^h)-h\sigma(e^h)={\cal O}(h^{p+1})$, für $h\to 0$.
(4) $\zeta=1$ ist mindestens $p$-fache Nullstelle der Funktion
also $\rho(\zeta)/\ln\zeta=\sigma(\zeta)+{\cal O}\bigl((\zeta-1)^p\bigr)$, für $\zeta\to 1$.
(5) $L(f,t,h)={\cal O}(h^{p+1}),\quad\forall f\in C^{p+2}(G,\mathbb{R}{})$.
(6) Die Monome bis zum Grade $p$ liegen im Kern des $h=1$ Schnittes von $L$, also $L(t^i,t_0,1)=0$, für $i=0,1,\ldots,p$.
(7) $L(f,t_0,h)={\cal O}(h^{p+1})$, für die spezielle Funktion $t\mapsto f(t)=e^t$.
(8) $y(t_0+kh)-y_k={\cal O}(h^{p+1})$, falls man die Startwerte als exakte Werte wählt.
(9) $L(y,t_0,h)=c_{p+1}h^{p+1}y^{(p+1)}(t_0)+{\cal O}(h^{p+2})$ mit $c_{p+1}=\sum_{i=0}^k\bigl(\alpha_ii^{p+1}-(p+1)\beta_ii^p\bigr)/(p+1)!$.
Diese Liste liesse sich fortsetzen. Einige der Nummern sind lediglich Umformulierungen anderer Nummern. Dennoch ist es gelegentlich nützlich eine der möglichen Formeln in der oben zitierten Form parat zu haben. Die Bedingung der Konsistenz und die Konsistenzordnung ist unabhängig von der Entwicklungsstelle der Taylorentwicklung. Zur praktischen Berechnung von Mehrschrittformeln, die zuerst nicht unbedingt stabil sein müssen, wählt man häufig (1), für den Beweis der Dahlquistbarriere werden (3) und (4) herangezogen. Einzelne Eigenschaften der obigen Angaben tragen in der Literatur häufig auch gesonderte Namen. Für die Beweise sei beispielsweise verwiesen auf Hairer/Wanner/Nørsett (1987) oder auch {Werner, Helmut}{Arndt, Herbert}Werner/Arndt (1986).
Wählt man, wie bei (8) die Startwerte exakt, also $y_0=y(t_0)$, $y_1=y(t_0+h)$ und so fort bis $y_{k-1}=y(t_0+(k-1)h)$, so gilt für den dann entstehenden Fehler zwischen dem nun durch die Formel bestimmten Wert $y_k$ und dem exakten Wert $y(t_0+kh)$, die Beziehung
Hierbei ist $W=I-h\gamma J$, $\gamma=\beta_k/\alpha_k$ und $J$ ist die Jacobimatrix von $f$, deren Zeilen ausgewertet wurden an Stellen auf der Strecke zwischen $y(t_k)$ und $y_k$. Insbesondere gilt nicht notwendig $J=f_y(y_k)$, jedoch gilt dies näherungsweise. Im Falle steifer Differentialgleichungen und differential-algebraischer Gleichungen wird auch tatsächlich $W^{-1}L(y,t_0,h)$, bzw. eine Näherung hiervon, zum Gebrauch als Fehlerkonstante empfohlen, man vgl. hier Petzold (1982) und die dort angeführte Literatur. Im Falle von expliziten Formeln, also $\beta_k=0$, ist natürlich $W=I$.
You know, I am a multistep-man … and don't tell anybody, but the first program I wrote for the first Swedish computer was a Runge-Kutta code …
(G. Dahlquist, 1982, after some glasses of wine; printed with permission), Hairer/Wanner/Nørsett (1987)
Das Bemerkenswerte am Hopfschen Problem ist, daß eine einfach zu formulierende algebraische Frage eine einfache algebraische Antwort findet, daß indessen zur Lösung nichttriviale Methoden der Topologie erforderlich sind; hier erscheint zum ersten Mal der “topologische Stachel im Fleisch der Algebra”, der bis auf den heutigen Tag von vielen Algebraikern als so schmerzhaft empfunden wird.
R. Remmert, M. Koecher (1983)
Bibliographisch: Hairer, Ernst (*1949), Wanner, Gerhard (*1942), Nørsett, Syvert Paul, Remmert, Reinhold (1930--2016), Koecher, Max (1924--1990),
Der Kern der Konsistenzmatrix $C_{p,k}$ hat eine Fülle von sehr speziellen Eigenschaften, die hier zusammengestellt werden sollen. Anhand des sehr strukturierten Aufbaus dieser Matrix sind einige dieser Eigenschaften nicht verwunderlich. Insbesondere einige Symmetrieeigenschaften der Matrix übertragen sich auf den Kern. Nimmt man als Nebenbedingung noch das Erfülltsein der Wurzelbedingung hinzu, so gelten weitreichende Konsequenzen, hier die beiden Dahlquist-Barrieren. Diese beiden Barrieren sind auch eine der Gründe für das verstärkte Interesse an zusammengesetzten Verfahren.
1. Definition: Ein lineares $k$-Schrittverfahren heißt symmetrisch, falls
2. Beispiel: Das Milne-Simpson-Verfahren $y_{n+1}-y_{n-1}=h\cdot(f_{n+1}+4f_n+f_{n-1})/3$ ist symmetrisch, während hingegen alle Adams-Verfahren, implizit oder explizit, nicht symmetrisch sind. Die Nullstellen des charakteristischen Polynoms $\rho$ des Milne-Simpson-Verfahren liegen bei $(+1)$ und bei $(-1)$.
Für symmetrische lineare Mehrschrittverfahren gilt $\rho(\mu)=-\mu^k\rho(1/\mu)$, aufgrund der obigen Definition. Mit $\mu$ ist auch gleichzeitig $1/\mu$ Nullstelle von $\rho$.
Für ein stabiles lineares Mehrschrittverfahren liegen somit alle Wurzeln auf dem Einheitskreis und sind einfach. An solchen Verfahren ist man eher weniger interessiert, da bei Schrittweiten $h\ne0$, diese Wurzeln vom Betrage $1$ aus dem Einheitskreis nach aussen wandern. Allerdings hängt bei Schrittweiten $h\ne0$ dieses Verhalten stark vom Prädiktor ab. In der Kombination als Picard-Prädiktor-Korrektor-Verfahren oder als Stufen zyklischer Verfahren haben jedoch symmetrische lineare Mehrschrittverfahren gegenüber anderen Verfahren keine Nachteile.
Ein Verfahren der Konsistenzordnung $p$ liefert für eine Differentialgleichung mit Polynomen des Grades $p$ als Lösung, unter völliger Vernachlässigung von Rundungsfehlern, die exakte Lösung. Ist das Verfahren zusätzlich noch stabil, so konvergiert das Verfahren.
3. Satz: Es gilt
Es war $C_{p,k}\in\mathbb{Z}^{(p+1)\times(2k+2)}$ und mit dem ^{Dimensionssatz
für lineare Gleichungssysteme} ergibt sich daher
$\dim\ker C_{p,k}=(2k+2)-\min(p+1,k+1)$.
Den führenden Koeffizienten $\alpha_k$ kann man als Normierungsfaktor
auffassen, und damit gibt es genau eine $2k-p$ parameterabhängige
Schar von linearen $k$-Schrittverfahren, falls $p\ge k$.
Von dieser Schar ist aber nach der ersten Dahlquist-Barriere nur ein
kleiner Teil als einstufiges Verfahren konvergent.
Es zeigt sich, daß die maximal erreichbare Konsistenzordnung eines linearen Mehrschrittverfahrens der Form $\sum_{i=0}^k (\alpha_i y_{n+i} - h\beta_i f_{n+i})$ durch die Wurzelbedingung an $\rho$, begrenzt ist. Ist das charakteristische Polynom $\rho$ stabil, so ist dies gleichzeitig ein Hemmschuh für die maximal erreichbare Konsistenzordnung, d.h. Konsistenzordnung und Stabilität beissen sich gegeneinander, oder in noch anderer Formulierung, mehr geometrischer Sprechweise:
Die Menge aller derjenigen Vektoren
welche zu einem stabilen Polynom $\rho(\mu)=\sum_{i=0}^\kappa \alpha_i\mu^i$ führen, beschreibbar durch Ungleichungen vom Routh-Hurwitz-Typ, {Routh, E.J.}{Hurwitz, Adolf (1859--1919} stellt einen nicht-linearen Kegel im $\mathbb{R}^{2\kappa+2}$ dar. Die lineare Untermannigfaltigkeit beschrieben durch $C_{p,\kappa}{\alpha\choose\beta}=0$ schneidet den nicht-linearen Kegel überhaupt nicht für $p>\kappa+2$ und berührt ihn für $p=\kappa+1+{1\over2}\left[1+(-1)^\kappa\right]$. Es gilt der
4. Satz: (^{Erste Dahlquist-Barriere}) Das lineare $k$-Schrittverfahren sei wenigstens konsistent der Ordnung $1$ und das charakteristische Polynom $\rho$ erfülle die Wurzelbedingung.
(a) Dann unterliegt die Konsistenzordnung und damit gleichzeitig einhergehend die Konvergenzordnung $p$, einer Schranke nach oben wie folgt
(b) Weiterhin gilt: Stabile lineare Mehrschrittverfahren der maximalen Konsistenzordnung $k+2$ ($k$ also gerade) sind symmetrisch. Bei einem solchen linearen $k$-Schrittverfahren mit geradem $k$, besitzt $\rho$, also wie oben bemerkt, die Wurzeln $(+1)$, $(-1)$ und $(k-2)/2$ Paare verschiedener unimodularer Wurzeln. Zu jedem $\rho$ mit dieser Eigenschaft der Wurzeln, existiert genau ein einziges $\sigma$, sodaß $(\rho,\sigma)$ ein lineares $k$-Schrittverfahren der maximalen Konsistenzordnung $k+2$ ist.
5. Wegen dem großen Interesse, dem man diesem Satz beimißt, findet man den sehr schönen, funktionentheoretischen Beweisgang in mehreren ($\ge8$) Büchern. Verwiesen sei hier lediglich auf die schon mehrfach zitierten beiden Bücher von Werner/Arndt (1986) und Hairer/Wanner/Nørsett (1987) sowie Werner/Schaback (1972). Man vgl. auch die Bücher von Gear (1971c), Henrici (1962) und Stetter (1973) (unvollständiger Beweis).
Darüberhinaus ist der Satz erweitert worden, um für eine noch größere Klasse von Verfahren seine entsprechende Gültigkeit zu behalten, man vgl. hier Jeltsch/Nevanlinna (1986). Eine Kurzübersicht über Ordnungsbeschränkungen findet man in dem Tagungsaufsatz von Wanner (1987). G. Dahlquist bewies diesen Satz 1956.
Bibliographisch: Jeltsch, Rolf, Nevanlinna, Olavi, Hairer, Ernst (*1949), Wanner, Gerhard (*1942), Nørsett, Syvert Paul, Dahlquist, Germund, Stetter, Hans Jörg (*1930), Schaback, Robert (*1945), Werner, Helmut (1931--1985), Arndt, Herbert, Gear, Charles William (1935--2022), Henrici, Peter Karl Eugen (1923--1987).
6. Konsequenzen dieser ersten Dahlquist-Barriere sind:
6.1. Es gibt kein stabiles lineares $3$-Schrittverfahren mit der Konsistenzordnung 6. Es gibt allerdings mehrere lineare zyklische Mehrschrittformeln der Konvergenzordnung 6 mit nur 3 Startwerten, nämlich die Verfahren DH2 und DH3.{Donelson III, John}{Hansen, Eldon} Allerdings erhält man die Lösungswerte stets im “3er-Pack”. Die letzte Stufe dieser beiden dreistufigen Zyklen benutzt für sich alleine nur 3 Startwerte, davon stammen zwei aus dem aktuellen Zyklus, insgesamt jedoch hat man dann 6 Lösungswerte mit äquidistanten Gitterabstand vorliegen.
6.2 Die Adams-Moulton-Verfahren
haben die Konsistenzordnung $\kappa$ und die Konvergenzordnung $\kappa+1$, welches für ungerade $\kappa$ von keinem anderem konvergenten linearen einstufigen Mehrschrittverfahren überboten werden kann.
Als ein Beispiel für die Verallgemeinerungen, sei der Satz von Reimer aus dem Jahre 1968 angegeben, ohne Beweis. Während die erste Dahlquist-Barriere lediglich für lineare Mehrschrittverfahren galt, verallgemeinerte der Satz von Reimer, 12 Jahre später nach der ersten Dahlquist-Barriere, den Sachverhalt auf lineare Verfahren mit beliebig vielen Ableitungen.
Bibliographisch: Reimer, Manfred.
7. Satz: (Satz von Reimer über den maximalen Grad stabiler Differenzenformeln.) Die lineare Differenzenform
und der Normierung $\alpha_\kappa^{(0)}=1$ habe den Grad $p$ und sei stabil. Dann gilt
Die Schranke wird für jedes Paar $(\kappa,m)\in\mathbb{N}^2$ angenommen. Weiterhin wird der maximal mögliche Grad $p=N+1$ genau dann erreicht, wenn $N=(\kappa+1)m$ ungerade ist und das Verfahren symmetrisch ist.
Beweis: siehe Reimer (1982). ☐
8. Die hier häufig auftauchenden BDF$i$ haben das folgende Stabilitätsverhalten. Die BDF$i$ ist ein lineares $i$-Schrittverfahren der Konsistenzordnung $i$ und definiert durch die Formeln
9. Satz: Die BDF$i$ sind stabil für $i\in\{1,\ldots,6\}$ und instabil für alle $i\ge7$.
Den funktionentheoretischen Beweis findet man in dem Buche von Hairer/Wanner/Nørsett (1987). Die Tatsache, daß die BDF$i$ für alle $i\ge7$ instabil sind, wurde zuerst 1972 von C.W. Cryer bewiesen. Drei Jahre später erschien ein alternativer Beweis von D.M. Creedon und J.J.H. Miller (alle BIT). Der Satz gilt nicht für zusammengesetzte Verfahren, wo die BDF$i$ als Stufen auftauchen, wie z.B. das zyklische Verfahren siebenter Ordnung von Tendler (1973) deutlich macht. Man siehe auch Tendler/Bickart/Picel (1978).
Bibliographisch: Colin Walker Cryer, Theodore A. Bickart (1936--2023), obituary.
Joel Marvin Tendler: "A Stiffly Stable Integration Process Using Cyclic Composite Methods", Ph.D. Diss., Syracuse University, Syracuse, New York, 26.Feb.1973, viii+iv+172 pages.
1. Die erste Dahlquist-Barriere schränkt die höchstmögliche Konvergenzordnung ein, aber allerdings nicht allzu drastisch. Sehr drakonisch wird jedoch die Vielfalt $A$-stabiler linearer Mehrschrittverfahren durch die zweite Dahlquist-Barriere eingeengt. Es stellt sich heraus, daß man über die Ordnung 2 grundsätzlich nicht hinaus kommt. Hier gilt dann also
2. Satz: Zweite Dahlquist-Barriere.
(1) Ein lineares $A$-stabiles Mehrschrittverfahren ist stets implizit und besitzt höchstens die Konsistenzordnung und damit die Konvergenzordnung 2.
(2) Unter allen linearen $A$-stabilen Mehrschrittverfahren der Konsistenzordnung 2, besitzt die Trapezregel $y_{n+1}=y_n+h\cdot(f_{n+1}+f_n)/2$ ($\vartheta=1/2$-Einschrittverfahren) die kleinstmögliche Fehlerkonstante.
Die BDF2 ist das einzige lineare $2$-Schrittverfahren, welches $A_\infty^0$-stabil ist.
Für den funktionentheoretischen Beweis sei auf die Originalarbeit von Dahlquist (1963) verwiesen, Germund G. Dahlquist (1925--2005). Der Beweis beruht maßgeblich auf den folgenden beiden Sachverhalten und dem Vorzeichenverhalten gewisser Terme.
3. Lemma: Ein $k$-Schrittverfahren ist $A$-stabil genau dann, wenn $\rho(\mu)/\sigma(\mu)$ das Äußere des Einheitskreises auf die komplexe linke Halbebene abbildet, also $\mathop{\rm Re}\nolimits \left[\rho(\mu)/\sigma(\mu)\right]<0$, für $\left|\mu\right|>1$.
4. Satz: Satz von Riesz-Herglotz.
Voraussetzungen: Die Funktion $\varphi(z)$ sei holomorph für $\mathop{\rm Re}\nolimits z>0$. Desweiteren gelte für alle Argumente in der rechten Halbebene $\mathop{\rm Re}\nolimits \varphi(z)\ge0$, also
Ferner genüge $\varphi$ auf der positiven reellen Achse der Beschränktheitsbedingung $\sup\left\{\left|x\varphi(x)\right|: 0<x<\infty\right\}$.
Behauptung: $\varphi$ hat für alle Argumente aus der rechten Halbebene die Darstellung
wobei $\omega(t)$ beschränkt und nicht fallend ist.
Bibliographisch: Gustav Ferdinand Maria Herglotz (1881--1953), Friedrich Riesz (1880--1956).
Aus dieser einschränkenden Begrenzung der Konvergenzordnung, beziehen Begriffe wie $A[\alpha]$-, $S[\delta]$-Stabilität, etc., überhaupt ihre Berechtigung. Gäbe es $A$-stabile lineare $k$-Schrittverfahren beliebig hoher Ordnung, so wären dies die idealen Verfahren zur Lösung steifer Differentialgleichungen, unter der Voraussetzung daß nicht andere Eigenschaften, wie z.B. Schrittzahl $k$, Fehlerkonstanten, u.s.w., erheblich verschlechtert würden. Beispielsweise wäre ein $A_\infty^0$-stabiles, lineares 4-Schrittverfahren, bei Fehlerkonstanten im Bereich von ca. $1\over10$, ein ideales Verfahren zur Lösung steifer Differentialgleichungen. Die zweite Dahlquist-Barriere besagt, daß es solch ein Verfahren prinzipiell nicht geben kann.
Alternative Beweisgänge werden in Wanner (1987), s.u., angedeutet, allerdings nicht streng bewiesen. Die Trapezregel ist nicht $A_\infty^0$-stabil. Die Dissertation Tischer (1983) und Tischer/Sacks-Davis (1983) geben $A_\infty^0$- und $S_\infty^0$-stabile zyklische zweistufige Verfahren an, mit den Konvergenzordnungen $p=2,3,4$ und benötigten Startwerten von $k=2,3,4$. Allerdings sind bei allen Stufen der zyklischen Formeln von Tischer (1983) (Dissertation) und Tischer/Sacks-Davis (1983), die Äquilibrierungsmaße vergleichsweise hoch.
Bibliographisch: Peter E. Tischer, Ron Sacks-Davis.
Peter E. Tischer: "The Cyclic Use of Linear Multistep Formulas for the Solution of Stiff Differential Equations", Ph.D. Thesis, Department of Computer Science, Monash University, Clayton, Victoria, Australia, August 1983, x+180 pages.
Wanner, Gerhard (*1942): "Order Stars and Stability", in ``The State of the Art in Numerical Analysis", Proceedings of the joint IMA/SIAM conference held at the University of Birmingham, 14--18 April 1986, Edited by A. Iserles and M.J.R. Powell, Clarendon Press, Oxford, 1987, 451--471
Die Tatsache, daß ein explizites lineares Mehrschrittverfahren nicht $A$-stabil sein kann, ist sehr leicht einzusehen. Auch eine beliebige Kombination expliziter linearer Mehrschrittverfahren, mit äquidistanter Gitterweite $h$, kann nicht $A$-stabil sein. Sehr wohl kann jedoch eine Kombination von impliziten und expliziten Verfahren sogar $A_\infty^0$-stabil sein.
Zusätzliches Licht auf die Beziehung zwischen Konsistenzordnung und Stabilitätseigenschaften wirft der Satz von Jeltsch/Nevanlinna (1982).
Bibliographisch: Rolf Jeltsch, Olavi Nevanlinna.
5. Satz: siehe Jeltsch/Nevanlinna (1982). Es gilt
und
Weiter gibt es funktionale Zusammenhänge zwischen Fehlerkonstanten und erreichbarer Höchstordnung.
6. Satz: siehe Jeltsch/Nevanlinna (1986).
Voraussetzung: Es sei $c_{p+1}$ der Fehlerfaktor von
Die Wurzeln von $\rho_0(\zeta)$ seien $\zeta_1=1,\zeta_2,\ldots,\zeta_k$, welche in der Einheitskreisscheibe liegen:
Behauptung: (1) Ist die Formel explizit und von der Ordnung $p=mk$, so gilt
(2) Im impliziten Falle und der Ordnung $p=(k+1)m$ gilt
(3) In beiden Fällen, also in Fall (1) und (2) ist Gleichheit möglich bei der Formel maximaler Ordnung mit dem charakteristischen Polynom
welches stabil ist, für $R<1$ oder $R=1$ und $k\le2$.
Die Größen $f_{jkm}$ und $e_{jkm}$ sind gegeben durch
und
für $j=0,\ldots,k-1$.
Beweis: Jeltsch/Nevanlinna (1986). ☐
Nach dem Satz von Jeltsch/Nevanlinna (1982) gibt es also “fast $A$-stabile” lineare Mehrschrittverfahren mit beliebiger Anzahl von Startwerten. Dennoch sind diese Verfahren nicht $A$-stabil und schon gar nicht $A_\infty^0$- oder $S_\infty^0$-stabil, nach der zweiten Dahlquist-Barriere. Vielmehr rücken die Wurzeln betragsmässig immer mehr der eins näher, für $H\to\infty$, und die Fehlerkonstanten werden mit größer werdenden $k$ immer größer. Beispielsweise verwendet Gupta (1985) $k$-Schrittverfahren mit den in der Tabelle angegebenen Eigenschaften.
Bibliographisch: Gopal K. Gupta.
p | $\alpha$ | $\delta$ | $c_{p+1}$ | $\mu_\infty$ | k |
---|---|---|---|---|---|
1 | 90.00 | 0.0 | 0.5 | 0.0 | 1 |
2 | 90.00 | 0.0 | 0.083 | 1.0 | 1 |
3 | 86.46 | 0.075 | 0.242 | 0.32 | 3 |
4 | 80.13 | 0.282 | 0.374 | 0.43 | 5 |
5 | 73.58 | 0.606 | 0.529 | 0.567 | 7 |
6 | 67.77 | 1.218 | 0.724 | 0.878 | 9 |
7 | 65.53 | 1.376 | 1.886 | 0.898 | 12 |
8 | 64.96 | 1.149 | 7.686 | 0.790 | 16 |
9 | 62.78 | 2.086 | 16.737 | 0.989 | 19 |
10 | 63.74 | 1.223 | 133.955 | 0.878 | 26 |
Hierbei bedeutet $p$ die Konvergenzordnung, $k$ die Anzahl der Startwerte, $c_{p+1}$ der Fehlerfaktor, $\alpha$ der Widlund-Winkel, und $\delta$ ist der entsprechende Wert bei der $S[\delta]$-Stabilität. $\mu_\infty$ ist der Betrag der betragsmässig größten Wurzel bei $\infty$.
Es zeigt sich, daß das Programm DSTIFF, welches diese Formeln benutzt, häufig doppelt so viele Funktionsauswertungen und doppelt so lange Rechenzeiten beansprucht, wie das Programm LSODE, welches auf den BDF$i$, mit $i\in\{1,\ldots,5\}$ basiert. Man beachte allerdings, daß hier Implementierungen von Formeln und Heuristik miteinander verglichen wurden. Dieser Vergleich, den Gupta (1985) anstellte, ist also keine endgültige Wertung von Formeln, sondern eine Wertung von Programmen. Eine geschickte Programmierung und eine durchdachte Heuristik sind von nicht zu unterschätzender Wichtigkeit.
Aufgrund einer modifizierten Strategie für die Korrektoriteration in dem Programm DSTIFF, sind die Anzahlen für $LU$-Zerlegungen (= Jacobimatrixauswertungen) leicht geringer, als für das Programm LSODE. Lediglich erwartungsgemäss für das Problem B5 benötigt das Programm DSTIFF bedeutend weniger Schritte, als das Programm LSODE. Bei diesem Problem werden die Stabilitätseigenschaften besonders gefordert. Wüßte man im voraus um die Lage der Eigenwerte der konstanten Jacobimatrix, so könnte man bei dem Programm LSODE gleich von vorne herein eine passende Höchstordnung wählen und damit würden sich beide Programme wieder angleichen. Das Verhältnis der Schritte der beiden Programme zueinander beträgt bei B5 grob $1:4$ (DSTIFF:LSODE). Dieses Verhältnis übersetzt sich allerdings nicht in gleichem Maßstab auf die Rechenzeit. Die Rechenzeit ist lediglich um einen wesentlich geringeren Betrag angestiegen.
Eine gewisse Sonderstellung nehmen die BDF$i$ ein, wegen $\sigma(\mu)=\mu^i$.
7. Bemerkung: Die BDF$i$ sind die einzigen linearen $i$-Schrittverfahren der Konsistenzordnung $i$, für $i=1,\ldots,6$, die $A_\infty^0[\alpha]$- bzw. $S_\infty^0[\delta]$-stabil sind.
Es gibt weitere lineare Mehrschrittverfahren ($\ne$BDF$i$), die $A_\infty^0[\alpha]$- bzw. $S_\infty^0[\delta]$-stabil sind, jedoch ist dann die Konsistenzordnung $i$ nicht mehr mit $i$ Startwerten zu erreichen. Für mehrstufige Verfahren gilt die Bemerkung nicht mehr, wie z.B. die zyklischen Formeln von Tendler (1973) deutlich machen, siehe auch Tendler/Bickart/Picel (1978).
Wie üblich bedeute “$\cong$” Gleichheit bis auf ${\cal O}(h^{p+2})$. Jede Stufe eines zusammengesetzten Verfahrens wird nun in einen Taylorabschnitt (Taylor, Brook (1685--1731)) zerlegt und man erhält hierfür
$\gamma$ kann aufgespalten werden in eine Summe
und jeder Summand wird einzeln auf annullierte Dominanz, oder Totalannullation geprüft. Bei Verfahren, bei denen alle Stufen die gleiche Konsistenzordnung haben, sind $c_{ij}=0$, für $j\le p$, und $i=1,\ldots,s$, und die obige Gleichung reduziert sich dann auf
1. Beispiel: Es werde das explizite Euler-Verfahren als Prädiktor verwendet und mit der BDF2 werde zweimal anschliessend iteriert.
Schritt | Formel | Verfahren |
---|---|---|
Prädiktor | $y^0_{n+1}=y_n+z_n$ | explizites Euler-Verfahren |
Korrektor | $y_{n-1}-4y_n+3y^1_{n+1}=2z^0_{n+1}$ | BDF2 |
Korrektor | $y_{n-1}-4y_n+3y_{n+1}=2z^0_{n+1}$ | BDF2 |
Mit $u_n=(y^0_n,{\mskip 3mu}y^1_n,{\mskip 3mu}y_n)$ ergibt sich für die sechs Matrizen
Für das Matrixpolynom $\rho(\mu)=A_0+A_1\mu+A_2\mu^2$ ergibt sich
Auffällig ist die obere Dreiecksgestalt und die Verteilung der $\mu^\kappa$-Terme auf der Diagonalen. Weiterhin erscheint in der rechten unteren Ecke das charakteristische Polynom des Korrektors. Dieser Sachverhalt gilt ganz allgemein. Der Nullensatz für Prädiktor-Korrektor-Verfahren lautet:
2. Satz: Sei $\rho_c$ das charakteristische Polynom des Korrektors. Für das Matrixpolynom eines $P(EC)^i\{E\}$-Verfahrens, mit
hat man für alle $\mu\in\mathbb{C}$ die Darstellung
Beweis: (Nullensatz) Es ist
Die ersten $i$ Komponenten der Vektoren $u_{n+\nu}$ kommen in der letzten Korrektorstufe nicht vor. Die Matrizen $A_0,\ldots,A_{\kappa-1}$ tragen Elemente lediglich auf der letzten Spalte, sind also alle von der Form
während hingegen $A_\kappa$ Diagonalgestalt hat, also
wobei $\alpha_{11}=\alpha_\kappa^P$, der führende Koeffizient des Prädiktor-Verfahrens ist und $\alpha_{22}=\cdots=\alpha_{i+1,i+1}=\alpha_\kappa$ gleich dem führenden Koeffizient des Korrektors ist. Summation der $A_\nu\mu^\nu$ ergibt die Behauptung. ☐
Nur $y^*_{n+1}$, also die Lösung der impliziten Korrektorgleichung für die Zeit $t_{n+1}$, ist gesucht. Die anderen vergangenen Werte sind schon gefunden. Die Zwischenwerte der vergangenen Iterationen werden nicht mehr verwendet, anders als bei semiiterativen Verfahren. Würde man diese dennoch verwenden, so könnte sich natürlich auch das Spektrum ändern, weil sich sich dann auch die obere Dreiecksgestalt ändert. Vorausgesetzt wird hier ebenfalls, daß immer mit dem gleichen Korrektor iteriert wird, und daß nur ein einziger Prädiktor genommen wird. Z.B. verwenden off-step-point Verfahren u.U. mehrere Prädiktoren, so auch Filippi/Kraska (1973).
Bibliographisch: Siegfried Filippi (1929--2022), Ernst Kraska (1932--2021), Todesanzeige.
3. Folgerungen: (1) Das charakteristische Polynom $Q(\mu,0)=\det\rho(\mu)$ sowohl des $P(EC)^iE$-, als auch des $P(EC)^i$-Verfahrens hat mindestens $\kappa i$ Nullen im Spektrum und die restlichen $\kappa$ Eigenwerte stimmen mit den Wurzeln des charakteristischen Polynomes $\rho_c$ des Korrektors überein.
(2) Insbesondere ist ein $P(EC)^iE$- bzw. $P(EC)^i$-Verfahren genau dann stabil, wenn der Korrektor stabil ist. Die Stabilität der Prädiktorformel ist völlig unerheblich für die $D$-Stabilität des $P(EC)^iE$- bzw. $P(EC)^i$-Verfahrens. Sehr wohl hat natürlich der Prädiktor Einfluß auf das Aussehen des Stabilitätsgebietes.
(3) Die Linkseigenvektoren $v_m$ mit $m=1,\ldots$, zu den nicht zu Null gehörenden Eigenwerten, also somit $m\le\kappa$, sind alle von der Form
Folgerung (2) kann man auch auf andere Art und Weise einsehen. Seien die beiden Funktionen $\varphi$ und $\psi$ Lipschitz-stetig, dann ist auch die verkettete Funktion $\varphi\circ\psi$ Lipschitz-stetig. Ist also
so gilt
Denkt man sich nun ein Picard-Prädiktor-Korrektor-Verfahren nicht als einziges mehrstufiges, i.d.R. lineares Verfahren, sondern denkt man es sich als ein ineinander verschachteltes, i.d.R. nicht-lineares Verfahren, so sieht man ebenfalls sofort, daß für die Stabilitätseigenschaften bzgl. $h\to0$, nur der Korrektor maßgeblich ist und der Prädiktor unmaßgeblich ist.
4. Sei der Prädiktor $\hat z_{n+\kappa}$ gegeben durch die Matrix-Differenzengleichung
und der Korrektorwert ergebe sich als Lösung der Matrix-Differenzengleichung
Picard-Iteration besteht nun darin, daß man den Wert $z_{n+\kappa}$ in der Funktion $\psi$ ersetzt durch die Iterierte der vorherigen Iteration, also wird $z_{n+\kappa}$ in $\psi$ ersetzt durch $\hat z_{n+\kappa}$. Direkte Substitution der Bestimmungsgleichung für den Prädiktorwert $\hat z_{n+\kappa}$ in die Funktion $\psi$, ergibt dann
wobei die Funktion $\vartheta$ Lipschitz-stetig ist und damit erhält man mit den üblichen Sätzen bei gegebener Konsistenz und Stabilität dann die Konvergenz. Über die Entstehungsgeschichte von $\vartheta$ braucht man nichts zu wissen, außer eben, daß $\vartheta$ Lipschitz-stetig bzgl. seiner Argumente ist. Insbesondere die Nullstabilität hängt jetzt offensichtlich nur noch von den Matrizen $A_i$ ab. Iteriert man häufiger als einmal, also Picard-$P(EC)^i\{E\}$ (i>1), so wird die Verschachtelungtiefe nur höher, am Prinzip ändert sich nichts.
Aus der Folgerung (3) ergibt sich jetzt sofort, daß die Fehlervektoren des Prädiktors und die Fehlervektoren der Zwischeniterierten von den Linkseigenvektoren $v_m$ vollständig weggefiltert werden. Dies heißt, die Eigenwerte nicht gleich Null bekommen nur den Fehlerfaktor des Korrektors zu Gesicht und die restlichen Fehlerfaktoren werden von den Nullen im Spektrum total annulliert. Überhaupt gibt es Parallelen zwischen Runge-Kutta-Verfahren und Prädiktor-Korrekor-Verfahren. Prädiktor-Korrektor-Verfahren steht hier sowohl für $P(EC)^iE$- also auch für $P(EC)^i$-Verfahren, kurz $P(EC)^i\{E\}$-Verfahren. Diesen Effekt der Totalannullation kann man anhand eines Beispiels besonders deutlich nachvollziehen.
5. Beispiel: Als Prädiktor-Korrektor-Verfahren werde verwendet
Schritt | Formel | Verfahren |
---|---|---|
Prädiktor | $y^0_{n+1}=y_n+z_n$ | explizites Euler-Verfahren |
Korrektor | $y_{n-1}-4y_n+3y_{n+1}=2z^0_{n+1}$ | BDF2 |
Mit $u_n=(y^0_n,{\mskip 3mu}y_n)$ erhält man die sechs Matrizen
Als Lösung für die Differenzengleichung
erhält man nach Durchmultiplikation mit $A_2^{-1}$ für den dominanten Term
Die ersten Fehlerterme des Prädiktors sind $h^2/2\ddot y+{\cal O}(h^3)$ und für den Korrektor lauten sie $-2h^3/3y^{III}+{\cal O}(h^4)$.
Die Fehlervektoren des Prädiktors liegen nun gerade so, daß sie genau auf diese Nullen heraufpassen, das heißt die Fehlervektoren stehen senkrecht auf den nicht zu Null gehörenden Jordanvektoren. Die vom Prädiktor gelieferten niedrigen Konsistenzordnungen, werden deswegen total annulliert (Totalannullation). Dieses Verhalten ist völlig analog dem Verhalten bei Runge-Kutta-Verfahren, wo die Stufen mit niedrigen Konsistenzordnungen von den Nullen in der Jordanmatrix
vollständig bedämpft werden und somit keinerlei Wirkung zeigen. Dies gilt zumindestens im asymptotischen Falle $h\to 0$, wo allein einzig die $A_\nu$ entscheidend wirken und die Matrizen $B_\nu$ keine Rolle spielen.
6. Beispiel: Runge-Kutta-Verfahren mit insgesamt 4 Stufen.
Die Konsistenzordnung kann pro Stufe um eine Einheit steigen. Die Matrix $C$ hat somit die Form
7. Beispiel: Die hier zutage tretende Ähnlichkeit zwischen Runge-Kutta-Verfahren und $P(EC)^i\{E\}$-Verfahren gilt sogar soweit, daß manche $P(EC)^i\{E\}$-Verfahren mit bestimmten expliziten Runge-Kutta-Ver-fahren völlig gleichwertig sind. Zum Beispiel gilt für das verbesserte Euler-Verfahren mit dem Parametertableau
daß es völlig identisch ist mit dem impliziten Trapezverfahren, wobei das explizite Euler-Verfahren als Prädiktor verwendet wird:
Die Analyse beider Verfahren geschieht häufig völlig getrennt. Die Konsistenzordnung 2 des verbesserten Euler-Verfahrens weist man häufig durch Taylorentwicklung direkt nach. Beim Prädiktor-Korrektor Verfahren wendet man die Konsistenzsätze an, weist Stabilität des Korrektors nach und zeigt schließlich mit Hilfe des Satzes von Liniger (1971), daß die Konsistenzordnung des Korrektors erhalten bleibt, wenn man ausreichend lange iteriert.
8. Wichtig für das Konvergenzverhalten ist die spektrale Struktur der drei Matrizen $X$, $J$ und $Y$:
Seien $v_1,\ldots,v_r$ die Linkseigenvektoren zum Matrixpolynom $\rho$ zum Eigenwert $\lambda=1$, so gilt als Bedingung der annullierten Dominanz
Für den Fall $r=1$ erhält man also die geometrische Bedingung, daß die Spalten der Matrix $(\rho(1),{\mskip 3mu}\gamma)$ aus dem orthogonalen Komplement von $v$ sein müssen, somit
Ist der Linkskern von $\rho(1)$ nicht mehr 1-dimensional, sondern $r$-dimensional, so hat die Bedingung zu gelten
Für Eigenwerte $\left|\mu\right|=1$ gilt ganz entsprechend
wobei $r$ jetzt die Vielfachheit des Eigenwertes zu $\left|\mu\right|=1$ ist und entsprechend $v_1,\ldots,v_r$ die Linkseigenvektoren zu diesem Eigenwert sind. Algebraische Vielfachheit (=Multiplizität der Nullstelle des charakteristischen Polynoms) und geometrische Vielfachheit (=Dimension des invarianten Unterraumes) müssen bei dominanten Eigenwerten natürlich gleich sein. Anhand der oben schon angegebenen Darstellung für die Lösung der Matrixdifferenzengleichung, und zwar in der Form
ist das Auftauchen der Linkseigenvektoren sofort offenkundig. Die Bedingung der annullierten Dominanz ist eine stetige Invariante, da bei einfachen Eigenwerten die Eigenvektoren stetig von kleinen Änderungen abhängen. Bei mehrfachen Eigenwerten muß dies nicht unbedingt gelten.
Man vgl. auch On Differential Forms.
1. Da die Determinante in jeder Spalte linear ist, stellt
für fest gegebene $a_1,\ldots,a_{n-1}\in\mathbb{R}^n$, eine Linearform des $\mathbb{R}^n$ dar. Nach dem Darstellungssatz von Riesz:
Sei $H$ ein Hilbertraum, und sei $f:H\to\mathbb{C}$ ein stetiges lineares Funktional, dann
und weiter ist $|b|=|f|$.
Daher gibt es genau einen Vektor $b\in\mathbb{R}^n$, sodaß die Linearform als Skalarprodukt geschrieben werden kann:
Bibliographisch: Riesz, Friedrich (1880--1956).
2. Diesen, implizit durch das Skalarprodukt, eindeutig bestimmten Vektor $b$ nennt man das Vektorprodukt (auch Kreuzprodukt oder äußeres Produkt) und schreibt hierfür
oder auch
Es gilt also
3. Hieraus liest man ab
Die letzte Gleichung sagt, daß das äußere Produkt senkrecht auf jedem “Einzelfaktor” steht. Weiter kann man jetzt noch die Jacobische und die Grassmannsche Identität leicht nachrechnen. Die obigen Gleichungen gelten auch für $n=2$, wobei dann $\bigwedge_{i=1}^1a_i=a_1$ ist.
Bibliographisch: Grassmann, Hermann (1809--1877), Jacobi, Carl Gustav (1804--1851).
Das oben eingeführte äußere Produkt ist ein spezielles äußeres Produkt. Es gibt weitere äußere Produkte. Bei diesen ist der Bildbereich nicht mehr notwendig gleich $\mathbb{C}^n$, sondern $\mathbb{C}[{n\choose m}]$, bei einem $m$-fachen Produkt. Für $m=n-1$ ergibt sich natürlich genau das oben angegebene Produkt, bis auf Proportionalität.
4. Die Komponenten des Vektors $b$ bei $(*)$, ergeben sich durch sukzessives Einsetzen der $n$ Einheitsvektoren $e_i$ zu
Für den Betrag des äußeren Produktes gilt
weges des Satzes über die Gramsche Determinante (Gram, Jorgen Pedersen (1850--1916))
5. Die Definition des Vektorproduktes kann auch in der folgenden Form geschehen:
ist eine Linearform für feste $a_i$, u.s.w. Die $a_1,\ldots,a_{i-1},x,,a_{i+1},\ldots,a_n$ bilden ein Rechtssystem.
6. Beispiel: $n=3$. Gesucht sind die Komponenten des Vektorproduktes $a\times b$, mit $a=(\alpha_1,{\mskip 3mu}\alpha_2,{\mskip 3mu}\alpha_3)$ und $b=(\beta_1,{\mskip 3mu}\beta_2,{\mskip 3mu}\beta_3)$. Zu berechnen sind drei Determinanten,
7. Beispiel: $n=2$. Gesucht sind die Komponenten des Vektors $a^\bot$, welcher senkrecht steht auf $a$, mit $a={\alpha_1\choose\alpha_2}$. Das äußere Produkt liefert gerade solch einen Vektor. In diesem Fall hat das Produkt nur einen Faktor. Zu berechnen sind hier $n=2$ Determinanten und zwar
Eine Einführung in das Vektorprodukt findet man beispielsweise in den Büchern von Walter (1986) oder Koecher (1985). Besonders hervorzuheben ist hierbei die ausführliche Darstellung von Gröbner (1966).
Bibliographisch: Rolf Walter (1937--2022), Max Koecher (1924--1990), Wolfgang Gröbner (1899--1980).
Für die Fehlerkonstante von Henrici
erhält man nun das folgende Resultat. Da das äußere Produkt $\bigwedge_{i=1}^{n-1}a_i$ senkrecht steht auf $a_i$, für $i=1,\ldots,n-1$, ist dieses Produkt also Linkseigenvektor von $\rho(1)$, wenn man die Spalten der Matrix $\rho(1)$ mit $a_i$ bezeichnet und einen Spaltenvektor, sagen wir $a_n$, herausstreicht. Wenn man einmal von Umnumerierungen absieht, so hat man damit alle Fälle abgedeckt. Die Restmatrix sei
Ist $\bigwedge_{i=1}^{n-1}a_i=0$, so hat $\rho(1)$ einen mehrfachen Eigenwert $\mu=1$; man erhält hier also zugleich ein leichtes Kriterium, unter der Voraussetzung starker Stabilität. Dies liegt daran, daß das Vektorprodukt genau dann verschwindet, falls die Faktoren linear abhängig sind, siehe Gröbner (1966). Da die Berechnung von $\bigwedge_{i=1}^{n-1}a_i$ allerdings häufig über Determinanten geschieht, ist dieses Kriterium von der praktischen Rechnung nicht immer günstig. Wie starke Stabilität nachgewiesen wurde, sei hier dazu noch nicht einmal berücksichtigt. Für die Fehlerkonstante ergibt sich wegen $(**)$
Dies heißt, das Volumen der durch die linear unabhängigen Spaltenvektoren von $\rho(1)$ und dem Vektor $\gamma$ aufgespannten Körpers, ist der Zähler der Henricischen Fehlerkonstante.
Verschwindet der Zähler der Henricischen Fehlerkonstante, so liegt annullierte Dominanz vor. Albrecht (1979) nennt dies die Ordnungsbedingung. Durch Berechnen von $\det\left(\widehat{\rho(1)},\gamma\right)$ kann man dies also überprüfen. Diese Prüfung auf annullierte Dominanz kann man natürlich auch ohne den Umweg über das Kreuzprodukt, wie folgt herleiten. Aus
folgt, daß die zusammengesetzte Matrix $\left(\rho(1),\gamma\right)$ nicht maximalen Rang haben kann, also
Hierbei war $n_1$ die Vielfachheit des Eigenwertes $\mu=1$. Für Eigenwerte $\left|\mu\right|=1$ gilt allgemein $\mathop{\rm rank}\left(\rho(\mu),\gamma\right)=\kappa-n_\mu$, mit $n_\mu$ Vielfachheit des Eigenwertes $\left|\mu\right|=1$. Falls $n_\mu\ge1$ dann $\det\left(\widehat{\rho(1)},\gamma\right)=0$.
Damit sind alle denkbaren Fälle erschöpft, wenn man von Umnumerierungen absieht.
1. Beispiel: Zweistufiges, zyklisches lineares Mehrschrittverfahren mit zwei Startwerten. Die erste Stufe, mit Fehlerfaktor $\gamma_1$, sei
und die zweite Stufe, mit Fehlerfaktor $\gamma_2$, sei
Dann ist
2. Bedingung der annullierten Dominanz für zweistufige Verfahren. Für zweistufige Verfahren hat man
und der Fehlervektor sei $\gamma=(\gamma_1,{\mskip 3mu}\gamma_2)$. Aufgrund der Konsistenz $\rho(1){\mskip 3mu}{1\choose 1}={0\choose0}$, ist
Ist nun die Matrix $\rho(1)$ nicht die Nullmatrix, so erhält man als Linkseigenvektor zu $\rho(1)$ natürlich
und damit als Bedingung für annullierte Dominanz
Wäre jetzt $(\alpha_g^1,{\mskip 3mu}\alpha_g^2)=(0,{\mskip 3mu}0)$, so wäre die Matrix $\rho(1)$ gleich der Nullmatrix und die Bedingung der annullierten Dominanz führte zu der Bedingung, daß der Fehlervektor $\gamma$ sowohl auf $1\choose 0$, als auch auf $0\choose 1$ senkrecht stehen müßte. Damit wäre $\gamma_1=\gamma_2=0$, die Bedingung also leer. Die Konsistenzordnung im modifizierten Sinne wäre schon eine Ordnung höher als die wirklich erreichte Konvergenzordnung.
3. Beispiel: Verwendet man als erste Stufe das ^{Verfahren von Milne-Simpson} der Ordnung 4, mit
und als zweite Stufe ein beliebiges Verfahren dritter Ordnung, so ist die Bedingung der annullierten Dominanz automatisch erfüllt, wegen
Das so gebildete zweistufige Verfahren konvergiert dann insgesamt mit der Ordnung 4.
4. Bedingung der annullierten Dominanz für dreistufige Verfahren. Sei der Fehlervektor des Verfahrens bezeichnet mit $\gamma=(\gamma_1,{\mskip 3mu}\gamma_2,{\mskip 3mu}\gamma_3)$ und der Matrix $\rho(1)$ sei gegeben durch
wobei
Als Bedingung für annullierte Dominanz ergibt sich nun
unter der Voraussetzung, daß $\rho(1)$ den Rang 2 hat.
Die Verallgemeinerung auf den $r$-stufigen Fall ergibt unmittelbar
1. Henrici, Peter Karl Eugen (1923--1987). Hier wird nun allgemeiner eine Klasse von Fehlerkonstanten vorgestellt und die Beziehung zueinander werden aufgezeigt. Liegt das Verfahren $z_{n+1}=Az_n+h\varphi_n$ zugrunde mit Fehlervektor $\gamma$, so wird eine Fehlerkonstante definiert durch
Sei jetzt leicht allgemeiner $Lz_{n+1} = Uz_n + h\varphi_n$. Dann gilt
Dies gilt wegen $A=-L^{-1}U$, daher
Aus $\tilde v(A-I)=0$ folgt
und damit ist $v$ Linkseigenvektor von $L\mu+U$ zum Eigenwert $\mu=1$, während $\tilde v=vL^{-1}$ und $\tilde\gamma=L^{-1}\gamma$ war. Vorausgesetzt ist natürlich, daß das Matrixpolynom $L\mu+U$ monisch ist, also $L$ invertierbar ist. Wegen der Null-Stabilität des Verfahrens ist das natürlich der Fall. Erkennbar ist auch, daß der Nenner nicht verschwinden kann, da die Matrix $A$ zur Klasse M gehört, siehe Ortega (1972).
Bibliographisch: Ortega, James McDonough.
Die obige Fehlerkonstante verallgemeinert sich sinngemäß bei mehrfachen Eigenwerten $\mu=1$.
Da die zyklischen Verfahren in der Dissertation von Tendler (1973) oder Tendler/Bickart/Picel (1978), in der Dissertation von Tischer (1983) und Tischer/Sacks-Davis (1983) und schließlich auch alle zyklischen Verfahren von Donelson/Hansen (1971) jedoch nur einen einfachen Eigenwert bei $\mu=1$ besitzen, wird dieser Fall hier nicht weiter verfolgt.
Bibliographisch: Peter E. Tischer, Ron Sacks-Davis, Donelson III, John (1941--2010), biography, Hansen, Eldon Robert (*1927), wiki.
Joel Marvin Tendler: "A Stiffly Stable Integration Process Using Cyclic Composite Methods", Ph.D. Diss., Syracuse University, Syracuse, New York, 26.Feb.1973, viii+iv+172 pages.
Peter E. Tischer: "The Cyclic Use of Linear Multistep Formulas for the Solution of Stiff Differential Equations", Ph.D. Thesis, Department of Computer Science, Monash University, Clayton, Victoria, Australia, August 1983, x+180 pages.
Im folgenden werden zwei Eigenschaften der Fehlerkonstanten von Henrici gezeigt. Zum einen ist die Fehlerkonstante von Henrici unabhängig von einer Skalierung des Verfahrens und zum anderen kann man sich auf den Fall einer Linearisierung des Matrixpolynomes beschränken. Für die praktische Rechnung von Linkseigenvektoren und weiteren Größen ist es natürlich günstiger das Verfahren in Form eines Matrixpolynomes mit möglichst geringer Dimension darzustellen. An anderer Stelle wiederum ist es angebrachter die Linearisierung zu betrachten, um nur mit einer einzigen Matrix zu hantieren. Daher ist es günstig für beide Darstellungen äquivalente Beschreibungen zur Verfügung zu haben.
Als nächstes wird nun also gezeigt, daß die Fehlerkonstante von Henrici unanhängig von einer Skalierung der Stufen ist. Jede Stufe darf beliebig mit einem Faktor $(\ne\!0)$ multipliziert werden, der gesamte Zyklus darf sogar einer nichtsingulären Skalierung unterzogen werden. Weiterhin ersieht man hieraus, daß die Fehlerkonstante von Henrici unabhängig von der Reihenfolge der Stufen ist. Für die umgedrehte Reihenfolge der Stufen wählt man beispielsweise einfach die Hankelmatrix $D=(\delta_{i,s+1-j})_{i,j=1}^s\in\mathbb{C}^{s\times s}$. Eine Vertauschung von Stufen innerhalb eines Zykluses kann natürlich sehr wohl die Anzahl der Startwerte ändern, u.U. kann sich also auch sogar die Anzahl der Matrizen im Matrixpolynom ändern. Dieser Fall ist dennoch mitberücksichtigt, da man ja das “alte” Verfahren mit Nullmatrizen ergänzen kann.
2. Satz: Sei $D\in\hbox{GL}(\mathbb{C},s)$ und sei $\hat\rho(\mu)=D\rho(\mu)$ das skalierte Polynom. Das zu dem Matrixpolynom $\rho$ gehörige Verfahren habe die Fehlerkonstante
Der Vektor $\gamma$ enthält hierbei die Fehlerfaktoren der Stufen. $\hat C$ sei die Fehlerkonstante von Henrici des skalierten Verfahrens. Dann gilt
Beweis: Es ist $\hat\rho(1)=D\rho(1)$, $\hat\gamma=D\gamma$, und $\hat v:=vD^{-1}$ ist Linkseigenvektor von $\hat\rho(1)$. Die Ableitung des Matrixpolynomes $\rho$ an der Stelle 1 skaliert sich ebenfalls entsprechend, also $\hat\rho'(1)=D\rho'(1)$. Der Rechtseigenvektor $w$ ist auch gleichzeitig Rechtseigenvektor von $\hat\rho(1)$. Nun ist
☐
3. Sei jetzt allgemeiner statt des Matrixpolynoms $\rho(\mu)=L\mu+U$, betrachtet der Fall des Matrixpolynoms
Dann ist
eine Fehlerkonstante. Hierbei sind $v$ und $w$ entsprechend die Links- und Rechtseigenvektoren des Matrixpolynomes $\rho(\mu)$ zum dominanten Eigenwert $\mu=1$, es ist also
Durch Wahl einer speziellen Norm und entsprechende Normierung des Vektors $w$ kann man dann auch den bestimmten Artikel benutzen.
In natürlicher und offensichtlicher Weise wird hiermit die klassische Fehlerkonstante von Henrici verallgemeinert. Auch hier kann der Nenner nicht verschwinden, da, wie unten gezeigt wird, diese Konstante mit der oben angegebenen Konstante äquivalent ist. Sind die Koeffizienten des Polynomes $A_i$ nicht von der Form $\alpha_i\otimes I$, so gilt nicht notwendig $\rho'(1)=\sigma(1)$, wie man anhand des folgenden Beispiels einsieht.
4. Beispiel: Die zyklische, zweimalige Hintereinanderausführung der BDF2 führt auf die Matrix mit den Einträgen
und den Elementen
Hier ist $\rho(\mu)=A_0+A_1\mu$ und $\sigma(\mu)=B_1\mu$. Offensichtlich gilt jetzt nicht $\rho'(1)=\sigma(1)$, da $\rho'(1)\equiv A_1\ne\sigma(1)\equiv B_1$ und dies obwohl jede Stufe die gleiche Konsistenzordnung hat, ja sogar alle Stufen gleich sind.
Nun wird gezeigt, daß alle angegebenen Fehlerkonstanten äquivalent sind. Um die nachstehenden Überlegungen durchsichtiger zu gestalten, soll anhand eines einfachen Beispieles unter anderem einige Eigenschaften der Begleitmatrix gezeigt werden.
5. Beispiel: Es sei das Polynom
vorgelegt, und es sei $\rho(1)=0$. Die Koeffizienten dieses Polynoms seien aus einem beliebigen Ring, nicht notwendig kommutativ, wobei 1 das neutrale Element bezeichne. Die Begleitmatrix zu $\rho$ sei
Jetzt ist
Linkseigenvektor des Matrixpolynoms $I\mu-C_1$ zu $\mu=1$, wegen
da ja $\aa+\ab+\ac+1=0$, aufgrund $\rho(1)=0$. Wichtig ist noch zu vermerken, daß die Summe der Komponenten des Vektors $v$, gerade die Ableitung des Polynoms an der Stelle 1 ist, also es gilt
Wegen $\rho(1)=0$ ist selbstverständlich $w^\top=(1,1,1)$ Rechtseigenvektor der Matrix $C_1$. Den Linkseigenvektor zu $C_1\in\mathbb{C}^{s\times s}$ kann man natürlich auch über das äußere Produkt erhalten. Aus der Matrix $(I-C_1)$ streicht man eine Spalte und ersetzt diese Spalte sukzessive $s$-mal durch den $i$-ten Einheitsvektor, für $i=1,\ldots,s$ und berchnet die $s$ Determinanten, also die Komponenten des äußeren Produktes.
Interessant ist in diesem Zusammenhang der nachstehende Zusammenhang zwischen Rechtseigenvektoren und Begleitmatrix, siehe Schäfke/Schmidt (1973), S.94.
Bibliographisch: Schäfke, Friedrich Wilhelm (1922--2010), Schmidt, Dieter (*1941).
6. Satz: Sei $C_1$ die Begleitmatrix des monischen Polynoms $\rho$ des Grades $n$. Ist $0\ne\mu\in\mathbb{C}$ Nullstelle von $\rho(\mu)$ der genauen Ordnung $r$, so liefert die vektorwertige Funktion $w_0\colon\mathbb{C}\to\mathbb{C}^n$ definiert durch
mit
ein System von Rechts-Jordanvektoren zum Eigenwert $\mu$ von $C_1$, für welches also gilt
Beweis: Man geht aus von der Identität $(\lambda I-C_1)=\rho(\lambda)e_n$, wobei $e_n=(0,\ldots,0,1)\in\mathbb{C}^n$. $i$-malige Differentiation liefert
Einsetzen von $\lambda=\mu$, für $i=0,1,\ldots,r-1$ ergibt mit $\rho^{(r)}(\mu)=0$ (algebraische Vielfachheit von $\mu$), daß die $r$ linear unabhängigen Vektoren $w_i$ Hauptvektoren zu $\mu$ von $C_1$ sind. ☐
Um nun eine gewisse Äquivalenz der Fehlerkonstanten zu zeigen, verfährt man wie nachstehend. Bei gewissen Einschränkungen an die Links- und Rechtseigenvektoren, kann man tatsächlich Gleichheit erzielen. Zumindestens Proportionalität ist stets gewährleistet.
7. Satz: Voraussetzungen: Es sei
($\ell{\buildrel\land\over=}$Stufenzahl), ferner sei $C_1\in\mathbb{C}^{\ell\kappa\times\ell\kappa}$ die erste Begleitmatrix zu $\rho(\mu)$, also
$v$ und $w$ seien beliebige aber feste Links- und Rechtseigenvektoren von $\rho(\mu)$ zu $\mu=1$ und
$\gamma\in\mathbb{C}^\ell$ sei gänzlich beliebig und $\gamma_c = (0,\ldots,0,\gamma)^\top \in \mathbb{C}^{\kappa\ell}$, ($\gamma,\gamma_c{\buildrel\land\over=}$Fehlervektoren).
Behauptungen: (1) $v_c$ und $w_c$ sind Links- und Rechtseigenvektoren von $\rho_c(\mu) := I\mu - C_1$ zu $\mu=1$.
(2) Es gilt
Beweis: zu (1): Man sieht schnell, daß tatsächlich $v_c\rho_c(1)=0$ und $\rho_c(1)w_c=0$, mit
zu (2): Gezeigt wird, daß Zähler und Nenner jeweils gleich sind. Für die Zähler ist dies unmittelbar klar. Für die Nenner rechnet man leicht nach, daß
☐
Die hier durchgeführten Überlegungen gelten sinngemäß in beliebigen, nicht notwendigerweise kommutativen Ringen. Hierzu ersetzt man $\mathbb{C}^\ell$ durch $\mathbb{R}$. Der obige Satz rechtfertigt in gewisser Hinsicht
8. Definition: Die Linearform $\gamma\mapsto v\gamma/v\rho'(1)w$ heißt Henrici-Linearform, mit $v$, $w$ wie oben. Insbesondere für einen Fehlervektor (spezieller Vektor des $\mathbb{C}^\ell$) heißt der Wert dann Henrici-Fehlerkonstante.
Selbstverständlich wird nicht behauptet, daß $v\gamma/v\rho'(1)w = v_c\gamma/v_c\rho_c'(1)w_c$ für beliebige Links- und Rechtseigenvektoren $v$, $w$, bzw. $v_c$, $w_c$. Dies erkennt man unmittelbar, falls man einen der Vektoren beliebig streckt oder staucht. Für den Zähler waren gewisse Unterraumeigenschaften von $\gamma_c$, nämlich $\gamma_c=(0,\ldots,0,*)^\top$ bedeutsam.
Die weiteren Verallgemeinerungen führen dann direkt zu den Begriffen der annullierten Dominanz und der Totalannullation. Um nun die Verbindung mit der klassischen Fehlerkonstante von Henrici weiter aufzuzeigen, sei auf den folgenden Sachverhalt hingewiesen.
Bei $m$-facher Wiederholung ein und desselben Verfahrens, multipliziert sich die oben angegebene Fehlerkonstante mit $m$. Dieses Ergebnis ergibt sich sofort, wenn man erkennt, daß
Linkseigenvektor von $\rho(1)$ ist. Dann steht im Zähler $(1,\ldots,1){\mskip 3mu}\gamma$ und da jede Komponente von $\gamma$ natürlich gleich ist, erhält man sofort das verlangte Resultat, wenn man noch weiß, daß der Nenner natürlich bei welcher Dimension auch immer, gleich bleibt. Auch hier gelten wieder, w.o. schon bemerkt, diese Ergebnisse in beliebigen Ringen, nicht notwendig kommutativ.
]]>Mit Ausnahme der Booleschen Algebra wird keine Theorie in der Mathematik universeller benutzt als die lineare Algeba. Es gibt kaum eine Theorie, die elementarer ist, trotz der Tatsache, daß Generationen von Professoren und Lehrbuchautoren die Einfachheit dieser Theorie durch höchst unangebrachte Berechnungen mit Matrizen verdunkelt haben.
Jean Alexandre Dieudonné (1960)
Man kann beweisen, man vgl. z.B. das Buch Albrecht (1979), oder den Aufsatz von Skeel (1976), daß die Norm $|\mathbb{P}\delta|$ Stabilitätsfunktional ist für Verfahren der allgemeinen Form
Man hat also Fehlerabschätzungen der Art
$\mathbb{P}$ ist eine Block-Toeplitz Matrix, siehe weiter unten. Hierbei ist $Z=(Z_1,\ldots,Z_n)$ der entsprechende Vektor der exakten Lösungen und $z=(z_1,\ldots,z_n)$, die durch obige Verfahrensvorschrift gewonnene Näherung hierfür.
Diese doppelseitige Abschätzung ist insoweit von besonderer Bedeutung, da sie sofort verständlich macht, daß die berechnete Näherung sich nicht beliebig weit von der exakten Lösung entfernen kann, wenn man die Größe $\delta$ “klein” hält. Wichtig ist natürlich, daß die linke Konstante $c_1$ nicht verschwinden darf, also $c_1\ne0$ und daß die rechte Konsrtante $c_2$ nicht zu “groß” ist, also $c_2<\infty$. Ferner ist zu berücksichtigen, daß beide Konstanten $c_1$ und $c_2$ nicht selber von der Größe $\delta$ abhängen.
Die obige Verfahrensvorschrift $z_{n+1}=Sz_n+h\varphi$ ist recht allgemein. Hier genügt vollkommen die Verfahrensvorschrift
mit den Matrizen $A_i,B_i\in\mathbb{R}^{s\times s}$ und entsprechenden Vektoren $z_{n+i},F_{n+i}\in\mathbb{R}^s$.
Es ist sofort offensichtlich, daß die obige Verfahrensvorschrift in der Vorschrift $z_{n+1}=Sz_n+h\varphi_n$ natürlich enthalten ist. Selbstverständlich hängt die Steuerungsfunktion auch von der Zeit $t_n$ ab, möglicherweise auch noch von weiteren Größen. Alle diese einfliessenden Parameter seien in der Schreibweise unterdrückt.
Das allgemeinene Stabilitätsfunktional $\psi$, für welches gilt
muß nicht notwendig eine Norm sein.
Es müssen also nicht die Bedingungen der Definitheit und die der Homogenität und die Dreiecksungleichung erfüllt sein. Das Funktional $\psi$ hängt natürlich von zahlreichen Größen ab, ist also eine Funktion mehrerer Veränderlicher. Diese ganzen Abhängigkeiten werden aber in der weiteren Schreibweise nicht gesondert alle aufgeführt. Unter Berücksichtigung der Argumente hätte man zu schreiben
dabei hängen die Matrizen $A_i$ von den Koeffizienten $\alpha_{ij}$ des Verfahrens ab und der Vektor $\delta$ hängt ab von der Matrix $S$ und den Matrizen $B_i$.
Bei der folgenden diskreten Fassung der Kontrollgleichung
wird nun das Stabilitätsverhalten weiter betrachtet. Es ist hierbei $z_n$ der Vorzustand, $z_{n+1}$ der Folgezustand und $u_n$ die Steuerungsgröße. Von Interesse sei jetzt lediglich der innere Zustand, nicht jedoch der Ausgang des obigen Systems. Häufig ist der Ausgang von der Form $x_n=Bz_n$.
Man erhält jetzt nacheinander
Schreibt man dies in Matrix-Vektor Schreibweise auf, so erhält man
wobei hier die Block-Toeplitz-Dreiecksmatrix $\mathbb{P}$ auftaucht, mit
Wichtig ist zu vermerken, daß diese Block-Dreicksmatrix $\mathbb{P}$ von der Iterationsstufe $k$ abhängt, insbesondere wird die Matrix dimensionsmässig größer, mit größer werdendem $k$; es ist $\mathbb{P}\in\mathbb{R}^{ks\times ks}$.
Man erkennt, wie die alten Steuerungen $u_0,u_1,\ldots,u_{k-1}$ nachwirken, nämlich in Matrixpotenzen
Die Überlegungen gelten sinngemäß, wenn man die Matrix $A$ selber abhängig vom Index $n$ hält. Dies heißt also, daß sich die Systemzustandsüberführung jedesmal ändern kann. Man hat also die Kontrollgleichung
Hier erhält man dann ganz genauso wie oben, der Reihe nach ausgehend vom Anfangszustand $z_0$:
Wiederum in Matrix-Vektor Schreibweise ergibt dies
Auch hier erkennt man den Einfuß vergangener Steuerungen $u_0,u_1,\ldots,u_{k-1}$ auf den neuen Zustand $z_k$, nämlich nun als Matrizenprodukt (im Gegensatz zu den Matrixpotenzen) zu
Interpretiert man jetzt die Steuerungen $u_i$ als Störungen $\delta_i$ des schon oben angegebenen Verfahrens $z_{n+1}=Az_n+h\varphi$, untersucht man also die veränderte Steuerungsgleichung
so erkennt man, wie sich diese Störungen aufsammeln und “aufaddieren”. Entscheidend ist hier ist also wieder die Block-Toeplitz-Dreiecksmatrix $\mathbb{P}$, mit
bzw. für den allgemeineren Falle hat die Block-Dreiecksmatrix $\mathbb{P}$ die Gestalt, nicht notwendig eine Toeplitz-Matrix,
welche beide von der Iterationsstufe $k$ abhängig sind, also wie oben $\mathbb{P}\in\mathbb{R}^{ks\times ks}$. Die Matrix $\mathbb{P}$ ist hier offensichtlich wegen $-Az_n+z_{n+1}={}*$, ($n=0,1,\ldots$) die Inverse der Matrix
Die Sammelwirkung der Steuerungen, bzw. der Störungen, hängt nun ab von $\mathbb{P}\delta$, mit
Würde man das lineare und homogene Gleichungsystems $\mathbb{P}\delta=0$ betrachten und nach den $\delta_i$ auflösen, so erhielte man das Ergebnis, daß die $\delta_0,\ldots,\delta_{k-1}$ gerade die Jordan-Kette der Länge $k$ ist, bzgl. $\lambda_0$ für das Matrixpolynom $L(\lambda)$, wenn man von der Feinheit absieht, daß man u.U. die ersten $i$-Nullvektoren $\delta_0,\ldots,\delta_{i-1}$ wegstreicht. Bibliographisch: Keldysh, M.V., Jordan, Camille (1838--1921)
Hierbei ist das Matrixpolynom $L(\lambda)$ gegeben durch
man siehe hierzu Gohberg/Lancaster/Rodman (1982). Autoren sind Gohberg, Izrael' TSudikovich, Lancaster, Peter und Rodman, Leiba.
Für den allgemeineren Fall, daß man in jedem Zustand eine neue Matrix $A_n$ betrachtet, also $z_{n+1}=A_nz_n+u_n$, ergibt sich das Matrixplynom $L(\lambda)$ zu
Man sieht sofort, daß für das Spektrum $\sigma(\mathbb{P})$ stets gilt, daß $\sigma(\mathbb{P})=\{1\}$ und zwar unabhängig von den Matrizen $A_0,\ldots,A_k$.
Insbesondere ist die Block-Dreiecksmatrix $\mathbb{P}$ invertierbar und somit ist $\left\Vert\mathbb{P}{}\cdot{}\right\Vert$, für festes $k$, eine Norm, da ganz allgemein für jede Vektornorm gilt, daß mit $\left\Vert\cdot\right\Vert$ auch für eine beliebige invertierbare Matrix $P$ dann ebenfalls $\left\Vert Px\right\Vert$ eine Norm ist. Dabei geht die Invertierbarkeit für die Definitheit ein und die Linearität wird für die Homogenität und die Dreiecksungleichung benötigt.
Das weitergehende Resultat, daß dann für die zugehörige Matrixnorm $\left\Vert A\right\Vert$ entsprechend $\left\Vert PAP^{-1}\right\Vert$ die zugehörige Matrixnorm zu $\left\Vert Px\right\Vert$ ist, kann man leicht beweisen. Dennoch wird dieses Ergebnis hier nicht weiter verwendet. Somit hat man ohne Mühe die Aussage erhalten, daß das Stabilitätsfunktional $\psi(\delta)=\Vert\mathbb{P}\delta\Vert$ tatsächlich eine Norm ist.
Will man nun zu einer Abschätzung für $\Vert z_{n+1}-\tilde z_{n+1}\Vert$ gelangen und beachtet man, daß man ja eine explizite Darstellung der Lösungen hat, so ergibt sich zunächst für $z_{n+1}=Az_n+u_n$ die Darstellung
Für das gestörte System $\tilde z_{n+1} = A\tilde z_n+v_n$ mit den “veränderten” Steuerungen $v_i$ erhält man die Darstellung
Hier sind wieder die einzelnen Vektoren $z_i$, bzw. die $\tilde z_i$, zu einem größerem Vektor $Z_{n+1}$, bzw. $\tilde Z_{n+1}$, zusammengefaßt. Es ist also
Die Differenz der beiden oben angegebenen Darstellungen führt nun direkt auf
Da die Matrizen $T$ und $\mathbb{P}$ von der Iterationsstufe $k$ abhängen, sind Einschränkungen an die Komponenten dieser beiden Matrizen zu stellen. Es werde jetzt an die Matrixpotenz $A^i$ oder an die Produkte $A_k\cdots A_{k-i}$ die Forderung gestellt, daß ihre Normen, für alle $i$ und alle $k$ beschränkt seien. Es solle also gelten, daß
oder allgemeiner
Im Lichte der obigen Bauart der oben angegebenen Block-Dreiecksmatrix $\mathbb{P}$, sind diese beiden Forderungen sofort offenkundig sinnvolle Einschränkungen, da die obigen Matrixpotenzen, bzw. Matrixprodukte, die Komponenten der Block-Dreiecksmatrix $\mathbb{P}$ ausmachen. Die erste Bedingung führt dann sofort auf die entsprechende Bedingung an die Eigenwerte der Matrix $A$. Die zweite Bedingung ist diffiziler.
Es zeigt sich nun, daß diese beiden Forderungen genügen, sodaß auch die Normen von $\mathbb{P}$ und $T$ trotz größer werdendem $k$, nicht zu stark wachsen. Man beachte strikt, daß sich die Normen ändern, mit größer werdendem $k$. Die sonst recht triviale Aussage, daß die Norm einer festen, beliebigen Matrix stets beschränkt ist, gilt hier nicht.
Vielmehr gilt: $\left|\mathbb{P}\right|={\cal O}(k)$, oder in anderer Formulierung, es ist
Der Nachweis werde nur für die Maximumnorm $\left|\cdot\right|_\infty$ geführt. Exakterweise müßte man natürlich stets Supremumsnorm notieren, dennoch sei diese Feinheit von jetzt ab nicht näher beachtet. Da $|A^j|\le c$, $\forall j\in\mathbb{N}_0$ ergibt sich
Für die 1-Norm $\left\Vert\cdot\right\Vert_1$ ergibt sich dieses Resultat ganz analog. Dies hängt mit der speziellen Gestalt der Matrix $\mathbb{P}$ zusammen. Für den allgemeinen Falle verlaufen die Überlegungen ähnlich.
Die Tatsache, daß $\left\Vert T\right\Vert = {\cal O}(k)$, ist sofort offenkundig für sowohl die Maximumnorm $\left\Vert\cdot\right\Vert_\infty$, als auch für die 1-Norm $\left\Vert\cdot\right\Vert_1$.
Betrachtet man jetzt wieder die beiden Verfahren $z_{n+1}=Sz_n+h\varphi_n$ und $\tilde z_{n+1}=S\tilde z_n+h\tilde\varphi_n+\delta_n$, so erhält man in üblicher vektorieller Schreibweise für die $\varphi_i$, $\delta_i$ und $z_i$ sofort
und dann mit der Standardabschätzung
Setzt man jetzt von den Funktionen $\varphi_n$ nur deren Beschränktheit voraus, und damit für $\varphi$, so erhält man sofort das Ergebnis, daß die beiden Zustände sich nicht beliebig weit voneinander entfernen können, wenn nur $k \left|\delta\right| \le \hbox{const}$ und
Diese beiden Bedingungen sind auch tatsächlich häufig gegeben. Die Beschränktheit des mittleren Summanden in der obigen Abschätzung $(*)$ ist wegen des Vorfaktors von $h$ offensichtlich, da dieser dann das ${\cal O}(k)$-Wachstum der Norm $\left|\mathbb{P}\right|$ auffängt. Die Beschränktheit von der Funktion $\varphi$ ist z.B. dann gegeben, wenn man weiß, daß diese Funktion Lipschitz-stetig ist. Auf einer kompakten Definitionsmenge — sagen wir $[a,b]\times K\times J\subset\!\subset\mathbb{R}^{2s+1}$ — folgt dann sofort die Beschränktheit von $\varphi$.
Bei einer genaueren Untersuchungen muß man natürlich die gestörte Gleichung $\tilde z_{n+1}=Az_n+\tilde h\tilde\varphi_n+\delta_n$ betrachten, da sich bei einer Störung natürlich auch die Schrittweitenfolge $h_0,h_1,\ldots{\mskip 3mu}$ ändert. Das Ausklammern der Schrittweite $h$, setzt natürlich gleiche Schrittweiten beider Verfahren voraus. Man kann dies in die Funktion $\tilde\varphi$ versuchen hinein zu verlagern. Die dann auftretenden Abschätzungen verlangen dann etwas mehr Sorgfalt. Man beachte, daß hier nur Beschränktheit von $|Z_{n+1}-\tilde Z_{n+1}|$ folgt, nicht jedoch erhält man mit der Standardabschätzung wie oben, das weitergehende Resultat, daß die Normdifferenz $|Z_{n+1}-\tilde Z_{n+1}|$ kleiner wird, wenn man $\delta$ normmässig genügend heftig verkleinert.
Man beachte, daß hier nur ein Semistabilitätsfunktional vorliegt mit der obigen Abschätzung $(*)$. Das Stabilitätsfunktional $\psi(\delta) = \left|\mathbb{P}\delta\right|$ geht hier additiv ein.
Bei einer Abschätzung, wie sie z.B. bei Skeel (1976), oder in dem Buche von Albrecht (1979), und auch in dem Buche von Hairer/Wanner/Nørsett (1987) beschrieben wird, geht dieses Funktional direkt multiplikativ in die Abschätzung der Form $(*)$ ein. Man erhält dann natürlich weitergehende Resultate. Allerdings wachsen die Faktoren vor dem Funktional exponentiell mit der Länge des Integrationsintervalles und ebenso exponentiell in der Lipschitzkonstanten. Insbesondere läßt sich auch der Abstand zweier Zustände verkleinern, falls man die Störung hinreichend stark verkleinert.
Bibliographisch: Hairer, Ernst (*1949), Wanner, Gerhard (*1942), Nørsett, Syvert Paul.
Nebenläufig sei auf die völlige Analogie der Lösungen von diskreter und kontinuierlicher Zustandsgleichung hingewiesen.
Das lineare und inhomogene Differentialgleichungs-Anfangswertproblem
hat die eindeutig bestimmte Lösung
wobei $H=H(t)$ das (eindeutig bestimmte) Fundamentalsystem der homogenen Gleichung $\dot x=A(t)x$ ist, mit $H(t_0)=I$. Die Spezialisierung auf die lineare und inhomogene Anfangswertaufgabe mit konstanten Koeffizienten
hat demnach die (eindeutig bestimmte) Lösung, die sogar auf der gesamten reellen Achse existiert, falls die Inhomogenität $u(t)$ ebenso existiert,
Für die diskrete Gleichung $z_{n+1}=Az_n+u_n$ erhält man nach Vorgabe des Anfangszustandes $z_0$ die eindeutig bestimmte Lösung
Zwischen den beiden Problemen $\dot x=Ax+Bz$ und $x_{k+1}=Sx_k+Rz_k$ kann man durch den Homomorphismus
stets vermitteln.
Eine weitere Analogie hat man wie folgt. Gilt
so erhält man die Abschätzung
mit
Der notationellen Einfachheit halber sei angenommen, daß $t\ge t_0$ ist — dies erspart Betragszeichen.
Spezialisiert man auf konstante $\delta(t)$ und $\ell(t)$, also $\delta(t)\equiv\delta$ und $\ell(t)\equiv L$, so erhält man die bekannte Abschätzung
welche eine Aussage darüber macht, wie verschiedene Anfangswerte zu ein und derselben Differentialgleichung zum Auseinanderlaufen der dazugehörigen Lösungen führen können. Im ungünstigsten Falle muß man mit exponentiellen Wachstum rechnen; die Ungleichung ist scharf.
Spezialisiert man lediglich $\ell(t)\equiv L$, so ergibt sich
Die letzte Abschätzung weist schon formal auf den engen Zusammenhang zum Spijkerschen Stabilitätsfunktional hin. Direkter wird dieser Zusammenhang im Falle der folgenden Überlegungen.
Hat man
mit den beiden Defekten $d_1, d_2(t)\in\mathbb{R}$, so erhält man
Man beachte, daß sich die letzte Defektabschätzung nicht durch Spezialisierung aus der obigen allgemeinen Abschätzung herleiten lässt. Dennoch sind die Beweise für beide Aussagen natürlich ähnlich. Ebenso ist gut zwischen $d_2(t)$ aus dem Banachraum $\mathbb{R}$ und der nicht-negativen skalaren Größe $\delta(t)$ zu unterscheiden; Banach, Stefan (1892--1945). Entsprechend sind die Integrale zu verstehen.
Das Spijkersche Stabilitätsfunktional lautet hier
in Abweichung der Notation von Albrecht (1979), wegen der veränderten Schreibweise der $\delta_i$. Die zum Stabilitätsfunktional gehörende Matrix $\mathbb{P}$ ist natürlich
Zu den Abschätzungen vergleiche man die Bücher von Schäfke/Schmidt (1973) und Hairer/Wanner/Nørsett (1987). Dort findet man auch Hinweise auf weiterführende Literatur und schwächere Voraussetzungen bei den Behauptungen.
Bibliographisch: Schäfke, Friedrich Wilhelm (1922--2010), Schmidt, Dieter (*1941).
]]>Einer der ganz zentralen Bestandteile eines Programmes, basierend auf Verfahren mit impliziten Stufen, ist die Auflösung der Implizitheit durch ein Iterationsverfahren zur Lösung von Gleichungssystemen. Diese Gleichungssysteme sind i.d.R. nichtlinear. Bei steifen Differentialgleichungen und bei linearen Mehrschrittformeln, als auch bei impliziten Runge-Kutta-Verfahren, ist der Aufwand, der hierfür getrieben wird, enorm und stellt den maßgeblichen Anteil an der Gesamtrechenzeit dar. Man ist jedoch nicht so sehr an der exakten Lösung der zahlreich auftauchenden nichtlinearen Gleichungssysteme interessiert, sondern an der zügigen Integration der Differentialgleichung. Die Gleichungssysteme sind hier nur ein Weg dorthin. Es stellt sich nun heraus, daß das zur Anwendung gelangende Newton-Kantorovich Iterationsverfahren unter gewissen Umständen nicht immer konvergiert. Diese Divergenz bleibt häufig unbemerkt und äußert sich lediglich in größeren globalen Fehlern. Da die Schaltentscheidung im Programm TENDLER, wie auch in anderen Programmen, während der Korrektoriteration gefällt wird, ist diesem Punkte in schaltfähigen Programmen besondere Aufmerksamkeit zu widmen.
Zuerst wird das Newton Iterationsverfahren in Beziehung gesetzt zu bekannten Iterationsverfahren für lineare Gleichungssysteme und umgekehrt. Anschliessend erlauben die Ergebnisse von Hughes Hallett (1984) eine einfache Antwort darauf, ob überhaupt gewisse Modifikationen des Newton Iterationsverfahren konvergieren können. Die Erfahrungen von Byrne/Hindmarsh/Jackson/Brown (1977) zeigen anhand praktischer Beispiele, daß die Korrektoriteration tatsächlich wesentlichen Einfluß auch auf die Genauigkeit des Verfahrens haben und nicht nur auf die Effizienz.
Hier seien kurz die wichtigsten Iterationsarten zur Lösung linearer Gleichungsysteme angeschrieben. Später, bei einem Erklärungsversuch für auffallende Verhalten der Korrektoriterationen, werden die Untersuchungen wichtig werden. Bei der Erklärung des sehr großen globalen Fehlers bei den beiden Programmen GEAR und EPISODE, bei der Wahl einer Diagonalapproximation der Jacobimatrix, sind die Divergenzsätze von Hughes Hallett (1984) ein möglicher Ansatzpunkt. Eine Charakteristik der Erklärung ist, daß zwischen den beiden möglichen Interpretationen, modifizierten Newton-Verfahren und Iterationsverfahren für lineare Gleichungssysteme, hin und her gewechselt wird.
Das gedämpfte modifizierte Newton-Verfahren lautet
zur Lösung des Nullstellenproblems $f(x)=0$, $x={\mskip 5mu}?$ Hierbei ist die Matrix $W$ in der Regel eine Näherung für die Jacobimatrix $J=f'(x^\nu)$. Insbesondere hängt die Matrix $W$ häufig auch von den vorhergehenden Iterierten $x^1, x^2, \ldots{\mskip 3mu}$ ab, also $W=W(x^1,\ldots,x^\nu)$. Dies muß jedoch nicht unbedingt so sein. Um die Schreibweise handlich und übersichtlich zu halten, seien im weiteren gewisse Abhängigkeiten in der Schreibweise nicht gesondert erwähnt. Den Wert $f(x^\nu)$ bezeichnet man als das Residuum und die Differenz zweier aufeinander folgender Iterierten $x^{\nu+1}-x^\nu$ wird Pseudoresiduum genannt.
Die beiden Begriffe Residuum und Pseudoresiduum werden auch für die Beträge, bzw. Normen dieser Größen benutzt, also $|f(x^\nu)|$ und $|x^{\nu+1}-x^\nu|$. Wird also von genügend kleinem Residuum gesprochen, so ist damit natürlich die entsprechende Norm gemeint.
Die beiden wichtigsten Spezialfälle dieser recht allgemeinen Iterationsklasse sollen jetzt kurz angegeben werden. Die Auffassung als Spezialisierung muß nicht immer vorgenommen werden. In anderem Zusammenhang kann es durchaus günstiger sein, anders vorzugehen.
Es seien allgemein Zerlegungen der invertierbar vorausgesetzten Matrix $A$ betrachtet: $A=L+D+R$, mit Subdiagonalmatrix $L$, Diagonalmatrix $D$ und Superdiagonalmatrix $R$. Voraussetzung sei weiter, daß keine der Diagonalelemente der Diagonalmatrix $D$ verschwindet, also $\det D\ne0$. Eine andere Zerlegung, allgemeinere Zerlegung der Matrix $A$, sei $A=M-N$, mit invertierbarer Matrix $M$. Gegeben sei das Nullstellenproblem $Ax-b=0$, $x={\mskip 5mu}?$
Zwei typische Vertreter für Iterationsarten zur Lösung obiger Gleichung sind nun die Jacobi-Überrelaxation (JOR-Verfahren) und die sukzessive Überrelaxation (SOR-Verfahren).
Die erstere der beiden Iterationen findet sich auch unter anderen Benennungen.
Die Iterationsvorschrift für das JOR-Verfahren lautet nun
mit der Iterationsmatrix $J_\omega = D^{-1}(D-\omega A) = I - \omega D^{-1}A$. Hierbei ist $J_\omega$ die Matrix, die bei der Schreibweise auftritt
Die weitere wichtige Spezialisierung für den Dämpfungs- bzw.
Verstärkungsfaktor $\omega$, nämlich $\omega=1$, liefert die
gewöhnliche [Jacobi Iteration].
Jacobi, Carl Gustav (1804--1851).
Die Iterationsvorschrift für das SOR-Verfahren lautet
mit der Iterationsmatrix
Die weitere Spezialisierung $\omega=1$, liefert das Gauß-Seidel Iterationsverfahren. Gauß, Carl Friedrich (1777--1855), von Seidel, Philipp Ludwig (1821--1896).
Nebenläufig sei erwähnt, daß die obige Form auch diejenige Gestalt hat, die sich für die Programmierung am besten eignet, wobei man die Vorkonditionierung mit der Inversen der Diagonalmatrix $D$ natürlich am Anfang der Rechnung und nur einmal durchführt. Wichtig ist zu vermerken, daß man bei der obigen Iterationsvorschrift für die einzelnen Komponenten von unteren Indices zu höheren Indices durchläuft, also $x_i^\nu, i=1,\ldots,n$. Die umgekehrte Reihenfolge für den Durchlaufsinn der Indices ist natürlich ebenso möglich; hier vertauschen sich dann lediglich die Rollen der Matrizen $L$ und $R$.
Auch noch auf eine andere Art und Weise läßt sich das Gauß-Seidel Iterationsverfahren als modifiziertes Newton-Kantorovich Verfahren interpretieren. Mit der Zerlegung
erhält man
Die Iterationsmatrix $W=L+D$ läßt hier jetzt die Interpretationen zu als Näherung für die Jacobimatrix $J$ der Funktion $f$, mit $f(x)=Ax-b$. Hier ersieht man die Asymmetrie die zutage tritt. Der Subdiagonalgehalt der Matrix $J$ wird hier vollständig gewertet, während hingegen der Superdiagonalgehalt, also hier $R$, gar nicht auftritt. Dies ist nicht verwunderlich an sich, soll jedoch vermerkt werden. Bei anderer Reihenfolge des Durchlaufens der Komponenten $x_i^{\nu+1}$ des Vektors $x^{\nu+1}$, hat man natürlich hier $W=D+R$, wie schon oben erwähnt.
Die letzte Bemerkung gilt selbstverständlich ganz allgemein. Mit der oben angegebenen Zerlegung $A=M-N$ im Kopfe, ist
also $Mx=Nx+b$. Für die Zerlegungsmatrizen $M$ und $N$ der wichtigsten Iterationsarten erhält man
Verfahren | $M$-Matrix | $N$-Matrix |
---|---|---|
JOR | $M={1\over\omega}D$ | $N={1\over\omega}D-A$ |
SOR | $M=L+{1\over\omega}D$ | $N={1\over\omega}\bigl(-\omega R+(1-\omega)D\bigr)$ |
Sowohl das JOR-Verfahren als auch das SOR-Verfahren lassen sich als konvergenzbeschleunigte Verfahren auffassen. In diesen beiden Fällen wird nur die einfachst denkbare Konvergenzbeschleunigung aus zwei Iterierten gewählt, man erhält also lediglich das gewichtete Zweiermitel der beiden letzten Iterierten, somit
Dies ist natürlich nichts anderes als das Verfahren von Euler-Knopp. Euler, Leonhard (1707--1783), Knopp, Konrad Hermann Theodor (1882--1957).
Allgemein arbeitet man mit der unendlichen Block-Dreiecksmatrix
wobei die Matrizen $B_{ij}\in\mathbb{R}^{n\times n}$ sind und $B_{ij}=\bf 0$, falls $j>i$. Blockimplizite Verfahren werden hier nicht weiter betrachtet. Natürlich summieren sich die Zeilensummen von $\mathbb{P}$ stets auf eins auf, man hat also das Erfülltsein der Konsistenzbedingung
Man rechnet dann $\mathbb{P}\bf x$, mit $x=(x^0, x^1,\ldots)$.
Diese Art der Konvergenzbeschleunigung hat nun eine Reihe von Bezeichnungen. Im folgenden werde der Bezeichnungsweise von Albrecht/Klein (1984) gefolgt. Autoren Prof. Dr. Peter Albrecht und Prof. Dr. Marcelo Pinheiro Klein. Die zuletzt angeführte allgemeine Art der linearen Konvergenzbeschleunigung heiße $\mathbb{P}$-Extrapolation. Ist $G$ die grundlegende Iterationsmatrix, also $x^{\nu+1}=Gx^\nu+c$, so heiße das beschleunigte Verfahren
entsprechend $B$-Extrapolation. Reduziert sich die Matrix $B\in\mathbb{R}^{n\times n}$ zu einem Skalar $\gamma\in\mathbb{R}$, so werde einfach von $\gamma$-Extrapolation gesprochen.
Wenn hier von beschleunigt gesprochen wird, so deutet dies lediglich die Veränderung der Iterationsvorschrift an, nicht jedoch ist damit automatisch gesagt, daß das neue Verfahren auch tatsächlich bei jeder Wahl der Extrapolationsparameter wirklich schneller konvergiert. Dies ist gerade eine der Aufgaben, nicht die einzige, durch geeignete Wahl der Parameter dies zu erzielen. Es ist durchaus zweckmässig und auch sinnvoll auf schnellere Konvergenz zu verzichten, dafür aber ein größeres Konvergenzgebiet zu erzielen und damit für eine wesentlich größere Klasse von Problemen die Garantie zu erhalten, daß das verwendete Iterationsverfahren überhaupt konvergiert. Man vgl. zu diesen Beschreibungen auch den Aufsatz von Varga/Eiermann/Niethammer (1987) und natürlich die entsprechenden Monographien, beispielsweise von Varga (1962) oder Birkhoff/Lynch (1984)](https://www.amazon.com/Numerical-Solution-Elliptic-Problems-Mathematics-6/dp/0898711975). Zu den Autoren: Richard Steven Varga (1928--2022), Michael Eiermann, Wilhelm Niethammer (1933--2023), Garrett Birkhoff (1911--1996), Robert E. Lynch (*1932).
Es ist nun von Wichtigkeit in Erfahrung zu bringen, unter welchen Umständen man durch $B$-Extrapolation überhaupt Konvergenz erzielen kann. Aussagen hierzu liefert u.a. Hughes Hallett (1984), Andrew Jonathan Hughes Hallett (1947--2019). Eine einfache Strukturaussage macht zuerst
1. Lemma: $A$-Extrapolation der $B$-Extrapolation (direkt hintereinander) liefert eine $AB$-Extrapolation. Insbesondere für kommutierende Matrizen $A$ und $B$ sind $AB$- und $BA$-Extrapolation dasselbe.
Von generellem Interesse ist das folgende Lemma, welches aber auch bei einem späteren Satz die Schlüsselrolle spielen wird.
2. Lemma: (1) Die $\gamma$-Extrapolation konvergiert für gewisse $\gamma>0$ genau dann, wenn sämtliche Realteile der Eigenwerte der Iterationsmatrix $G$ kleiner als eins sind, es muß also gelten $\mathop{\rm Re}\nolimits \lambda_i<1$, für alle $i=1,\ldots,n$ und den $\lambda_i$ aus dem Spektrum $\sigma(G)$. {\parskip=0pt plus 2pt\parindent=20pt\par} (2) Analog konvergiert die $\gamma$-Extrapolation für $\gamma<0$ genau dann, wenn $\mathop{\rm Re}\nolimits \lambda_i>1$, für alle $i=1,\ldots,n$.
Eines der wesentlichen Ergebnisse von Hughes Hallett ist nun der folgende Satz.
3. Proposition: Für eine beliebige Iterationsmatrix $G$ läßt sich nicht immer eine reelle Diagonalmatrix $R$ finden, so, daß die $R$-Extrapolation konvergent ist.
Der Beweis benutzt das oben angegebene Lemma. Die Beweisführung konzentriert sich nun darauf zu zeigen, daß die Eigenwerte von $R(I-G)$ nicht stets in der linken Halbebene $\mathbb{C}^{{}-{}}$ liegen können. Dies wiederum legt es nahe, bekannte Sätze aus der Stabilitätstheorie zu benutzen, wie z.B. die Sätze von Liénard-Chipart und Hurwitz. Hurwitz, Adolf (1859--1919), Liénard, Alfred-Marie (1869--1958), Chipart, A.H..
Beweis: (zum Diagonalextrapolationssatz von Hughes Hallett) Sei $G$ Grunditerationsmatrix. Die $R$-Extrapolation hat als Iterationsmatrix $RG+I-G = I+R(G-I)$, also hat die $\gamma$-Extrapolation der $R$-Extrapolation die Iterationsmatrix $I+\gamma R(G-I)$. Nach dem Lemma muß also gelten: Die Realteile der Eigenwerte von $R(G-I)$ müssen in der linken komplexen Halbebene $\mathop{\rm Re}\nolimits z<0$ liegen ($R\gets\gamma R$). Das charakteristische Polynom
hat die Koeffizienten
Nach dem Stabilitätskriterium von Liénard/Chipart ist aber abwechselnde Positivität geeigneter $a_i$ vonnöten. Dies lässt sich durchbrechen, falls $(G-I)_i^i=0$ $\forall i$, oder $(G-I)_{i_1i_2}^{i_1i_2}=0$ $\forall i_1<i_2$, oder $(G-I)_{i_1i_2i_3}^{i_1i_2i_3}=0$ $\forall i_1<i_2<i_3$, oder $\ldots$ $\left|G-I\right|=0$ ist. ☐
Es ist nun leicht möglich auf den nichtlinearen Fall zu verallgemeinern. Benutzt man das Verfahren $x^{\nu+1}=g(x^\nu)$ so ist ganz entsprechend wie im linearen Falle, die $R$-Extrapolation
Hughes Hallett (1984) zeigt nun ganz analog:
4. Satz: (1) Für die oben angegebene $R$-Extrapolation ist es nicht immer möglich eine reelle Diagonalmatrix $R$ zu finden, der Gestalt, daß das resultierende Verfahren dann konvergent ist.
(2) Dennoch ist es grundsätzlich möglich eine Nichtdiagonalmatrix zu finden, so, daß das Verfahren für einen Startwert, der nahe genug an der gewünschten Lösung liegt, konvergiert.
(3) Weiterhin ist es möglich eine Folge von Matrizen zu bestimmen, derart, daß das Verfahren für beliebige Funktionen $g({}\cdot{},{}\cdot{})$ konvergiert.
Der Beweis wird durch eine Linearisierung auf den vorhergehenden Satz zurückgespielt.
Es sind nun diese Ergebnisse mit den Vorbereitungen von oben, die ein zusätzliches Licht auf das Konvergenzversagen des modifizierten Newton-Verfahrens werfen. Dies komplementiert auch die Beobachtungen von Shampine (1980), welcher nicht generelle Konvergenzunmöglichkeiten in Erwägung zog, sondern seine Überlegungen auf den Konvergenztest fokussierte. Lawrence F. Shampine.
Shampine (1980) zitiert als experimentelle Stütze den Aufsatz von Byrne/Hindmarsh/Jackson/Brown (1977), in dem deutlich wird, daß das modifizierte Newton-Verfahren in den beiden Programmen GEAR und EPISODE, bei Verwendung der Richtungsableitung der Funktion $f$ als Näherung für die Diagonalelemente der Jacobimatrix $J$, nicht mehr zufriedenstellend arbeitet. Autoren: Byrne, George D., Hindmarsh, Alan C. (*1942), Jackson, Kenneth R., Brown, H. Gordon. Shampine (1980)](https://epubs.siam.org/doi/epdf/10.1137/0901005 schreibt:
Regardless of the Jacobian approximation, if the convergence test is reliable, the codes should deliver a good solution to the problem. Of course the efficiency is affected, but the accuracy of the results should not be. … it appears that the convergence test is unreliable, and that the potential unreliability can sometimes be exhibited as the result of a very poor approximate Jacobian.
Hierbei ist zu beachten, daß die Programme meistens maximal dreimal iterieren und damit lediglich drei Tests zur Erkennung von Divergenz durchgeführt werden. In dem Programm SYMPOL, zur Lösung von polynomialen nichtlinearen Gleichungssytemen, beispielsweise, wird bis zu 25-mal iteriert. In dem Programm BRENTM zur Lösung allgemeiner nichtlinearer Gleichungssysteme wird maximal 50-mal iteriert. Das Programm COLNEW iteriert pro Gitter nicht mehr als 40-mal.
Das an anderer Stelle angegebene zweidimensionale Differentialgleichungsproblem P3 von Byrne/Hindmarsh/Jackson/Brown (1977), welches seinen Ursprung in der chemischen Kinetik hat, wurde nun von Byrne, Hindmarsh, Jackson und Brown mit den verschiedensten Parametereinstellungen der beiden Programme GEAR und EPISODE ausgetestet. Die dabei gewonnenen Erfahrungen und Ergebnisse sind für die weitere Analyse sehr wertvoll. Daher soll dieses Beispiel kurz näher untersucht und interpretiert werden. Die folgenden Daten wurden gemessen bei dem Problem P3.
$\varepsilon$ | code | T | $\Vert y-Y\Vert$ | nst | ${\rm nfe\over nst}$ | nfe | nje | ${\rm nst\over nje}$ | $J$-CPU | $%T$ | $f$-CPU | %T | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
$10^{-3}$ | E21 | 2.33 | 1.89 | 4428 | 1.8 | 7979 | 859 | 5.2 | 0.0904 | 4 | 0.389 | 17 | ||
" | E22 | 2.37 | 3.70 | 4418 | 1.8 | 7884 | 845 | 5.2 | 0.159 | 7 | 0.384 | 16 | ||
" | E23 | 1.92 | 1120 | 4337 | 1.7 | 7350 | 893 | 4.9 | 0 | 0 | 0.358 | 19 | ||
" | G13 | 2.74 | 2520 | 11681 | 1.1 | 13087 | 1362 | 8.6 | 0 | 0 | 0.638 | 23 | ||
" | G21 | 2.25 | 1.67 | 5619 | 1.6 | 9145 | 751 | 7.5 | 0.0790 | 4 | 0.446 | 20 | ||
" | G22 | 2.30 | 1.44 | 5573 | 1.7 | 9390 | 754 | 7.4 | 0.142 | 6 | 0.458 | 20 | ||
" | G23 | 1.45 | 11400 | 4532 | 1.5 | 6578 | 662 | 6.8 | 0 | 0 | 0.321 | 22 | ||
$10^{-6}$ | E21 | 5.18 | 9.22 | 10507 | 1.6 | 16594 | 1263 | 8.3 | 0.133 | 3 | 0.809 | 16 | ||
" | E22 | 5.33 | 22.2 | 10610 | 1.6 | 16903 | 1337 | 7.9 | 0.251 | 5 | 0.824 | 15 | ||
" | E23 | 5.67 | 2190 | 13075 | 1.6 | 21099 | 2715 | 4.8 | 0 | 0 | 1.03 | 18 | ||
" | G21 | 5.75 | 5.32 | 14992 | 1.5 | 22919 | 1579 | 9.5 | 0.166 | 3 | 1.12 | 19 | ||
" | G22 | 5.95 | 4.68 | 14984 | 1.6 | 23229 | 1571 | 9.5 | 0.295 | 5 | 1.13 | 19 | ||
" | G23 | 4.77 | 3360 | 15187 | 1.5 | 22304 | 2129 | 7.1 | 0 | 0 | 1.09 | 23 | ||
$10^{-9}$ | E21 | 16.9 | 74.2 | 31282 | 1.3 | 41622 | 2465 | 12.7 | 0.259 | 2 | 2.03 | 12 | ||
" | E22 | 17.1 | 50.3 | 31413 | 1.3 | 41794 | 2532 | 12.4 | 0.476 | 3 | 2.04 | 12 | ||
" | E23 | 18.7 | 4310 | 39078 | 1.4 | 55623 | 6304 | 6.2 | 0 | 0 | 2.71 | 14 | ||
" | G21 | 16.7 | 24.4 | 41058 | 1.4 | 56423 | 3581 | 11.5 | 0.377 | 2 | 2.75 | 16 | ||
" | G22 | 17.4 | 26.8 | 40963 | 1.4 | 56513 | 3613 | 11.3 | 0.679 | 4 | 2.76 | 16 | ||
" | G23 | 14.4 | 3840 | 42199 | 1.4 | 56990 | 4358 | 9.7 | 0 | 0 | 2.78 | 19 |
Dabei bezeichnet $T$ die Gesamtrechenzeit auf einer Rechenanlage vom
Typ ^{IBM 370/195} in doppelter Genauigkeit.
Der Eintrag code bezeichnet
welches Programm, mit welcher Parametereinstellung benutzt wurde.
Hierbei deuten die beiden letzten Ziffern den Wert von mf
an.
Beispielsweise wurde bei E21 das Programm EPISODE mit der
Parametereinstellung mf=21
benutzt.
Der durch beiderseitige Einrahmung hervorgehobene Eintrag
$\|y-Y\|$ kennzeichnet den globalen Fehler, der begangen wurde.
nstep gibt die Anzahl der Schritte an zur Vollendung der Integration.
nfe gibt die Anzahl der Funktionsauswertungen an, und
der Bruch $\hbox{nfe}\over\hbox{nst}$ gibt an, wieviele Funktionsauswertungen pro
Schritt getätigt wurden.
Schließlich wird durch nje die Anzahl der Jacobimatrixauswertungen
angezeigt.
Der Bruch $\hbox{nst}\over\hbox{nje}$ zeigt an, über wieviele Schritte im Mittel die
Jacobimatrix konstant gelassen wurde.
$J$-CPU bedeutet, wieviel Rechenzeit verbraucht wurde zur Ausführung des
Unterprogrammes pset
und aller Routinen, die dieses Unterprogramm selbst
aufruft.
Die sich hieran direkt anschließende Spalte $%T$ gibt den prozentualen
Anteil an der Gesamtrechenzeit wieder.
"$f$-CPU" offenbart die Gesamtrechenzeit, die zur Funktionsauswertung benötigt
wurde, allerdings ohne die Zeit zur numerischen Approximation der
Jacobimatrix.
Die sich ebenfalls direkt rechts daneben anschließende letzte Spalte
gibt den prozentualen Anteil am Gesamtrechenzeitbedarf an.
Der Eingabeparameter mf
besteht stets aus zwei Ziffern.
Die erste Ziffer ist immer aus $\{1,2\}$, wobei 1 das Adams-Verfahren
anwählt und 2 die BDF anzeigt.
Die zweite Ziffer ist immer aus $\{0,1,2,3,4,5\}$.
Für die obige Tabelle sind nur wichtig die Ziffern 1, 2 und 3.
Zur Vollständigkeit seien jedoch alle Ziffern kurz erläutert.
Es sei erwähnt, daß die beiden letzten Ziffern 4 und 5 noch nicht in den
beiden Programmen GEAR und EPISODE zur Verfügung standen, sondern erst
in der späteren Version LSODE und den entsprechenden Modifikationen
dieses Programmes.
Dennoch, da an anderer Stelle, nämlich bei der Beschreibung von LSODA und
LSODAR, kurz nocheinmal diese unterschiedlichen Paramtereinstellungen zur
Sprache kommen, seien hier sämtliche Einstellungen aufgelistet.
0: Fixpunktiteration. Es wird keine Jacobimatrix ausgewertet und vom Benutzer muß auch keine Routine hierfür bereitgestellt werden.
1: Modifiziertes Newton Verfahren mit einer vollen Jacobimatrix. Diese Matrix muß vom Benutzer durch ein separat programmiertes Unterprogramm dem Programm zur Verfügung gestellt werden. Ob diese Matrix tatsächlich die passende Jacobimatrix $J$ zur Funktion $f$ ist, wird nicht überprüft.
2: Wie 1, jedoch wird die Jacobimatrix intern durch numerische Differentiation berechnet. Diese Einstellung ist für den Benutzer wesentlich bequemer und einfacher. Bei großen Differentialgleichungen ist diese Einstellung jedoch i.a. nicht so effizient, wie diejenige bei 1.
3: Diagonalapproximation der Jacobimatrix. Diese Paramter-Einstellung ist sehr speicherplatzökonomisch. Bei der Diagonalapproximation handelt es sich nicht wirklich um eine Diagonal_approximation_, sondern es wird lediglich eine gewichtete Richtungsableitung der Funktion $f$ zur Newton Iteration herangezogen.
4: Modifiziertes Newton-Verfahren mit einer vom Benutzer bereitgestellten Bandmatrix. Diese Matrix muß wie bei der Parameter-Einstellung 1 durch ein getrenntes Unterprogramm bereitgestellt werden, und wie bei 1 wird diese Matrix nicht überprüft.
5: Wie 4, nur wird hier die Bandmatrix durch numerische Differentiation ermittelt. Dies ist erneut für den Benutzer die bequemste und einfachste Art die Jacobimatrix zu spezifizieren.
Die Interpretation der oben angegebenen Tabelle ist nun wie folgt. Durchschnittlich werden von GEAR über alle Parametereinstellungen betrachtet, durchschnittlich 1.5 Funktionsauswertungen pro Schritt durchgeführt (Standardabweichung unter 0.2), und für EPISODE ergibt sich hier der Wert 1.6 (Standardabweichung ebenfalls unter 0.2). Dies heißt, daß beide Programme zu einem großem Teil im $PEC$-Modus arbeiten. Ferner bedeutet dies, daß eine Konvergenzrate sehr häufig nicht gebildet werden kann und somit die Konvergenzrate aus einem vergangenen Schritt genommen wird, bei dem Konvergenztest in beiden Programmen.
Der Rechenzeitanteil der Funktionsauswertungen an der Gesamtrechenzeit liegt bei dem Programm GEAR bei durchschnittlich 20% (Standardabweichung unter 3%) und für EPISODE bei durchschnittlich 15% (Standardabweichung ebenso unter 3%). Diese Zahlen sind für ein Mehrschrittverfahren mit variabler Schrittweite und variabler Ordnung nicht ungewöhnlich. Für das Programm TENDLER ergeben sich Zahlen ähnlicher Größenordnung.
Für die Strategien bei der Neuauswertung der Jacobimatrix $J$ ergibt sich das folgende Bild. Das Programm GEAR wartet im Mittel ungefähr 9 Schritte, bevor die Jacobimatrix neu ausgewertet wird (Standardabweichung unter 2 Schritten), während hingegen das Programm EPISODE im Mittel rund 8 Schritte wartet (Standardabweichung: ca. 3 Schritte). Erwartungsgemäß wird bei schärferer Genauigkeitsanforderung $\varepsilon$ länger gezögert, bis eine Neuauswertung vorgenommen wird, da ja die gewählten Schrittweiten naturgemäß kleiner sind und damit die Iterationsmatrix $W=I-h\gamma J$ sich nicht so stark ändert. Die Neuberechnung der Jacobimatrix $J$ wird ja entscheidend im Hindmarsh-Test gesteuert und beeinfußt, weniger durch Konvergenzversagen.
Auffällig an den angegebenen Daten in der Tabelle sind nun die
eingerahmten globalen Fehler $\|y-Y\|$.
Bei der Wahl des Eingabesteuerungsparameters mf=23
für beide
Programme, also GEAR und sowohl auch EPISODE, ergeben sich deutlich
auffallende, ungewöhnlich große Fehler.
Für die Wahl mf=13
für das Programm GEAR gelten die Bemerkungen analog.
Hierzu bemerken Byrne, Hindmarsh, Jackson und Brown:
mf=23
does not control the error well for this problem for either code.
Im Lichte der oben vorbereiteten Bemerkungen ist dies nicht mehr so überraschend. Es sind diese Gründe, die bewogen ein Iterationsverfahren mit Diagonalapproximation der Jacobimatrix nicht in das Programm TENDLER mit aufzunehmen. Insbesondere wird beim Schalten nicht zwischen modifizierter Newton-Kantorovich Iteration und Newton-Jacobi Iteration hin und her gewechselt, sondern lediglich zwischen modifiziertem Newton-Kantorovich Iteration und Picard Iteration.
Denkbar wäre, die Diagonalelemente von $J$ weiterzubenutzen, bei einem Wechsel der Iterationsart, also Verwendung des modifizierten Newton-Jacobi Verfahrens, siehe Ortega (1972). Lawrence Shampine (1982) schlägt dies ebenso vor. Er bemerkt hierzu:
We propose using simple iteration until the first Jacobian is formed and thereafter using Jacobi-iteration.
Autoren: Lawrence F. Shampine, James M. Ortega (*1932).
Dennoch, die $n$ Divisionen, $n$ Multiplikationen und $n$ Additionen und die zusätzlichen Speicherstellen sind zu bedenken. Das Programm LSODA bietet dem Benutzer nicht mehr an, entgegen den Offerierungen beim Programm LSODE, die Jacobimatrix durch eine Diagonalapproximation zu ersetzen. Bei einfach auszuwertenden Funktionen ist es vorteilhafter Picard Iteration zu verwenden, als ältere Informationen aus den Diagonalelementen der Jacobimatrix, ja sogar letztlich nur ältere Informationen aus mehr oder minder guten Näherungen für diese Diagonalelemente. In dem Programm von {Suleiman, M.B.}{Hall, George}Suleiman/Hall (1985) wird insoweit besonderer Gebrauch von den Diagonalelementen der Jacobimatrix $J$ gemacht, als daß die Spur der Jacobimatrix mit zum Schalten herangezogen wird. Das Programm TENDLER benutzt diese Informationen nicht. Bei Diagonaldominanz ergibt sich offensichtlich sofort ein Vorteil, bei der Benutzung des modifizierten Newton-Jacobi Verfahrens.
Es ist der zusätzliche Speicherbedarf und die Unsicherheit des Vorteils, die bewogen keinen Gebrauch der modifizierten Newton-Jacobi Iteration zu machen. Vom Speicherplatz sind zyklische lineare Verfahren einstufigen linearen Verfahren in linearen Termen der Dimension der Differentialgleichung _unterlegen:, da ja für jede Stufe eine geeignete Differenzentabelle bereit gehalten werden muß. Beispielsweise beträgt der lineare Anteil des Speichers für die drei Programme LSODA, STINT und TENDLER:
TENDLER | STINT | LSODA |
---|---|---|
$37n$ bzw. $42n$ | $41n$ | $11n$ |
Angeführt ist hier jeweils der Speicherplatzbedarf, falls die Höchstordnung auf 5 begrenzt wird. Dies liegt daran, daß die Programme LSODE, LSODA und LSODAR im steifen Modus maximal die BDF5 verwenden können. Die BDF6 wird aufgrund ihres kleinen Widlund-Winkels nicht in diesen Programmen benutzt. Die BDF$i$ ($i>6$) sind nicht $D$-stabil. Die zyklischen Verfahren von J.M. Tendler sind hingegen bis zur Ordnung 7 einsetzbar. Das Programm TENDLER lässt sich leicht dahingehend modifizieren, daß nur noch $37n$ Speicherzellen benutzt werden. Allerdings sind dann unter gewissen Umständen, während der Schrittweiten- und Ordnungssteuerung, Doppelberechnungen durchzuführen. Diese Doppelberechnungen müssen im Programm STINT auf jeden Fall durchgeführt werden.
]]>Es folgt ein recht allgemeiner Konvergenzbeweis für mehrstufige Verfahren, wobei allerdings vorausgesetzt wird, daß mit fester Schrittweite gearbeitet wird. Innerhalb des mehrstufigen Prozesses braucht das verwendete Gitter nicht äquidistant zu sein, wie z.B. bei Runge-Kutta Verfahren. Dabei wird allerdings hier ein etwas längerer Weg eingeschlagen. Zuerst werden in breiter Form Stabilitätsfunktionale vorgestellt und verschiedene, gleichwertige und äquivalente Darstellungen angegeben. Die Beweise für diese Stabilitätsfunktionale enthalten die eigentlichen Konvergenzbeweise, jedoch sind Stabilitätsfunktionale allgemeiner. Sie liefern direkt Stabilitätsungleichungen für die Differenzen zweier Lösungen von Differenzengleichungen, d.h. die Stabilitätsfunktionale liefern direkt Aussagen über das Auseinanderlaufen der Lösungen zweier Differenzengleichungen in Abhängigkeit von Störungen. An Differenzengleichungen werden nur lineare Gleichungen betrachtet, allerdings darf die Inhomogenität beliebig sein, wenn sie nur einer Lipschitzbedingung genügt.
Bevor die eigentlichen Überlegungen bzgl. der Stabilitätsfunktionale angestellt werden, sollen anhand einfacher, vorangestellter Überlegungen, einige grundsätzliche Probleme beleuchtet werden. Danach folgen die sehr wichtigen Aussagen von Gronwall. Das diskrete Lemma von Gronwall spielt eine entscheidende Rolle beim Hauptsatz über Stabilitätsfunktionale. Vielerorts befindet sich das diskrete Lemma von Gronwall versteckt in Konvergenzbeweisen und hier i.d.R. nur in sehr spezialisierter Form. Erst daran anschliessend werden die Stabilitätsfunktionale behandelt und verschiedene Äquivalenzen bewiesen.
$ \def\diag{\mathop{\rm diag}} \def\col{\mathop{\rm col}} \def\row{\mathop{\rm row}} \def\dcol{\mathop{\rm col\vphantom {dg}}} \def\drow{\mathop{\rm row\vphantom {dg}}} \def\rank{\mathop{\rm rank}} \def\grad{\mathop{\rm grad}} \def\adj#1{#1^*} \def\iadj#1{#1^*} \def\tr{\mathop{\rm tr}} \def\mapright#1{\mathop{\longrightarrow}\limits^{#1}} \def\fracstrut{} $
Es sei $\mathfrak{B}$ ein Banachraum und $h\in\mathbb{R}$ die Schrittweite. Die Klasse von Verfahren der Form
berücksichtigt nicht block-implizite Verfahren, oder überhaupt implizite Verfahren, zumindestens ersteinmal nicht in sofort offenkundiger Weise. Hierbei ist
Subsumiert sind also nicht Verfahren der Vorschrift
bzgl. der rein formalen Schreibweise.
Verfahren der leicht allgemeineren Form
berücksichtigen blockimplizite Verfahren und gewöhnliche implizite Verfahren. Die oben angeschriebene Rekurrenz-Vorschrift für $u_{n+1}$ stellt eine implizite Gleichung für $u_{n+1}$ dar. An $\varphi$ muß man daher gewisse Voraussetzungen stellen, um eindeutige Lösbarkeit der impliziten Differenzengleichung zu garantieren. Da die zu integrierende Funktion fast durchweg einer Lipschitzkonstanten genügt, ist es naheliegend dasselbe auch für die Inhomogenität der Differenzengleichung zu fordern. Es möge also gelten
1. Satz: Die Differenzengleichung $(*)$ besitzt, für genügend kleine Schrittweiten $\mathopen|h\mathclose|$, eine eindeutige Lösung. Diese eindeutig bestimmte Lösung lässt sich mit Picard-Iteration bestimmen.
Beweis: Die Keplersche Gleichung für $u_{n+1}$ hat wegen der vorausgesetzten Lipschitz-Stetigkeit in der letzten Komponente von $\varphi$, nach dem Banachschen Fixpunktsatz eine eindeutig bestimmte Lösung und lässt sich durch Fxpunktiteration gewinnen.
☐
2. Bemerkung: Für nicht genügend kleines $\mathopen|h\mathclose|$ kann die Gleichung in der Tat mehrere oder keine Lösung besitzen.
Es seien betrachtet die beiden Verfahren der Form
Das erste Verfahren kann man als gestörtes Verfahren auffassen, während hingegen das zweite Verfahren das eigentliche Verfahren zur Berechnung der numerischen Lösung ist. Es sei
und $\delta_{n+\ell} := \hat u_{n+\ell}-u_{n+\ell}$ und dazu
Es ist also $\hat\delta_{n+\ell}$ die Differenz der entsprechenden Werte für die Funktion $\varphi(\cdot)$, wenn sämtliche Argumente verschieden sind.
Weiter sei
Die einzelnen $u_i$ und $\hat u_i$ sind aus dem Vektorraum $\mathbb{R}$, nicht notwendig endlichdimensional. Hierbei sind die $A_i:\mathfrak{B}\to\mathfrak{B}$ stetige, lineare Operatoren zwischen Banach-Räumen. Bei linearen Operatoren ist bekanntlich die Stetigkeit in einem Punkte äquivalent mit der globalen Stetigkeit und dies äquivalent mit der Beschränktheit. $\mathfrak{B}$ ist hierbei entweder ein reller oder komplexer Banachraum. Die Vektorraumeigenschaften braucht man der Linearität wegen, die Normiertheit für die folgenden Funktionale, und die Vollständigkeit wird benötigt bei der Anwendung des Banachschen Fixpunktsatzes. Beispiele sind $\mathfrak{B}=\mathbb{C}^k$ und $\mathfrak{B}=\mathbb{R}^k$, mit $k\ge1$. Gelegentlich gelten die Sätze auch in nicht notwendigerweise kommutativen Ringen $\mathfrak{B}$. Für $\mathfrak{B}$ wird im folgenden stets $\mathbb{C}^k$ gewählt. Die Mengen $\mathbb{C}^{k\ell\times k\ell}$ wären dann entsprechend zu ersetzen durch $\mathbb{R}^{\ell\times\ell}$ und andere Mengen entsprechend.
Man beachte, daß die Abschätzung nun abhängig von $h$ ist, die Abschätzung aber ausschliesslich für gewisse sehr stark eingeschränkte Schrittweiten $h$ gilt. Ohne Einschränkung an die Schrittweite $h$ ist der Satz nicht richtig. Die Unabhängigkeit von den $B_\nu$, bei
verlangt eine entsprechende Einschränkung an die Schrittweite $h$. Für einen praktischen Einsatz ist zusätzlich ein entsprechend großer Stabilitätsbereich erforderlich. In die Größe des Stabilitätsbereiches gehen entscheidend die $B_\nu$ ein und die Art der Iteration, mit der die impliziten Gleichungen in jedem Zeitschritt gelöst werden. Der Satz verliert ebenfalls seine Gültigkeit bei “langen” Integrationsintervallen. $\mathopen|b-a\mathclose|$ wird dann beliebig groß. Der Satz zeigt, daß bei endlichem Integrationsintervall $\mathopen|b-a\mathclose|$, die $\mathopen|\hat U-U\mathclose|$-Norm mit der $\left| \bopo [C_1]^{-1} \boro \bfR\right|$-Norm äquivalent ist. Bei unendlich langen Integrationsintervallen, sind diese Normen nicht notwendigerweise mehr äquivalent.
Das Lemma von Gronwall, Thomas Gronwall, (1877--1932) für den kontinuierlichen Falle lautet
1. Satz: (Lemma von Gronwall) Seien $h$, $w$ und $k$ stetige, reell-wertige Funktionen auf dem Intervall $[a,b]$. (Es muß lediglich gelten $(\int_a^x f)'=f(x)$, sodaß man mit leicht schwächeren Bedingungen auskäme.) Es gelte auf diesem Intervall die Abschätzung
Das Integral auf der rechten Ungleichungsseite sei stets nicht-negativ, was beispielsweise für nicht-negative Funktionen $k$, $w$, $h$ auf dem Intervall $[a,b]$, sichergestellt werden kann. Dann gilt die Abschätzung für die Funktion $h$ auf dem gesamten Intervall zu
Beweis: siehe Helmut Werner und Herbert Arndt in Werner/Arndt (1986). Sei
Hiermit gilt dann aufgrund der Stetigkeit von $k$ und $h$
Aus dieser Differentialgleichung folgt aufgrund der vorausgesetzten Ungleichung für die Funktion $h$
also die lineare Differentialungleichung
Multiplikation mit
führt zu
Integration von $a$ nach $x$ liefert wegen der mittleren Gleichung (Integral ist monotones Funktional)
also wegen $H(a)=0$ somit
und aufgrund der Voraussetzung von $h(x)\le w(x)+H(x)$ sofort
☐
2. Folgerung: Gilt $h(x)\le w+k\int_a^x h(t){\mskip 3mu}dt$, mit festen, nicht-negativen Konstanten $w$ und $k$, so folgt die Abschätzung
Ein völliges Analogon zum kontinuierlichen Lemma von Gronwall macht das diskrete Lemma von Gronwall, welches ebenfalls exponentielles Wachstum anzeigt, wenn eine Funktion geeignet auf beiden Seiten einer Ungleichung vorkommt. Es gilt nun der
3. Satz: (Diskretes Lemma von Gronwall) Es seien $(m+1)$ positive Zahlen $0\le\eta_0\le\eta_1\le\ldots\le\eta_m$ vorgegeben. Ferner sei $\delta\ge0$, $h_j\ge0$ und $x_{j+1}=x_j+h_j$. Es gelte die Ungleichung
Dann gilt
Beweis: siehe erneut Helmut Werner und Herbert Arndt in Werner/Arndt (1986). Der Fall $\delta=0$ ist einfach, wegen $e^0=1$. Sei nun $\delta>0$. Induktionsverankerung mit $j=0$ ist klar, ebenfalls einfach, wegen $e^0=1$. Der eigentliche Beweis reduziert sich jetzt lediglich noch auf den Induktionsschluß von $j$ nach $j+1$, wobei $\delta>0$ vorausgesetzt werden kann. Hier gilt nun
Für die Summe in der Klammer schätzte man ab (Untersumme einer streng monoton steigenden Funktion)
☐
Man vgl. auch Matrixpolynome.
Zur multiplen Lipschitzkonstanten von $\varphi$:
$(\ell+1)$-malige Anwendung der Dreiecksungleichung liefert
In der Schreibweise von $\varphi$ seien fortan zahlreiche hier nicht weiter interessierende Argumente der Schreibvereinfachung und der Klarheit wegen weggelassen. Es ist $\varphi(u_\ell,\ldots,u_1) = \varphi(t_\ell,h_\ell,u_\ell,\ldots,u_1)$.
1. Beispiel: Für die Verfahrensvorschrift der Form
wobei die $f_k$ Näherungswerte für $f(t_k,y(t_k))$ sind. Die Funktion $f$ der Differentialgleichung sei Lipschitz-stetig mit der Lipschitzkonstanten $L$ vorausgesetzt, also
Dann gilt für die obigen Lipschitzkonstanten $K_i$ die Verbindung mit der Lipschitzkonstanten der Differentialgleichung zu
2. Definition: Es sei $T$ eine gänzlich beliebige Matrix der Größe $k\times k$. Dann wird der Bidiagonaloperator $[T]$ zur Matrix $T$ der Größe $(N+1)k\times(N+1)k$, wie folgt definiert
Rechts daneben steht die Inverse, welche für eine beliebige Matrix $T$ stets existiert.
Die speziellen Operatoren $[\cdot]$ und $[\cdot]^{-1}$ tauchen im weiteren wiederholt auf. Aufgrund der Häufigkeit, wäre es zweckmässiger, die Rollen von $[\cdot]$ und $[\cdot]^{-1}$ zu vertauschen, jedoch stände dies dann im Gegensatz zur Schreibweise bei Skeel (1976), Robert David Skeel.
3. Satz: (Eigenschaften von $\mathop{\rm col}$, $\mathop{\rm row}$, $\mathop{\rm diag}$, $[\cdot]$) Es gilt
Beweis: Zu (1):
Zu (3):
Zu (5)
Zu (6): Beachte die Definition von $[T]$ und benutze dann
bzw.
Zu (7): Folgt aus (4), wegen $(AB)^{-1}=B^{-1}A^{-1}$, wobei $[T]$ für gänzlich beliebige Matrizen $T$ invertierbar ist. Für $T=\bf 0$ ist $[T]$ die Einheitsmatrix der Größe $(n+1)k\times(n+1)k$. ☐
4. Beispiele: Es gilt
Im allgemeinen gilt
Als nächstes folgt die Darstellung der Differenz der Lösung zweier Differenzengleichungen. Dieser Satz spielt eine wiederholt wichtige Rolle bei den gleich folgenden Hauptsätzen.
5. Satz: (Darstellungssatz) Voraussetzungen: $\hat u_n$ und $u_n$ seien die Lösungen der beiden Differenzengleichungen
Die “Störungen” $r_{n+\ell}$ korrespondieren zum Wert $\hat u_{n+\ell}$. Es seien zur Abkürzung gesetzt
Die Differenzengleichung für $\hat u_n$ habe die Startwerte $\hat u_i := u_i + r_i$, für $i=0,\ldots,\ell-1$. Es sei $\delta_i := r_i$, für $i=0,\ldots,\ell-1$, und $r_\nu := \delta_\nu := \hat\delta_\nu := 0$, für $\nu>N$.
Behauptung:
Beweis: Folgt aus dem allgemeinen Satz über die Lösung inhomogener, linearer Matrix-Differenzengleichungen. Die allgemeine Lösung der Differenzengleichung
lautet
Mit den obigen Abkürzungen für $\delta_n$ und $\hat\delta_n$, ergibt sich eine Differenzengleichung für $\delta_n$ zu
Diese Gleichung hat die Lösungsdarstellung
In der ersten Summe verschwinden die letzten $(\ell-1)$ Terme, wegen $P_1 C_1^i R_1=0$, für $i=0,\ldots,\ell-2$. Daß hier $P_1 C_1^{\ell-1} R_1 = I$, braucht man noch nicht. Für $\nu>n-\ell$ ist $n-1-\nu \le \ell-2$. Daher folgt genau die behauptete Gleichung, wie oben angegeben. ☐
Die folgende Ungleichung liefert nicht die bestmögliche Abschätzung für $\ell\ge2$, jedoch bleibt sie einfach zu handhaben und wird nachher beim Beweis des Hauptsatzes benötigt.
6. Hilfssatz: (Abschätzungssatz) Voraussetzung: $\varphi(\cdot)$ sei in jeder Komponente Lipschitz-stetig mit den Lipschitzkonstanten $K_i$. Die Werte $\delta_{\nu+\ell}$ und $\hat\delta_{\nu+\ell}$ seien wie oben definiert.
Behauptung:
Beweis: Für $\nu=0,\ldots,n-1$ ist
Sei jetzt, in einer nicht zu Mißverständnissen führenden Doppelbezeichnung, zur Schreibvereinfachung gesetzt $\delta_\nu \gets \mathopen|\delta_\nu\mathclose|$ und $\hat\delta_\nu \gets \mathopen|\hat\delta_\nu\mathclose|$, d.h. die Betragsstriche werden einfach weggelassen. Nun ist hiermit
Summation und Abschätzung bzgl. der Spalten im obigen Schema zeigt sofort die erste Abschätzung, wenn man die allerletzte Spalte mit $K_\ell$ und $\delta_n$ gesondert behandelt. Die weiteren behaupteten Ungleichungen ergeben sich sofort aus der ersten. ☐
Zur handlichen Notation der im folgenden Hauptsatz auftauchenden Stabilitätsfunktionale seien die folgenden abkürzenden Bezeichnungen eingeführt. Es war
und die erste Begleitmatrix lautet $(I=I_{k\times k})$
Desweiteren sei
und
wobei
Für das Produkt gilt: $[C_1]^{-1} \boro \in \mathbb{C}^{(N+1)k\ell \times (N+\ell)k}$. Es sei $(X,T,Y)$ ein beliebiges Standard-Tripel. Weiter sei
und
Es ist, aufgrund der Biorthogonalitätsbeziehung,
mit der Block-Hankel-Matrix $B$ zu
Die Sonderbehandlung der Blockmatrix bei $\boro$ und $\ovbf Y$ in dem ersten “Diagonalelement” hat seinen Ursprung in der Lösungsdarstellung einer Differenzengleichung für Matrixpolynome der Form
Für den Fall $\ell=1$, also $\rho(\mu)=I\mu-A$ reduzieren sich $P_1$ und $R_1$ zu Einheitsmatrizen der Größe $n\times n$. Die Biorthogonalitätsbeziehung schrumpft zu $X=Y^{-1}$ oder $X^{-1}=Y$.
Man vgl. Peter Albrecht, "Die numerische Behandlung gewöhnlicher Differentialgleichungen: Eine Einführung unter besonderer Berücksichtigung zyklischer Verfahren", 1979. Sowie Peter Albrecht, 1985.
Zuerst sei zur Übersichtlichkeit ein Teil des Beweises des nachfolgenden Hauptsatzes nach vorne gezogen. Später wird dieser Hilfssatz erweitert. Es gibt noch weitere Äquivalenzen zwischen Stabilitätsfunktionalen.
1. Hilfssatz: Voraussetzung: Es sei $C_1^i := {\bf0} \in \mathbb{C}^{k\ell\times k\ell}$, falls $i<0$.
Behauptung: Das verkürzte Stabilitätsfunktional ist mit dem ursprünglichen es erzeugenden Stabilitätsfunktional normmässig äquivalent, d.h. es gilt
Beweis: Der Beweis wird in zwei Teile aufgespalten. Man schätzt beide Stabilitätsfunktionale gegeneinander ab. Die Abschätzung $\left|\bopo [C_1]^{-1} \boro \bfR\right| \le \left|\bopo\right| \left|[C_1]^{-1} \boro \bfR\right|$ ist klar, wobei die Zeilensummennorm von $\bopo$ unabhängig von $N$ ist. Die andere Abschätzungsrichtung berücksichtigt das Verhalten der Begleitmatrix $C_1$ intensiver. Man vergleiche hier auch die beiden nachstehenden Beispiele zur Verdeutlichung des “quasi-nilpotenten” Charakters der Potenzen der Matrizen $C_1$. Man benutzt
wegen
Diese letzte Identität hat ihre Wurzel in der eben genannten “quasi-nilpotenten” Eigenschaft der Begleitmatrix $C_1$. Das Herausziehen von $C_1^{\ell-1}$ ist zulässig, da bei der $\sup$-Norm bei $\left| \bopo [C_1]^{-1} \boro \bfR \right|$ weiterhin über alle Zeilen das Supremun gebildet wird. Es geht kein Wert bei der Supremunsbildung verloren. Schließlich
wegen $r_\nu := 0$, für $\nu>N$. ☐
2. Beispiel: Sei $\ell=2$ und sei $N:=n:=3$. Es ist $\rho(\mu)=I\mu^2+A_1\mu+A_0\in\mathbb{C}^{k\times k}$ und die Potenzen der ersten Begleitmatrix $C_1$ lauten $C_1^\nu$, für $\nu=1,\ldots,N$:
Es war
Die Matrizen $\bopo$ und $\boro$ haben das Aussehen
Man berechnet
zu
An einer weiteren Demonstration ersieht man das sehr schnelle “Großwerden” der überstrichenen Matrizen.
3. Beispiel: Es sei nun $\ell=3$ und $N=3$. Es ist $\rho(\mu)=I\mu^3+A_2\mu^2+A_1\mu+A_0 \in \mathbb{C}^{k\times k}$. Nun berechnet man $C_1^\nu$ für $\nu=1,\ldots,N$:
und
Weiter ist $\bopo\in\mathbb{C}^{4k\times4k\ell}$ und $\boro\in\mathbb{C}^{4k\ell\times6k}$ mit
Nun ist $[C_1]^{-1} \boro \in \mathbb{C}^{12k\times6k}$ mit
also
Das zugrunde liegende Schema ist hier
Es folgt nun der angekündigte Hauptsatz, aus dem sich leicht ein entsprechender Konvergenzsatz für sehr allgemeine Diskretisierungsverfahren ableiten lässt. Desweiteren zeigt der Satz mehrere Querverbindungen zwischen verschiedenen Stabilitätsfunktionalen auf. In gewissen Situationen hat jedes der vorkommenden Funktionale seine spezifischen Vor- und Nachteile, und es lohnt sich mehrere Darstellungen, oder äquivalente Funktionale zur Verfügung zu haben. Insbesondere sollte jede der Darstellungen in gegenseitiger Befruchtung gepflegt werden. Später werden noch zwei andere Darstellungen hinzukommen, die bei gewissen Untersuchungen abermals vereinfachend wirken.
4. Hauptsatz: Voraussetzungen: $(P_1,C_1,R_1)$ sei das erste Begleiter-Tripel zum Matrixpolynom
vom Grade $\ell\ge1$. Die Funktion $\varphi$ sei Lipschitz-stetig in jeder Komponente mit den Lipschitzkonstanten $K_i$, also
Die Potenzen der Matrix $C_1$ seien beschränkt durch die obere Schranke $D$, also $\left|C_1^\nu\right|\le D$, $\forall\nu\in\mathbb{N}$. Seien $\xi$ und $\hat\xi$ definiert durch
Die Größe $\hat\xi$ ist eine Funktion von mehreren Veränderlichen, es ist $\hat\xi=\hat\xi(P_1,D,R_1,K_0,\ldots,K_\ell)$. Es sei $\mathopen|b-a\mathclose|\ne0$. Die Schrittweite $h$ sei so gewählt, daß erstens $\mathopen|b-a\mathclose| / \mathopen|h\mathclose|$ natürlich ist und zweitens gleichzeitig gilt
und $N$ sei implizit definiert durch $N\mathopen|h\mathclose| = \mathopen|b-a\mathclose|$.
Behauptungen: (1) Beide (möglicherweise) impliziten Differenzengleichungen
besitzen für jedes $n$, eine eindeutig bestimmte Lösung $u_{n+\ell}$ bzw. $\hat u_{n+\ell}$, die man mit Picard-Iteration berechnen kann.
(2) Für die maximale normmässige Abweichung $\left|\hat u_n-u_n\right|$ gilt die beidseitige Abschätzung bzgl. der additiven Störglieder $r_n$, wie folgt
(3) Die positiven Konstanten $c_i$, für $i=1,2,3$, sind gegeben durch
(4) Die Abschätzung bei (3) ist unabhängig von der Wahl des Standard-Tripels, d.h. es gilt
für zwei beliebige Standard-Tripel $(X_1,T_1,Y_1)$ und $(X_2,T_2,Y_2)$ zum Matrixpolynom $\rho$.
(5) Das verkürzte Funktional $\left|[C_1]^{-1} \boro \bfR \right|$ ist ebenfalls Stabilitätsfunktional und zum unverkürzten Funktional äquivalent, unabhängig von $N$, d.h. es gilt
(6) Verkürzte Stabilitätsfunktionale sind bei Wechsel des Standard-Tripels untereinander äquivalent, jedoch nicht notwendig mehr gleich. Es gilt
Beweis: Zur Abkürzung werde wieder benutzt
Zu (1): Beide Differenzengleichungen stellen für jedes $n$ eine Lipschitz-stetige Keplersche Gleichung in $\hat u_{n+\ell}$ bzw. $u_{n+\ell}$ dar. Die Fixpunktgleichungen bzgl. $\hat F$ und $F$, mit
sind kontrahierend, falls $\mathopen|h\mathclose| K_\ell < 1$. Durch die oben vorausgesetzte Einschränkung an $h$, nämlich $\mathopen|h\mathclose|\xi<1$, ist diese hinreichende Bedingung für Kontraktion erfüllt. Auf einem geeigneten vollständigen Teilraum, lässt sich dann Existenz und Eindeutigkeit eines Fixpunktes deduzieren.
Zu (2): a) Nach dem Hilfssatz über die Darstellung der Differenz der Lösung zweier Differenzengleichungen (siehe Darstellungssatz), folgt sofort durch Umstellung, die Abschätzungskette
Hierbei wurde die Abschätzung
des Abschätzungssatzes benutzt, desweiteren die Gleichung $N\mathopen|h\mathclose| = \mathopen|b-a\mathclose|$ und schließlich die Abschätzung $\sum_{\nu=0}^n \mathopen|\delta_\nu\mathclose| \le N\sup_{\nu=0}^{n-1} \mathopen|\delta_\nu\mathclose|$. Durchmultiplikation mit
liefert die erste Ungleichung der Behauptung (2), wobei sich entsprechend die Konstante $c_1$ ergibt.
b) Wiederum nach dem Satz über die Darstellung der Differenz der Lösungen zweier Differenzengleichungen (siehe Darstellungssatz), folgt sofort beim Übergang zu Normen
wobei wieder der Abschätzungssatz benutzt wurde, also durch Umformung
Wegen der Voraussetzung an $h$, nämlich $\mathopen|h\mathclose|<1/\xi$, ist $1-\mathopen|h\mathclose|\xi>0$. Mit Hilfe des diskreten Lemmas von Gronwall, wobei man in der dort angegebenen Bezeichnung setzt
erhält man jetzt die Abschätzung
Anhand dieser Darstellung ersieht man auch das Zustandekommen der Konstanten $c_2$. Die Konstante $c_3$ ergibt sich sofort durch typische Abschätzungen.
Zu (4): Das Standard-Tripel $(X_1,T_1,Y_1)$ ist ähnlich zum Standard-Tripel $(X_2,T_2,Y_2)$ genau dann, wenn
oder
Nun ist
Hierbei wurden die Recheneigenschaften der Operatoren $\mathop{\rm diag}$, $\mathop{\rm row}$ und $[\cdot]$ benutzt.
Zu (5): Dies wurde im vorausgeschickten Hilfssatz bewiesen.
Zu (6): Mit der gleichen Notation wie beim Beweis zu (4) rechnet man
Durch Multiplikation von links mit $\mathop{\rm diag}_{\nu=0}^N S^{-1}$ folgt sofort
Damit sind beide verkürzten Funktionale äquivalent. ☐
5. Bemerkungen: Zur Voraussetzung: Aufgrund der Einschränkung der Schrittweite $h$ in Abhängigkeit der Konstanten $\xi$, ist das Ergebnis nur von praktischer Bedeutung bei kurzen Integrationsintervallen und nicht-steifen Differentialgleichungsproblemen, also Problemen mit kleiner Lipschitzkonstante. Bei steifen Problemen werden die Konstanten $\xi$, $\hat\xi$, $c_1$, $c_2$, $c_3$ schnell unangemessen groß. Die Konstanten $\xi$ und $\hat\xi$ enthalten direkt als multiplikativen Faktor die obere Schranke $D$ für die Matrixpotenzen. $\xi$ seinerseits geht exponentiell in die Abschätzung ein. Die Aufspaltung in zwei sehr ähnliche Konstanten $\xi$ und $\hat\xi$ geschieht nur, weil $\xi$ i.a. kleiner ist als $\hat\xi$ und damit schärfere Schranken liefert. Man könnte mit $\hat\xi$ alleine auskommen. Dabei würde man $\xi$ vollständig durch $\hat\xi$ ersetzen. $\hat\xi$ lässt sich wiederum ersetzen durch $\left|P_1\right| D \left|R_1\right| \left(\ell+1\right) \left(\max_{i=0}^\ell K_i\right)$, man vergl. hier den entsprechenden Hilfssatz mit den diesbezüglichen Abschätzungen, siehe Abschätzungssatz. Erfüllt die erste Begleitmatrix $C_1$ die Bedingung $\left|C_1^\nu\right|\le D$, $\forall\nu\in\mathbb{N}$, so auch jede zu $C_1$ ähnliche Matrix, allerdings mit u.U. verändertem $D$.
Numerische Ergebnisse von Tischer/Sacks-Davis (1983)3 und Tischer/Gupta (1985)2 zeigen, daß selbst bei steifen Differentialgleichungen das Stabilitätsfunktional die richtige Konvergenzordnung anzeigt und dies obwohl $\mathopen|h\mathclose| \xi < 1$, verletzt ist. Autoren Peter E. Tischer, Ron Sacks-Davis und Gopal K. Gupta. Dies deutet darauf hin, daß die Ergebnisse des Hauptsatzes allgemeiner gelten als der den Hauptsatz tragende Beweis.
Kerninhalt der Beweise im Hauptsatz sind der Darstellungssatz, das diskrete Lemma von Gronwall und die Abschätzungen im Hilfssatz 6. Die obere Schranke $D$ für die Matrixpotenzen $\left|C_1^i\right|$ hängt u.U. ab von der Dimension der zugrundeliegenden Differentialgleichung $\dot y=f(t,y)$, aufgrund der Beziehung $\left|C_1\otimes I\right|=\left|C_1\right|$, falls die zur Maximumnorm kompatible Zeilensummennorm verwendet wird. Die Lipschitzkonstanten $K_i$ sind abhängig von der Lipschitzkonstante von $f$.
Zu (1): Die Lösungen der möglicherweise impliziten Differenzengleichungen müssen nicht mit Picard-Iteration berechnet werden. Ebenso gut kann das Newton-Raphson-Iterationsverfahren oder das Newton-Kantorovich-Iterationsverfahren benutzt werden. Der Startfehlersatz von Liniger liefert eine obere Schranke für die Anzahl der nötigen Iterationen. Es zeigt sich, daß eine einzige Iteration vielfach vollkommen ausreicht. Weitere Iterationen schaffen keinerlei Verbesserungen an denen man interessiert ist. Für nicht genügend kleine Schrittweiten $\mathopen|h\mathclose|$ können in der Tat die beiden angegebenen Differenzengleichungen und damit die entsprechenden Keplerschen Gleichungen keine oder mehr als eine Lösung besitzen.
Zu (2): Die Stabilitätsfunktionale $\left|\bopo [C_1]^{-1} \bopo \bfR\right|$, $\left|[C_1]^{-1} \boro \bfR\right|$ und $\left|\bfR\right|$ sind unabhängig von $\varphi(\cdot)$, und unabhängig von den Lipschitzkonstanten $K_i$, jedoch abhängig von $N$ und damit letztlich abhängig von $h$ und/oder der Länge des Integrationsintervalles $\mathopen|b-a\mathclose|$. Die Konstanten $c_1$, $c_2$, $c_3$ hängen von den Lipschitzkonstanten $K_i$ ab. Da bei dem Hauptsatz allerdings als zentrale Voraussetzung die Lipschitzkonstanten eingehen und beim obigen Beweis auch benötigt werden, hängen in soweit auch die Funktionale hiervon ab. Das durch die Konstante $c_2$ induzierte exponentielle Wachstum kann bei den gegebenen Voraussetzungen des Hauptsatzes nicht so ohne weiteres verbessert werden, wie z.B. die beiden Differentialgleichungen $\dot y=0$ und $\dot y=y$ mit $y(0)=1$ zeigen, wenn man das explizite Eulerverfahren $y_{n+1}=y_n+hf_n$ anwendet. Daß hierdurch auch das qualitative Verhalten gänzlich überschätzt werden kann, zeigen die beiden Differentialgleichungen $\dot y=0$ und $\dot y=-y$, mit $y(0)=1$, wenn man das implizite Eulerverfahren $y_{n+1}=y_n+hf_{n+1}$ verwendet. Dieses Verhalten ist schon beim kontinuierlichen Lemma von Gronwall und den hieraus sich ableitenden Sätzen wohl bekannt. Dort sind allerdings auch Sätze bekannt, die dieses falsche Voraussagen des qualitativen Verhaltens vermeiden, siehe Hairer/Wanner/N\o rsett (1987). {Hairer, Ernst}{Wanner, Gerhard}_{N\o rsett, Syvert Paul}% Hier benutzt man u.a. die logarithmische Norm $\mu$ definiert zu
Für die euklidische-, Maximum- und die 1-Norm ergeben sich
Zu (4): Die Aussage (4) zeigt, daß das Stabilitätsfunktional unabhängig von der Basisdarstellung und Basiswahl ist. Die Abschätzungen sind invariant unter der Wahl des Standard-Tripels. Vielfach geeignet ist das Stabilitätsfunktional zum Jordan-Tripel, zum ersten Begleiter-Tripel $(P_1,C_1,R_1)$ oder zum zweiten Begleiter-Tripel $(P_1B^{-1},C_2,BR_1)$, mit der Block-Hankel-Matrix zu
Zu (5) und (6): Gleichheit beider verkürzter Stabilitätsfunktionale ist nicht mehr zu erwarten. Desweiteren erkennt man, daß die Rechtseigenvektoren, also die Spalten in $X_1$ bzw. $X_2$ (falls einer der beiden zu einem Jordan-Tripel gehört) keinen “kalkülmässigen Einfluß” haben, entgegen den Linkseigenvektoren. Natürlich haben die Rechtseigenvektoren Einfluß auf das Gesamtverhalten, denn ändern sich die Rechtseigenvektoren, repräsentiert durch $X$, so ändern sich sich nach der Biorthogonalitätsbeziehung
auch die Linkseigenvektoren, repräsentiert durch $Y$. Jedoch brauchen die Rechtseigenvektoren oder gar die Inverse von $\mathop{\rm col}(XT^i)$ nicht berechnet zu werden. Dies ist hier mit “kalkülmässig” unabhängig gemeint.
6. Corollar: Voraussetzung: $\xi$, $c_1$, $c_2$ wie beim Hauptsatz.
Behauptung: $\xi\to0$, $c_1\to1$, $c_2\to1$, falls $\displaystyle\max_{i=0}^\ell K_i \to 0$.
D.h. die beidseitige Ungleichungskette entartet zu einer Gleichungskette, falls alle Lipschitzkonstanten $K_\rho$ gegen Null gehen, was insbesondere bei Quadraturproblemen auftritt. Eine Anfangswertaufgabe für Differentialgleichungen enthält mit $\dot y=f(t)$, $y(a)=0$, $y(b)=>?$, das Quadraturproblem $\int_a^b f(t) dt$ als Spezialfall.
In Komponentenschreibweise liest sich der Hauptsatz wie folgt.
7. Hauptsatz: Voraussetzung: Es sei
Behauptung: (2) Für die maximale normmässige Abweichung $\left|\hat u_n-u_n\right|$ gilt die beidseitige Abschätzung bzgl. der additiven Störglieder $r_n$, wie folgt
(4) Die Abschätzung bei (3) ist invariant unter der Wahl eines Standard-Tripels, d.h. es gilt
für zwei Standard-Tripel $(X,T,Y)$ und $(\hat X,\hat T,\hat Y)$.
8. Bemerkung: Zu (2): Man erkennt an der Komponentendarstellung, daß $r_n$ eingeht in das Stabilitätsfunktional, ohne von rechts “echt” mit $R_1$ (bzw. $Y$) multipliziert zu werden; $\nu=n-\ell$, für $\nu>n-\ell$, also $n-1-\nu\le\ell-2$, man denke an $P_1C_1^{n-1-\nu}R_1=0$. M.a.W. für $\nu=n-\ell$ kann $r_n$ nicht in den Kernbereich von $P_1C_1^{n-1-\nu}R_1$ gelangen. Im Falle von Diskretisierungsverfahren, wo die $r_\nu$ die lokalen Diskretisierungsfehlervektoren darstellen, hat dies zur Konsequenz: Die Ordnung in $h$ der $r_\nu$ kann nie überschritten werden. Durch Summation kann selbstverständlich eine Reduktion der Ordnung anfallen. Ist beispielsweise $r_\nu={\cal O}(h^{p+1})$, so ist $\left|\bopo [C_1]^{-1} \boro \bfR\right| = {\cal O}(h^{p+1+\varepsilon})$ mit $\varepsilon>0$ unmöglich. Für ein Diskretisierungsverfahren ist dennoch ein Ordnungssprung größer 1 möglich, falls gewisse Komponenten von $r_\nu\in\mathbb{C}^k$ bei der Ordnungsfindung unberücksichtigt bleiben. Dies ist z.B. bei Runge-Kutta-Verfahren der Fall.
Im weiteren sei vorausgesetzt, daß die Eigenwerte von $C_1$ auf dem Einheitskreis nur aus der 1 bestehen, also nicht von der Form $e^{i\varphi}$ [$\varphi\ne0 \pmod{2\pi}$] sind, da andernfalls die typischen Projektoreigenschaften verloren gehen. Sei $E$ diejenige Matrix, die lediglich die spektralen Eigenschaften von $C_1$ zu dem (den) dominanten Eigenwert(en) $\mu=1$ trägt. $T$ sei die Transformationsmatrix von $C_1$ auf Jordannormalform, also
Die Matrix $E$ filtert aus dieser Darstellung nur den (die) Eigenwert(e) $\mu=1$ heraus, also
Es zeigt sich, daß $E$ nicht speziell von der Matrix $C_1$ abhängt.
Die Eigenwerte $\mu=1$ sind ja gerade diejenigen Eigenwerte, die für den dominanten lokalen Fehler verantwortlich sind. Es gilt $\sum_{\nu=0}^N 1\to\infty$, falls $N\to\infty$, aber $\sum_{\nu=0}^\infty \mu^\nu<C$, falls $\left|\mu\right|<1$. Bei $\sum_{\nu=0}^N 1$ $(N\to\infty)$ verliert man gerade eine $h$-Potenz. Es war $N\mathopen|h\mathclose| = \mathopen|b-a\mathclose|$, und $N\to\infty \iff \mathopen|h\mathclose|\to0$.
Die Matrix $E$ hat nun eine Reihe von Recheneigenschaften, die in nachstehendem Satz zusammengefaßt sind. $\mathbb{N}$ ist hier wie üblich die Menge der natürlichen Zahlen von eins an.
1. Satz: (Projektorsatz) $E$ sei wie oben definiert. $S$ sei eine beliebige Matrix, ähnlich zu $C_1$, also $S=H^{-1}C_1H$. Dann gelten
und
Beweis: Zu (1): $E^2=(T\hat JT^{-1})(T\hat JT^{-1})=T\hat J^2T^{-1}= T\hat JT^{-1}=E$.
Zu (2): Liegt an der Ähnlichkeit von Standard-Tripeln.
Zu (3): $SE=(TJT^{-1})(T\hat JT^{-1})=TJ\hat JT^{-1}=T\hat JT^{-1}=E$. Für $E=ES$ verfährt man analog.
Zu (4): Aufgrund der Vertauschbarkeit von $S$ und $E$ nach (2) und der Projektoreigenschaft nach (1) rechnet man
wegen
Zu (5): Berechne direkt anhand der Definition von $[X]$ das Matrixprodukt $[E]^{-1}[S]$ aus. Auf der ersten Subdiagonalen erscheint stets $E-S$ und auf allen darunterliegenden Diagonalen steht $E-ES,$ was nach Behauptung (3) gleich der Nullmatrix ist.
Zu (6): Folgt sofort aus (5). Invertierung von $[E]^{-1}[S]$ liefert $[S]^{-1}[E]$. Die Invertierbarkeit ist aufgrund der Definition von $[X]$ gesichert. Die angegebenen Normen (Zeilensummennorm oder Spaltensummenorm) ergeben sich unmittelbar.
Zu (7): Ist klar. ☐
2. Beispiel: Zu (5): Für das Produkt $[E]^{-1}[S]$ im Falle $N=3$ berechnet man
Es ist $E-ES=0$.
Bei den Ausdrücken hinter $\sup(\cdot)$ steht immer eine endliche Menge, für welches natürlich stets das Maximum existiert. Warum schreibt man $\sup(\cdot)$ und nicht $\max(\cdot)$? Weil man später beim Konvergenzsatz zu $N\to\infty$ übergehen will und man dann zu $\limsup(\cdot)$ gelangt.
3. Satz: Voraussetzungen: $\left|S^\nu\right| \le D$, $\forall\nu\in\mathbb{N}$, $S=XJY$, wobei $J$ die (bis auf Permutation eindeutige) Jordanmatrix ist. $X$ ist die Matrix, die die Rechtseigenvektoren trägt und $Y$ enthält in entsprechend umgekehrter Reihenfolge die Linkseigenvektoren, d.h. es gilt $SX=XJ$ und $YS=JY$. Weiter gilt $S=XJx^{-1}=Y^{-1}JY=XJY$.
Behauptungen: (1) $\displaystyle \hat c_1 \left| [S]^{-1} \bfR \right| \le \left| \hat U-U \right| \le \hat c_2 \left| [S]^{-1} \bfR \right| \le \hat c_3 N \left|\bfR\right|$.
(2) $\displaystyle \left|[S]^{-1}\bfR\right| \sim \left|[E]^{-1}\bfR\right| \sim \left|[J]^{-1} \ovbf Y \bfR\right|$.
(3) Die Konstanten $\hat c_1$, $\hat c_2$ und $\hat c_3$ sind gegeben durch
Die Werte $\hat c_1$ und $\hat c_2$ sind unabhängig von $N$, $\hat c_3$ hingegen nicht. $c_1, c_2$ wie beim Hauptsatz.
Beweis: Man schätzt $\left|[E]^{-1}\bfR\right|$ und $\left|[S]^{-1}\bfR\right|$ gegeneinander ab. Es ist
Durchmultiplikation mit $[S-E]^{-1}$ würde jetzt liefern $[S-E]^{-1} [E]^{-1} \bfR = [S]^{-1} \bfR$. Alternativ könnte man rechnen
Nach dem Projektorsatz sind $\left|[S-E]\right|$ und $\left|[S-E]^{-1}\right|$ für alle $N$ beschränkt und damit sind beide Normen äquivalent. Die letzte Äquivalenz hat ihre Ursache in
☐
In Komponentenschreibweise liest sich der obige Satz wie folgend.
4. Satz: Voraussetzungen: $\left|S^\nu\right|\le D$, $\forall \nu\in\mathbb{N}$. $E$ ist wie oben und es gelten die restlichen Voraussetzungen des Hauptsatzes.
Behauptungen: (1) Die Stabilitätsnormen
sind zueinander äquivalent.
(2) Es gilt die zweiseitige Fehlerabschätzung
5. Satz: Voraussetzungen: $(P_1,C_1,R_1)$ sei das erste Begleitertripel, $(X,J,Y)$ sei das Jordan-Tripel zum Matrixpolynom
$C_1^\nu\le D$, $\forall\nu\in\mathbb{N}$. Die Matrix $\hat J$ filtere aus $J$ nur die Jordanblöcke zum Eigenwert $\mu=1$ heraus. $J$ selber enthalte keine weiteren dominanten Eigenwerte, $J$ ist also stark $D$-stabil. Zwischen $C_1$ und $J$ besteht grundsätzlich der Zusammenhang
Nun sei $\hat C_1$ die entsprechend zu $\hat J$ ähnliche Matrix. $\hat C_1$ ist wie $\hat J$ Projektor.
Behauptung: Das verkürzte Projektorstabilitätsfunktional ist äquivalent zum Projektorstabilitätsfunktional, welches seinerseits äquivalent ist zum ursprünglichen Stabilitätsfunktional, d.h. es gilt unabhängig von $N$, daß
Diese Äquivalenzen sind unabhängig von der Wahl der Standard-Tripel, d.h. es gilt genauso
Beweis: Die dritte Äquivalenz wurde schon im Hauptsatz postuliert und bewiesen, desgleichen die Invarianz vom Standard-Tripel. Für die weiteren gegenseitigen Äbschätzungen rechnet man
Für die Rückabschätzung rechnet man
Die Beschränktheit der Normen von $[C_1-\hat C_1]$ und $[C_1-\hat C_1]^{-1}$, und zwar gänzlich unabhängig von $N$, wurde schon vorher gezeigt. An dieser Stelle benutzt man dann $\left|C_1^\nu\right|\le D$, $\forall\nu\in\mathbb{N}$. Die Beschränktheit von $\left|\bopo\right|$, unabhängig von $N$, ist ebenfalls klar. ☐
Wünscht man lediglich ein Konvergenzresultat, so beschränke man sich auf das diskrete Lemma von Gronwall, den Darstellungssatz und beim Abschätzungssatz genügt völlig die letzte, sehr leicht einzusehende Abschätzung. Schließlich beim Hauptsatz genügt lediglich (1), (2) und (3). Weitere Vereinfachungen ergeben sich, falls man sich auf lineare Matrixpolynome der Form $\rho(\mu)=I\mu-S$ beschränkt, also überall lediglich den Fall $\ell=1$ betrachtet. Die untersuchten Verfahrenstypen bleiben dabei die gleichen, man verliert also letztlich nichts an Allgemeinheit. Die Werte $\left|P_1\right|$, $\left|R_1\right|$ entfallen dann völlig. Die Beweise werden kürzer, aber ggf. muß $S$ in den Anwendungen auf Diskretisierungsprobleme unnötig groß gewählt werden. Allerdings kann häufig $S$ kleiner als $C_1$ ausfallen, jedoch spielt $C_1$ für praktische Rechnungen nicht die entscheidende Rolle, vielmehr ist es $Y$.
1. Aufgrund der Konsistenzbedingung $\rho(1)=0$ für jede Stufe eines zusammengesetzten Verfahrens, gilt $Sw=w$ ($S\in\mathbb{C}^{k\times k}$), mit $w=(1,\ldots,1)^\top \in\mathbb{C}^k$, wenn man das Verfahren in der Form $u_{n+1}=Su_n+h\varphi(u_n,u_{n+1})$ notiert. Bei zyklischer oder auch nicht-zyklischer Kombination mehrerer Verfahren gelangt man zu $u_{n+1}=S_\nu S_{\nu-1} \ldots S_2 S_1 u_n + \ldots{\mskip 3mu}$. Als notwendige und hinreichende Bedingung für Stabilität erhält man
Ein typischer Fall ist die Benutzung eines Grundverfahrens $u_{n+1}=Su_n+h\varphi$ und Variation der Schrittweite $h$. Gilt die obige Stabilitätsbedingung, so spricht man auch von schrittwechsel-stabil. Die Stabilitätsbedingung in der obigen Form ist nicht einfach zu verifizieren. Hinreichende Kriterien sind allerdings viel einfacher zu handhaben, man fordert also mehr und zwar:
Den ersten Fall kann man so erreichen, daß man die $\alpha_{ij}$-Koeffizienten eines Verfahrens vorgibt und anschließend die $\beta_{ij}$-Koeffizienten berechnet. Das Verfahren ist offensichtlich stabil (die zu $\alpha_{ij}$ gehörende Matrix $S$ war ja stabil) und es konvergiert mit der gleichen Konvergenzordnung wie $S$, wenn man die $\beta_{ij}$ so wählt, daß eine ausreichend hohe Konsistenzordnung erreicht wird. Das ist aber stets möglich nach dem Dimensionssatz für die Konsistenzmatrix $C_{p+1,k}$.
2. Beim zweiten Fall absorbiert bildlich gesprochen die Matrix $T$ sämtliche vorhergehenden Matrizen. Dies lässt sich bewerkstelligen, wenn die Spaltenvektoren von $T$ Rechsteigenvektoren von $S_i$ sind, zum Eigenwert 1. Da aber alle $S_i$ konsistent sind, gilt $S_i w = w$ $\forall i$. Damit hat $T$ die Gestalt
Aufgrund der Konsistenz von $T$ muß gelten $Tw=w$, also
im Falle von $w=(1,\ldots,1)$ also $\varepsilon_1+\cdots+\varepsilon_k=1$.
Egal wie $w$ aussieht, $T$ ist ein Projektor, also $T^2=T$, oder was dasselbe ist: $\ker T$ und $\mathop{\rm Im} T$ sind zueinander komplementäre % Unterräume des $\mathbb{C}^k$ ($A_1\cap A_2=\emptyset$, $A_1+A_2=\mathbb{C}^k$). Offensichtlich ist aber nicht jeder konsistente Projektor von der Gestalt $T=(\varepsilon_1 w,\ldots,\varepsilon_k w)$. Dennoch zeigt sich, daß man bei einem stark stabilen, konsistenten Projektor nur einige Zeit warten muß, bis er die gewünschte Form annimmt, also man eine gewisse Potenz dieser Matrix zu bilden hat. Eine äquivalente Charakterisierung liefert
3. Satz: Spektraldarstellung schrittwechsel-stabiler Matrizen.
Voraussetzung: Es seien $T_\nu \in \mathbb{C}^{k\times k}$ ($\nu=1,\ldots,k-1$) mit
Behauptung: Es gilt
Beweis: “$\Rightarrow$”: Die Matrix $T=(\varepsilon_1 w,\ldots,\varepsilon_k w)$ hat den Rang genau 1: Jeder Minor mit 2 oder mehr Zeilen verschwindet (Spalten Vielfaches voneinander oder Nullspalte); aus $w\ne0$ folgt $T\ne0$. Damit ist $T$ ähnlich zu einer der Matrizen $T_\nu$, $\nu=1,\ldots,k-1$. Da eine Projektoreigenschaft invariant unter einem Basiswechsel ist % ($P^2=P$ $\Rightarrow$ $S^{-1}PSS^{-1}PS=S^{-1}PS$) muß $T$ ähnlich zu $T_1$ sein.
“$\Leftarrow$”: Es sei $w$ Rechtseigenvektor von $T$ und $X$ sei die Matrix der Rechtsjordanvektoren und $Y$ sei die Matrix der Linksjordanvektoren, also $T=XT_1Y$, mit
Multiplikation von rechts mit $T_1$ filtert aus $X$ gerade $w$ heraus, Multiplikation von links mit $T_1$ filtert aus $Y$ gerade $v$ heraus, also
Offensichtlich hat $T=(XT_1)(T_1Y)$ dann die verlangte Gestalt $T=(v_1w,\ldots,v_kw)$ (dyadisches Produkt), mit $vw=1$ aufgrund der Biorthogonalitätsbeziehung $XY=YX=I$. ☐
Der Beweis zeigt gleichzeitig, daß $\varepsilon T=\varepsilon$, also $\varepsilon$ Linkseigenvektor von $T$ ist, was man natürlich auch so gesehen hätte. Die Beschränkung beim zweiten Fall auf ein einziges Sonderverfahren, ist nach dem ersten Fall unerheblich, wenn man z.B. immer das gleiche Sonderverfahren mehrmals anwendet. Wie man sieht, muß man $T_\nu$ nur sooft wiederholen, wie der Nilpotenzgrad von 0 angibt, also $\nu$-mal. Bei einem $k$-Schritt Adams-Moulton-Verfahren also $(k-1)$-mal und bei einem Runge-Kutta-Verfahren einmal.
4. Satz: Die stark stabile Matrix $A\in\mathbb{C}^{n\times n}$ habe die Eigenwerte $\lambda_1=1$ und $\left|\lambda_i\right|<1$ ($i=2,\ldots,n$). Es gelte $Tw=w$, $v_1T=v_1T$, $v_1w=1$, $v_1=\mathop{\rm row}(v_{1i})$ und es sei $T^\infty := (v_{11}w,\ldots,v_{1n}w)$. Dann gilt: $T^\nu\to T^\infty$ ($\nu\to\infty$).
Beweis: Für $S:=T-T^\infty$ gilt wegen $TT^\infty=T^\infty=(T^\infty)^\nu=T^\infty T$ offensichtlich $S^\nu=T^\nu-T^\infty$ ($\nu\in\mathbb{N}$). Mit den Linkseigenvektoren $v_2,\ldots,v_n$ zu $\lambda_2,\ldots,\lambda_n$ ergibt sich $v_iTT^\infty=v_iT^\infty=\lambda_iv_iT^\infty$, also $v_iT^\infty=0$, somit $v_i(T-T^\infty)=v_iS=\lambda_iv_i$, für $i=2,\ldots,n$. Weiter ist $v_1T^\infty=v_1=v_1T$, daher $v_1(T-T^\infty)=v_1S=0$, folglich hat $S$ die Eigenwerte $0,\lambda_2,\ldots,\lambda_n$, ergo $\rho(S)<1$. ☐
Erneut muß $w$ nicht gleich $(1,\ldots,1)^\top$ sein. $v_1w=1$ lässt sich immer erreichen. Bei stark stabilen konsistenten Matrizen ist entweder $T\sim T_1\nu$, was äquivalent ist mit $T^\nu=(\varepsilon_1w,\ldots,\varepsilon_nw)$, oder aber zumindestens konvergiert eine Potenz von $T$ gegen diese Gestalt. Das Wiederholen eines stark stabilen Zykluses hat hierin seine Erklärung.
Sei
und es sei $c\cdot b > 0$. Dann ist $A$ diagonalisierbar mit den $n$ Eigenwerten
Sei
$E$ ist diagonalisierbar mit den Eigenwerten
Weiter gelten
und
Mit $T$ gilt dann für $C:=1-\alpha T=\mathop{\rm tridiag}(\alpha,1-2\alpha,\alpha)$, also
Parabolische, partielle Differentialgleichugen kann man durch Semidiskretisierung der Ortsvariablen auf ein i.a. vergleichsweise großes gewöhnliches Differentialgleichungssystem umformen. Dieses kann man dann mit den üblichen Verfahren numerisch lösen. Ein anderer Weg ist, vollständig zu diskretisieren. Dies bietet u.U. die Möglichkeit Verbindungen zwischen Orts- und Zeitdiskretisierungen zu nutzen. Dies soll hier kurz dargestellt werden.
Betrachtet werde die inhomogene Wärmeleitungsgleichung
mit den Rand- und Anfangsdaten
Die Differentialausdrücke für $u_t$ und $u_{xx}$ werden jetzt durch Differenzenausdrücke ersetzt und zwar 1)
2)
3)
4)
5) Man wende die Trapezregel ($\vartheta={1\over2}$-Verfahren) an, wobei jedoch, wie oben dauernd geschehen, $f$ nicht mit in die Implizitheit mit hineinbezogen wird.
Hierbei wurden zur notationellen Vereinfachung die nicht weiter interessierenden Argumente unterdrückt. Stets ist ist $t$ bzw. $x$ gemeint, also z.B. $u(x+h)$ meint $u(t,x+h)$ und so fort. Diese Schreibweise von $u(t,*)=u(*)$ und $u(*,x)=u(x)$ betont die funktionalen Abhängighkeiten. $u$ ist immer eine Funktion zweier Veränderlicher. Vorauszusetzen ist natürlich $u\in C^4([0,t_e]\times[0,x_e])$.
Es sei $N:=\lceil t_e/\tau\rceil$ die Anzahl der Zeitschritte und $M:=\lceil x_e/h\rceil$ sei die Anzahl der Ortsschritte. Weiter sei $t_i:=i\tau=0,\tau,2\tau,\ldots$, für $i=0,\ldots,N$, und $x_k:=kh=0,h,2h,\ldots$, für $k=0,\ldots,M$. Die Näherung für $u(t_i,x_k)$ werde mit $u^i_k$ bezeichnet. Entsprechend sei $f^i_k$ die Näherung für $f(t_i,x_k,u(t_i,x_k))$. Offensichtlich ist $t_N=t_e$ und $x_M=x_e$.
1) Mit der Diskretisierung 1) erhält man jetzt das explizite Einschrittverfahren, wenn man $u_t$ und $u_{xx}$ entsprechend ersetzt. Durch Zusammenfassung ergibt sich
2) Einsetzen ergibt das explizite Zweischrittverfahren
Der Wertevektor $u^1_k$ muß hierbei auf andere Weise erhalten werden, zum Beispiel durch das obige explizite Einschrittverfahren.
3) Einsetzen liefert das implizite Zweischrittverfahren von DuFort/Frankel aus dem Jahre 1953: {DuFort, E.C.}{Frankel, S.P.}%
4) Einsetzen liefert das implizite Einschrittverfahren von Crank/Nicolson aus dem Jahre 1947:{Crank, J.}{Nicolson, P.}
5) Einsetzen ergibt das implizite Einschrittverfahren von Crank/Nicolson (II). Dies entspricht also in etwa der Trapezregel:
Zur Abkürzung wurde oben benutzt $\alpha:=\sigma\tau/h^2$, welches auch im folgenden benutzt werden wird. Alle oben angegebenen Verfahren lassen sich in Matrixschreibweise notieren, anhand dessen man dann das Stabilitätsverhalten besser untersuchen kann, als in der Komponentenform. Zur Abkürzung sei daher im weiteren
und seien die Matrizen definiert
Mit diesen Vektoren $v^i$, $f^i$ und den Matrizen $A_\nu$, $B_5$ schreiben sich jetzt die alle oben angegebenen Verfahren, wie folgt.
1) $v^{i+1}=A_1v^i+\tau f^i$, für $i=0,\ldots,N-1$.
2) $v^{i+1}=2\alpha A_2v^i+v^{i-1}+2\tau f^i$, für $i=1,\ldots,N-1$.
3) $(1+2\alpha)v^{i+1}=2\alpha A_3v^i+(1-2\alpha)v^{i-1}+2\tau f^i$, für $i=1,\ldots,N-1$.
4) $A_4v^{i+1}=v^i+\tau f^i$, für $i=0,\ldots,N-1$.
5) $A_5v^{i+1}=B_5v^i+\tau f^i$, für $i=0,\ldots,N-1$.
Die Stabilität aller Verfahren ergibt sich damit aus den spektralen Daten der zum Verfahren gehörenden Matrixpolynome. Von tridiagonlen Matrizen, der obigen Gestalt, nämlich Differenzenmatrizen, sind jedoch die Eigenwerte sämtlich angebbar. Es gilt:
1) $A_1$ mit den Eigenwerten $\lambda_{1,i} := 1-4\alpha\sin^2{i\pi\over2M}$, für $i=1,\ldots,M-1$.
2) $A_2$ mit den Eigenwerten $\lambda_{2,i} := 4\sin{i\pi\over2M} > 0$, für $i=1,\ldots,M-1$.
3) $A_3$ mit den Eigenwerten $\lambda_{3,i} := 2\cos{i\pi\over M}$, für $i=1,\ldots,M-1$.
4) $A_4$ mit den Eigenwerten $\lambda_{4,i} := 1+4\alpha\sin^2{i\pi\over2M}$, für $i=1,\ldots,M-1$.
5) Für $A_5$ rechnet man
und daher $\lambda_{5a,i} := {1\over2}\left(2+4\alpha\sin{i\pi\over2M}\right)$, und
mit den Eigenwerten $\lambda_{5b,i} := {1\over2}\left(2-4\alpha\sin{i\pi\over2M}\right)$, für $i=1,\ldots,M-1$.
Für die Stabilität ergeben sich nun unter Berücksichtigung der obigen Matrizen, die folgenden Aussagen.
1) Das Matrixpolynom $I\mu-A_1$ hat die Eigenwerte $\mu_i=\lambda_{1,i}$. Diese sind genau dann betragsmässig kleiner eins, falls $\alpha\le1/2$. Wegen $\alpha=\sigma\tau/h^2$, führt dies auf die Begrenzung der Zeitschrittweite $\tau$ zu
insbesondere ist die Zeitdiskretisierung nicht unabhängig von der Ortsdiskretisierung. Eine sehr feine Ortsdiskretisierung führt somit automatisch auch zu einer sehr restringierten Zeitschrittweite, und dies obwohl vielleicht in der Zeit eine viel größere Schrittweite angemessener wäre. Dies ist ein typisches Phänomen für explizite Verfahren und ein Grund zur Betrachtung impliziter Verfahren.
2) Für das Matrixpolynom $I\mu^2-2\alpha A_2\mu-I$ ergeben sich nach Durchmultiplikation mit $D$, wobei $D$ die Transformationsmatrix für $A_2$ ist, also $A_2=D\mathop{\rm diag}(\lambda_{2,i})D^{-1}$, die Eigenwerte des Matrixpolynoms zu
also
Der Spektralradius ist also für jedes $\alpha$ größer als 1. Das Verfahren ist demzufolge für alle $\tau$ und $h$ instabil und damit nicht global konvergent, insbesondere als Einzelverfahren nicht brauchbar. In der Kombination mit anderen Verfahren, z.B. im Rahmen eines zyklischen Verfahrens, könnte es u.U. konvergent gemacht werden.
3) Das Matrixpolynom lautet $(1+2\alpha)I\mu^2-2\alpha A_3\mu-(1-2\alpha)I$. Sei $D$ die Transformationsmatrix auf Diagonalgestalt für die Matrix $A_3$. Damit erhält man die $2M-2$ Eigenwerte des Matrixpolynoms als Nullstellen der Gleichung
also
mit $\varphi := i\pi/M$. Mit der Lösungsformel für quadratische Gleichungen der Form $ax^2+bx+c=0$, $a\ne0$, nämlich
erhält man
Längere, aber elementare Rechnungen zeigen, daß die beiden Funktionen $\mu_{i,\nu}\colon(\alpha,\varphi)\mapsto\mu_{i,\nu}(\alpha,\varphi)$, $\nu=1,2$, auf dem Rechteck $\left[0,+\infty\right[ \times \left[0^\circ,180^\circ\right]$ ihre Extrema annehmen für $\alpha=0$ oder $\varphi=0^\circ$ bzw. $\varphi=180^\circ$. Hierbei sind eine Reihe von Fallunterscheidungen nötig ($\alpha\to\infty$, Radikand positiv oder negativ, $\ldots$). In der Tat also $\mathopen|\mu_{i,1/2}\mathclose| < 1$, für alle $\alpha>0$ und alle $\varphi \in \left]0^\circ,180^\circ\right[$. Das Verfahren von DuFort/Frankel ist damit unbeschränkt stabil.
4) Das Matrixpolynom $I\mu-A_4^{-1}$ hat die Eigenwerte $\mu_i=\lambda_{4,i}^{-1} < 1$, für alle $\alpha$, da $\lambda_{4,i} > 1$. Das Verfahren von Crank/Nicolson ist damit für alle $\tau$ und $h$ stabil. Aufgrund der Konsistenz folgt damit die Konvergenz.
5) Für das entsprechende Matrixpolynom korrespondierend zu $A_5\mu=B_5$, ergeben sich die Eigenwerte als Quotient der Eigenwerte von $A_5$ und $B_5$, also
Damit ist auch dieses Verfahren unbeschränkt stabil, unabhängig also von den beiden Diskretisierungsgrößen $\tau$ und $h$.
]]>Bei jedem Iterationsschritt eines Newton-Raphson-Verfahrens, bzw. bei jeder Aktualisierung der Iterationsmatrix beim Newton-Kantorovich Iterationsverfahren, fällt die Lösung eines linearen Gleichungssystems an. Es ist daher von Wichtigkeit, für diesen Prozeß ein zuverlässiges und zugleich effizientes Lösungsverfahren parat zu haben.
Wie könnte man erkennen, ob ein berechnetes Ergebnis $x$ für ein lineares Gleichungssystem $Ax=b$, eine gute Näherung darstellt? Naheliegend wäre die Betrachtung des Residuums $Ax-b$. Wie das folgende Beispiel deutlich macht, ist dieses Maß mit Vorsicht zu geniessen.
1. Beispiel: Sei betrachtet das lineare Gleichungssystem
Einige Vektoren $x$ und ihre Bilder $Ax$ lauten
Die ersten beiden Vektoren könnten den Eindruck erwecken, daß man sich schon sehr nahe der richtigen Lösung befindet, jedoch ist beim ersten Mal keine der angegebenen Nachkommaziffern richtig, und beim zweiten Mal ist nur bei 2 Komponenten eine einzige Stelle hinter dem Komma richtig. Dies alles ist möglich, obwohl die Matrix symmetrisch ist und alle Komponenten der Matrix dem gleichen Größenbereich entstammen.
Ähnliche Verhältnisse liegen vor bei dem nachstehenden Beispiel.
2. Beispiel: Betrachtet sei nun das lediglich zweidimensionale Problem mit den Daten
Der Residuenvektor ist hier exakt $(-10^{-8},{\mskip 3mu}10^{-8})$, dennoch lautet die exakte Lösung $(2,{\mskip 3mu}-2)$.
Die Empfindlichkeit, mit der ein lineares Gleichungsystem auf Änderung der Eingabedaten reagiert, wird quantitativ erfaßt durch die Konditionszahl.
3. Satz: Voraussetzungen: Die Matrix $A$ sei invertierbar und $x$ sei die exakte Lösung des linearen Gleichungssystems $Ax=b$. Bekannt sei eine Näherungslösung $\hat x$. $r$ sei das Residuum, also $r:=b-A\hat x$.
Behauptung: Es gilt die beidseitige, scharfe Abschätzung
Beweis: Zu 1). Wegen $|r|=|b-A\hat x|=|Ax-A\hat x|\le|A|\cdot|x-\hat x|$, ist $|r|/|A|\le|x-\hat x|$. Andererseits ist $|x|=|A^{-1}b|\le|A^{-1}|\cdot|b|$, also $1/(|A^{-1}|\cdot|b|)\le1/|x|$, nach Multiplikation entsprechender Seiten der beiden hergeleiteten Ungleichung die unter 1) gemachte Behauptung
Diese Abschätzung ist scharf. Sei zur Abkürzung $e:=x-\hat x$. Die Ungleichung wird zu einer Gleichung, wenn $|Ae|=|A|\cdot|e|$ und $|A^{-1}b|=|A^{-1}|\cdot|b|$. Nach Definition von Matrixnormen gibt es solche Vektoren $e^*$ und $b^*$, sodaß $|Ae^*|=|A|\cdot|e^*|$ und $|A^{-1}b^*|=|A^{-1}|\cdot|b^*|$. Für $b^*$ und $\tilde x:=A^{-1}b^*-e$ wird die Ungleichung zu einer Gleichung.
Zu 2). Erstens wegen $\left|b\right| = \left|Ax\right| \le \left|A\right| \cdot \left|x\right|$ ist $1 / \left|x\right| \le \left|A\right| / \left|b\right|$. Zweitens ist $\left|x-\hat x\right| = \left|A^{-1}b-A^{-1}A\hat x\right| = \left|A^{-1}r\right| \le \left|A^{-1}\right| \cdot \left|r\right|$. Insgesamt ergibt sich wieder durch Multiplikation entsprechender Seiten
Auch diese Ungleichung ist scharf. Wähle $x^*$ und $r^*$ mit $|Ax^*|=|A|\cdot|x^*|$ und $\left|A^{-1}r^*\right| = \left|A^{-1}\right| \cdot \left|r^*\right|$. Für $b^*:=A^{-1}x^*$ und $\hat x^*:=x^*-A^{-1}r^*$ gilt Gleichheit. ☐
4. Definition: Die Zahl $\kappa(A) := \left|A\right| \cdot \left|A^{-1}\right|$ heißt Konditionszahl der quadratischen Matrix $A$ zur Norm $\left|\cdot\right|$.
Für rein theoretische Überlegungen stellt die Konditionszahl eine gute Beschreibung von Störungs- und Empfindlichkeitsphänomenen dar. Jedoch ist man ja gerade an der Inverse, bzw. an der Lösung des linearen Gleichungssystems interessiert. Die hier bei der Analyse auftauchende Konditionszahl ist also bei der praktischen Auflösung nicht bekannt. Es gibt Verfahren, mit denen die Konditionszahl geschätzt werden kann. Diese Verfahren sind stellenweise mit der Gaußschen Eliminationsmethode auf das engste gekoppelt und ergeben sich daher zusammen mit der Rechnung. Direkt aus der Defintion der Konditionszahl ersieht man
5. Eigenschaften: Es gelten $\kappa(A)\ge1$ und $\kappa(AB)\le\kappa(A)\cdot\kappa(B)$.
Mit Hilfe der Konditionszahl lässt sich eine Abschätzung einfach schreiben, welche charakterisiert, inwieweit Störungen in der Matrix $A$ zu Veränderungen in der eigentlich gewünschten Lösung $x$ führen.
6. Satz: Löst man statt des exakten Systems $Ax=b$ das gestörte System $\hat A\hat x=b$, so gilt die scharfe Abschätzung nach oben
Beweis: Zunächst ist $x=A^{-1}b=A^{-1}\hat A\hat x=A^{-1}(A+\hat A-A)\hat x=\hat x+A^{-1}(\hat A-A)\hat x$, also $x-\hat x=A^{-1}(\hat A-A)\hat x$, somit $|x-\hat x|\le|A^{-1}|\cdot|A-\hat A|\cdot|\hat x|$. Durch Erweitern mit $|A|\ne0$ schließlich
Die Abschätzung ist offensichtlich scharf. ☐
Die Konditionszahl charakterisiert gleichzeitig auch den Abstand zu allen nicht-invertierbaren Matrizen “in der Nähe” von $A$.
7. Satz: Für alle invertierbaren Matrizen $A$ gilt
Für die Maximumnorm, die 1-Norm und die euklidische Norm gilt Gleichheit.
Beweis: Ist $B$ eine beliebige nicht-invertierbare Matrix, so gibt es also einen Vektor $x\ne0$, mit $Bx=0$. Für diesen Vektor $x$ gilt:
Daher $1\le|A^{-1}|\cdot|A-B|$, somit
Für die behauptete Gleichheit bei der Maximumnorm, schätzt man in umgekehrter Richtung ab und zeigt damit indirekt durch Eingabelung, die Gleichheit.
Zur genaueren Unterscheidung von Normen und Betragsstrichen, werde mit $\left|\cdot\right|_\infty$ die Maximumnorm bezeichnet und mit $\left|\cdot\right|$ die gewöhnliche Betragsfunktion für skalare Größen. Sei $v$ ein Einheitsvektor mit den beiden Eigenschaften $\left|v\right|_\infty = 1$ und $\left|A^{-1}v\right|_\infty = \left|A^{-1}\right|_\infty \cdot \left|v\right|_\infty$. Nach Definition der zu einer Vektornorm gehörenden Matrixnorm gibt es solch einen Vektor $v$.
Weiter sei $y:=A^{-1}v$, $\left|y\right|_\infty =: \left|y_m\right|$. Sei $e_m$ der $m$-te Einheitsvektor; $z:=y_m^{-1}e_m$ und $B:=A-vz^\top$. Wegen $By=AA^{-1}v-y_m^{-1}y_mv=0$ und $y\ne0$, ist $B$ nicht invertierbar. Für beliebige Vektoren $x$ gilt
Da $x$ beliebig war gilt somit
also
Für die $1$-Norm führt man den Beweis ganz ähnlich und für die euklidische Norm benutzt man den Satz über die Existenz einer Singulärwertzerlegung. Der genaue Beweis werde hier nicht ausgeführt. ☐
In anderer Formulierung des oben schon bewiesenen Satzes, lässt sich schreiben:
8. Satz: Es sei $A$ invertierbar und es sei $A(x+\Delta x)=b+\Delta b$. Dann gilt
Der nächste Satz zeigt, daß das symmetrisierte Gleichungssystem $A^\top Ax=A^\top b$ eine größere, und damit schlechtere Konditionszahl besitzt, als das ursprüngliche System. Insbesondere gelten diese Überlegungen für das Normalgleichungssystem (Ausgleichung im Sinne kleinster Quadrate), obwohl dort die entsprechenden Matrizen nicht quadratisch, also erst recht nicht invertierbar sind.
9. Satz: Für eine beliebige invertierbare Matrix $A$ gilt $\kappa_s(A)\le\kappa_s(A^\top A)$.
Beweis: Seien $\mu_{\rm max}$ und $\mu_{\rm min}$ entsprechend die größten und kleinsten Eigenwerte von $A^\top A$. Dann ist $\left|A\right|_s=\sqrt{\mu_{\rm max}}$ und $\left|A^{-1}\right|=\sqrt{\mu_{\rm min}^{-1}}$. Weiter ist $\left|A^\top A\right|_s = \mu_{\rm max}$ und $\left|(A^\top A)^{-1}\right| = \mu_{\rm min}^{-1}$. Daher ist
☐
Welche ist nun die beste Vorkonditionierung mit einer Diagonalmatrix? Es zeigt sich nun, daß dies gerade die normmässige Äquilibrierung aller Zeilenvektoren der Matrix $A$ ist.
10. Satz: Ist die invertierbare $(n\times n)$-Matrix $A=(a_{ik})$ normiert (äquilibriert) gemäß
so gilt für jede Diagonmalmatrix $D$ mit $\det D\ne0$, die Ungleichung
$\kappa_\infty$ bezeichnet hier die Konditionszahl bezüglich der Zeilensummennorm (verträgliche Norm für die Maximumnorm $\left|\cdot\right|$).
Beweis: siehe Werner (1975)*1972+1, Werner, Helmut. Es sei $\left|\cdot\right|$ die Maximum-Vektornorm bzw. die Zeilensummennorm bei Matrizen. Für jede Diagonalmatrix $D=(d_{ii})$, mit $\det D\ne0$ gilt
und
Hierbei bezeichnete $\tilde a_{ik}$ die Komponenten der inversen Matrix $A^{-1}$. Aus den beiden obigen Gleichungen folgt
☐
Versucht man nun hingegen auf beiden Seiten der Matrix eine Äquilibrierung zu erreichen, so kann man sich nach den Worten von Dahlquist und Björck u.U. ebenfalls “in die Nesseln setzen”.
11. Beispiel: Man betrachte für $0 < \left|\varepsilon\right| < 1$ die Matrix
Sein nun $D_1 := \mathop{\rm diag}(1,\varepsilon,\varepsilon)$ und $D_2 := \mathop{\rm diag}(\varepsilon^{-1},1,1)$. Die skalierte Matrix
ist zwar jetzt zeilenäquilibriert, jedoch beträgt die Konditionszahl jetzt $\kappa(B)\approx3/\varepsilon$, während hingegen $\kappa(A)=3$.
Wenn auch die Cramersche Regel eine elegante Darstellung der Lösung eines linearen Gleichungssystems liefert, so ist doch selbst bei bestmöglicher Ausrechnung aller Determinanten der Aufwand höher, als derjenige von Verfahren, die im folgenden vorgestellt werden. Würde man die $(n+1)$ Determinanten ($n$ Zählerdeterminanten und eine Nennerdeterminante) als Summe von jeweils $n$ Faktoren berechnen, so gelänge man zu Rechengrößenordnungen der Form $(n!)$. Schon $n=50$ würde mehr als $10^{64}$ Gleitkommamultiplikationen erfordern, was selbst für Größtrechenanlagen unvertretbar lange Rechenzeiten heraufbeschwören würde. Aber, wie eben erwähnt, selbst bei bestmöglicher und effizientester Auswertung von Determinanten, wären immer noch größenordnungsmässig $n^4$ Operationen nötig, während hingegen die im weiteren Verlaufe dargestellten Verfahren in der Größenordnung $n^3$ liegen.
1. Ein lineares Gleichungssystem mit $p$ Gleichungen und $n$ Unbekannten $x_1$, $x_2$ bis $x_n$ hat die Form
Hierbei sind $a_{ij}$ und $b_k$ feste gegebene Zahlen. Die $a_{ij}$ heißen die Koeffizienten. Der erste Index (hier $i$) heißt Zeilenindex, der zweite Index (hier $j$) heißt Spaltenindex. Der Vektor $(b_1,\ldots,b_p)$ heißt Vektor der rechten Seite [^{right hand side (RHS)}]. Das lineare Gleichungssystem heißt homogen, falls der Vektor der rechten Seite gleich dem Nullvektor ist, also $b_k=0$, für alle $k=1,\ldots,p$.
2. Daß man beim Operieren mit Gleichungssystemen vorsichtig sein muß, zeigt das folgende Beispielgleichungssystem
Zieht man nun die drei Folgerungen, erstens die 1.te Gleichung beizubehalten, zweitens alle drei Gleichungen zusammenzuaddieren und drittens die 2.te zur 3.ten Gleichung zu addieren, so erhält man
Aufgrund der Konstruktion ist jedes Tripel $(x,y,z)$, welches das ursprüngliche Gleichungssystem löst auch gleichzeitig Lösung des neuen umgeformten Systems. Die Umkehrung gilt jedoch nicht! Das Tripel mit $x=y=z=1/3$ löst zwar das neue, umgeformte System, nicht aber das ursprüngliche. Durch Ziehen von Folgerungen können also Lösungen hinzukommen!
3. Gibt es Umformungen, die die Lösungsmenge nicht verändern? Ja, es gibt bei linearen Gleichungssystemen unendlich viele Umformungsmöglichkeiten, die die Lösungsgesamtheit nicht verändern. Drei besonders wichtige sind die nachstehenden Umformungen:
Die nicht betroffenen Gleichungen des Systems werden beibehalten, so wie sie sind. Es gilt nun, daß die obigen drei Vertreter von Umformungen, die Lösungsgesamtheit nicht verändern. Diese drei ausgezeichneten Umformungen, heißen {\it ^{elementare Umformungen}}. Mit den obigen drei Umformungen, wäre das obige malheur nicht passiert.
4. Satz: Bei elementaren Umformungen ändert sich die Lösungsmenge nicht.
Beweis: Das oben angeschriebene Gleichungssystem lautet nach Anwendung der dritten Umformungsregel
Die erste Zeile des Gleichungssytems wurde mit $\lambda$ multipliziert und zur zweiten Gleichung hinzuaddiert. Die restlichen Zeilen wurden völlig unverändert übernommen. Die Lösung des alten Gleichungssystems ist zugleich auch Lösung des neuen umgeformten Lösungssystems, da aber diese Umformung rückgängig gemacht werden kann, hat das neue System genau die gleichen Lösungen. Die Rückgängigmachung geschähe dadurch, daß man die erste Gleichung mit $(-\lambda)$ multipliziert und zur zweiten Gleichung hinzuaddiert. Der Rest der Gleichungen wird wieder belassen. ☐
5. Zu diesen drei elementaren Umformungen korrespondieren die folgenden sogenannten Elementarmatrizen. Die Vertauschung zweier Zeilen
Addiert man zur $i$-ten Zeile von $L(\lambda)$ die $j$-te Zeile multipliziert mit $f(\lambda)$, so ist die äquivaltent mit der Linksmultiplikation mit
Die gleiche Operation für die Spalten ist äquivalent mit der Multiplikation von rechts mit der transponierten Matrix
Schließlich die Multiplikation der $i$-ten Zeile (Spalte) von $L(\lambda)$ mit einer Zahl $a\ne0$ ist äquivalent mit der Multiplikation von links (rechts) mit der Matrix
1. Die Produktzerlegung der Matrix $A\in\mathbb{C}^{n\times n}$ in $A=LU$, mit Subdiagonalmatrix $L$ und Superdiagonalmatrix $U$ heißt eine $LU$-Zerlegung. Wie das Beispiel der Matrix $A=({0\atop1}{1\atop0})$ zeigt, braucht es nicht unbedingt immer eine $LU$-Zerlegung zu geben.
Gibt es jedoch eine $LU$-Zerlegung, so ist diese Zerlegung unter gewissen Normierungsbedingungen auch eindeutig.
2. Satz: Die Zerlegung einer invertierbaren Matrix $A$ in das Produkt $A=L\cdot U$, einer Superdiagonalmatrix $U$ und einer normierten Subdiagonalmatrix $L$ (Subdiagonalmatrix mit lauter Einsen in der Diagonalen), ist eindeutig, wenn sie existiert.
Beweis: $A$ sei zerlegbar in die beiden Produkte $A=LU=\hat L\hat U$, mit Superdiagonalmatrizen $U$, $\hat U$ und normierten Subdiagonalmatrizen $L$, $\hat L$. Das Produkt von Superdiagonalmatrizen ist wieder eine Superdiagonalmatrix. Durch Transponierung erhält man entsprechend, daß das Produkt von Subdiagonalmatrizen wieder eine Subdiagonalmatrix ist und, daß weiter das Produkt von zwei normierten Subdiagonalmatrizen wieder eine normierte Subdiagonalmatrix ist. Nun folgt aus der Gleichung $U\hat U^{-1}=L^{-1}\hat L=I$, dann $\hat L^{-1}=L^{-1}$ und $\hat U^{-1}=U^{-1}$ (Eindeutigkeit der Inversen). ☐
Die folgende Tabelle gibt an: die wesentliche Anzahl der durchzuführenden Operationen und der benötigte Speicherplatzbedarf bei vollbesetzten Matrizen, bei symmetrischen $(m,m)$-Bandmatrizen und dies in Abhängigkeit davon, ob eine Pivotsuche durchgeführt wird oder nicht.
vollbesetzte Matrix | Bandmatrix ohne Pivot | Bandmatrix mit Pivot | |
---|---|---|---|
Speicherplatzbedarf | $n^2$ | $(2m+1)n$ | $(3m+1)n$ |
LU-Faktorisierung | $n^3/3$ | $(m+1)mn$ | $(2m+1)mn$ |
Rücksubstitution | $n^2$ | $(2m+1)n$ | $(3m+1)n$ |
3. Definition: $A\in\mathbb{C}^{n\times n}$ heißt ^{$(m,k)$-Bandmatrix} ($m,k\in\{0,\ldots,n-1\}$) mit linksseitiger Bandbreite $m$ und rechtsseitiger Bandbreite $k$, wenn $A$ insgesamt $m$ ^{Unterdiagonalen} und $k$ ^{Oberdiagonalen} enthält, welche Nichtnullelemente besitzen und sonst $A$ nur aus Nullen besteht. Eine ^{Tridiagonalmatrix} ist somit eine $(1,1)$-Bandmatrix, eine ^{obere Hessenbergmatrix} ist eine $(1,n-1)$-Bandmatrix und eine ^{untere Hessenbergmatrix} ist eine $(n-1,1)$-Bandmatrix. Hermitesche $(m,k)$-Bandmatrizen sind stets $(m,m)$-Bandmatrizen. Gelegentlich ist es nützlich zu sagen, daß $A$ eine $(m,k)$-Bandmatrix ist, wenn die entsprechenden Unter- oder Überdiagonalen Nichtnullelemente enthalten können. So wäre dann die Nullmatrix eine $(m,k)$-Bandmatrix für jedes $m,k\in\{0,\ldots,n-1\}$.
4. Lemma: $A\in\mathbb{C}^{n\times n}$ sei eine $(m,k)$-Bandmatrix und besitze eine $LU$-Zerlegung. Dann ist $L$ eine $(m,0)$-Bandmatrix und $U$ ist eine $(0,k)$-Bandmatrix.
Beweis: Es ist $a_{ij}=\sum_{\nu=1}^{\min(i,j)} \ell_{i\nu} u_{\nu j}$, also
☐
Umgekehrt ist das Produkt einer $(m,0)$-Bandmatrix mit einer $(0,k)$-Bandmatrix immer mindestens eine $(m,k)$-Bandmatrix.
5. Beispiel: Die Inversen von Bandmatrizen können einen hohen Auffüllungsgrad aufweisen. Dies zeigt
Die Matrix $A$ ist diagonal-dominant mit positiven Diagonaleinträgen, also positiv definit. $L$ und $U$ sind Dreiecksbandmatrizen, dennoch ist die Inverse von $A$ vollbesetzt, nämlich
1. Definition: Es bezeichnet $B[k]:=(b_{ij})_{i,j=1,\ldots,k}$ die Matrix gebildet aus den führenden $k$ Zeilen und Spalten. Entsprechend entgegengesetzt bezeichnet $B\!\left]\ell\right[:=(b_{ij})_{i,j=n-\ell,\ldots,n}$ die Matrix zusammengesetzt aus den letzten $\ell$ Zeilen und Spalten.
2. Das Gaußsche Eliminationsverfahren mit totaler Pivotsuche (GECP: Gaussian Elimination with complete pivoting) geht wie folgt vor sich. Es sei $A$ eine komplexe $n\times n$ Matrix.
Die Gauß-Elimination liefert entweder eine obere Dreiecksmatrix $A^{(n-1}$, oder die Information, daß $A$ nicht invertierbar ist. Wie erwähnt, heißen die Diagonalelemente $a_{kk}^{(k-1)}$ Pivotelemente. Eine Matrix $A$ ist genau dann invertierbar, wenn alle Pivotelemente nicht verschwinden (Produkt der Diagonalelemente ist bis auf das Vorzeichen der Wert einer Determinante). Wenn man das betragsmässig größte Element der Restmatrix $A\!\left]n-k\right[$ nur in der ersten Spalte von $A\!\left]n-k\right[$ sucht, also das betragsmässig größte Element der jeweils ersten Spalte sucht, anstatt in der ganzen Matrix $A\!\left]n-k\right[$ danach zu suchen (w.o.), so spricht man von Gauß-Elimination mit partieller Pivotsuche. Beschränkt man sich sogar bei der Suche auf ein beliebiges nicht verschwindendes Element, so spricht man von gewöhnlicher Gauß-Elimination. Bei Handrechnung verwendet man häufig die gewöhnliche Gauß-Elimination und wählt als Pivot möglichst kleine ganze Zahlen, falls vorhanden, z.B. 1. Programmiert wird i.d.R. die Gauß-Elimination mit partieller Pivotwahl, während GECP eher selten angewendet wird.
Nach dem $k$-ten Eliminationsschritt sieht die umgeformte Matrix $A$ dann wie folgt aus
Wüßte man im voraus, welche Zeilen und Spalten jeweils zu vertauschen wären, so könnte man diese gleich im voraus durchführen. Mit dieser so vorpräparierten Matrix bräuchte man dann keinerlei Zeilen- und Spaltenvertauschungen durchzuführen. Alle diejenigen Matrizen, bei denen diese Vorvertauschungen schon durchgeführt sind, sollen CP heißen (^{completely pivoted}).
Es sei
Diese Größe heißt Wachstum der Pivotstrategie.
Bei partieller Pivotwahl kann gelten $g(A)=2^n$. Bei totaler Pivotsuche sagt die 1992 falsifizierte Wilkinsonsche Vermutung (local copy), nach James Hardy Wilkinson (1919--1986), $g(A)\le n$. Diese Abschätzung ist scharf, wie man anhand von sogenanten Hadamard-Matrizen, Jacques S. Hadamard, (1865--1963), zeigen kann. Für komplexe Matrizen sind diese Schranken zu erhöhen. Hierzu Jane Day und Brian Peterson in Day/Peterson (1988):
Wilkinson's conjecture is very intriguing---easy to state, soon believed, and apparently very difficult to resolve.
3. Proposition: $A\in\mathbb{C}^{n\times n}$ sei invertierbar und CP. Es werde der $k$-te Eliminationsschritt der GECP durchgeführt, $k<i,j\le n$. Dann gilt
Beweis: Da $A$ CP und da Pivotierung (nämlich Linearkombination von Zeilen) die Determinante und die Hauptminoren von $A$ nicht ändern, ergibt der Laplacesche Entwicklungssatz nach der $k$-ten Spalte (oder Zeile) sofort $\displaystyle{ A_{1,\ldots,k,j}^{1,\ldots,k,i} = a_{ij}^{(k)} A_{1\ldots k}^{1\ldots k}. }$ Aufgrund der Invertierbarkeit von $A$ folgt die gemachte Aussage. ☐
4. Corollar: Das Pivotelement $a_{kk}^{(k-1)}$ bei GECP ist $a_{kk}^{(k-1)}={1\over x}$; $x$ ist das $(k,k)$-Element der Inverse der Matrix $A[1\ldots k]$, also von $(A[1\ldots k])^{-1}$. Insbesondere ist $a_{nn}^{(n-1)}$ das Reziproke eines Elementes von $A^{-1}$.
Beweis: Sei $B:=A[1\ldots k]$. Nach der Proposition ist dann
☐
5. Bemerkungen: (1) GECP kann wie folgt interpretiert werden: Hat man die ersten $k-1$ Zeilen und Spalten gewählt, so wählt man die $k$-te Zeile und Spalte deswegen aus, weil dann die führende $k\times k$ Determinante maximalen Betrag aufweist.
(2) Alternativ kann man argumentieren: Hat man die ersten $k-1$ Zeilen und Spalten gewählt, so wählt man die $k$-te Zeile und Spalte deswegen aus, weil dann $\det A\!\left]n-k\right[$ minimalen Betrag aufweist.
(3) Geometrisch gesprochen: man wählt die $k$-te Zeile und Spalte deswegen aus, weil dann das $k$-Volumen des Spates gebildet aus den ersten $k$ Zeilenvektoren und Spaltenvektoren aus $A[k]$ maximal wird.
(4) Umgekehrt: man wählt die $k$-te Zeile und Spalte deswegen aus, weil damit das $(n-k)$-Volumen des projizierten Spates minimal wird, denn Pivotieren bzgl. $a_{kk}^{(k-1)}$ heißt Projizieren des Spates aufgespannt durch die Zeilen von $A^{(k-1)}\!\left]n-k+1\right[$ in den Spat aufgespannt durch die Zeilen von $A^{(k)}\!\left]n-k\right[$.
6. Satz: Darstellungssatz für die Gauß-Elimination nach Day/Peterson (1988). Es sei $A\in\mathbb{C}^{n\times n}$ invertierbar und $k<n$. Die Restmatrix nach dem $k$-ten Eliminationsschritt ist gegeben durch
D.h. die nach dem $k$-ten Eliminationsschritt noch nicht in Dreiecksform vorliegende Restmatrix $A^{(k)}\!\left]n-k\right[$ ist nichts anderes als von der eigentlichen Inversen $A^{-1}$ die invertierte Restmatrix $\bigl(A^{-1}\!\left]n-k\right[\bigr)^{-1}$. Damit stellt die Restmatrix nicht nur irgendeine Hilfsmatrix dar, sondern steht im Gegenteil mit der Inversen schon in engster Verbindung.
Beweis: Für $i,j>k$ sei $a_{ij}^{(k)}$ ein beliebiges Element von $A^{(k)}\!\left]n-k\right[$. Nach der vorhergehenden Proposition und dem Satz über Minoren Inverser gilt
Erneut wegen dem Satz über die Minoren Inverser gilt
Durch Einsetzen
Damit ist $a_{ij}^{(k)}$ genau der $(i,j)$-Eintrag von $(A^{-1}\!\left]n-k\right[)^{-1}$. ☐
7. Corollar: Führt man vor der eigentlichen Elimination sämtliche Zeilen- und Spaltenvertauschungen im voraus durch (also Matrix ist CP), so hat dies die Bedeutung, daß für $k=1,\ldots,n-1$ der Betrag der Determinante von $A^{-1}\!\left]n-k\right[$ nicht vergrößert werden kann durch irgendwelche Zeilen- und Spaltenvertauschungen der letzten $n-k+1$ Zeilen und Spalten von $A$.
Beweis: Nach den obigen Bemerkungen (3) und (4) ist GECP gleichbedeutend mit der Minimierung von $\left|\det A^{(k)}\!\left]n-k\right[\right|$ in jedem Schritt $k$, also der Maximierung von $\left|\det A^{-1}\!\left]n-k\right[\right|$. ☐
Für positiv definite Matrizen $A$ ist GE immer anwendbar und zugleich liefert GE ein einfaches Kriterium zur Überprüfung auf positve Definitheit. Es gilt nämlich
8. Satz: Voraussetzung: $A\in\mathbb{C}^{n\times n}$ sei hermitesch. (Hermite, Charles (1822--1901))
Behauptung: GE durchführbar $\land$ $a_{ii}^{(k)}>0$ $\iff$ $A\succ0$.
Beweis: $A$ positiv definit $\iff$ $A_{1\ldots r}^{1\ldots r}>0$ $\iff$ $a_{ii}^{(k)}>0$, da Determinanten oder Hauptminoren sich nicht ändern bei Addition von Vielfachen von Zeilen zueinander. ☐
9. Corollar: Jede positiv definite (hermitesche) Matrix $A$ besitzt genau eine $LU$-Zerlegung der Form $A=LU=LDL^\top$, mit einer normierten Subdiagonalmatrix $L$ und einer Diagonalmatrix $D$ mit lauter positiven Diagonalelementen.
Die Gauß-Elimination mit Diagonalstrategie mit positiven (Diagonal-) Pivots ist genau dann ausführbar, wenn die Matrix positiv definit ist. Also bei positiv definiten Matrizen sind Zeilen- und/oder Spaltenvertauschungen prinzipiell nicht erforderlich. Dies ist insofern von besonderem Interesse, als daß bei sehr großdimensionalen Matrizen ($n>1000$ beispielsweise) man besonders Wert legt auf einen geringen Auffüllungsgrad, welcher mit einer Pivotstrategie i.d.R. in einem Zielkonflikt steht. Konzentriert man sich daher bei positiv definiten Matrizen allein darauf, den Auffüllungsgrad gering zu halten, so bleibt dennoch die Gauß-Elimination immer durchführbar.
Genauso zeigt man: GE durchführbar $\iff$ $A_{1\ldots r}^{1\ldots r}\ne0$, da auch hier wieder sich die Hauptminoren nicht ändern bei Linearkombination von Zeilen. Damit hat man: Eine Matrix $A$ besitzt genau dann eine $LU$-Zerlegung, wenn alle führenden Hauptminoren nicht verschwinden. Dies deswegen, weil die Existenz einer $LU$-Zerlegung äquivalent ist mit der Durchführbarkeit der Gauß-Elimination ohne irgendwelche Zeilen- oder Spaltenvertauschungen.
]]>Sei eine lineare Mannigfaltigkeit ${\cal M}\subseteq\mathbb{C}^n$ aufgespannt durch die $s$ linear unabhängigen Vektoren $a_1,\ldots,a_s\in\mathbb{C}^n$. Sei $A=(a_1,\ldots,a_s)\in\mathbb{C}^{n\times s}$. Es gilt
Sei ${\cal M}^\bot$ das orthogonale Komplement von ${\cal M}$, also $y\in{\cal M}^\bot$ genau dann, wenn
Ist die Orthogonalitätsrelation (bzw. die dazugehörige Sesquilinearform) nicht ausgeartet, so gilt
also ${\cal M}\oplus{\cal M}^\bot=\mathbb{C}^n$. Jeder Vektor $0\ne x\in\mathbb{C}^n$ lässt sich somit eindeutig zerlegen in einen Anteil aus ${\cal M}$ und einen Anteil aus ${\cal M}^\bot$, also
Bezeichnung: $\xM$ heißt die Projektion von $x$ auf ${\cal M}$ und $\xMb$ heißt orthogonale Projektion von $x$ auf ${\cal M}$.
1. Satz: Bei fest gegebener Basis $a_1,\ldots,a_s$ von ${\cal M}$ lassen sich $\xM$ und $\xMb$ berechnen durch
Da $A\in\mathbb{C}^{n\times s}$ maximalen Spaltenrang hat, ist $A^*A$ nach der Gramschen Determinante invertierbar.
Bezeichnung: $P$ heißt Projektionsmatrix oder Projektor, $Q$ heißt orthogonaler Pojektor; genauer ist von $P_s$ bzw. $Q_s$ zu sprechen.
Beweis: Sei
Es ist $\xM=Au$, mit $u\in\mathbb{C}^s$. Durch Linksmultiplikation mit $(A^*A)^{-1}A^*$ folgt $u=(A^*A)^{-1}A\xM$. Ein Element von ${\cal M}$ muß bzgl. der Basis $a_1,\ldots,a_s$ die Koordinaten $(u_1,\ldots,u_s,0,\ldots,0)$ haben, somit
Für $x\in\cal M$ gilt $x=Au$ und $Px=Au=x$. Für $x\in{\cal M}^\bot$ gilt $A^*x=0,$ wegen $a_i^*x=0$ ($i=1,\ldots,s$). Die Darstellung von $Q$ folgt sofort aus der Darstellung von $P$, wegen $\xMb = x - \xM = x - Px$. ☐
2. Beispiel: Seien $n=3$, $s=2$, $a_1=(1,0,0)^\top$, $a_2=(0,1,0)^\top$. Damit wird $P=A(A^\top A)^{-1}A^\top=\mathop{\rm diag}(1,1,0)$, wegen $A^\top A={1{\mskip 3mu}0\choose 0{\mskip 3mu}1}$. Dies ist tatsächlich die Projektion auf die ersten beiden Komponenten.
3. Satz: Bezeichne $\mathopen|x\mathclose|=\sqrt{\langle x,x\rangle}$. Es gelten
(1) $P^*=P$, $Q^*=Q$ (Hermitizität),
(2) $P^2=P$, $Q^2=Q$ (Idempotenz),
(3) $x,a_1,\ldots,a_s$ linear anhängig $\iff$ $Qx=0$,
(4) $P$, $Q$ positiv semidefinit,
(5) $\mathopen|Px\mathclose|\le\mathopen|x\mathclose|$, $\mathopen|Px\mathclose|\le\mathopen|x\mathclose|$,
(6) $P_iP_k = P_{\min(i,k)}$, $Q_iQ_k = Q_{\max(i,k)}$,
(7)
Beweis: zu (1) und (2): elementare Rechnung.
zu (3): $Qx=0$ $\iff$ $x\in{\cal M}$ $\iff$ $x,a_1,\ldots,a_s$ im gleichen $s$-dimensionelen Raum.
zu (4): $P$, $Q$ hermitesch mit Eigenwerten 0 und 1.
zu (5): Da $P$ und $Q$ hermitesch sind, kann man beide unitär diagonalisieren, mit unitärer Matrix $U$ ($U^*U=I$, $\mathopen|U\mathclose|=1$). Also $\mathopen|Px\mathclose|\le\mathopen|U\mathclose| \mathopen|D\mathclose| \mathopen|U^*\mathclose| \mathopen|x\mathclose|$, wobei $\mathopen|D\mathclose|=1$.
zu (6) und (7): klar. ☐
4. Beispiel: Projektionen müssen nicht immer hermitesch, noch niemals normal sein. Projektionen können auch die euklidische Norm eines Vektors vergrößern. Dies zeigt $R={1{\mskip 3mu}1\choose 0{\mskip 3mu}0}$: $R^2=R$ (Projektoreigenschaft), $R\ne R^\top$, $R^\top R\ne RR^\top$ und $R{1\choose1}={2\choose0}$, aber $\mathopen|(2,0)\mathclose|=2$, $\mathopen|(1,1)\mathclose|=\sqrt2$. Der obige Satz sagt, daß mit dem Projektor $A(A^*A)^{-1}A^*$, dies alles nicht passieren kann.
1. Jeder Vektor $x\in\mathbb{C}^n$ besitzt bzgl. der Basis $a_1,\ldots,a_n$ eine Darstellung der Form $x=\sum{1\le i\le n} a_i\hat x_i = A\hat x$, oder $\hat x=A^{-1}x$, wobei $A=(a_1,\ldots,a_n)\in\mathbb{C}^{n\times n}$. Jeder Vektor $y\in\mathbb{C}^n$ hat also bzgl. $a_1,\ldots,a_n$ die Basisdarstellung $\hat y=A^{-1}y$. Sei $B=(b_1,\ldots,b_m)\in\mathbb{C}^{m\times m}$ eine Basismatrix für den $\mathbb{C}^m$ und sei $L\colon\mathbb{C}^n\mapsto\mathbb{C}^m$ eine Matrix bzgl. der Standardbasis. Der Übergang von der Standardbasis im $\mathbb{C}^n$ auf $A$ und der simultane Übergang von der Standardbasis im $\mathbb{C}^m$ auf $B$ “bewirkt”, daß man $L$ ersetzt durch $\hat L=B^{-1}LA$. Ein Vektor $\hat y=A^{-1}y$ wird also durch die zuerst wirkende Matrix $A$ umgeformt in Standardkoordinaten, danach wirkt wie üblich $L$, und $B^{-1}$ führt zur gewünschten Koordinatendarstellung im Zielraum $\mathbb{C}^m$.
2. Beispiel: Im Falle $B=A$ hat man $\hat L=A^{-1}LA$, bzw. im Falle $B=I$ einfach nur $\hat L=LA$. Wäre lediglich $A=I$ so $\hat L=B^{-1}L$.
Umgekehrt kann die Ersetzung der Matrix $L$ durch $A^{-1}LA$ gedeutet werden, als ein Übergang von der Standardbasis auf die Basis $A$, z.B. $L\to XJY=XJX^{-1}$, bzw. $J\to X^{-1}LX$. D.h., beim Übergang von der Standardbasis auf eine Jordanbasis (gegeben durch die Rechtshauptvektoren $X$), hat dann die Matrix $L$ die bekannte Jordansche Normalform.
Eine Anwendung der Jordanschen Normalform, bzw. der Schurschen Normalform, ist der Äquivalenzsatz für äquivalente Matrizen.
3. Definition: (1) Zwei Matrizen $A,B\in\mathbb{C}^{m\times n}$, heißen äquivalent, wenn $A=RBS$, mit invertierbarer $(m\times m)$-Matrix $R$ und invertierbarer $(n\times n)$-Matrix $S$.
(2) Zwei Matrizen $A,B\in\mathbb{C}^{n\times n}$ heißen ähnlich, falls $A=SBS^{-1}$, mit invertierbarer Matrix $S$.
Ähnlichkeit zweier Matrizen heißt nichts anderes, als Übergang zu einer anderen Basis. Der nächste Satz sagt, daß Äquivalenz zweier Matrizen nur eine Ranginvariante ist, sonst nichts.
4. Satz: (1) Zu jeder Matrix $A\in\mathbb{C}^{m\times n}$ existieren invertierbare Matrizen $R\in\mathbb{C}^{m\times m}$ und $S\in\mathbb{C}^{n\times n}$, sodaß
wobei die Anzahl der Einsen gleich $\mathop{\rm rank} A$ ist.
(2) Zwei Matrizen $A,B\in\mathbb{C}^{m\times n}$ sind genau dann äquivalent, wenn sie den gleichen Rang haben.
Beweis: Entweder über das Gaußsche Eliminationsverfahren mit Zeilen- und Spaltenvertauschungen oder über Jordansche oder Schursche Normalform. (2) folgt sofort aus (1). ☐
Eine weitere Anwendung hiervon ist
5. Satz: $A\in\mathbb{C}^{m\times n}$ hat den genauen Rang $r$ ($0\le r\le\min(m,n)$) $\iff$ es gibt mindestens einen nicht verschwindenden Minor der Ordnung $r$, sämtliche Minoren der Ordnung $r+1,r+2,\ldots,\min(m,n)$ verschwinden.
Beweis: Folgt sofort aus
☐
1. Definition: Sei $A\in\mathbb{C}^{m\times m}$ und $B\in\mathbb{C}^{n\times n}$. Dann heißt
also
das Kronecker-Produkt oder direktes Produkt von $A$ und $B$.
]]>The last time I wrote:
I am married and have three children. All three children show interest in society and technology, and will likely find their way through life. Being a husband and father of three is a story on its own, meriting a separate blog post.
All three children are now adults. They show a strong interest in science and technology and have made this their profession. They earn their own money, and live their own lives, mostly with their partner, whom they have found along the way. I couldn't be more proud to see them succeed.
In 2016, I lost my father, see Arnold Klausmeier. Last year, my wife lost her father. So we are both now fatherless.
After a long and stressful project, which finished in 2019, I decided to reduce my workload to 60%. Since 2020, I only work on Wednesday, Thursday, and Friday. I should have done this way earlier. Before that decision to reduce the workload, I struggled emotionally with this decision for quite some time, although rationally things were pretty clear.
I have lived in the same house and have driven the same car since more than ten years ago. I updated my various PCs, smartphones, and tablets. Advances in this technology are still breathtaking.
I traveled to Poland and Canada and visited France multiple times.
The CoVID pandemic didn't affect me personally, except that I had to postpone my planned trip to Montreal by three years. I worked from home before the pandemic and still do. Now working from home has become normal for many more people. In that respect, CoVID had acted as an accelerator for something that was ripe anyway.
According German mortality table, I have 21.5 years left to live. I can therefore write two more posts:
;-)
]]>While cookies could also be used for storing this choice, they are not needed for this. A cookie is first created on the server side and then transfered to the client, which then resends it whenever communicating with this server again. LocalStorage is different. LocalStorage is stored on the client, and never leaves the client. I.e., localStorage is only set and read via JavaScript on the client.
1. CSS. The actual CSS for dark and light colors uses CSS variables and is as below:
:root { --bg-color:#fffff8; --bgAcolor:white; color:black; --h1Color:DarkBlue; --thColor:LightBlue; --nthChild:#f2f2f2; --klmwidth:46rem; }
.dark-mode { background-color:#22160B; color:white; --bgAcolor:black; --h1Color:LightBlue; --thColor:DarkBlue; --nthChild:#935116;
--pagefind-ui-primary: #eeeeee; --pagefind-ui-text: #eeeeee; --pagefind-ui-background: #152028; --pagefind-ui-border: #152028; --pagefind-ui-tag: #152028;
}
body {
background-color: var(--bg-color);
font-family:Merriweather,"Times New Roman",ui-serif,Georgia,Cambria,Times,serif;
/*font-size: 28px; font-weight: 100;*/
margin: auto;
max-width: var(--klmwidth);
}
th { border: 1px solid Black; background-color:var(--thColor); padding:0.3rem 0.5rem 0.3rem 0.5rem; position:sticky; top:0 }
tr:nth-child(even) { background-color:var(--nthChild); }
We use below two icons for switching between dark and light.
Light | Dark |
---|---|
The "button" for switching between dark and light mode is:
<a onclick="return darkLightToggle()" aria-label="Switch between light and dark mode"><svg version="1.1" id="darkLightIcon" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="32" width="32" x="0px" y="0px" viewBox="0 0 122.8 122.8" style="enable-background:new 0 0 240 240" xml:space="preserve"><g><path d="M49.06,1.27c2.17-0.45,4.34-0.77,6.48-0.98c2.2-0.21,4.38-0.31,6.53-0.29c1.21,0.01,2.18,1,2.17,2.21 c-0.01,0.93-0.6,1.72-1.42,2.03c-9.15,3.6-16.47,10.31-20.96,18.62c-4.42,8.17-6.1,17.88-4.09,27.68l0.01,0.07 c2.29,11.06,8.83,20.15,17.58,25.91c8.74,5.76,19.67,8.18,30.73,5.92l0.07-0.01c7.96-1.65,14.89-5.49,20.3-10.78 c5.6-5.47,9.56-12.48,11.33-20.16c0.27-1.18,1.45-1.91,2.62-1.64c0.89,0.21,1.53,0.93,1.67,1.78c2.64,16.2-1.35,32.07-10.06,44.71 c-8.67,12.58-22.03,21.97-38.18,25.29c-16.62,3.42-33.05-0.22-46.18-8.86C14.52,104.1,4.69,90.45,1.27,73.83 C-2.07,57.6,1.32,41.55,9.53,28.58C17.78,15.57,30.88,5.64,46.91,1.75c0.31-0.08,0.67-0.16,1.06-0.25l0.01,0l0,0L49.06,1.27 L49.06,1.27z"/></g></svg></a>
2. JavaScript. We use the string "dark-theme" as the key for localStorage.
Its values can be either 1 or 0.
When the toggle function darkLightToggle()
is called, it has a switch whether to store the decision in localStorage or not.
We take care to only set a value in localStorage if the user actually has overriden the default.
The default can be either light or dark, depending on the browser setting.
We use the "window load" event in JavaScript to check both:
<script>
function darkLightToggle(setLocal=1) {
if (setLocal) {
let dts = localStorage.getItem("dark-theme") ?? 0;
if (dts != 1 && dts != 0) dts = 0; // in case the user has tampered with localStorage
localStorage.setItem("dark-theme", 1 - dts);
}
document.body.classList.toggle("dark-mode");
darkLightIcon.innerHTML = document.body.classList.contains("dark-mode") ?
'<g><path d="M58.57,25.81c-2.13-3.67-0.87-8.38,2.8-10.51c3.67-2.13,8.38-0.88,10.51,2.8l9.88,17.1c2.13,3.67,0.87,8.38-2.8,10.51 c-3.67,2.13-8.38,0.88-10.51-2.8L58.57,25.81L58.57,25.81z M120,51.17c19.01,0,36.21,7.7,48.67,20.16 C181.12,83.79,188.83,101,188.83,120c0,19.01-7.7,36.21-20.16,48.67c-12.46,12.46-29.66,20.16-48.67,20.16 c-19.01,0-36.21-7.7-48.67-20.16C58.88,156.21,51.17,139.01,51.17,120c0-19.01,7.7-36.21,20.16-48.67 C83.79,58.88,101,51.17,120,51.17L120,51.17z M158.27,81.73c-9.79-9.79-23.32-15.85-38.27-15.85c-14.95,0-28.48,6.06-38.27,15.85 c-9.79,9.79-15.85,23.32-15.85,38.27c0,14.95,6.06,28.48,15.85,38.27c9.79,9.79,23.32,15.85,38.27,15.85 c14.95,0,28.48-6.06,38.27-15.85c9.79-9.79,15.85-23.32,15.85-38.27C174.12,105.05,168.06,91.52,158.27,81.73L158.27,81.73z M113.88,7.71c0-4.26,3.45-7.71,7.71-7.71c4.26,0,7.71,3.45,7.71,7.71v19.75c0,4.26-3.45,7.71-7.71,7.71 c-4.26,0-7.71-3.45-7.71-7.71V7.71L113.88,7.71z M170.87,19.72c2.11-3.67,6.8-4.94,10.48-2.83c3.67,2.11,4.94,6.8,2.83,10.48 l-9.88,17.1c-2.11,3.67-6.8,4.94-10.48,2.83c-3.67-2.11-4.94-6.8-2.83-10.48L170.87,19.72L170.87,19.72z M214.19,58.57 c3.67-2.13,8.38-0.87,10.51,2.8c2.13,3.67,0.88,8.38-2.8,10.51l-17.1,9.88c-3.67,2.13-8.38,0.87-10.51-2.8 c-2.13-3.67-0.88-8.38,2.8-10.51L214.19,58.57L214.19,58.57z M232.29,113.88c4.26,0,7.71,3.45,7.71,7.71 c0,4.26-3.45,7.71-7.71,7.71h-19.75c-4.26,0-7.71-3.45-7.71-7.71c0-4.26,3.45-7.71,7.71-7.71H232.29L232.29,113.88z M220.28,170.87 c3.67,2.11,4.94,6.8,2.83,10.48c-2.11,3.67-6.8,4.94-10.48,2.83l-17.1-9.88c-3.67-2.11-4.94-6.8-2.83-10.48 c2.11-3.67,6.8-4.94,10.48-2.83L220.28,170.87L220.28,170.87z M181.43,214.19c2.13,3.67,0.87,8.38-2.8,10.51 c-3.67,2.13-8.38,0.88-10.51-2.8l-9.88-17.1c-2.13-3.67-0.87-8.38,2.8-10.51c3.67-2.13,8.38-0.88,10.51,2.8L181.43,214.19 L181.43,214.19z M126.12,232.29c0,4.26-3.45,7.71-7.71,7.71c-4.26,0-7.71-3.45-7.71-7.71v-19.75c0-4.26,3.45-7.71,7.71-7.71 c4.26,0,7.71,3.45,7.71,7.71V232.29L126.12,232.29z M69.13,220.28c-2.11,3.67-6.8,4.94-10.48,2.83c-3.67-2.11-4.94-6.8-2.83-10.48 l9.88-17.1c2.11-3.67,6.8-4.94,10.48-2.83c3.67,2.11,4.94,6.8,2.83,10.48L69.13,220.28L69.13,220.28z M25.81,181.43 c-3.67,2.13-8.38,0.87-10.51-2.8c-2.13-3.67-0.88-8.38,2.8-10.51l17.1-9.88c3.67-2.13,8.38-0.87,10.51,2.8 c2.13,3.67,0.88,8.38-2.8,10.51L25.81,181.43L25.81,181.43z M7.71,126.12c-4.26,0-7.71-3.45-7.71-7.71c0-4.26,3.45-7.71,7.71-7.71 h19.75c4.26,0,7.71,3.45,7.71,7.71c0,4.26-3.45,7.71-7.71,7.71H7.71L7.71,126.12z M19.72,69.13c-3.67-2.11-4.94-6.8-2.83-10.48 c2.11-3.67,6.8-4.94,10.48-2.83l17.1,9.88c3.67,2.11,4.94,6.8,2.83,10.48c-2.11,3.67-6.8,4.94-10.48,2.83L19.72,69.13L19.72,69.13z"/></g>' :
'<g><path d="M49.06,1.27c2.17-0.45,4.34-0.77,6.48-0.98c2.2-0.21,4.38-0.31,6.53-0.29c1.21,0.01,2.18,1,2.17,2.21 c-0.01,0.93-0.6,1.72-1.42,2.03c-9.15,3.6-16.47,10.31-20.96,18.62c-4.42,8.17-6.1,17.88-4.09,27.68l0.01,0.07 c2.29,11.06,8.83,20.15,17.58,25.91c8.74,5.76,19.67,8.18,30.73,5.92l0.07-0.01c7.96-1.65,14.89-5.49,20.3-10.78 c5.6-5.47,9.56-12.48,11.33-20.16c0.27-1.18,1.45-1.91,2.62-1.64c0.89,0.21,1.53,0.93,1.67,1.78c2.64,16.2-1.35,32.07-10.06,44.71 c-8.67,12.58-22.03,21.97-38.18,25.29c-16.62,3.42-33.05-0.22-46.18-8.86C14.52,104.1,4.69,90.45,1.27,73.83 C-2.07,57.6,1.32,41.55,9.53,28.58C17.78,15.57,30.88,5.64,46.91,1.75c0.31-0.08,0.67-0.16,1.06-0.25l0.01,0l0,0L49.06,1.27 L49.06,1.27z"/></g>' ;
}
const darkLightIcon = document.querySelector("#darkLightIcon");
addEventListener('load', (event) => {
let dst = localStorage.getItem("dark-theme");
if (dst == 1 // explicit user request
|| (dst == null && window.matchMedia('(prefers-color-scheme: dark)').matches )) { // as per Browser setting
darkLightToggle(0);
} else {
document.body.classList.remove('dark-mode');
}
});
</script>
3. Media query. In the Brave web-browser you can force the dark mode. Go to Settings, then Appearance. Brave calls it "Night Mode" instead of dark mode.
This setting will then trigger the above media query.
Added 13-Jul-2024: I am now member of The Darktheme Club.
]]>IGYRC5108-U COBOL COMPILER TERMINATING: UNCORRECTABLE PROGRAM INTERRUPT CONDITION.
The COBOL program was not fully compiled but compilation stopped midway.
Further messages from the compile run:
PROGRAM CHECK, INTERRUPT CODE 04
PSW 078D2F00 CAA178A4
REGISTERS 0 - 15:
4A9973EE 00000084 0013421C 00000026 00081180 00000000 00069364 00079C54
00000000 00000000 00079C54 4A9C6B48 4A9972BC 4A997000 CA9C68C6 CA9C6D42
CURRENT COBOL COMPILER PHASE: IGYCPANA (STORAGE LOC: CA9C6000)
LAST MODULE RECORDING CONTROL: IGYNXML (STORAGE LOC: 4AA153D0)
INTERRUPT OCCURRED AT STORAGE LOCATION: 00A178A4
CURRENT LINE NUMBER: 010055 PP 5655-EC6 IBM ENTERPRISE COBOL FOR Z/OS 6.3.0 P210118 CZF02 DATE 05/17/2024 TIME 18:38:56 PAGE 231
Compiler in question is "Enterprise COBOL for z/OS 6.3.0".
Searching for this error message brought below entry from IBM: IGYRC5108-U COBOL Compiler Error Message for Phase IGYCPSCN. This is not pointing to the real cause.
The real problem is that you have used too much space in WORKING-STORAGE SECTION
.
I.e., your variables in there consume too much space.
When remembering Memory Limitations with IBM Enterprise COBOL Compiler this comes as no shocking surprise.
So reducing this occupied space solved the problem.
In my case I had a couple of large PIC X(256000)
clauses.
This 1MB club has 781 members as of today.
Becoming member there is by using:
git init
echo "---\npageurl: eklausmeier.goip.de\nsize: 133.1\n---\n" > eklausmeier.goip.de.md
git format-patch -1
The resulting file is then sent via e-mail to patches@btxx.org.
A renewed check of my blog on https://tools.pingdom.com shows:
Content and requests by content type:
Waterfall diagram:
]]>The original website https://www.publicomag.com is hosted on Cloudflare. It uses WordPress.
1. Comparison. For the comparison I use the website tools.pingdom.com, which provides various metrics to evaluate the performance of a website:
The first few tests in Pingdom were conducted for Europe/Frankfurt, as I host all stuff on below machine in my living room not far from Frankfurt.
The post in question is Inspiration als Energiequelle: Neues vom grünen Hauptmann von Köpenick. The version using Simplified Saaze is here. This post contains 5 images and 13 comments. All images are served directly from https://www.publicomag.com. I.e., no side has any advantage in that respect. I had already blogged on this here: Performance Remarks on PublicoMag Website.
The results are thus:
Original (WordPress) | Modified (Simplified Saaze) |
---|---|
The results for the original website, based on WordPress, are indeed worse on every dimension: page size, load time, number of requests. In comparison to the modified version using Simplified Saaze the ratio is roughly:
So Simplified Saaze is better in all dimensions by a factor. Load time is particularly striking. This is quite noteworthy as the Simplified Saaze version is entirely self-hosted, i.e., upload to the internet is limited to 50 MBit/s!
The recommendations for the original website are therefore not overly surprising:
The missing compression is clearly an oversight on the web-server part.
The breakdown of the content type for the original WordPress website is:
One can clearly see that half of the page size are images, one third is JavaScript, fonts and CSS each have roughly 8%, the actual HTML content is just 2%.
I uploaded the Simplified Saaze version to Netlify, which provides CDN functionality. I measured again the WordPress post requested from San Francisco, and the Simplified Saaze version from San Francisco. The measurements are pretty similar to the Frankfurt results.
Original (WordPress) San Francisco | Modified (Simplified Saaze) San Francisco |
---|---|
Surprisingly, the Simplified Saaze version on Cloudflare has loading time of 5.24 seconds from San Francisco. Vercel is in line with Netlify and has load times of 385 ms.
For comparison I also hosted the Simplified Saaze version on https://www.lima-city.de. Load times are 248 ms for Frankfurt. Load times are 943 ms for San Francisco.
2. Modified website. The breakdown of the modified site, based on Simplified Saaze, is as below.
Actual loading of the modified site will roughly follow below waterfall diagram. This waterfall diagram shows that a major part of the loading time is spent in loading Google's Playfair fonts. This is quite surprising. The other fonts from Google load in record time.
3. Known limitations. Alexander Wendt wrote about some general limitations with the used technical solution so far:
Trotzdem sind wir zuversichtlich, demnächst das eine oder andere technische Problem hoffentlich befriedigend zu lösen. Generell braucht Publico eine schrittweise Erneuerung seiner technischen Plattform, die in ihren Grundzügen von 2017 stammt.
4. Low powered devices. Dan Luu noted in How web bloat impacts users with slow devices that many so-called modern websites are more or less unusable on older or low-powered devices. Some quotes:
If you've never used a low-end device like this, the general experience is that many sites are unusable on the device and loading anything resource intensive (an app or a huge website) can cause crashes.
Software developers underestimate the impacts low-powered devices have, when loading websites:
]]>People seem to really underestimate the dynamic range in wealth and income across the world.
It offers below features:
<!--more-->
tag to showcase the initial content of a blog post.The theme looks like this:
This theme is modeled after the blog from Alexander Wendt. That blog is powered by WordPress and hosted on Cloudflare. I have written on this PublicoMag website: Performance Remarks on PublicoMag Website. Alexander Wendt started this blog in October 2017. The number of posts per year are given in below table. Year 2024 is not complete. As time passes the year 2024 will have more and more posts.
Year | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
---|---|---|---|---|---|---|---|---|
#posts | 50 | 237 | 191 | 190 | 179 | 177 | 168 | 43 |
#comments | 721 | 3999 | 3211 | 2973 | 2480 | 1300 | 1115 | 230 |
Number of comments were counted like this (varying 2017 to 2024):
perl -ne 'if (/^(\d+) Kommentare <\/h5>/) { $s+=$1; printf("%d\t%d\t%s\n",$1,$s,$ARGV); }' 2017*
There are two parts in the installation.
1. Install the theme including content and the Simplified Saaze static site generator using composer
:
$ composer create-project eklausme/saaze-wendt
Creating a "eklausme/saaze-wendt" project at "./saaze-wendt"
Installing eklausme/saaze-wendt (v1.0)
- Downloading eklausme/saaze-wendt (v1.0)
- Installing eklausme/saaze-wendt (v1.0): Extracting archive
Created project in /tmp/T/saaze-wendt
Loading composer repositories with package information
Updating dependencies
Lock file operations: 1 install, 0 updates, 0 removals
- Locking eklausme/saaze (v2.2)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
- Downloading eklausme/saaze (v2.2)
- Installing eklausme/saaze (v2.2): Extracting archive
Generating optimized autoload files
No security vulnerability advisories found.
real 3.08s
user 0.48s
sys 0
swapped 0
total space 0
2. The Simplified Saaze installation is described in Simplified Saaze. It documents how to check for PHP version, check for yaml-parsing, FFI, MD4C extension, etc.
Once everything is installed, just run php saaze -mor
.
We need a list or URLs available.
Below approach did not work: We use the month list in WordPress.
for i in `seq 2018 2023`; do for j in `seq -w 01 12`; do curl https://www.publicomag.com/$i/$j/ > m$i-$j.html; done; done
Special cases for 2017 and 2024:
curl https://www.publicomag.com/2017/10/ -o m2017-10.html
curl https://www.publicomag.com/2017/11/ -o m2017-11.html
curl https://www.publicomag.com/2017/12/ -o m2017-12.html
...
curl https://www.publicomag.com/2024/03/ -o m2024-03.html
It turned out that the month-lists lack links. To be exact: It lacks more than 466 URLs.
This approach fetches all links:
$ curl https://www.publicomag.com/ -o wendt-p1.html
$ time ( for i in `seq 2 124`; do
curl https://www.publicomag.com/page/$i/ -o wendt-p${i}.html;
done )
This creates 124 files:
$ ls -alFt | head
total 25580
drwxr-xr-x 2 klm klm 4096 Apr 2 11:34 ./
drwxr-xr-x 4 klm klm 4096 Apr 2 11:33 ../
-rw-r--r-- 1 klm klm 208194 Apr 2 11:28 wendt-p1.html
-rw-r--r-- 1 klm klm 187908 Apr 2 11:27 wendt-p124.html
-rw-r--r-- 1 klm klm 203575 Apr 2 11:27 wendt-p123.html
-rw-r--r-- 1 klm klm 206497 Apr 2 11:27 wendt-p122.html
-rw-r--r-- 1 klm klm 207572 Apr 2 11:27 wendt-p121.html
-rw-r--r-- 1 klm klm 207970 Apr 2 11:27 wendt-p120.html
-rw-r--r-- 1 klm klm 206010 Apr 2 11:27 wendt-p119.html
...
List of URLs:
perl -ne 'print $1."\n" if /<h2 class="post-title"><a href="([^"]+)"/' wendt-p*.html > allURL
Downloading all posts uses below Perl script blogwendtcurl
:
#!/bin/perl -W
# Download content from www.publicomag.com (Alexander Wendt) given a list of URLs
# Elmar Klausmeier, 05-Mar-2024
use strict;
my $fn;
my @F;
while (<>) {
chomp;
@F = split('/');
$F[5] =~ s/a%cc%88/ä/;
$fn = $F[3] . '-' . $F[4] . '-' . $F[5] . '.html';
printf $fn . "\n";
`curl $_ -o $fn`;
}
This creates a list of HTML files:
$ ls -alFt | head
total 175856
drwxr-xr-x 3 klm klm 4096 Mar 7 19:16 ../
drwxr-xr-x 2 klm klm 69632 Mar 5 19:53 ./
-rw-r--r-- 1 klm klm 203580 Mar 5 19:53 2024-03-18471.html
-rw-r--r-- 1 klm klm 252784 Mar 5 19:53 2024-03-wenn-die-zukunft-ans-fenster-des-gruenen-hauses-klopft.html
-rw-r--r-- 1 klm klm 203765 Mar 5 19:53 2024-03-zeller-der-woche-niedere-gruende.html
-rw-r--r-- 1 klm klm 203337 Mar 5 19:53 2024-02-zeller-der-woche-widerstaendler.html
-rw-r--r-- 1 klm klm 231904 Mar 5 19:52 2024-02-das-nie-wieder-deutschland-und-seine-millionen-fuer-judenhasser.html
...
1. Fonts.
2. Categories. Categories over all posts are as follows:
$ perl -ne 'print $1."\n" if / hentry category-([-\w]+)/' *.html | sort | uniq -c | sort -rn
595 spreu-weizen
486 politik-gesellschaft
122 medien-kritik
28 fake-news
3 hausbesuch
1 film
Different, i.e., multiple, categories can be attributed to a single post. However, the majority of posts only has a single category attached.
In the above list there is no categoriy "alte-weise". I added this category.
We want to convert images in "Alte-Weise" to text. That way loading those pages should be way quicker.
Therefore we need to download those images and convert them with tesseract
.
3. URLs. Below Perl one-liners produces a list of URLs for the images.
perl -ne 'print "$1$2\n" if (/^<meta property="og:image"\s+content="(https:\/\/www\.publicomag\.com\/wp-content\/uploads\/\d+\/\d+\/)(Alte-Weis[^"]+|AlteWeise[^"]+|AlteuWeise[^"]+|auw-[^" ]+|aub_[^"]+|auw_[^"]+|AuW_[^"]+|AW_[^"]+|OW[^"]+)"/)' *.html | sort > ../allAlte-WeiseURL
Downloading these images:
perl -ane 'chomp; @F=split(/\//); `curl $_ -o $F[7]`' ../allAlte-WeiseURL
curl https://www.publicomag.com/wp-content/uploads/2023/01/Alte-Weise_C.Wright-Mills-1011x715.jpg -o Alte-Weise_Wright_Mills-scaled.jpg
4. JavaScript. A huge number of JavaScript libraries are loaded. We will get rid of them all.
An easy target is the logo: this was replaced with plain text. This saves one roundtrip to the web-server.
1. For the category "alte-weise" the entire image with text is converted to two elements:
The image is scanned with tesseract
.
That way the text can be searched via Pagefind. Also, the required bandwidth is reduced.
Old:
New:
The new approach is to use a blockquote, where the CSS puts an image on top:
blockquote blockquote {
background: transparent no-repeat top/30% url('/img/Alte-Weise-Kopf.svg');
text-align:center;
padding-left:2rem;
padding-right:2rem;
padding-top:12rem;
padding-bottom:1rem;
background-color:#b6c7c8; border-radius:2.5rem
}
The actual text in Markdown is then:
>> „Zweifel ist nicht das Gegenteil, sondern ein Element des Glaubens.“
>>
>> Paul Tillich
That way the ordinary blockquote in Markdown (single >
) is left free to be used for citations.
Obviously, entering the text in >>
is way easier than producing an image for each epigram.
2. Care was taken to reduce the number of images needed for the social media icons.
Old:
New:
That reduces loading eight images. However, you need to load some font glyphs.
<a style="background-color:SkyBlue; color:white" href="https://telegram.me/share/url?url=<?=$urlEncoded?>&text=<?=$titleEncoded?>"
title="Teilen auf Telegram" target=_blank> <span class=symbols>🮰</span> Telegram </a>
In particular this symbol U+1fbb0 is %F0%9F%AE%B0
when URL encoded:
@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+Symbols+2&text=%F0%9F%97%8F%F0%9F%AE%B0%F0%9F%96%82%F0%9F%96%A8');
Similarly, symbol U+1f5cf is %F0%9F%97%8F
when URL encoded.
Perl script blogwendtmd
is used to convert a single HTML file to Markdown.
$ time ( for i in *.html; do blogwendtmd $i; done )
real 94.95s
user 136.51s
sys 0
swapped 0
total space 0
The long runtime is exclusively for running tesseract
, i.e., the conversion from image to text.
Once all WordPress posts are converted to Markdown, this script no longer needs to be run, obviously.
blogwendtmd
is 180 lines of Perl code.
Listing of all authors and their corresponding directories.
$ perl -ne 'print $1."\n" if /\/author\/([^\/]+)\//' 2*.html | sort -u
alexander
archi-bechlenberg
bernd-zeller
cora-stephan
david-berger
hansjoerg-mueller
joerg-friedrich
matthias-matussek
redaktion
samuel-horn
wolfram-ackner
Each of these authors have a separate index beneath /author/
.
Generating all yearly overviews:
for i in *; do ( echo $i; cd $i; blogwendtdate -gy$i *.md > index.md ) done
Perl script blogwendtdate
generates a Markdown file, which contains all articles for the corresponding year.
This script first has to store all posts for one year in a hash, sort it according to date in the frontmatter.
my @L; # list of posts in a year, in the beginning not necessarily sorted
sub markdownfile(@) {
my $f = $_[0];
my ($flag,$title,$date,$draft) = (0,"","",0);
open(F,"<$f") || die("Cannot open $f");
while (<F>) {
if (/^\-\-\-\s*$/) {
last if (++$flag >= 2);
. . .
}
if ($draft == 0 && length($title) > 0 && length($date) > 0) {
push(@L, sprintf("%s: [%s](%s%s)",$date,$title,$prefix,substr($f,0,-3)) );
}
close(F) || die("Cannot close $f");
}
while (<@ARGV>) {
#printf("ARGV=|%s|\n",$_);
next if (substr($_,-8) eq "index.md");
markdownfile($_);
}
for (sort @L) {
printf("%d. %s\n",++$cnt,$_);
}
Many HTML errors were corrected, which were reported by Nu Html Checker. See for example das-magische-sprechen-schafft-macht-fuer-den-augenblick.
The Publico blog contains comments, where readers have left their thoughts.
In Perl script blogwendtmd
we detect comments by checking for <h5>
tags for the beginning, and pinglist
for the end of all comments.
if (/^<ul class="pinglist">/) { $flag = 0; next; }
elsif (/<h5 class="comments-h">/) {
...
$flag = 1;
}
next if ($flag == 0);
We refrained from integrating the commenting system HashOver. It is not difficult, as we have already demonstrated in the Lemire theme. However, for a political blog a comment system is rather "dangerous", as it can attract rather unwelcoming writings. Under German law the hoster of these comments becomes liable. Essentially, you therefore must check every comment manually:
... da die Kommentare alle gesichtet werden müssen und die Redaktion nach wie vor aus dem Gründer Alexander Wendt und einer Teilzeitredakteurin besteht, können sie nicht umgehend online gehen.
In light of the high volume of comments HashOver should most probably be added.
In serial mode it takes less than 3 seconds to build 19 collections without comments.
With comments it takes less than 6 seconds to process 23 thousand pages, see below.
This build time can be almost halved by using parallelisation with -p16
.
$ time php saaze -morb /tmp/build
Building static site in /tmp/build...
execute(): filePath=./content/alexander.yml, nSIentries=770, totalPages=39, entries_per_page=20
execute(): filePath=./content/alte-weise.yml, nSIentries=131, totalPages=7, entries_per_page=20
execute(): filePath=./content/archi-bechlenberg.yml, nSIentries=5, totalPages=1, entries_per_page=20
execute(): filePath=./content/bernd-zeller.yml, nSIentries=332, totalPages=17, entries_per_page=20
execute(): filePath=./content/cora-stephan.yml, nSIentries=1, totalPages=1, entries_per_page=20
execute(): filePath=./content/david-berger.yml, nSIentries=1, totalPages=1, entries_per_page=20
execute(): filePath=./content/fake-news.yml, nSIentries=28, totalPages=2, entries_per_page=20
execute(): filePath=./content/film.yml, nSIentries=1, totalPages=1, entries_per_page=20
execute(): filePath=./content/hansjoerg-mueller.yml, nSIentries=2, totalPages=1, entries_per_page=20
execute(): filePath=./content/hausbesuch.yml, nSIentries=2, totalPages=1, entries_per_page=20
execute(): filePath=./content/joerg-friedrich.yml, nSIentries=2, totalPages=1, entries_per_page=20
execute(): filePath=./content/mag.yml, nSIentries=1235, totalPages=62, entries_per_page=20
execute(): filePath=./content/matthias-matussek.yml, nSIentries=1, totalPages=1, entries_per_page=20
execute(): filePath=./content/medien-kritik.yml, nSIentries=123, totalPages=7, entries_per_page=20
execute(): filePath=./content/politik-gesellschaft.yml, nSIentries=486, totalPages=25, entries_per_page=20
execute(): filePath=./content/redaktion.yml, nSIentries=112, totalPages=6, entries_per_page=20
execute(): filePath=./content/samuel-horn.yml, nSIentries=3, totalPages=1, entries_per_page=20
execute(): filePath=./content/spreu-weizen.yml, nSIentries=596, totalPages=30, entries_per_page=20
execute(): filePath=./content/wolfram-ackner.yml, nSIentries=6, totalPages=1, entries_per_page=20
Finished creating 19 collections, 19 with index, and 1248 entries (2.58 secs / 809.47MB)
#collections=19, parseEntry=0.7290/23712-19, md2html=1.1983, toHtml=1.2839/23712, renderEntry=0.1562/1248, renderCollection=0.0403/224, content=23712/0
real 5.16s
user 4.36s
sys 0
swapped 0
total space 0
Running pagefind, i.e., indexing al keywords for the WebAssembly based search functionality:
$ time pagefind -s . --exclude-selectors aside --exclude-selectors footer --force-language=de
Running Pagefind v1.0.4
Running from: "/tmp/buildwendt"
Source: ""
Output: "pagefind"
[Walking source directory]
Found 1473 files matching **/*.{html}
[Parsing files]
Did not find a data-pagefind-body element on the site.
↳ Indexing all <body> elements on the site.
[Reading languages]
Discovered 1 language: de
[Building search indexes]
Total:
Indexed 1 language
Indexed 1473 pages
Indexed 133261 words
Indexed 0 filters
Indexed 0 sorts
Finished in 19.644 seconds
real 19.87s
user 18.28s
sys 0
swapped 0
total space 0
It would take 11 seconds without comments, i.e., indexing 77,168 words.
There are quite a number of collections at play in this theme.
The most important one being mag
(short for magazine).
This directory contains all the blog posts.
All the other collections are just symbolic links to mag
, i.e., they do not contain additional content.
total 96
drwxr-xr-x 4 klm klm 4096 Apr 27 17:11 ./
drwxr-xr-x 7 klm klm 4096 May 13 13:00 ../
lrwxrwxrwx 1 klm klm 3 Mar 26 21:48 alexander -> mag/
-rw-r--r-- 1 klm klm 273 Apr 2 18:56 alexander.yml
lrwxrwxrwx 1 klm klm 3 Apr 27 17:11 alte-weise -> mag/
-rw-r--r-- 1 klm klm 225 Apr 27 17:10 alte-weise.yml
lrwxrwxrwx 1 klm klm 3 Mar 31 17:22 archi-bechlenberg -> mag/
-rw-r--r-- 1 klm klm 495 Apr 2 18:58 archi-bechlenberg.yml
lrwxrwxrwx 1 klm klm 3 Mar 31 17:17 bernd-zeller -> mag/
-rw-r--r-- 1 klm klm 213 Apr 2 18:01 bernd-zeller.yml
lrwxrwxrwx 1 klm klm 3 Apr 2 15:18 cora-stephan -> mag/
-rw-r--r-- 1 klm klm 707 Apr 2 19:01 cora-stephan.yml
lrwxrwxrwx 1 klm klm 3 Apr 2 15:17 david-berger -> mag/
-rw-r--r-- 1 klm klm 761 Apr 2 19:06 david-berger.yml
drwxr-xr-x 2 klm klm 4096 Apr 2 16:24 error/
-rw-r--r-- 1 klm klm 88 Apr 2 16:21 error.not_used_yml
lrwxrwxrwx 1 klm klm 3 Apr 2 19:25 fake-news -> mag/
-rw-r--r-- 1 klm klm 216 Apr 2 19:42 fake-news.yml
lrwxrwxrwx 1 klm klm 3 Apr 2 19:25 film -> mag/
-rw-r--r-- 1 klm klm 201 Apr 2 19:43 film.yml
lrwxrwxrwx 1 klm klm 3 Mar 31 17:22 hansjoerg-mueller -> mag/
-rw-r--r-- 1 klm klm 318 Apr 2 18:56 hansjoerg-mueller.yml
lrwxrwxrwx 1 klm klm 3 Apr 2 19:25 hausbesuch -> mag/
-rw-r--r-- 1 klm klm 219 Apr 2 19:42 hausbesuch.yml
lrwxrwxrwx 1 klm klm 3 Apr 2 15:18 joerg-friedrich -> mag/
-rw-r--r-- 1 klm klm 222 Apr 2 18:01 joerg-friedrich.yml
drwxr-xr-x 10 klm klm 4096 May 12 20:56 mag/
-rw-r--r-- 1 klm klm 110 Apr 1 22:25 mag.yml
lrwxrwxrwx 1 klm klm 3 Mar 31 17:22 matthias-matussek -> mag/
-rw-r--r-- 1 klm klm 228 Apr 2 18:02 matthias-matussek.yml
lrwxrwxrwx 1 klm klm 3 Apr 2 19:25 medien-kritik -> mag/
-rw-r--r-- 1 klm klm 234 Apr 2 19:27 medien-kritik.yml
lrwxrwxrwx 1 klm klm 3 Apr 2 17:47 politik-gesellschaft -> mag/
-rw-r--r-- 1 klm klm 255 Apr 2 17:59 politik-gesellschaft.yml
lrwxrwxrwx 1 klm klm 3 Mar 31 17:16 redaktion -> mag/
-rw-r--r-- 1 klm klm 202 Apr 2 18:03 redaktion.yml
lrwxrwxrwx 1 klm klm 3 Mar 31 17:21 samuel-horn -> mag/
-rw-r--r-- 1 klm klm 259 Apr 2 19:03 samuel-horn.yml
lrwxrwxrwx 1 klm klm 3 Apr 2 19:25 spreu-weizen -> mag/
-rw-r--r-- 1 klm klm 231 Apr 2 19:27 spreu-weizen.yml
lrwxrwxrwx 1 klm klm 3 Mar 31 17:22 wolfram-ackner -> mag/
-rw-r--r-- 1 klm klm 542 Apr 2 19:05 wolfram-ackner.yml
The collection yaml files look like this. First mag.yml
:
title: Publico
sort_field: date
sort_direction: desc
index_route: /
entry_route: /{slug}
more: true
rss: true
Now alexander.yml
, which filters for author
:
title: Publico - Autor Alexander Wendt
subtitle: "Alexander Wendt ist Herausgeber von Publico."
sort_field: date
sort_direction: desc
index_route: /author/alexander
entry: false
entry_route: /{slug}
more: true
filter: return ($entry->data['author'] === 'Alexander Wendt');
Similarly, alte-weise.yml
, which filters for categories
:
title: Publico - Alte & Weise
sort_field: date
sort_direction: desc
index_route: /alte-weise
entry: false
entry_route: /{slug}
more: true
filter: return (array_search('alte-weise',$entry->data['categories']) !== false);
Except mag.yml
, all other yaml files set rss: false
.
This theme uses the following PHP template files:
bottom-layout.php
: commonalities for the bottom partentry.php
: template for the entry, i.e., the usual blog posterror.php
: 404 page, or other error conditionshead.php
: HTML for the first few lines for all HTML filesindex.php
: template for the index, i.e., the listing of postsoverview.php
: HTML sitemaprss.php
: RSS feedsitemap.php
: XML sitemaptop-layout.php
: commonalities for the top partI use the following hierarchy of PHP files for my entry
-template, i.e., the template for a blog post:
The following hierarchy is used for the index
-template, i.e., the template for showing a reverse-date sorted list of blog posts:
In C this is just gmtime()
.
gmtime
accepts time_t
and produces struct tm
:
struct tm *gmtime(const time_t *timep);
On mainframe, however, it is sometimes a little inconvienent to call a C routine from COBOL. It is easier to just code the short algorithm in COBOL.
2. Approach. P.J. Plauger's book "The Standard C Library" contains the source code for gmtime()
and localtime()
.
This code is then translated to COBOL.
The C code is as below.
/* Convert UNIX timestamp to triple (year,month,day)
Elmar Klausmeier, 01-Apr-2024
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <limits.h>
// From P.J.Plauger: The Standard C Library, Prentice Hall, 1992
static const int daytab[2][12] = {
{ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 }, // leap year
{ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }
};
int daysTo (int year, int mon) { // compute extra days to start of month
int days;
if (year > 0) days = (year - 1) / 4; // correct for leap year: 1801-2099
else if (year <= -4) days = 1 + (4 - year) / 4;
else days = 0;
return days + daytab[year&03 || (year==0)][mon];
}
struct tm *timeTotm (struct tm *t, time_t secsarg, int isdst) { // convert scalar time to time struct
int year, mon;
const int *pm;
long i, days;
time_t secs;
static struct tm ts;
secsarg += ((70 * 365LU) + 17) * 86400; // 70 years including 17 leap days since 1900
if (t == NULL) t = &ts;
t->tm_isdst = isdst;
for (secs=secsarg; ; secs=secsarg+3600) { // loop to correct for DST (not used here)
days = secs / 86400;
t->tm_wday = (days + 1) % 7;
for (year = days / 365; days < (i=daysTo(year,0)+365L*year); --year)
; // correct guess and recheck
days -= i;
t->tm_year = year;
t->tm_yday = days;
pm = daytab[year&03 || (year==0)];
for (mon=12; days<pm[--mon]; )
;
t->tm_mon = mon;
t->tm_mday = days - pm[mon] + 1;
secs %= 86400;
t->tm_hour = secs / 3600;
secs %= 3600;
t->tm_min = secs / 60;
t->tm_sec = secs % 60;
//if (t->tm_isdst >= 0 || (t->tm_isdst = IsDST(t)) <= 0) return t;
return t;
}
}
int main (int argc, char *argv[]) {
struct tm t;
long secs;
if (argc <= 1) return 0;
secs = atol(argv[1]);
timeTotm(&t, secs, 0);
printf("timeTotm(): year=%d, mon=%d, day=%d, hr=%d, min=%d, sec=%d\n",
1900+t.tm_year, 1+t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);
return 0;
}
3. COBOL solution. Below is the COBOL code which was translated from above C code.
Fun fact: GNU Cobol crashed on some intermediate result, see cobc crashes on illegal COBOL source code file. This bug was fixed within a few hours by Simon Sobisch!
Below source code is compiled without problems.
000010 IDENTIFICATION DIVISION.
000020 PROGRAM-ID. Timestamp2date.
000030 AUTHOR. Elmar Klausmeier.
000040 DATE-WRITTEN. 02-May-2024.
000050
000060 DATA DIVISION.
000070 WORKING-STORAGE SECTION.
000080*
000090 01 year PIC S9(18) comp-5.
000100 01 mon PIC S9(18) comp-5.
000110 01 days PIC S9(18) comp-5.
000120*
000130* Local helper variables
000140 01 i PIC S9(18) comp-5.
000150 01 idays PIC S9(18) comp-5.
000160 01 daysTo PIC S9(18) comp-5.
000170 01 yearMod4 PIC S9(9) comp-5.
000180 01 leapIx PIC S9(9) comp-5.
000190 01 daysP1 PIC S9(18) comp-5.
000200*
000210 01 secs PIC S9(18) comp-5.
000220 01 secsarg PIC S9(18) comp-5.
000230*
000240*
000250* struct tm:
000260* int tm_sec; // Seconds [0, 60]
000270* int tm_min; // Minutes [0, 59]
000280* int tm_hour; // Hour [0, 23]
000290* int tm_mday; // Day of the month [1, 31]
000300* int tm_mon; // Month [0, 11] (January = 0)
000310* int tm_year; // Year minus 1900
000320* int tm_wday; // Day of the week [0, 6] (Sunday = 0)
000330* int tm_yday; // Day of the year [0, 365] (Jan/01 = 0)
000340* int tm_isdst; // Daylight savings flag
000350 01 tm_sec PIC S9(9).
000360 01 tm_min PIC S9(9).
000370 01 tm_hour PIC S9(9).
000380 01 tm_mday PIC S9(9).
000390* range: 1-12
000400 01 tm_mon PIC S9(9).
000410 01 tm_year PIC S9(9).
000420 01 tm_wday PIC S9(9).
000430 01 tm_yday PIC S9(9).
000440*
000450*
000460 01 daytabInit.
000470* Number of days for leap year
000480 05 daytab-1-1 pic s9(9) comp-5 value 0.
000490 05 daytab-1-2 pic s9(9) comp-5 value 31.
000500 05 daytab-1-3 pic s9(9) comp-5 value 60.
000510 05 daytab-1-4 pic s9(9) comp-5 value 91.
000520 05 daytab-1-5 pic s9(9) comp-5 value 121.
000530 05 daytab-1-6 pic s9(9) comp-5 value 152.
000540 05 daytab-1-7 pic s9(9) comp-5 value 182.
000550 05 daytab-1-8 pic s9(9) comp-5 value 213.
000560 05 daytab-1-9 pic s9(9) comp-5 value 244.
000570 05 daytab-1-10 pic s9(9) comp-5 value 274.
000580 05 daytab-1-11 pic s9(9) comp-5 value 305.
000590 05 daytab-1-12 pic s9(9) comp-5 value 335.
000600* Number of days for non-leap year
000610 05 daytab-2-1 pic s9(9) comp-5 value 0.
000620 05 daytab-2-2 pic s9(9) comp-5 value 31.
000630 05 daytab-2-3 pic s9(9) comp-5 value 59.
000640 05 daytab-2-4 pic s9(9) comp-5 value 90.
000650 05 daytab-2-5 pic s9(9) comp-5 value 120.
000660 05 daytab-2-6 pic s9(9) comp-5 value 151.
000670 05 daytab-2-7 pic s9(9) comp-5 value 181.
000680 05 daytab-2-8 pic s9(9) comp-5 value 212.
000690 05 daytab-2-9 pic s9(9) comp-5 value 243.
000700 05 daytab-2-10 pic s9(9) comp-5 value 273.
000710 05 daytab-2-11 pic s9(9) comp-5 value 304.
000720 05 daytab-2-12 pic s9(9) comp-5 value 334.
000730 01 daytabArr redefines daytabInit.
000740 05 filler occurs 2 times.
000750 10 filler occurs 12 times.
000760 15 daytab pic s9(9) comp-5.
000770*
000780*
000790
000800 PROCEDURE DIVISION.
000810******************************************************************
000820* A100-main
000830******************************************************************
000840* Function:
000850*
000860******************************************************************
000870 A100-main SECTION.
000880 A100-main-P.
000890
000900* initialize daytabArr.
000910* move daytabInit to daytabArr
000920* perform varying leapIx from 1 by 1 until leapIx > 2
000930* perform varying mon from 1 by 1 until mon > 12
000940* display 'daytab(' leapIx ',' mon ') = '
000950* daytab(leapIx, mon)
000960* end-perform
000970* end-perform.
000980
000990 ACCEPT secsarg FROM ARGUMENT-VALUE
001000 perform v910-timeToTm
001010 display ' tm_sec = ' tm_sec
001020 display ' tm_min = ' tm_min
001030 display ' tm_hour = ' tm_hour
001040 display ' tm_mday = ' tm_mday
001050 display ' tm_mon = ' tm_mon
001060 display ' tm_year = ' tm_year
001070 display ' tm_wday = ' tm_wday
001080 display ' tm_yday = ' tm_yday
001090
001100 STOP RUN.
001110
001120
001130* Convert UNIX timestamp to triple (year,month,day)
001140* Converted from C program
001150* From P.J.Plauger: The Standard C Library, Prentice Hall, 1992
001160
001170******************************************************************
001180* V900-daysTo
001190******************************************************************
001200* Function: compute daysTo given year and mon
001210* compute extra days to start of month
001220******************************************************************
001230 V900-daysTo SECTION.
001240 V900-daysTo-P.
001250
001260* correct for leap year: 1801-2099
001270 evaluate true
001280 when year > 0
001290 compute idays = (year - 1) / 4
001300 when year <= -4
001310 compute idays = 1 + (4 - year) / 4
001320 when other
001330 move zero to idays
001340 end-evaluate
001350
001360 compute yearMod4 = function mod(year,4)
001370 if yearMod4 not= zero or year = zero then
001380 move 2 to leapIx
001390 else
001400 move 1 to leapIx
001410 end-if
001420 compute daysTo = idays + daytab(leapIx, mon)
001430
001440 CONTINUE.
001450 END-V900-daysTo.
001460 EXIT.
001470
001480
001490******************************************************************
001500* V910-timeToTm
001510******************************************************************
001520* Function: compute tmT from secsarg (seconds since 01-Jan-1970)
001530* convert scalar time to time struct
001540******************************************************************
001550 V910-timeToTm SECTION.
001560 V910-timeToTm-P.
001570
001580* 70 years including 17 leap days since 1900
001590 compute secsarg = secsarg + ((70 * 365) + 17) * 86400;
001600 move secsarg to secs
001610
001620 compute days = secs / 86400
001630 add 1 to days giving daysP1
001640 compute tm_wday = function mod(daysP1, 7)
001650
001660 compute year = days / 365
001670 move 1 to mon
001680 perform until 1 = 0
001690 perform v900-daysTo
001700 compute i = daysTo + 365 * year
001710 if days >= i then
001720* exit perform
001730 go to v910-endloop
001740 end-if
001750* correct guess and recheck
001760 subtract 1 from year
001770 end-perform.
001780 v910-endloop.
001790
001800 subtract i from days
001810 move year to tm_year
001820 move days to tm_yday
001830
001840 compute yearMod4 = function mod(year,4)
001850 if yearMod4 not= zero or year = zero then
001860 move 2 to leapIx
001870 else
001880 move 1 to leapIx
001890 end-if
001900 move 12 to mon
001910 perform until days >= daytab(leapIx, mon)
001920 subtract 1 from mon
001930 end-perform
001940 move mon to tm_mon
001950 compute tm_mday = days - daytab(leapIx, mon) + 1
001960
001970 compute secs = function mod(secs,86400)
001980 compute tm_hour = secs / 3600;
001990 compute secs = function mod(secs,3600)
002000 compute tm_min = secs / 60;
002010 compute tm_sec = function mod(secs, 60)
002020
002030 CONTINUE.
002040 END-V910-timeToTm.
002050 EXIT.
002060
002070
4. Example output. Here are two examples. First example is Fri May 03 2024 14:16:01 GMT+0000. See https://www.unixtimestamp.com.
$ ./cobts2date 1714745761
tm_sec = +000000001
tm_min = +000000016
tm_hour = +000000014
tm_mday = +000000003
tm_mon = +000000005
tm_year = +000000124
tm_wday = +000000005
tm_yday = +000000123
Second example is Thu Dec 31 1964 22:59:59 GMT+0000.
$ ./cobts2date -157770001
tm_sec = +000000059
tm_min = +000000059
tm_hour = +000000022
tm_mday = +000000031
tm_mon = +000000012
tm_year = +000000064
tm_wday = +000000004
tm_yday = +000000365
For a list of leap years see Schaltjahr.
]]>In benchmarks it ranks at the top constantly. See Web Framework Benchmarks.
It works way faster than NGINX or Apache. It shines for static web content.
2. Building. The already existing AUR packages for H2O do not work. I.e., they generate a binary which crashes.
Below PKGBUILD
produces a H2O binary.
pkgname=h2o-master-git
pkgver=1.0
pkgrel=1
arch=('i686' 'x86_64')
pkgdesc="H2O: the optimized HTTP/1.x, HTTP/2, HTTP/3 server"
provides=(h2o)
url="https://h2o.examp1e.net"
source=("git+https://github.com/h2o/h2o.git?commit=master?signed/" h2o.service)
sha256sums=('SKIP' 734e9d045dd5568665762d48e4077208c3da8c68f87510aaa9559d495dd680fd)
build() {
cd "$srcdir"/h2o
cmake -DCMAKE_INSTALL_PREFIX=/usr .
make
}
package() {
cd "$srcdir"/h2o
install -Dm 644 LICENSE "$pkgdir"/usr/share/licenses/$pkgname/LICENSE
install -Dm 644 README.md "$pkgdir"/usr/share/doc/h2o/README.md
install -Dm 644 "$srcdir"/h2o.service "$pkgdir"/usr/lib/systemd/system/h2o.service
install -Dm 644 examples/h2o/h2o.conf "$pkgdir/etc/h2o.conf"
make DESTDIR="$pkgdir" install
}
Compiling on AMD Ryzen 7 5700G, max clock 4.673 GHz, 64 GB RAM, finishes in less than two minutes.
$ time makepkg -f
...
==> Tidying install...
-> Removing libtool files...
-> Purging unwanted files...
-> Removing static library files...
-> Copying source files needed for debug symbols...
-> Compressing man and info pages...
==> Checking for packaging issues...
==> Creating package "h2o-master-git"...
-> Generating .PKGINFO file...
-> Generating .BUILDINFO file...
-> Generating .MTREE file...
-> Compressing package...
==> Leaving fakeroot environment.
==> Finished making: h2o-master-git 1.0-1 (Fri 12 Apr 2024 09:48:36 PM CEST)
real 92.42s
user 447.76s
sys 0
swapped 0
total space 0
3. Configuration. Below is a working configuration in file /etc/h2o.conf
.
The configuration accomplishes the following:
The entire configuration file is a YAML file.
listen: 80
listen: &ssl_listen
port: 443
ssl:
certificate-file: /etc/letsencrypt/live/eklausmeier.goip.de/fullchain.pem
key-file: /etc/letsencrypt/live/eklausmeier.goip.de/privkey.pem
minimum-version: TLSv1.2
cipher-preference: server
cipher-suite: "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256"
# Oldest compatible clients: Firefox 27, Chrome 30, IE 11 on Windows 7, Edge, Opera 17, Safari 9, Android 5.0, and Java 8
# see: https://wiki.mozilla.org/Security/Server_Side_TLS
# The following three lines enable HTTP/3
listen:
<<: *ssl_listen
type: quic
header.set: "Alt-Svc: h3-25=\":443\""
user: http
#pid-file: /var/run/h2o/h2o.pid
#crash-handler: /usr/local/bin/h2obacktrace
access-log:
path: /var/log/h2o/access.log
format: "%h|%{%Y/%m/%d:%T %z}t|%s|%b|%r|%{referer}i|%{user-agent}i|%V:%p|"
error-log: /var/log/h2o/error.log
compress: [ br, gzip ]
#file.dirlisting: ON
file.custom-handler:
extension: .php
fastcgi.connect:
port: /run/php-fpm/php-fpm.sock
type: unix
hosts:
0:
paths:
/jpilot/favicon.ico:
file.file: /home/klm/php/saaze-jpilot/public/favicon.ico
/jpilot/img:
file.dir: /home/klm/php/saaze-jpilot/public/img
/jpilot/jpilot.css:
file.file: /home/klm/php/saaze-jpilot/public/jpilot.css
/koehntopp/assets:
file.dir: /home/klm/php/saaze-koehntopp/public/assets
/koehntopp/jscss:
file.dir: /home/klm/php/saaze-koehntopp/public/jscss
/lemire/jscss:
file.dir: /home/klm/php/saaze-lemire/public/jscss
/mobility/img:
file.dir: /home/klm/php/saaze-mobility/public/img
/nukeklaus/img:
file.dir: /home/klm/php/saaze-nukeklaus/public/img
/nukeklaus/jscss:
file.dir: /home/klm/php/saaze-nukeklaus/public/jscss
/panorama/img:
file.dir: /home/klm/php/saaze-panorama/public/img
/paternoster/paternoster.css:
file.file: /home/klm/php/saaze-paternoster/public/paternoster.css
/saaze-example/blogklm.css:
file.file: /home/klm/php/saaze-example/public/blogklm.css
/vonhoff/img:
file.dir: /home/klm/php/saaze-vonhoff/public/img
/wendt/pagefind:
file.dir: /home/klm/php/saaze-wendt/public/pagefind
/:
file.dir: /srv/http
redirect:
status: 301
internal: YES
url: /index.php?
/p:
mruby.handler: |
Proc.new do |env|
[200, {'content-type' => 'text/plain'}, ["Hello world"]]
end
As already mentioned at the top: mruby doesn't work.
Once you access /p
the entire web-server crashes.
H2O does not offer URL rewriting out of the box.
The above path-configurations operate on a prefix match schema.
I.e., if the URL in question starts with the string provided, this is considered a match.
The string after the match is appended to the part in file.dir
.
4. Discussion. While alternatives to Apache and NGINX are highly welcome, the current state of H2O leaves many questions unanswered.
I tried to replace the old mruby dependency with the current 3.3 version. The build of H2O then failed.
While embodying software packages directly into the H2O GitHub repo makes building the software easier, it risks that the included software rots. That's exactly what is happening here.
Fun fact: I noticed H2O when reading about the LWAN web-server written by L. Pereira. Both, Kazuho Oku and L. Pereira, work at Fastly.
Also see H2O Tutorial.
In case someone wants to analyze why mruby crashes, here is the result of where
in gdb:
Core was generated by `h2o -c h2o.conf'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x000062085dc9ae9b in mrb_str_hash (mrb=<optimized out>, str=...) at /usr/src/debug/h2o-master-git/h2o/deps/mruby/src/string.c:1673
1673 hval ^= (uint32_t)*bp++;
[Current thread is 1 (Thread 0x7002156006c0 (LWP 18088))]
(gdb) where
#0 0x000062085dc9ae9b in mrb_str_hash (mrb=<optimized out>, str=...) at /usr/src/debug/h2o-master-git/h2o/deps/mruby/src/string.c:1673
#1 0x000062085dc8cb6c in obj_hash_code (h=0x7001d0028660, key=..., mrb=0x1a0) at /usr/src/debug/h2o-master-git/h2o/deps/mruby/src/hash.c:325
#2 ib_it_init (mrb=mrb@entry=0x7001d00015a0, it=it@entry=0x7002155fe550, h=h@entry=0x7001d0028660, key=...) at /usr/src/debug/h2o-master-git/h2o/deps/mruby/src/hash.c:645
#3 0x000062085dc8cd3a in ib_init (ib_byte_size=<optimized out>, ib_bit=<optimized out>, h=0x7001d0028660, mrb=<optimized out>) at /usr/src/debug/h2o-master-git/h2o/deps/mruby/src/hash.c:151
#4 ht_init (mrb=mrb@entry=0x7001d00015a0, h=h@entry=0x7001d0028660, size=size@entry=17, ea=0x7001d0047700, ea_capa=ea_capa@entry=25, ht=ht@entry=0x0, ib_bit=<optimized out>) at /usr/src/debug/h2o-master-git/h2o/deps/mruby/src/hash.c:793
#5 0x000062085dc8d11a in ar_set (mrb=0x7001d00015a0, h=0x7001d0028660, key=..., val=...) at /usr/src/debug/h2o-master-git/h2o/deps/mruby/src/hash.c:536
#6 0x000062085dc8c2e6 in h_set (val=..., key=..., h=0x7001d0028660, mrb=0x7001d00015a0) at /usr/src/debug/h2o-master-git/h2o/deps/mruby/src/hash.c:169
#7 mrb_hash_set (mrb=0x7001d00015a0, hash=..., key=..., val=...) at /usr/src/debug/h2o-master-git/h2o/deps/mruby/src/hash.c:1245
#8 0x000062085dc67938 in iterate_headers_callback (shared_ctx=shared_ctx@entry=0x7001d0001540, pool=pool@entry=0x7001d0076958, header=header@entry=0x7002155fe8d0, cb_data=cb_data@entry=0x7001d0028660) at /usr/src/debug/h2o-master-git/h2o/lib/handler/mruby.c:748
#9 0x000062085dc67e4c in h2o_mruby_iterate_native_headers (shared_ctx=shared_ctx@entry=0x7001d0001540, pool=<optimized out>, headers=<optimized out>, cb=cb@entry=0x62085dc678a0 <iterate_headers_callback>, cb_data=cb_data@entry=0x7001d0028660)
at /usr/src/debug/h2o-master-git/h2o/lib/handler/mruby.c:727
#10 0x000062085dc6a76e in build_env (generator=0x7001d006cbe0) at /usr/src/debug/h2o-master-git/h2o/lib/handler/mruby.c:836
#11 on_req (_handler=<optimized out>, req=<optimized out>) at /usr/src/debug/h2o-master-git/h2o/lib/handler/mruby.c:974
#12 0x000062085dbc603a in call_handlers (req=0x7001d00765d8, handler=0x62085f2d5ef0) at /usr/src/debug/h2o-master-git/h2o/lib/core/request.c:165
#13 0x000062085dbeeb89 in handle_incoming_request (conn=<optimized out>) at /usr/src/debug/h2o-master-git/h2o/lib/http1.c:714
#14 0x000062085dba6293 in run_socket (sock=0x7001d009b660) at /usr/src/debug/h2o-master-git/h2o/lib/common/socket/evloop.c.h:834
#15 run_pending (loop=loop@entry=0x7001d0000b70) at /usr/src/debug/h2o-master-git/h2o/lib/common/socket/evloop.c.h:876
#16 0x000062085dba6300 in h2o_evloop_run (loop=0x7001d0000b70, max_wait=<optimized out>) at /usr/src/debug/h2o-master-git/h2o/lib/common/socket/evloop.c.h:925
#17 0x000062085dc5da1b in run_loop (_thread_index=<optimized out>) at /usr/src/debug/h2o-master-git/h2o/src/main.c:4210
#18 0x000070022b8a955a in ?? () from /usr/lib/libc.so.6
#19 0x000070022b926a3c in ?? () from /usr/lib/libc.so.6
]]>core
file was written where the offending program was started.
The only prerequisite was that there was no limit imposed.
Limits can be checked by
$ ulimit -a
-t: cpu time (seconds) unlimited
-f: file size (blocks) unlimited
-d: data seg size (kbytes) unlimited
-s: stack size (kbytes) 8192
-c: core file size (blocks) unlimited
-m: resident set size (kbytes) unlimited
-u: processes 254204
-n: file descriptors 1024
-l: locked-in-memory size (kbytes) 8192
-v: address space (kbytes) unlimited
-x: file locks unlimited
-i: pending signals 254204
-q: bytes in POSIX msg queues 819200
-e: max nice 0
-r: max rt priority 0
-N 15: rt cpu time (microseconds) unlimited
The line for the "core file size" must be greater than zero.
In Arch Linux that alone doesn't help. core
files are written to this directory:
$ coredumpctl info
PID: 16354 (h2o)
UID: 33 (http)
GID: 33 (http)
Signal: 11 (SEGV)
Timestamp: Wed 2024-04-10 20:02:12 CEST (2h 3min ago)
Command Line: h2o
Executable: /usr/bin/h2o
Control Group: /user.slice/user-1000.slice/user@1000.service/tmux-spawn-3fc3de1b-6e2d-43bf-ad3d-bf55b4ce3a1a.scope
Unit: user@1000.service
User Unit: tmux-spawn-3fc3de1b-6e2d-43bf-ad3d-bf55b4ce3a1a.scope
Slice: user-1000.slice
Owner UID: 1000 (klm)
Boot ID: 8b9d5dcffc3a4669b0c7fa244db334be
Machine ID: 814e9c58b1e34999a682767020267eb0
Hostname: chieftec
Storage: /var/lib/systemd/coredump/core.h2o.33.8b9d5dcffc3a4669b0c7fa244db334be.16354.1712772132000000.zst (inaccessible)
Message: Process 16354 (h2o) of user 33 dumped core.
Stack trace of thread 16363:
#0 0x0000777802fe7bb3 n/a (libcrypto.so.53 + 0xd0bb3)
#1 0x00007778030efd5b SSL_CTX_flush_sessions (libssl.so.56 + 0x24d5b)
#2 0x00005d994cc02023 cache_cleanup_thread (h2o + 0x12a023)
#3 0x0000777802c7755a n/a (libc.so.6 + 0x8b55a)
#4 0x0000777802cf4a3c n/a (libc.so.6 + 0x108a3c)
The command coredumpctl list
enlists the core
's so far:
$ coredumpctl list
TIME PID UID GID SIG COREFILE EXE SIZE
Sat 2024-04-06 17:55:20 CEST 24746 33 33 SIGSEGV inaccessible /usr/bin/h2o -
Sat 2024-04-06 18:49:20 CEST 26982 33 33 SIGSEGV inaccessible /usr/bin/h2o -
Sat 2024-04-06 18:50:04 CEST 27178 33 33 SIGSEGV inaccessible /usr/bin/h2o -
You can start debugging with coredumpctl debug
. That will call gdb
.
The location and name of the core
file can be changed by tampering with
$ cat /proc/sys/kernel/core_pattern
|/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h
More information is here: Core dump file is not generated, coredumpctl, systemd-coredump.
]]>From the CSS Naked Day:
The idea behind CSS Naked Day is to promote web standards. Plain and simple. This includes proper use of HTML, semantic markup, a good hierarchy structure, and of course, a good old play on words. In the words of 2006, it’s time to show off your
<body>
for what it really is.
The importance of CSS is illustrated by this humorous tweet:
The logic to enable or disable CSS is given by below PHP routine on CSS Naked Day:
<?php
function is_naked_day($d) {
$start = date('U', mktime(-14, 0, 0, 04, $d, date('Y')));
$end = date('U', mktime(36, 0, 0, 04, $d, date('Y')));
$z = date('Z') * -1;
$now = time() + $z;
if ( $now >= $start && $now <= $end ) {
return true;
}
return false;
}
?>
Running this with php -a
and unixtimestamp.com for the year 2024 gives the following interval:
The rationale is:
CSS Naked Day lasts for one international day. Technically speaking, it will be April 9 somewhere in the world for 50 hours. This is to ensure that everyone’s website will be publicly nude for the entire world to see at any given time during April 9.
For this blog I use the static site generator Simplified Saaze.
All templates of this generator are written in PHP.
So deactivating CSS is a pretty simple if
statement.
I use the following hierarchy of PHP files for my entry
-template, i.e., the template for a blog post:
The following hierarchy is used for the index
-template, i.e., the template for showing a reverse-date sorted list of blog posts:
<head>
sectionFile head.php
does not contain any CSS.
File top-layout.php
handles the majority of the HTML <head>
section, and the beginning of the <body>
section.
I use prism.js for syntax highlighting. This in turn uses CSS, which is surrounded by a simple if
:
<?php $NO_CSS = getenv('NO_CSS') ? true : false; ?>
<?php if (isset($entry['prismjs']) && ! $NO_CSS) { ?>
<link href=/jscss/prism.css rel=stylesheet>
<?php } ?>
If I generate all the static HTML files, I use the environment variable NO_CSS
.
In case of dynamic generation I simply set $NO_CSS
explicitly in top-layout.php
, i.e., $NO_CSS=true;
.
I have a separate CSS file, called blogklm.css
, which I also surround with an if
:
<?php if (! $NO_CSS) echo "<style>\n" ?>
<?php if (! $NO_CSS) require SAAZE_PATH . "/public/jscss/blogklm.css" ?>
<?php if (! $NO_CSS) echo "</style>\n" ?>
For galleries and Markmap I had a conditional anyway. This needed an additional clause:
<?php if (!isset($pagination) && ! $NO_CSS) {
if (isset($entry['gallery_css'])) echo $entry['gallery_css'];
if (isset($entry['markmap_css'])) echo $entry['markmap_css'];
} ?>
I use Pagefind for searching within this blog.
Pagefind in turn needs CSS, which is surrounded by an if
:
<?php if (! $NO_CSS) { ?>
<link href="/pagefind/pagefind-ui.css" rel="stylesheet">
<script src="/pagefind/pagefind-ui.js"></script>
<script>
window.addEventListener('DOMContentLoaded', (event) => {
new PagefindUI({ element: "#search", showSubResults: true });
});
</script>
<?php } ?>
<body>
sectionStill in top-layout.php
.
Finally, I explicitly mention that I stripped all CSS, so visitors are not surprised to find a new layout:
<?php if ($NO_CSS) echo "<h2> <a href=\"https://css-naked-day.github.io\">April 9 is CSS Naked Day!</a></h2>\n"; ?>
Below text is copied from CSS Naked Day and the Missing Wikipedia Page:
The event dates back to 2006, when Dustin Diaz, an American web developer, advertised the first CSS Naked Day in order “to promote web standards.”
During the first two years (2006 and 2007), CSS Naked Day was held on April 5, when in 2008, the date was changed to April 9.
Until 2009, the event was organized by Diaz. From 2010 to 2014, Taylor Satula, an American web designer, ...
From the first CSS Naked Day in 2006, which had 763 recorded participants, engagement went up to 2,160 participants in 2008. After another strong participation in 2009 (1,266 recorded participants), fewer people and sites are documented to have taken part.
In recent years (2020–2023), only a fraction of these participants is known, usually including a few dozen individuals and their sites. While there are no reliable ways to measure participation, it seems clear that while CSS Naked Day is still being observed, that is only the case for a small minority of people in the field. ...
In the months following the 2015 edition, and until today, Basmaison and Meiert have kept maintaining the site and promoting the event together.
The usual omnipresent Wikipedia trolls and naysayer blocked this wiki entry.
]]>gcc -fomit-frame-pointer
Unfortunately the ELF itself does not contain a flag, which tells you that. But looking at the assembler code can give you the answer.
First disassemble the code with
objdump -d
Check the disassembly for below pairs directly after any C function:
push %rbp
mov %rsp,%rbp
These are the instructions to set up the frame pointer on 64 bit Linux x86 systems.
Example:
0000000000001380 <zif_md4c_toHtml>:
1380: 55 push %rbp
1381: 48 89 e5 mov %rsp,%rbp
A good heuristic is then
objdump -d $binary | grep -c "mov.*%rsp,.*%rbp"
Double check with
objdump -d $binary | grep -C1 "mov.*%rsp,.*%rbp"
This heuristic is not fool proof, as individual C routines can be augmented with
__attribute__((optimize("omit-frame-pointer"))
In the intense debate about making -fno-omit-frame-pointer
the default in Fedora, see this comment from L. A. F. Pereira in Python 3.11 performance with frame pointers.
See How can I tell whether a binary is compiled with frame pointers or not on Linux?, which discusses the case for 32 bit x86 Linux systems.
Code with framepointers will always contain the both of the two instructions
push %ebp
andmov %esp, %ebp
. ... For those working with x86_64, the registers to look for are the 64-bit equivalents: %rbp and %rsp - the concept is the same though!
The post The Return of the Frame Pointers by Brendan Gregg triggered this task.
As of today, 18-Mar-2024, Arch Linux still does not ship binaries with frame pointer support. For example:
$ objdump -d /bin/zsh | grep -c "mov.*%rsp,.*%rbp"
10
The PHP binary fails the heuristic:
$ objdump -d /bin/php | grep -c "mov.*%rsp,.*%rbp"
173
But looking at the actuall disassembly shows something like this:
000000000021aff2 <php_info_print_box_end@@Base>:
21aff2: f3 0f 1e fa endbr64
21aff6: 48 8d 05 43 9b 1e 01 lea 0x11e9b43(%rip),%rax # 1404b40 <sapi_module@@Base>
I.e., no frame pointer handling.
]]>$ lastb
a ssh:notty 209.97.163.130 Tue Mar 5 13:07 - 13:07 (00:00)
sftpuser ssh:notty 93.123.39.2 Tue Mar 5 13:05 - 13:05 (00:00)
sftpuser ssh:notty 93.123.39.2 Tue Mar 5 13:05 - 13:05 (00:00)
hzp ssh:notty 43.156.241.167 Mon Mar 4 18:19 - 18:19 (00:00)
hzp ssh:notty 43.156.241.167 Mon Mar 4 18:19 - 18:19 (00:00)
root ssh:notty 8.219.249.208 Mon Mar 4 18:17 - 18:17 (00:00)
mheydary ssh:notty 118.178.132.93 Mon Mar 4 12:35 - 12:35 (00:00)
mheydary ssh:notty 118.178.132.93 Mon Mar 4 12:34 - 12:34 (00:00)
ftp1user ssh:notty 143.255.140.241 Mon Mar 4 12:34 - 12:34 (00:00)
ftp1user ssh:notty 143.255.140.241 Mon Mar 4 12:34 - 12:34 (00:00)
panisa ssh:notty 139.224.200.60 Mon Mar 4 11:13 - 11:13 (00:00)
panisa ssh:notty 139.224.200.60 Mon Mar 4 11:13 - 11:13 (00:00)
sina ssh:notty 129.226.158.202 Mon Mar 4 10:45 - 10:45 (00:00)
sina ssh:notty 129.226.158.202 Mon Mar 4 10:44 - 10:44 (00:00)
hadoop ssh:notty 129.226.152.121 Mon Mar 4 10:43 - 10:43 (00:00)
In 2020 I used fail2ban. Since 2021 I use SSHGuard. It uses way less resources. See Analysis And Usage of SSHGuard.
I ran a quick analysis which country is the most aggressive penetrator.
1. Collecting IP addresses. SSHGuard filters the offending intruder via ipset.
$ ipset list > i1
This collects all IP addresses.
Now I run these IP numbers through geoiplookup
:
$ for i in `perl -ne 'print $1."\n" if /^(\d+\.\d+\.\d+\.\d+)\s+/' i1`; do geoiplookup $i >> i3; done
The resulting list looks like this:
$ head i3
GeoIP Country Edition: CN, China
GeoIP Country Edition: HK, Hong Kong
GeoIP Country Edition: US, United States
GeoIP Country Edition: US, United States
GeoIP Country Edition: KR, Korea, Republic of
GeoIP Country Edition: PE, Peru
GeoIP Country Edition: CA, Canada
GeoIP Country Edition: CN, China
GeoIP Country Edition: KR, Korea, Republic of
GeoIP Country Edition: KE, Kenya
2. Sorting according frequency.
cut -d: -f2 i3 | sort | uniq -c | sort -rn
The top 20 offenders are:
4228 CN, China
3175 US, United States
2142 SG, Singapore
1596 KR, Korea, Republic of
1042 DE, Germany
980 IN, India
755 HK, Hong Kong
661 BR, Brazil
566 RU, Russian Federation
522 VN, Vietnam
471 ID, Indonesia
453 JP, Japan
403 FR, France
396 NL, Netherlands
354 GB, United Kingdom
313 IR, Iran, Islamic Republic of
307 CA, Canada
279 TW, Taiwan
236 AU, Australia
173 TH, Thailand
Graphically this looks like this:
]]>Initially I succeeded in installing the IBM compiler in 2021. The IBM compiler compared very favorably against the GNU Cobol compiler, see Comparing GnuCOBOL to IBM COBOL. But in 2023 this installation procedure failed. So, no IBM COBOL on Arch Linux.
Richard Nelson from IBM contacted me today and mentioned that IBM COBOL should also run on Arch Linux. So I tried to install the latest version 1.2.0.2 again. Version 1.2 is particularly appealing as it supports 64 bit. IBM COBOL compilers were notorious with lacking 64 bit support, see Memory Limitations with IBM Enterprise COBOL Compiler.
My current Arch Linux setup is as given in below table.
Type | Version |
---|---|
Linux | 6.7.6-arch1-2 #1 SMP PREEMPT_DYNAMIC x86_64 GNU/Linux |
gcc | gcc version 13.2.1 20230801 (GCC) |
glibc | 2.39-1 |
gcc-libs | 13.2.1-5 |
1. Download. Software package is here: IBM COBOL for Linux on x86.
IBM now uses this annoying two-factor authorization procedure, click through all these hoops.
This 2FA makes it essentially impossible to write an AUR package, which downloads the IBM file within the PKGBUILD
.
The file in question is IBM_COBOL_V1.2.0_LINUX_EVAL.x86-64.240110.tar.gz
. Its size is 116 MB.
$ tar ztvf IBM_COBOL_V1.2.0_LINUX_EVAL.x86-64.240110.tar.gz
drwxr-sr-x root/root 0 2023-06-06 01:05 images/
drwxr-sr-x root/root 0 2024-01-10 16:16 images/rhel/
-rw-rw-r-- root/root 26210268 2024-01-10 16:16 images/rhel/cobol.rte.1.2.0-1.2.0.2-231215.x86_64.rpm
-rw-rw-r-- root/root 2331592 2024-01-10 16:16 images/rhel/cobol.dbg.1.2.0-1.2.0.2-231215.x86_64.rpm
-rw-rw-r-- root/root 3055224 2024-01-10 16:16 images/rhel/cobol.cmp.license-eval.1.2.0-1.2.0.2-231215.x86_64.rpm
-rw-rw-r-- root/root 11199076 2024-01-10 16:16 images/rhel/cobol.cmp.1.2.0-1.2.0.2-231215.x86_64.rpm
drwxr-sr-x root/root 0 2024-01-10 16:17 images/sles/
-rw-r--r-- root/root 22295780 2024-01-10 16:17 images/sles/cobol.rte.1.2.0-1.2.0.2-231215.x86_64.rpm
-rw-r--r-- root/root 1975984 2024-01-10 16:17 images/sles/cobol.dbg.1.2.0-1.2.0.2-231215.x86_64.rpm
-rw-r--r-- root/root 2999760 2024-01-10 16:17 images/sles/cobol.cmp.license-eval.1.2.0-1.2.0.2-231215.x86_64.rpm
-rw-r--r-- root/root 9095804 2024-01-10 16:17 images/sles/cobol.cmp.1.2.0-1.2.0.2-231215.x86_64.rpm
drwxr-sr-x root/root 0 2024-01-10 16:17 images/ubuntu/
-rw-r--r-- root/root 1957512 2024-01-10 16:17 images/ubuntu/cobol.dbg.1.2.0_1.2.0.2-231215_amd64.deb
-rw-r--r-- root/root 2992220 2024-01-10 16:17 images/ubuntu/cobol.cmp.license-eval.1.2.0_1.2.0.2-231215_amd64.deb
-rw-r--r-- root/root 10125300 2024-01-10 16:17 images/ubuntu/cobol.cmp.1.2.0_1.2.0.2-231215_amd64.deb
-rw-r--r-- root/root 22514248 2024-01-10 16:17 images/ubuntu/cobol.rte.1.2.0_1.2.0.2-231215_amd64.deb
-rwxr-xr-x root/root 6763 2024-01-10 16:32 install
-rw-r--r-- root/root 820691 2023-06-06 01:05 install.pdf
-rwxr-xr-x root/root 2694559 2023-06-06 01:12 LicenseAgreement.pdf
-rwxr-xr-x root/root 285651 2023-06-06 01:12 LicenseInformation.pdf
-rwxr-xr-x root/root 57001 2023-06-06 01:12 notices
-rw-r--r-- root/root 311858 2023-06-06 01:14 quickstart.fr_FR.pdf
-rw-r--r-- root/root 311477 2023-06-06 01:14 quickstart.ja_JP.pdf
-rw-r--r-- root/root 281309 2023-06-06 01:14 quickstart.pdf
-rwxr-xr-x root/root 2932 2023-06-06 01:12 README
2. Unpacking the Ubuntu part. We will extract the Ubuntu part, highlighted above.
$ tar zxf IBM_COBOL_V1.2.0_LINUX_EVAL.x86-64.240110.tar.gz images/ubuntu/
Change to images/ubuntu
directory and run the below loop, which first unpacks the deb-files with ar
, then unpacks the resulting tar.xz
data file with tar Jx
:
for i in *.deb; do ar xf $i; tar Jxf data.tar.xz; done
This creates a subdirectory opt
with 188 entries.
Move the resulting opt
or opt/ibm
to the "real" /opt
and chown -R root:root
all the files.
Installation size is 135 MB.
3. Checking the installation. See, whether all libraries are in place.
$ ldd /opt/ibm/cobol/1.2.0/bin/cob2
linux-vdso.so.1 (0x00007ffebab8a000)
librt.so.1 => /usr/lib/librt.so.1 (0x000070366a43e000)
libdl.so.2 => /usr/lib/libdl.so.2 (0x000070366a439000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x000070366a434000)
libc.so.6 => /usr/lib/libc.so.6 (0x000070366a252000)
/lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x000070366a47a000)
$ ldd /opt/ibm/cobol/1.2.0/bin/cob3
not a dynamic executable
$ ldd cob3_64
linux-vdso.so.1 (0x00007ffeddbf9000)
librt.so.1 => /usr/lib/librt.so.1 (0x00007a35119f5000)
libdl.so.2 => /usr/lib/libdl.so.2 (0x00007a35119f0000)
libicuuc_64r.so => /opt/ibm/cobol/1.2.0/usr/bin/./../../../rte/usr/lib/libicuuc_64r.so (0x00007a3510600000)
libcob2_64r.so => /opt/ibm/cobol/1.2.0/usr/bin/./../../../rte/usr/lib/libcob2_64r.so (0x00007a3510000000)
libm.so.6 => /usr/lib/libm.so.6 (0x00007a3511904000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007a3511720000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007a350fc00000)
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007a35116fb000)
libicudata_64r.so => /opt/ibm/cobol/1.2.0/usr/bin/./../../../rte/usr/lib/libicudata_64r.so (0x00007a350da00000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007a35116f6000)
/lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007a3511a31000)
libicui18n_64r.so => /opt/ibm/cobol/1.2.0/usr/bin/./../../../rte/usr/lib/libicui18n_64r.so (0x00007a350d200000)
libdfp_64r.so => /opt/ibm/cobol/1.2.0/usr/bin/./../../../rte/usr/lib/libdfp_64r.so (0x00007a350ca00000)
For convenience add the bin-directory to the PATH
:
$ export PATH=$PATH:/opt/ibm/cobol/1.2.0/bin
Up to this point, running the compiler would report a license problem. The actual compiler is cob2
.
Here is an example, once the license is setup correctly:
$ cob2 hello1.cob
IBM COBOL for Linux 1.2.0 compile started
End of compilation 1, program HELLO1, no statements flagged.
4. Getting a 60 day trial license.
Richard Nelson sent me a new file libxlcmpev_64r.so
.
With this new library file the compiler works flawlessly.
$ license_check
Evaluation (Trial/Eval/TnB) license
Current date Sat, 02 Mar 2024 17:54:00 GMT
Activation date Thu, 29 Feb 2024 00:00:01 GMT
Expire date Mon, 29 Apr 2024 23:59:59 GMT
Days left 58
Thanks Richard!
Also, Richard mentioned the install
shell script in the original tar file, see line 18.
I didn't make use of that! My fault.
Once I knew that this libxlcmpev_64r.so
is problematic, and looking at the install script:
...
extendTrial="$reldir/cobol/$version/usr/bin/xlcmp xlcbl && rm $reldir/cobol/$version/usr/bin/xlcmp"
eval $extendTrial
...
Generating the license now goes like this, as user root:
/opt/ibm/cobol/1.2.0/usr/bin/xlcmp xlcbl
This generates a new 1.2.0/usr/lib/libxlcmpev_64r.so
.
This provides a valid 60 day license.
$ license_check
Evaluation (Trial/Eval/TnB) license
Current date Sat, 02 Mar 2024 18:14:24 GMT
Activation date Sat, 02 Mar 2024 00:00:01 GMT
Expire date Wed, 01 May 2024 23:59:59 GMT
Days left 60
]]>Type | Value |
---|---|
CPU | AMD Ryzen 7 5700G |
RAM | 64 GB |
OS | Arch Linux 6.7.6-arch1-1 #1 SMP PREEMPT_DYNAMIC |
PHP | PHP 8.3.3 (cli) |
PHP with JIT | PHP 8.3.3 (cli), Zend Engine v4.3.3 with Zend OPcache v8.3.3 |
Simplified Saaze | 2.0 |
Regarding JIT configuration see PHP 8: How to setup the JIT.
1. Runtimes in serial mode. In the following we use PHP with no JIT. So far runtimes for this very blog are as below:
$ time php saaze -mortb /tmp/build
Building static site in /tmp/build...
execute(): filePath=./content/aux.yml, nSIentries=7, totalPages=1, entries_per_page=20
execute(): filePath=./content/blog.yml, nSIentries=452, totalPages=23, entries_per_page=20
execute(): filePath=./content/gallery.yml, nSIentries=7, totalPages=1, entries_per_page=20
execute(): filePath=./content/music.yml, nSIentries=69, totalPages=4, entries_per_page=20
execute(): filePath=./content/error.yml, nSIentries=0, totalPages=0, entries_per_page=20
Finished creating 5 collections, 4 with index, and 561 entries (0.25 secs / 24.46MB)
#collections=5, parseEntry=0.0103/563-5, md2html=0.0201, MathParser=0.0141/561, renderEntry=0.1573/561, renderCollection=0.0058/33, content=561/0, excerpt=0/0
real 0.28s
user 0.16s
sys 0
swapped 0
total space 0
It can be seen that the renderEntry()
function uses 0.1573 seconds from overall 0.25 seconds, i.e., more than 60%.
These 561 calls will now be parallelized.
The rest stays serial.
For the Lemire blog we have:
$ time php saaze -rb /tmp/buildLemire
Building static site in /tmp/buildLemire...
execute(): filePath=/home/klm/php/saaze-lemire/content/blog.yml, nSIentries=2771, totalPages=139, entries_per_page=20
Finished creating 1 collections, 1 with index, and 4483 entries (1.01 secs / 97.18MB)
#collections=1, parseEntry=0.0702/4483-1, md2html=0.1003, MathParser=0.0594/4483, renderEntry=0.4121/4483, renderCollection=0.0225/140, content=4483/0, excerpt=0/0
real 1.03s
user 0.64s
sys 0
swapped 0
total space 0
In this case the output template processing is 0.4121 seconds from overall 1.01 seconds, that's 40%. This shows that the Lemire templates are easier. No wonder, they do not use categories and tags, and many other gimmicks, which I used in this blog. But still, 40% of the runtime is spent on output rendering.
In Performance Comparison Saaze vs. Hugo vs. Zola I wrote:
It would be quite easy to use threads in Saaze, i.e., so-called entries and the chunks of collections could easily be processed in parallel.
It is even easier to parallelize the generation of the output files when the PHP templating is in place. We will see that parallelizing can be done in less than 20 lines of PHP code.
2. Runtimes in serial mode with JIT enabled. Below are the runtime with JIT and OPCache enabled for PHP.
time php saaze -mortb /tmp/build
Building static site in /tmp/build...
execute(): filePath=./content/aux.yml, nSIentries=7, totalPages=1, entries_per_page=20
execute(): filePath=./content/blog.yml, nSIentries=453, totalPages=23, entries_per_page=20
execute(): filePath=./content/gallery.yml, nSIentries=7, totalPages=1, entries_per_page=20
execute(): filePath=./content/music.yml, nSIentries=69, totalPages=4, entries_per_page=20
execute(): filePath=./content/error.yml, nSIentries=0, totalPages=0, entries_per_page=20
Finished creating 5 collections, 4 with index, and 562 entries (0.16 secs / 20.36MB)
#collections=5, parseEntry=0.0104/564-5, md2html=0.0219, MathParser=0.0203/562, renderEntry=0.0521/562, renderCollection=0.0022/33, content=562/0, excerpt=0/0
real 0.19s
user 0.11s
sys 0
swapped 0
total space 0
The previous massive renderEntry()
part in runtime shrank from 0.1573 seconds to 0.0521 seconds.
I think this is mainly due to the OPCache, which now avoids recompiling and reparsing the PHP output template.
For the Lemire blog with JIT enabled we have:
time php saaze -rb /tmp/buildLemire
Building static site in /tmp/buildLemire...
execute(): filePath=/home/klm/php/saaze-lemire/content/blog.yml, nSIentries=2771, totalPages=139, entries_per_page=20
Finished creating 1 collections, 1 with index, and 4483 entries (0.62 secs / 96.24MB)
#collections=1, parseEntry=0.0655/4483-1, md2html=0.0974, MathParser=0.0586/4483, renderEntry=0.0707/4483, renderCollection=0.0110/140, content=4483/0, excerpt=0/0
real 0.65s
user 0.40s
sys 0
swapped 0
total space 0
Similar picture to the above: the renderEntry()
part dropped from 0.4121 seconds to 0.0707 seconds.
That's massive.
3. Unix forks in PHP. As a preliminary introduction to pcntl_fork()
in PHP, look at below simple PHP code.
<?php
for ($i=1; $i<=4; ++$i) {
if (($pid = pcntl_fork())) {
printf("i=%d, pid=%d\n",$i,$pid);
sleep(1);
exit(0);
}
Running this script:
$ php forktst.php
i=1, pid=15082
i=2, pid=15083
i=3, pid=15084
i=4, pid=15085
The fork and join method of parallelization is easy to use, but it has the disadvantage that communicating results from the children to the parent is "difficult". Communicating data from the parent to its children is "easy": everything is copied over.
4. Implementation in BuildCommand.php.
The command-line version of Simplified Saaze calls buildAllStatic()
.
This routine iterates through all collections, and for each collection it iterates through all entries.
getEntries()
reads Markdown files into memory and converts them to HTML by using MD4C, all in memorybuildEntry()
uses the entry in question and writes the HTML to disk by processing it through our PHP templates.PHP function buildEntry()
is essentially:
private function buildEntry(Collection $collection, Entry $entry, string $dest) : void {
...
file_put_contents($entryDir, $this->templateManager->renderEntry($entry);
}
buildEntry()
is now encapsulated within beginParallel()
and endParallel()
.
That's it.
foreach ($collections as $collection) {
$entries = $collection->getEntries(); # finally calls getContentAndExcerpt() and sorts
$nentries = count($entries);
$nSIentries = count($collection->entriesSansIndex);
$entries_per_page = $collection->data['entries_per_page'] ?? \Saaze\Config::$H['global_config_entries_per_page'];
$totalPages = ceil($nSIentries / $entries_per_page);
printf("\texecute(): filePath=%s, nSIentries=%d, totalPages=%d, entries_per_page=%d\n",$collection->filePath,$nSIentries,$totalPages,$entries_per_page);
$this->beginParallel($nentries,$aprocs);
$i = 0;
foreach ($entries as $entry) {
if ($this->nprocs > 0 && ($i++ % $this->nprocs) != $this->procnr) continue; // distribute work among nprocs processes
if ($entry->data['entry'] ?? true) {
$this->buildEntry($collection, $entry, $dest);
$entryCount++;
}
}
$this->endParallel();
if ($tags) { // populate cat_and_tag[][] array
foreach ($entries as $entry) {
if ($entry->data['entry'] ?? true)
$this->build_cat_and_tag($entry,$collection->draftOverride);
}
}
++$totalCollection;
if ($this->buildCollectionIndex($collection, 0, $dest)) $collectionCount++;
for ($page=1; $page <= $totalPages; $page++)
$this->buildCollectionIndex($collection, $page, $dest);
}
The two PHP functions for fork and join are thus:
protected function beginParallel(int $nentries, int $aprocs) : void {
$this->pid = 0;
$this->procnr = 0;
$this->nprocs = 1;
if ($nentries < 128) return; // too few entries to warrant forking
$this->nprocs = $aprocs; // aprocs = allowed procs, specified on commmand-line
for ($this->procnr=0; $this->procnr<$this->nprocs; ++$this->procnr)
if (($this->pid = pcntl_fork())) return; // child returns to work
}
protected function endParallel() : void {
if ($this->pid) exit(0); // exit child process; pid=0 is parent
}
This fork and join via pcntl_fork()
does not work on Microsoft Windows.
5. Benchmarking. How much of an improvement do we get by this? For this very blog with 561 entries, the runtimes can be more than halved. This is in line with the 60% runtime used by the output template processing. It should be noted that this blog is comprised of five collections:
The parallelization kicks in only for at least 128 entries. I.e., only the blog-part is parallelized, the music-part and the other parts are not.
Another benchmark is the Lemire blog converted to Simplified Saaze, see Example Theme for Simplified Saaze: Lemire.
Command-lines are:
time php saaze -p16 -mortb /tmp/build
time php saaze -p16 -rb /tmp/buildLemire
Then we are varying the parameter -p
.
All output is to /tmp
, which is a RAM disk in Arch Linux.
Obviously, I do not want to measure disk read or write speed.
I want to measure the processing speed of Simplified Saaze.
Timings are from time
, taking real time.
Blog entries | p=1 | p=2 | p=4 | p=8 | p=16 |
---|---|---|---|---|---|
561 posts / this blog | 0.28 | 0.18 | 0.16 | 0.13 | 0.12 |
561 posts with JIT | 0.19 | 0.17 | 0.14 | 0.13 | 0.12 |
4.483 posts in Lemire | 1.03 | 1.02 | 0.65 | 0.54 | 0.52 |
4.483 posts with JIT | 0.65 | 0.64 | 0.53 | 0.47 | 0.46 |
Overall, with just 20 lines of PHP we can halve the runtime. For JIT enabled, the drop in runtime is not so pronounced, but also almost halved.
The very good performance of JIT, which we can see here, is in line with the findings in Phoronix: PHP 8.0 JIT Is Offering Very Compelling Performance Ahead Of Its Alpha.
]]>Type | URL |
---|---|
Releases | https://github.com/:owner/:repo/releases.atom |
Commits | https://github.com/:owner/:repo/commits.atom |
Private feed | https://github.com/:user.private.atom?token=:secret |
Tags | https://github.com/:user/:repo/tags.atom |
User activity | https://github.com/:user.atom |
They are vaguely documented by GitHub here: Get feeds.
For example, for my saaze
GitHub repository the feed for the commits is:
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xml:lang="en-US">
<id>tag:github.com,2008:/eklausme/saaze/commits/master</id>
<link type="text/html" rel="alternate" href="https://github.com/eklausme/saaze/commits/master"/>
<link type="application/atom+xml" rel="self" href="https://github.com/eklausme/saaze/commits/master.atom"/>
<title>Recent Commits to saaze:master</title>
<updated>2024-02-17T12:58:12Z</updated>
<entry>
<id>tag:github.com,2008:Grit::Commit/48560c8bb5535cfaacdf2fc1be153c43448051d5</id>
<link type="text/html" rel="alternate" href="https://github.com/eklausme/saaze/commit/48560c8bb5535cfaacdf2fc1be153c43448051d5"/>
<title>
Reduced CPU overhead in composer
</title>
<updated>2024-02-17T12:58:12Z</updated>
<media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/1020520?s=30&v=4"/>
<author>
<name>eklausme</name>
<uri>https://github.com/eklausme</uri>
</author>
<content type="html">
<pre style='white-space:pre-wrap;width:81ex'>Reduced CPU overhead in composer</pre>
</content>
</entry>
...
</feed>
The above output was produced by below command-line:
curl https://github.com/eklausme/saaze/commits.atom
]]>Previous profiling measurements with XHProf and PHPSPY indicated that the handling of the return value from MD4C via FFI::String takes some time. So I changed FFI to a "real" PHP extension. I measured again. Result: No difference between FFI and PHP extension. So the profiling measurements were misleading.
Also the following claim in the PHP manual is downright false:
it makes no sense to use the FFI extension for speed; however, it may make sense to use it to reduce memory consumption.
Nevertheless, writing a PHP extension was a good exercise to keep my acquaintance with the PHP development ecosystem up to date. I had already written a COBOL to PHP and an IMS/DC to PHP extension:
Literature on writing PHP extension are here:
The PHP extension code is in GitHub: php-md4c.
1. Walk through the C code. For this simple extension there is no need for a separate header file.
The extension starts with basic includes for PHP, for the phpinfo()
, and for MD4C:
// MD4C extension for PHP: Markdown to HTML conversion
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <php.h>
#include <ext/standard/info.h>
#include <md4c-html.h>
The following code is directly from the FFI part php_md4c_toHtml.c:
struct membuffer {
char* data;
size_t asize; // allocated size = max usable size
size_t size; // current size
};
The following routines are also almost the same as in the FFI case, except that memory allocation is using safe_pemalloc()
instead of native malloc()
.
In our case this doesn't make any difference.
static void membuf_init(struct membuffer* buf, MD_SIZE new_asize) {
buf->size = 0;
buf->asize = new_asize;
if ((buf->data = safe_pemalloc(buf->asize,sizeof(char),0,1)) == NULL)
php_error_docref(NULL, E_ERROR, "php-md4c.c: membuf_init: safe_pemalloc() failed with asize=%ld.\n",(long)buf->asize);
}
Next routine uses safe_perealloc()
instead of realloc()
.
static void membuf_grow(struct membuffer* buf, size_t new_asize) {
buf->data = safe_perealloc(buf->data, sizeof(char*), new_asize, 0, 1);
if (buf->data == NULL)
php_error_docref(NULL, E_ERROR, "php-md4c.c: membuf_grow: realloc() failed, new_asize=%ld.\n",(long)new_asize);
buf->asize = new_asize;
}
The rest is identical to FFI.
static void membuf_append(struct membuffer* buf, const char* data, MD_SIZE size) {
if (buf->asize < buf->size + size)
membuf_grow(buf, buf->size + buf->size / 2 + size);
memcpy(buf->data + buf->size, data, size);
buf->size += size;
}
static void process_output(const MD_CHAR* text, MD_SIZE size, void* userdata) {
membuf_append((struct membuffer*) userdata, text, size);
}
static struct membuffer mbuf = { NULL, 0, 0 };
Now we come to something PHP specific.
We encapsulate the C function into PHP_FUNCTION
.
Furthermore, the arguments of the routine are parsed with ZEND_PARSE_PARAMETERS_START(1, 2)
.
This routine must have at least one argument.
It might have an optional second argument.
That is what is meant by (1,2)
.
The return string is allocated via estrndup()
.
In the FFI case we just return a pointer to a string.
/* {{{ string md4c_toHtml( string $markdown, [ int $flag ] )
*/
PHP_FUNCTION(md4c_toHtml) { // return HTML string
char *markdown;
size_t markdown_len;
int ret;
long flag = MD_DIALECT_GITHUB | MD_FLAG_NOINDENTEDCODEBLOCKS;
ZEND_PARSE_PARAMETERS_START(1, 2)
Z_PARAM_STRING(markdown, markdown_len)
Z_PARAM_OPTIONAL Z_PARAM_LONG(flag)
ZEND_PARSE_PARAMETERS_END();
if (mbuf.asize == 0) membuf_init(&mbuf,16777216); // =16MB
mbuf.size = 0; // prepare for next call
ret = md_html(markdown, markdown_len, process_output,
&mbuf, (MD_SIZE)flag, 0);
membuf_append(&mbuf,"\0",1); // make it a null-terminated C string, so PHP can deduce length
if (ret < 0) {
RETVAL_STRINGL("<br>- - - Error in Markdown - - -<br>\n",sizeof("<br>- - - Error in Markdown - - -<br>\n"));
} else {
RETVAL_STRING(estrndup(mbuf.data,mbuf.size));
}
}
/* }}}*/
The following two PHP extension specific functions are just for initialization and shutdown. The following diagram from PHP internals shows the sequence of initialization and shutdown.
Init: Do nothing.
/* {{{ PHP_MINIT_FUNCTION
*/
PHP_MINIT_FUNCTION(md4c) { // module initialization
//REGISTER_INI_ENTRIES();
//php_printf("In PHP_MINIT_FUNCTION(md4c): module initialization\n");
return SUCCESS;
}
/* }}} */
Shutdown: Do nothing.
/* {{{ PHP_MSHUTDOWN_FUNCTION
*/
PHP_MSHUTDOWN_FUNCTION(md4c) { // module shutdown
if (mbuf.data) pefree(mbuf.data,1);
return SUCCESS;
}
/* }}} */
The following function prints out information when called via phpinfo()
.
/* {{{ PHP_MINFO_FUNCTION
*/
PHP_MINFO_FUNCTION(md4c) {
php_info_print_table_start();
php_info_print_table_row(2, "MD4C", "enabled");
php_info_print_table_row(2, "PHP-MD4C version", "1.0");
php_info_print_table_row(2, "MD4C version", "0.5.2");
php_info_print_table_end();
}
/* }}} */
The output looks like this:
Below describes the argument list.
/* {{{ arginfo
*/
ZEND_BEGIN_ARG_INFO(arginfo_md4c_test, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO(arginfo_md4c_toHtml, 1)
ZEND_ARG_INFO(0, str)
ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, flag, "MD_DIALECT_GITHUB | MD_FLAG_NOINDENTEDCODEBLOCKS")
ZEND_END_ARG_INFO()
/* }}} */
/* {{{ php_md4c_functions[]
*/
static const zend_function_entry php_md4c_functions[] = {
PHP_FE(md4c_toHtml, arginfo_md4c_toHtml)
PHP_FE_END
};
/* }}} */
The zend_module_entry
is somewhat classical.
All the above is configured here.
/* {{{ md4c_module_entry
*/
zend_module_entry md4c_module_entry = {
STANDARD_MODULE_HEADER,
"md4c", // Extension name
php_md4c_functions, // zend_function_entry
NULL, //PHP_MINIT(md4c), // PHP_MINIT - Module initialization
PHP_MSHUTDOWN(md4c), // PHP_MSHUTDOWN - Module shutdown
NULL, // PHP_RINIT - Request initialization
NULL, // PHP_RSHUTDOWN - Request shutdown
PHP_MINFO(md4c), // PHP_MINFO - Module info
"1.0", // Version
STANDARD_MODULE_PROPERTIES
};
/* }}} */
This seemingly innocent looking statement is important: Without it you will get PHP Startup: Unable to load dynamic library
.
#ifdef COMPILE_DL_TEST
# ifdef ZTS
ZEND_TSRMLS_CACHE_DEFINE()
# endif
#endif
ZEND_GET_MODULE(md4c)
2. M4 config file.
The PHP extension requires a config.m4
file.
dnl config.m4 for php-md4c extension
PHP_ARG_WITH(md4c, [whether to enable MD4C support],
[ --with-md4c[[=DIR]] Enable MD4C support.
DIR is the path to MD4C install prefix])
if test "$PHP_YAML" != "no"; then
AC_MSG_CHECKING([for md4c headers])
for i in "$PHP_MD4C" "$prefix" /usr /usr/local; do
if test -r "$i/include/md4c-html.h"; then
PHP_MD4C_DIR=$i
AC_MSG_RESULT([found in $i])
break
fi
done
if test -z "$PHP_MD4C_DIR"; then
AC_MSG_RESULT([not found])
AC_MSG_ERROR([Please install md4c])
fi
PHP_ADD_INCLUDE($PHP_MD4C_DIR/include)
dnl recommended flags for compilation with gcc
dnl CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
export OLD_CPPFLAGS="$CPPFLAGS"
export CPPFLAGS="$CPPFLAGS $INCLUDES -DHAVE_MD4C"
AC_CHECK_HEADERS([md4c.h md4c-html.h], [], AC_MSG_ERROR(['md4c.h' header not found]))
#AC_CHECK_HEADER([md4c-html.h], [], AC_MSG_ERROR(['md4c-html.h' header not found]))
PHP_SUBST(MD4C_SHARED_LIBADD)
PHP_ADD_LIBRARY_WITH_PATH(md4c, $PHP_MD4C_DIR/$PHP_LIBDIR, MD4C_SHARED_LIBADD)
PHP_ADD_LIBRARY_WITH_PATH(md4c-html, $PHP_MD4C_DIR/$PHP_LIBDIR, MD4C_SHARED_LIBADD)
export CPPFLAGS="$OLD_CPPFLAGS"
PHP_SUBST(MD4C_SHARED_LIBADD)
AC_DEFINE(HAVE_MD4C, 1, [ ])
PHP_NEW_EXTENSION(md4c, md4c.c, $ext_shared)
fi
3. Compiling. Run
phpize
./configure
make
Symbols are as follows:
$ nm md4c.so
0000000000002160 r arginfo_md4c_test
0000000000003d00 d arginfo_md4c_toHtml
w __cxa_finalize@GLIBC_2.2.5
00000000000040a0 d __dso_handle
0000000000003dc0 d _DYNAMIC
U _emalloc
U _emalloc_64
U _estrndup
00000000000016c8 t _fini
U free@GLIBC_2.2.5
00000000000016c0 T get_module
0000000000003fe8 d _GLOBAL_OFFSET_TABLE_
w __gmon_start__
00000000000021c8 r __GNU_EH_FRAME_HDR
0000000000001000 t _init
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
0000000000004180 b mbuf
00000000000040c0 D md4c_module_entry
U md_html
U memcpy@GLIBC_2.14
U php_error_docref
U php_info_print_table_end
U php_info_print_table_row
U php_info_print_table_start
0000000000003d60 d php_md4c_functions
U php_printf
0000000000001640 t process_output
0000000000001234 t process_output.cold
U _safe_malloc
U _safe_realloc
U __stack_chk_fail@GLIBC_2.4
U strlen@GLIBC_2.2.5
0000000000004168 d __TMC_END__
U zend_parse_arg_long_slow
U zend_parse_arg_str_slow
U zend_wrong_parameter_error
U zend_wrong_parameters_count_error
U zend_wrong_parameters_none_error
. . .
0000000000001380 T zif_md4c_toHtml
00000000000011cf t zif_md4c_toHtml.cold
0000000000001175 T zm_info_md4c
0000000000001350 T zm_shutdown_md4c
00000000000016b0 T zm_startup_md4c
4. Installing on Arch Linux. Copy the md4c.so
library to /usr/lib/php/modules
as root:
cp modules/md4c.so /usr/lib/php/modules
Finally activate the extension in php.ini
:
extension=md4c
5. Notes on Windows. On Linux we use the installed MD4C library. As noted in Installing Simplified Saaze on Windows 10 #2 it is advisable to amalgamate all MD4C source files into a single file for easier compilation.
6. MD4C is now an offical PHP extension. With the help of Christoph M. Becker MD4C is now officially listed here: PECL MD4. Remi Collet helped with packaging the MD4C library source code.
]]>lefh
to generate and update Let's Encrypt certificates for the Hiawatha webserver.
Unfortunately, this PHP script no longer works.
Therefore I installed certbot
:
pacman -S certbot-nginx
Updating my domains is like this:
certbot --nginx -d eklausmeier.goip.de,klm.ddns.net,eklausmeier.mywire.org,klmport.no-ip.org,klm.no-ip.org
Its output is roughly
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for eklausmeier.goip.de and 4 more domains
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/eklausmeier.goip.de/fullchain.pem
Key is saved at: /etc/letsencrypt/live/eklausmeier.goip.de/privkey.pem
This certificate expires on 2024-05-19.
These files will be updated when the certificate renews.
Add the first two files in /etc/nginx/nginx.conf
:
ssl_certificate /etc/letsencrypt/live/eklausmeier.goip.de/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/eklausmeier.goip.de/privkey.pem;
Check with nginx -t
.
If all is OK, then restart with systemctl restart nginx
.
Final check is with Qualys SSL Labs:
]]>On my old WordPress blog, https://eklausmeier.wordpress.com, I had 79 subscribers. From their e-mail names, I would suspect that some of them were not really interested in my actual content but were a little bit spammy. Nevertheless, many seemed to be legitimate.
There are a lot of professional newsletter services on the market. For example:
There are many more.
These solutions should be distinguished from mailing list software.
2. Data model. Initially, I thought of a single file used to store all information. Something like this: Handling of subscription-file: Read into a PHP hash table, change whatever needs change, and if there is a change required, e.g., new subscriber, then move the old file, and write a new file from the hash.
However, this file needs some protection using flock()
to guard against simultaneous writing to it.
After some thought it seems more advantageous to use a simple SQLite file, i.e., a database, which already handles concurrency out of the box.
A single database table suffices. Henceforth this table is called subscription
.
Nr. | Column | type | nullable | Example or meaning |
---|---|---|---|---|
1 | text | not null | primary key, e.g., Peter.Miller@super.com | |
2 | Firstname | text | null | e.g., Peter |
3 | Lastname | text | null | e.g., Miller |
4 | registration | date | not null | date of registration, e.g., 06-Feb-2024 |
5 | IP | text | not null | e.g., 84.119.108.23, IP address of web client during initial subscription |
6 | status | int | not null | 1=in-limbo 2=active 3=inactive 4=bounced during registration 5=bounced |
7 | token | text | not null | e.g., uIYkEk+ylks= computed with $token = base64_encode(random_bytes(8)); |
State diagram for status is as below.
Create script for SQLite is like this:
drop table subscription;
create table subscription (
email text primary key,
firstname text,
lastname text,
registration date not null,
IP text not null,
status int not null,
token text not null
);
The following SQL statements will be used:
select email, firstname from subscription where status=1
insert into subscription (email,firstname,lastname,registration,IP,status,token) values (...)
select token from subscription where email=:m
update subscription set status=:s where email=:m
The following columns could be added to better cope with malicious users.
Nr. | Column | type | nullable | Example or meaning |
---|---|---|---|---|
8 | lastRegist | date | null | date of last registration, relevant only for multiple subscriptions for the same e-mail |
9 | lastIP | text | null | last used IP of the web client, when used for multiple subscriptions |
3. Sketch of solution. Here are considerations and requirements for a simple newsletter software.
subscription
, see above.The token does not need to be overly confidential. Its purpose is to defend against funny/stupid/malicious actors, who want to unsubscribe people against their will.
Handling of e-mails: For reading e-mail you can use imap_headers()
, for sending imap_mail()
.
Also see Sending email using PhpMailer with Gmail XOAUTH2, and Gmail Email Inbox using PHP with IMAP.
Subscribing to the mailing list works with an empty e-mail that states Subscribe
in the subject line.
For unsubscribing you send Unsubscribe
in the subject line and the token in the body part.
These two operations are also supported by a simple web-form, which essentially asks for the e-mail address and the token from the user and then sends the confirmation e-mail and sets the status in the subscription table.
Reading e-mails is done every 20 minutes, e.g., controlled by cron.
The reading process then analyses the subject field for Subscribe
and Unsubscribe
.
This process also checks for any bounces.
In case of a bounce the status flag is set to either bounced or bounced during registration.
No distinction is made betweeen hard or soft bounces.
A subscription request makes an entry in the subscription table and sets the status column to in-limbo. The sender receives an e-mail, which he must confirm by e-mail or web form. Once the confirming e-mail is received or the web form is used to confirm then the status column is set to active. If a new subscription request is made with an already existing e-mail address then a new token is generated and sent, and the status remains its previous status, e.g., it might remain active or in-limbo.
If a malicious user subscribes to multiple e-mail addresses, which he does not own, then all these e-mail addresses are set to in-limbo. If the legitimate user now wants to subscribe, he can do so without fuss, because new tokens are sent out for any subscription requests. This prevents that e-mail addresses are blocked, which are not confirmed.
4. Web forms. The HTML form for processing subscribe and unsubscribe requests looks very simple:
First name:
Last name:
E-mail address:
Token: (only required for unsubscribe)
Changing your e-mail address is done by subscribing to the new address, and then unsubscribing from the old one.
If you have lost or deleted the token for unsubscribing, then simply subscribe again with the same e-mail address. A token will be sent to you, which you then can use for unsubscribing.
While the e-mail address is mandatory, the first and last name are optional.
The actual e-mailing can be done with below simple HTML form:
Greeting: Firstname will be taken
Content:
The following e-mails are sent depending on the circumstances:
5. Effort estimation. I expect the whole code for this to be no more than 1kLines of PHP code. I expect the following PHP programs/files:
Possible problems ahead due to hosting limitations:
To counter above limits somewhat, you can split your e-mails into batches, i.e., send 500 e-mails the first hour, then another 500 mails the next hour. For this you need an additional table, which stores the batch-number, and the message text to be sent. Obviously, you will not actually send 500 e-mails, but rather 450 or so, to cope for the confirmation mails for new subscribers or unsubscribers.
I am quite surprised that a Google search didn't reveal any program, which already does something similar. The most resembling is this phpList.
]]>Voraussetzungen: Es sei
ein beliebiges komplexes Polynom mit Koeffizienten $a_i\in\mathbb{C}$ und Nullstellen $\lambda_i\in\mathbb{C}$. Weiter sei
mit der Vereinbarung $a_{n+1}=a_{n+2}=\cdots=0$.
Behauptung: $\mathop{\rm Re}\nolimits \lambda_i<0$ genau dann, wenn
Für $a_0>0$ also $\Delta_i>0$, $i=1,\ldots,n$.
Beweis: Siehe das Buch von Gantmacher, Felix Ruvimovich (1908--1964), Gantmacher (1986), §16.6, "Matrizentheorie", Springer-Verlag, Berlin Heidelberg New York Tokyo, Übersetzung aus dem Russischen von Helmut Boseck, Dietmar Soyka und Klaus Stengert, 1986, 654 S. ☐
Der obige Satz ist ein Spezialfall des allgemeinen Satzes von Routh/Hurwitz, der es erlaubt die genaue Anzahl der Nullstellen mit echt negativen Realteil genau anzugeben. Der folgende Satz von Liénard/Chipart aus dem Jahre 1914 hat gegenüber dem Stabilitäskriterium von Routh/Hurwitz den Vorteil, nur etwa halb so viele Minoren auf ihr Vorzeichen zu untersuchen.
2. Satz: Stabilitätskriterium von Liénard/Chipart nach Chipart, A.H., Liénard, Alfred-Marie (1869--1958).
Behauptung: $\mathop{\rm Re}\nolimits \lambda_i<0$ ist äquivalent zu einer der folgenden 4 Aussagen:
(1) $a_n>0$, $a_{n-2}>0$, $\ldots$; $\Delta_1>0$, $\Delta_3>0$, $\ldots$,
(2) $a_n>0$, $a_{n-2}>0$, $\ldots$; $\Delta_2>0$, $\Delta_4>0$, $\ldots$,
(3) $a_n>0$, $a_{n-1}>0$, $a_{n-3}>0$, $\ldots$; $\Delta_1>0$, $\Delta_3>0$, $\ldots$,
(4) $a_n>0$, $a_{n-1}>0$, $a_{n-3}>0$, $\ldots$; $\Delta_2>0$, $\Delta_4>0$, $\ldots.$
Beweis: Siehe erneut Gantmacher (1986), §16.13. ☐
Für die Überprüfung eines vorgelegten Polynoms wählt man dann zweckmässigerweise von den vier Bedingungen diejenige, sodaß $\Delta_{n-1}$ oder $\Delta_n$ die geringere Zeilenzahl hat.
]]>1. Satz: Formel von Faà di Bruno Es hänge $w$ von $u$ ab, $u$ ist hierbei Funktion von $x$. Es sei $D_x^k u$ die $k$-te Ableitung von $u$ nach $x$. Dann gilt
Beweis: Siehe Knuth, Donald Ervin (*1938), The Art of Computer Programming, Volume 1 -- Fundamental Algorithms, Addison-Wesley Publishing Company, Reading (Massachusetts) Menlo Park (California) London Sydney Manila, 1972, second printing, xxi+634 S. Siehe McEliece im o.a. Buch von Knuth, McEliece, Robert James. Bezeichnet $c(n,j,k_1,k_2,\ldots)$ den Bruchterm, so rechnet man durch Differenzieren
Hierbei ist es von Vorteil unendlich viele $k_i$ anzunehmen, obwohl $k_{n+1}=k_{n+2}=\cdots=0$. Im Induktionsschritt sind $k_1+\cdots+k_n=j$ und $k_1+2k_2+\cdots+nk_n=n$ Invarianten. Man kann nun $n! / k_1! (1!)^{k_1} k_2! (2!)^{k_2}\ldots$ kürzen und gelangt dann zu $k_1+2k_2+\cdots=n+1$. Man vgl. auch Bourbaki und Schwartz. ☐
]]>Diese Darstellungen für $f$ lassen sich für vektorwertige Funktionen entsprechend verallgemeinern. Wie im Eindimensionalen liegt auch hier wieder das Schwergewicht auf der Gewinnung von Restgliedformeln, oder mit den Worten von Mangoldt und Knopp: (Mangoldt, Hans Carl Friedrich von (1854--1925, Knopp, Konrad Hermann Theodor (1882--1957))
Ausdrücklich sei noch einmal betont, daß der wesentliche Inhalt des Taylorschen Satzes nicht darin besteht, daß ein Ansatz der Form
überhaupt gemacht werden kann. Das ist vielmehr unter der alleinigen Voraussetzung, daß $f^{(n)}(x_0)$ existiert, für jedes seinem Betrage nach hinreichend kleines $h$ unter allen Umständen möglich. $\ldots$ $R_n$ ist lediglich eine abkürzende Bezeichnung für die Differenz der linken Seite und der Summe dieser $(n+1)$ ersten Summanden der rechten Seite. Das Schwergewicht des Problems und damit der allein wesentliche Inhalt des Taylorschen Satzes liegt ausschließlich in den Aussagen, die über dieses Restglied gemacht werden können.
1. Defintion: (Multiindizes) Für $\alpha=(\alpha_1,\ldots,\alpha_n)\in\mathbb{N}^n$ sei die Ordnung eines Multiindex und die Multifakultät definiert zu
Ist $f$ eine $\left|\alpha\right|$-mal stetig differenzierbare Funktion, so sei die ^{Multiableitung} gesetzt zu
insbesondere $D_i^{\alpha_i}=D_i\ldots D_i$ ($i$ mal). Die ^{Multipotenz} für einen Vektor $x$ ist
Nach dem Satz von H.A. Schwarz, Schwarz, Hermann Armandus (1843--1921), ist die Reihenfolge des Differenzierens nach verschiedenen Variablen unerheblich, bei genügend glatter Funktion $f$.
2. Lemma: Es gilt
Beweis: Durch Induktion nach $n$, wenn man die Binomische Formel voraussetzt. Man rechnet über Induktion nach $k$, wenn man dies nicht benutzen will. Für $n=1$ ist die Behauptung klar. Für den Induktionsschluß klammert man $[x_1+(x_2+\cdots+x_n)]^k$. ☐
Entsprechend gilt
also
Generalvoraussetzung: $f\colon U\subset\mathbb{R}^n\rightarrow\mathbb{R}$ sei $k$-mal stetig differenzierbar auf der offenen Menge $U$. Es sei $x\in U$ und $h\in\mathbb{R}^n$ derart, daß $x+th\in U$, $\forall t\in[0,1]$. Es sei $g\colon[0,1]\rightarrow\mathbb{R}$, mit $g(t):=f(x+th)$.
3. Hilfssatz: Die Funktion $g$ ist $k$-mal stetig differenzierbar und
Beweis: Induktion nach der Ordnung des Multiindex, also nach $k$. Für $k=1$ ist nach der Kettenregel
Induktionsschluß von $(k-1)\rightarrow k$:
Anwenden der Kettenregel und des Lemmas liefert
☐
4. Satz: Satz von Taylor, Taylor, Brook (1685--1731). Es sei $f$ jetzt sogar $(k+1)$-mal stetig differenzierbar. Dann existiert ein $\theta\in[0,1]$, so daß
Beweis: $g$ ist wie $f$ mindestens $(k+1)$-mal stetig differenzierbar. Nach der Taylorformel für eine Veränderliche existiert ein $\theta\in[0,1]$, so daß
Einsetzen der im Hilfssatz ermittelten Formeln liefert unmittelbar das Ergebnis. ☐
5. Corollar: Es sei $f$ mindestens $k$-mal stetig differenzierbar und es sei $h$ hinreichend klein. Dann gilt
dabei steht $o(\left|h\right|^k)$ als Abkürzung für eine Funktion $\varphi$ mit $\varphi(0)=0$ und
Beweis: Nach dem vorhergehenden Satz gibt es ein von $h$ abhängiges $\theta\in[0,1]$, mit
wobei
Wegen der vorausgesetzten Stetigkeit von $D^\alpha f$ verschwindet $r_\alpha(\cdot)$ bei 0, also $\displaystyle\lim_{h\to0} r_\alpha(h)=0$. Setzt man
so folgt $\displaystyle\lim_{h\to0} {\varphi(h) / \left|h\right|^k} = 0$, d.h. $\varphi(h)=o(\left|h\right|^k)$, denn
☐
Der Satz von Taylor im $\mathbb{R}^m$ entsteht durch komponentenweise Anwendung der vorherigen Resultate. Man benötigt allerdings $m$ möglicherweise verschiedene Zwischenstellen.
6. Beispiel: Es sei $f\colon\mathbb{R}\rightarrow\mathbb{R}^3$ mit $f(t):=(\sin t,{\mskip 3mu}\cos t,{\mskip 3mu}t)$. Dann ist $f'(t)=(\cos t,{\mskip 3mu}-\sin t,{\mskip 3mu}1)$ und wenn man nur eine einzige Zwischenstelle zulässt erhält man den Widerspruch
Aus $\cos\xi=0=\sin\xi$ folgt $\cos^2\xi+\sin^2\xi=0$.
Literatur: Otto Forster (*1937): Analysis 2.
]]>1. Satz: Voraussetzungen: Es seien $a_{ij}(\lambda)$ differenzierbare Funktionen. Es sei
ferner
insbesondere $\displaystyle{ \alpha_i^j = (-1)^{i+j} A_{1\ldots\widehat\imath\ldots n}^{1\ldots\widehat\jmath\ldots n}. }$
Behauptung:
Beweis: Entwickelt man $A(\lambda)$ nach dem Laplaceschen Entwicklungssatz nach der $i$-ten Zeile, so erkennt man $\partial A/\partial(a_{ij}) = \alpha_i^j$. Anwenden der Kettenregel liefert die mittleren Identitäten. Die letzte Identität ist nur eine Umsortierung der vorherigen (Laplacescher Entwicklungssatz rückwärts gelesen). ☐
Man vgl. auch Bourbaki (1976): "Éléments de mathématique: Fonctions d'une variable réelle -- Théorie élémentaire", Hermann, Paris, 1976, 54+38+69+46+55+31+38 S. = 331 S.
2. Die Jacobimatrizen einiger Matrizenfunktionen, wie Spur, Determinante, Matrizenprodukt.
Es sei $y=f(x_{11},\ldots,x_{1n},x_{21},\ldots,x_{2n},\ldots,x_{m1},\ldots,x_{mn})$ eine reelle Funktion in $mn$ Veränderlichen, also $y=f(X)$. Es bezeichne
Im Falle $X=(x_1,\ldots,x_n)$ ist ${{dy\over dX}=\nabla y}$.
3. Satz: (1) $\displaystyle{{d{\mskip 5mu}ax\over dx} = a}$, $\displaystyle{{d{\mskip 5mu}x^\top Ax\over dx} = 2Ax}$, ($A=A^\top$).
(2) $\displaystyle{{d{\mskip 5mu}\ln\det X\over dX} = (X^\top)^{-1}}$, $\displaystyle{{d{\mskip 5mu}\det X\over dX} = (\det X)^{-1} (X)^{-1}}$.
(3) $\def\tr{\mathop{\rm tr}}\displaystyle{{d{\mskip 5mu}\tr X^{-1}A\over dX} = -(X^{-1} A X^{-1})^\top}$.
Beweis: (1) ist klar. Bei (2) beachte man
entsprechend
Zu (3): Es gelten
☐
]]>1. Sei $f$ eine geeignet gewählte holomorphe Funktion. Dann definiert man für eine quadratische Matrix $A$ die Matrixfunktion $f(A)$ zu
Wegen des Satzes von Cauchy, Cauchy, Augustin Louis (1789—1857), hängt $f(A)$ nicht von der Wahl der Kurve $\Gamma$ ab. Offensichtlich ist $S^{-1}f(A)S=f(S^{-1}AS)$, für jede invertierbare $(n\times n)$-Matrix $S$. Ohne Einschränkung kann man deshalb $A$ bei den weiteren Überlegungen als Jordanmatrix, Jordan, Camille (1838—1922), voraussetzen. Also $A = J = \mathop{\rm diag}(J_\nu)_{\nu=1}^k$, wobei $J_\nu$ Jordanblock ist. Es ist
Viele Behauptungen reduzieren sich damit also sogar lediglich auf die Betrachtung eines einzelnen Jordanblockes $J_\nu$, mit $J_\nu=\lambda_0\delta_{xy}+\left(\delta_{x+1,y}\right)_{x,y=1}^m$.
2. Sei nun $J$ Jordan-Block der Größe $k\times k$ zum Eigenwert $\lambda_0$. Dann gilt
Insbesondere für die spezielle Funktion $f(\lambda):=\lambda^n$ ergibt sich
wobei $\lambda^{-j}:=0$, für $j\in\mathbb{N}$.
3. Diese Darstellungen finden ihre Begründung durch den folgenden Satz, obwohl für den Fall $\lambda^n$ die Darstellung auch leicht direkt unter Benutzung von $J^n = (\lambda I + N)^n$, mit geeignetem Nilpotenzblock $N$ und der binomischen Formel bewiesen werden kann. Man braucht dann nicht den ganzen Weg über Matrizenfunktionen zu gehen. Möchte man die Integraldarstellung stärker berücksichtigen rechnet man wie folgend. Allgemein ist $f(A)=(1/2\pi i)\int_\Gamma f(z)(Iz-A)^{-1}dz$. Entwicklung des Cauchy-Kernes liefert
Dann berechnet man das Residuum durch Vertauschen von Integration und Summation zu
4. Satz: Es ist
Sind $f$ und $g$ holomorph auf (möglicherweise verschiedenen) Umgebungen des Spektrums von $A$, so gilt
Beweis: Es genügt, w.o. bemerkt, sich auf ein einziges Jordankästchen $J$ der Größe $m\times m$ zu beschränken. Es sei $\Gamma$ ein positiv orientierter Kreis um $\lambda_0$. Es ist
wobei $N = (\delta_{x+1,y})_{x,y}^m$, also $N^m=0\in\mathbb{C}^{m\times m}$ ist. Wegen $\int_\Gamma d\lambda/(\lambda-\lambda_0)=2\pi i$, und $\int_\Gamma (\lambda-\lambda_0)^k d\lambda=0$, für $k\in\mathbb{Z}\setminus\{-1\}$ gilt offensichtlich ${1\over2\pi i}\int_\Gamma (I\lambda-J)d\lambda=I$ und
Die additive Linearität ist klar. Für die multiplikative Aussage schließt man: Ist $f(\lambda)=\sum_{k=0}^\infty (\lambda-\lambda_0)^k f_k$ und $g(\lambda)=\sum_{k=0}^\infty (\lambda-\lambda_0)^k g_k$, so ist $f(\lambda)g(\lambda)=\sum_{k=0}^\infty (\lambda-\lambda_0)^k h_k$, mit $h_k=\sum_{i=0}^k f_i g_{k-i}$. Folglich
☐
Mit der Darstellung für $J^n$ ergibt sich leicht der folgende Sachverhalt.
5. Satz: Sei $J$ eine beliebige Jordanmatrix. Dann gelten:
(1) $J^n\to0$ genau dann, wenn $\left|\lambda\right| < 1$.
(2) $\sup_{n=1}^\infty|J^n|\le\rm const$ genau dann, wenn $\left|\lambda\right| \le 1$ und zu Eigenwerten vom Betrage 1 nur lineare Elementarteiler gehören, also die Jordanblöcke zum Eigenwert 1 stets von der Größe $(1\times 1)$ sind.
Wegen $A=XJY$, $Y=X^{-1}$ und damit $A^n=XJ^nY$ und wegen $\left|A^n\right|\le\left|X\right|\cdot\left|J^n\right|\cdot\left|Y\right|$, erhält man daher für eine beliebige quadratische Matrix $A$ den folgenden Satz.
6. Satz: Seien $\lambda_i$ für $i=1,\ldots k$, die Eigenwerte der Matrix $A$. Dann gelten
(1) $\def\mapright#1{\mathop{\longrightarrow}\limits^{#1}}|A|\mapright{n\to\infty}0$ genau dann, wenn $|\lambda_i|<1$, für alle $i=1,\ldots,k$, und
(2) $|A^n|$ beschränkt für alle $n\in\mathbb{N}$ genau dann, wenn $|\lambda_i|\le1$ und zu Eigenwerten vom Betrage 1, nur $(1\times 1)$-Jordanblöcke korrespondieren.
7. Bemerkung: Es gelten die Äquivalenzen
Beweis: Zu: $\sum_{n=0}^\infty A^n=(I-A)^{-1}$, falls $\rho(A)<1$. Ist $\lambda$ Eigenwert von $A$, so ist $(1-\lambda)$ Eigenwert von $(I-A)$. Wegen $|\lambda|<1$, ist $(I-A)$ invertierbar. Weiter
Somit gilt für alle $n\in\mathbb{N}$
und damit folgt wegen $A^n\to0$, die Behauptung. Die Rückrichtung $\rho(A)<1$, falls $\sum A^n = (I-A)^{-1}$ ist klar aufgrund der notwendigen Konvergenzbedingung für die Reihe. Die restlichen Äquivalenzen ergeben sich u.a. mit Hilfe des vorhergehenden Satzes und sind offensichtlich. ☐
8. Eine andere Anwendung für die Darstellung von $J^n$, ist die Lösungsdarstellung für homogene, lineare Differenzengleichungen mit konstanten Koeffizienten. Durch Übergang von der Begleitmatrix zur Jordanmatrix erkennt man dann recht schnell die Lösungsdarstellung für die Differenzengleichung. Es ist
also
9. Satz: Voraussetzung: Es habe $L(\lambda)=\lambda^\ell+a_{\ell-1}\lambda^{\ell-1}+\cdots+a_0 \in \mathbb{C}$ die Faktorisierung
Behauptung: Der Lösungsraum der homogenen, linearen Differenzengleichung $a_{m+\ell}+a_{\ell-1}x_{m+\ell-1}+\cdots+a_0x_m=0$ hat die Dimension $\ell$ und wird aufgespannt von
wobei $\mathop{\rm grad} p_\nu=\eta_\nu-1$, $\nu=1,\ldots,k$. Der Fall $\mathop{\rm grad} p_\nu=0$ bedeutet dabei Konstante.
Beweis: Sei $u_m:=(x_{m-1+\ell},\ldots,x_m)\in\mathbb{C}^\ell$. Die Lösung der Differenzengleichung $L(E)x_m=0$ lautet $u_m = C_1^m u_0 = X J^m Y u_0$, wobei $Y=X^{-1}$ die Matrix der Linksjordanvektoren und $X$ die Matrix der Rechtsjordanvektoren ist. Die Multiplikation von links mit $X$ und von rechts mit $Y$ bewirkt eine Vermischung der einzelnen Jordankästchen. Nach Ausklammern von gemeinsamen Faktoren stehen vor $\mu_\nu$ Summen von Binomialkoeffizienten $m\choose\rho_\nu$, $0\le\rho_\nu<\eta_\nu$, $\nu=1,\ldots,k$, also Polynome in $m$. Da $C_1$ stets nicht-derogatorisch ist — betrachte Minor $(C_1)_{1,\ldots,n-1}^{2,\ldots,n}$ — beträgt der Grad von $p_\nu$ genau $\eta_\nu-1$, wegen $\mathop{\rm grad}{m\choose\eta_\nu-1}=\eta_\nu-1$. Aufgrund von $\sum\eta_\nu=\ell$ hat man insgesamt $\ell$ freie Parameter. Noch zu zeigen: die lineare Unabhängigkeit der angegebenen Lösung. ☐
10. Corollar: Die Folgen $(m^i{\mskip 3mu}\mu_\nu^m)$, $i=0,\ldots,\eta_\nu-1$, für $\nu=1,\ldots,\ell$, bilden eine Basis für den Lösungsraum der Differenzengleichung.
1. Es gibt auch einen anderen Zugang zu holomorphen Matrixfunktionen, siehe den Artikel der beiden Autoren Yasuhiko Ikebe und Toshiyuki Inagaki, Ikebe/Inagaki (1986), "An Elementary Approach to the Functional Calculus for Matrices", The American Mathematical Monthly, Vol 93, No 3, May 1986, pp.390—392
Sei $f$ in einer Umgebung von $\{\lambda_1,\ldots,\lambda_r\}$ genügend oft differenzierbar. Für ein festes $n\in\mathbb{N}$ setzt man
Für $f(z)=z$ ergibt sich
d.h. also ein einfacher Jordanblock der Größe $n\times n$ zum Eigenwert $\lambda$. Mit $J$ sei stets ein solcher Jordanblock gemeint. Ist $f(z)\equiv c=\rm const$, so ist $f^*(z)=cI$.
Die Abbildung $*\colon f\rightarrow f^*$ ist ein Homomorphismus der Algebra der analytischen Funktionen in einer Umgebung von $\{\lambda_1,\ldots,\lambda_r\}$ in die kommutative Algebra der oberen Dreiecksmatrizen.
2. Satz: (Homomorphiesatz) Es gelten
(1) $(f+g)^* = f^* + g^*$, Additivität,
(2) $(cf)^* = c{\mskip 3mu}f^*$, $c\in\mathbb{C}$ fest, Homogenität,
(3) $(fg)^* = f^* {\mskip 3mu} g^* = g^* {\mskip 3mu} f^*$, Multiplikation und Kommutativität,
(4) $(f/g)^* = f^* {\mskip 3mu} (g^*)^{-1} = (g^*)^{-1}{\mskip 3mu} f^*$, falls $g^*(z)\ne0$, Quotientenbildung und Kommutativität,
(5) $(1/g)^* = (g^*)^{-1}$, falls $g^*(z)\ne0$, Inversenbildung.
Durch wiederholtes Anwenden von (1), (2) und (4) ergibt sich sofort
3. Corollar: Sei $f$ eine rationale Funktion ohne Pol in $\lambda$ und sei $f=p/q$ die vollständig gekürzte Darstellung, mit also teilerfremden Polynomen $p$ und $q$. Dann gilt
Aber auch für Potenzreihen rechnet man wie erwartet. Dies zeigt die
4. Folgerung: Sei $f(\lambda)=a_0+a_1z+\cdots{\mskip 3mu}$ eine Potenzreihe mit Konvergenzradius echt größer als $\left|\lambda\right|$. Dann gilt $ f^*(\lambda) = a_0I+a_1J+\cdots{\mskip 3mu}. $
Zu einer vorgegebenen festen quadratischen Matrix $A$ sei die (bis auf Permutation eindeutige) Jordannormalform $X^{-1}AX=\mathop{\rm diag}\left(J_1,\ldots,J_m\right)$ betrachtet. Hierbei ist $X$ (Matrix der Rechtsjordanketten) invertierbar. $J_i$ bezeichnet einen einfachen Jordanblock zum Eigenwert $\mu_i$, $i=1,\ldots,m$. Die $\mu_i$ müssen nicht notwendig verschieden sein. Ist $f$ eine analytische Funktion in der Umgebung von $\{\mu_1,\ldots,\mu_m\}$, so definiert man $f(A)$ durch
Das Corollar und die Folgerung zeigen, daß $f(A)$ übereinstimmt mit dem, was man gängigerweise erwartet, zumindestens für rationale Funktionen und für Potenzreihen. Direkt aus der Definition folgt
5. Satz: Identitätssatz. Seien $\lambda_1,\ldots,\lambda_r$ die verschiedenen Eigenwerte von $A$. Die Funktionen $f$ und $g$ seinen analytisch in einer Umgebung von $\{\lambda_1,\ldots,\lambda_r\}$. Dann gilt Gleichheit $f(A)=g(A)$ genau dann, wenn die Ableitungen an den Eigenwerten bis zu entsprechender Ordnung übereinstimmen, also
wobei $m_k$ die Größe des größten Jordanblockes zum Eigenwert $\lambda_k$ bezeichnet.
Die oben als Definition für $f(A)$ benutzte Integralformel lässt sich nun, da Funktionen von Matrizen jetzt anders definiert wurden, auch beweisen.
6. Satz: Integraldarstellung für $f(A)$. Sei $\Gamma$ eine einfache geschlossene Kurve, die in ihrem Inneren die sämtlichen Eigenwerte von $A$ umschließt. Sei $f$ holomorph auf $\Gamma$ und im Inneren von $\Gamma$. Dann gilt
Beweis: Wie üblich reduziert sich der Beweis auf die Betrachtung eines einzelnen Jordanblockes $J$ der Größe $n\times n$. Man rechnet
Beim Übergang von der ersten Zeile zur zweiten Zeile wurde benutzt
und beim Übergang von der $2^{\rm ten}$ zur $3^{\rm ten}$, daß die Inverse von $I\tau-J$ halt so aussieht. ☐
Der vorletzte Satz (Identitätssatz für Matrixfunktionen) zeigt, daß für eine feste Matrix $A$, die Matrixfunktion als Matrixpolynom darstellbar ist, da eine Übereinstimmung nur an endlich vielen Ableitungen gefordert ist. Sind die $m_k$ ($k=1,\ldots,r$) bekannt, so kann für eine feste Matrix $A\in\mathbb{C}^{n\times n}$ ein Ansatz der Form $g(\lambda) = a_{n-1}\lambda^{n-1} + \cdots + a_1\lambda + a_0$ gemacht werden, und man erhält die $a_i$ als Lösung einer Hermiteschen Interpolationsaufgabe. Sind alle Eigenwerte verschieden, also $m_k=1$ ($k=1,\ldots,r$), so liegt eine gewöhnliche Interpolationsaufgabe zugrunde. Die Lösung geschieht beispielsweise mit Newtonschen Differenzen oder der Lagrangeschen Formel, u.U. auch über die Cramersche Regel. Zu überprüfen ist, ob $f(\lambda)$ für die Eigenwerte $\lambda_1,\ldots,\lambda_r$ auch tatsächlich definiert ist. Probleme treten z.B. auf bei $f(\lambda)=\sqrt\lambda$, $f(\lambda)=\ln\lambda$, für $\lambda\notin\mathbb{R}^+$. Für $A\in\mathbb{C}^{1\times1}$ entartet die Aussage des Identitätssatzes in eine leere Aussage, nämlich $f=g\iff f=g$.
Einfache Folgerungen direkt aus der Definition von Matrizenfunktionen sind nun die folgenden Ergebnisse.
7. Satz: Satz von Cayley/Hamilton, 1.te Fassung, Cayley, Arthur (1821—1895), Hamilton, William Rowan (1805—1865). Das charakteristische Polynom $\chi(z)=\det(Iz-A)$ für $A\in\mathbb{C}^{n\times n}$ annulliert als Matrixpolynom aufgefaßt $A$, also es gilt $\chi(A)=0\in\mathbb{C}^{n\times n}$.
Beweis: Nach Charles A. McCarthy (1975): "The Cayley-Hamilton Theorem", The American Mathematical Monthly, April 1975, Vol 82, No 4, pp.390—391. Die Inverse von $Iz-A$ ist $\left[\det(Iz-A)\right]^{-1} M_{\mu\nu}(z)$, wobei $\mathop{\rm grad} M_{\mu\nu}\le n-1$. Die Integraldarstellung von $\chi(A)$ liefert
nach dem Cauchyschen Integralsatz ($\int_\Gamma f=0$, $f$ holomorph). ☐
8. Definition: Zu einer Matrix $A\in\mathbb{C}^{n\times n}$ mit Eigenwerten $\lambda_1,\ldots,\lambda_r$ ($r\le n$) und Jordannormalform $A\sim\mathop{\rm diag}(J_1,\ldots,J_s)$ ($r\le s\le n$) heißt
das Minimalpolynom zu $A$. Hierbei ist $m_\nu$ die Ordnung des größten Jordanblocks zum Eigenwert $\lambda_\nu$. Zu $A={1{\mskip 3mu}0\choose0{\mskip 3mu}2}$ ist $\hat\chi(z)=(z-1)(z-2)$, zu $A=I$ ist $\hat\chi(z)=z-1$ unabhängig von $n$, und zu $A=\mathop{\rm diag}[{1{\mskip 3mu}1\choose0{\mskip 3mu}1},1,1,1]$ ist $\hat\chi(z)=(z-1)^2$ das Minimalpolynom.
9. Ähnliche Matrizen haben die gleiche Jordannormalform bis auf Umnumerierung von Jordanblöcken, daher das gleiche Minimalpolynom und auch das gleiche charakteristische Polynom. Offensichtlich verschwindet jeder Faktor $(J-\lambda_\nu I)^k$ ($\forall k\ge m_\nu$) für jeden Jordanblock $J$ zum Eigenwert $\lambda_\nu$, also $\hat\chi(A)=0\in\mathbb{C}^{n\times n}$, aber $(J-\lambda_\nu I)^k\ne0$ ($\forall k<m_\nu$). Damit ist $\hat\chi(z)$ ein Polynom minimalen Grades, welches $A$ annulliert. Aufgrund des führenden Leitkoeffizienten gleich 1 ist $\hat\chi(z)$ sogar eindeutig bestimmt. Da $\hat\chi$ stets Teiler von $\chi(z)=\det(Iz-A)$ ist, folgt
10. Satz: Satz von Cayley/Hamilton, 2.te Fassung, Cayley, Arthur (1821—1895), Hamilton, William Rowan (1805—1865). $\chi(A)=0\in\mathbb{C}^{n\times n}$. In Worten: Die Matrix $A$ annulliert ihr eigenes charakteristisches Polynom.
]]>