Vollständiges elliptisches Integral II. Art

Im Beitrag Vollständiges elliptisches Integral I. Art erwähne ich die Beschäftigung mit der Hertz’schen Pressung. Diese verlangt aber auch noch nach der II. Art dieser Kategorie eines Elliptischen Integrals.

Die 3. Formel der angeführten Reihenentwicklungen auf THE WOLFRAM FUNCTIONS SITE ist \( K(z) \) sehr ähnlich: \[ E(z) = \frac \pi 2 \sum_{k = 0}^\infty \frac {\left( – \frac 1 2 \right)_k \left( \frac 1 2 \right)_k z^k}{k!^2} \]
Die darin vorkommenden indizierten Klammerausdrücke sind das bereits veröffentlichte Pochhammer-Symbol.
Da eine Konvergenz nur für \( |z|<1 \) gegeben ist, braucht es für \( z<-1 \) noch die Identität \( E(z<-1) = \sqrt {1-z} E \left( \frac z {z-1} \right) \), als zweite von 7 angebotenen auf THE WOLFRAM FUNCTIONS SITE.
Um eine annehmbare Genauigkeit zu erhalten, müssen ausreichend viele Glieder aufsummiert werden, wobei Fakultäten – insbesondere potenziert – dem allzu schnell ein Ende setzen können. Es bietet sich hier also an, die Quotienten \( \frac {\left( – \frac 1 2 \right)_k}{k!} \) und \( \frac {\left( \frac 1 2 \right)_k}{k!} \) zu multiplizieren, was mit \( \left( – \frac 1 2 \right)_k = – \frac {(2k – 2)!}{2^{2k-1} (k-1)!} \) und \( \left( \frac 1 2 \right)_k = \frac {(2k – 1)!}{2^{2k-1} (k-1)!} \) zu \( – \frac 1 {2 \pi} \frac {\Gamma \left[ – \frac 1 2 +k \right]}{\Gamma \left[ 1+k \right]} \frac {\Gamma \left[ \frac 1 2 +k \right] }{\Gamma \left[ 1+k \right]} \) führt. \( \Gamma \) steht dabei für die Gamma-Funktion, die Excel anbietet, weswegen einer Formel nichts mehr im Wege steht. Als Besonderheiten müssen noch folgende speziellen Werte berücksichtigt werden: \( K(1) = 1 \) , \( K(0) = \frac \pi 2 \) und \( K(-1) = \frac {2 \Gamma \left( \frac 3 4 \right)^4 + \pi^2}{2 \sqrt {2 \pi} \Gamma \left( \frac 3 4 \right)^2} \).

Damit die Formel alle Glieder aufsummiert, muss sie als Matrixformel (Arrayformel) eingegeben werden. Die Begrenzung der Gliederanzahl kommt dabei von der größtmöglichen positiven Zahl in Excel, weswegen die Gamma-Funktion keine größere ganze Zahl als 171 zulässt.

Das kann auch mittels der Benutzerdefnierten Funktion E_z(z) erfüllt werden, wobei z eine einzelne Zahl, eine Matrix-Konstante, eine einzelne Zelle oder ein einzeiliger oder einspaltiger Zellbereich sein darf. Nicht mehr die Anzahl der Glieder ist schlagend, sondern die geforderte Genauigkeit, fixiert auf die 15 signifikanten Stellen in Excel, bei deren Erreichen abgebrochen wird. Die Restriktion der Gamma-Funktion kann umgangen werden, weil in einer Schleife nicht jedes Glied gänzlich neu berechnet werden muss. Auch noch Rechenzeit sparend, ist ein neues Glied das vorhergehende multipliziert mit deren Quotienten.

Die nachfolgenden Datei enthält alles obig Beschriebene nachvollziehbar, wobei der Vergleich mit Werten aus Mathematica gezogen wird:

Bemerkung: Wegen der Funktion GAMMA nicht als 97-2003-Version.

Vollständiges elliptisches Integral I. Art

Obwohl mir der Begriff des Elliptischen Integrals seit Langem geläufig ist, drängte sich mir nie eine Anwendung dafür auf. Zum Teil wahrscheinlich deshalb, weil die Abhilfe zu deren Umgehung oftmals in Tabellenform vorliegt.

Als ich mich kürzlich intensiver mit der Hertz’schen Pressung beschäftigte, stolperte ich über eine nun als solche erkannte, schon des Öfteren benutzte Tabelle! Die vorliegenden Zahlenwerte in ein eigenes Tabellenblatt zu tippen und mittels SVERWEIS zu interpolieren, wäre die althergebrachte Vorgehensweise mit existenten Excel-Methoden gewesen.
Alternativ zeigt die 3. Formel der angeführten Reihenentwicklungen auf THE WOLFRAM FUNCTIONS SITE: \[ K(z) = \frac \pi 2 \sum_{k = 0}^\infty \frac {\left( \frac 1 2 \right)_k \left( \frac 1 2 \right)_k z^k}{k!^2} \]
Der darin doppelt vorkommende indizierte Klammerausdruck ist das bereits veröffentlichte Pochhammer-Symbol.
Da eine Konvergenz nur für \( |z|<1 \) gegeben ist, braucht es für \( z<-1 \) noch die Identität \( K(z<-1) = \frac 1 {\sqrt {1-z}} K \left( \frac z {z-1} \right) \), als zweite von 7 angebotenen auf THE WOLFRAM FUNCTIONS SITE.
Um eine annehmbare Genauigkeit zu erhalten, müssen ausreichend viele Glieder aufsummiert werden, wobei Fakultäten – insbesondere potenziert – dem allzu schnell ein Ende setzen können. Es bietet sich hier also an, den Quotienten \( \frac {\left( \frac 1 2 \right)_k}{k!} \) zu quadrieren, was mit \( \left( \frac 1 2 \right)_k = \frac {(2k – 1)!}{2^{2k-1} (k-1)!} \) zu \( \frac {\Gamma \left[ \frac 1 2 +k \right]}{\sqrt \pi \Gamma \left[ 1+k \right]} \) führt. \( \Gamma \) steht dabei für die Gamma-Funktion, die Excel anbietet, weswegen einer Formel nichts mehr im Wege steht. Als Besonderheiten müssen noch folgende speziellen Werte berücksichtigt werden: \( K(1) = \infty \) , \( K(0) = \frac \pi 2 \) und \( K(-1) = \frac {\Gamma \left( \frac 1 4 \right)^2}{4 \sqrt {2 \pi}} \).

Damit die Formel alle Glieder aufsummiert, muss sie als Matrixformel (Arrayformel) eingegeben werden. Die Begrenzung der Gliederanzahl kommt dabei von der größtmöglichen positiven Zahl in Excel, weswegen die Gamma-Funktion keine größere ganze Zahl als 171 zulässt.
Die Formel zeigt deutliche Abweichungen in der Nähe von 1, weil dort die Gliederanzahl nicht mehr auslangt, und hat den Nachteil, dass sie nicht mehrere \( z \) gleichzeitig bedienen kann, weil die Matrixfähigkeit schon für die Gliedersummierung verbraucht wurde!

Das alles kann mittels der Benutzerdefnierten Funktion K_z(z) erfüllt werden, wobei z eine einzelne Zahl, eine Matrix-Konstante, eine einzelne Zelle oder ein einzeiliger oder einspaltiger Zellbereich sein darf. Nicht mehr die Anzahl der Glieder ist schlagend, sondern die geforderte Genauigkeit, fixiert auf die 15 signifikanten Stellen in Excel, bei deren Erreichen abgebrochen wird. Die Restriktion der Gamma-Funktion kann umgangen werden, weil in einer Schleife nicht jedes Glied gänzlich neu berechnet werden muss. Auch noch Rechenzeit sparend, ist ein neues Glied das vorhergehende multipliziert mit deren Quotienten.

Die nachfolgenden Datei enthält alles obig Beschriebene nachvollziehbar, wobei der Vergleich mit Werten aus Mathematica gezogen wird:

Bemerkung: Wegen der Funktion GAMMA nicht als 97-2003-Version.

Pochhammer-Symbol

Für mich als “bloßen” Maschinenbauer hält die Mathematik naturgemäß noch immer Rätsel bereit, so auch kürzlich mit dem Ausdruck \( (a)_n \). Mittels Google fand sich schließlich das bis dato noch nie gebrauchte und mir somit gänzlich unbekannte Pochhammer-Symbol. Darauf gestoßen bin ich auf der Suche nach Reihen-Formeln für elliptische Integrale.

Excel bietet diesbezüglich keine eigene Funktion an, weswegen eine Umsetzung mit anderen, vorhandenen Funktionen nötig war. Da sich eine ausführliche Systematik des Symbols auch bei Wolfram Research findet, stand dem nichts mehr im Wege.
Die Parameter \( a \) und \( n \) schreien zumindest für mich förmlich nach einer Matrixformel, die beide gleichzeitig bedienen kann. Leider verweigerte mir die vorhandene Funktion PRODUKT(Zahl1; [Zahl2]; …) dies, da Zahl1 dazu ein Bereich hätte sein müssen, welcher aber bestimmungsgemäß ausmultipliziert wird. Blieb also “nur” die “abgespeckte” Form des Spaltenvektors, wobei auch die Formel in einer einzelnen Zelle als Matrixformel eingegeben werden muss, damit die einzelnen Faktoren für das Produkt erzeugt werden! Das “Umstricken” einer umgekehrten Anordnung sollte für den geübten “Excelianer” kein Problem darstellen.
Für die “Vollversion” musste ich also VBA bemühen und eine Benutzerdefinierte Funktion POCHHAMMER(a;n) programmieren. \( a \) darf dabei eine einzelne Zahl, eine Matrix-Konstante, eine einzelne Zelle oder ein einzeiliger oder einspaltiger Zellbereich sein. Gleiches gilt für \( n \), wobei hier sinnvollerweise ganze Zahlen erwartet würden. Die FOR-Schleife sorgt bei Nichterfüllung aber ohnehin dafür. Die umgekehrte Anordnung kann einfach mit MTRANS(POCHHAMMER(a;n)) bewerkstelligt werden.

Die folgende Datei enthält die Tabellenblätter Formel und UDF, um Obiges nachvollziehbar zu machen. Formel enthält in Spalte C Einzelformeln, der Rest sind Matrixformeln, eine einzige findet sich in UDF:

Bereich invers durchlaufen

In VBA verwendet man zum Durchlaufen von Aufzählungen (z. B. Workbooks, Worksheets,…) gewöhnlich die For Each…Next-Anweisung.
Will man dies in umgekehrter Reihenfolge tun, dann geht das mittels For *.Count To 1 Step -1…Next, wenn für die jeweilige Aufzählung die Eigenschaft Count vorliegt und auf die einzelnen Elemente per Index zugegriffen werden kann.
Ein Zellbereich bietet das mit Cells.Count zwar auch an, aber die Items beziehen sich nicht direkt auf den gesamten Bereich, sondern zuerst auf Areas, die sich schließlich auf den Bereich selbst beziehen. Da ein Bereich aus mehreren Areas bestehen kann, müssen also diese und die darin enthaltenen Items abgearbeitet werden.

Die Lösung sind 2 verschachtelte, invers laufende “For…Next”-Schleifen, die Areas und Cells abarbeiten und einer Collection übergeben. Anstatt der Aufzählung könnte auch ein temporärer Name mit den Bezügen gefüttert werden, was aber einen Eingriff im Tabellenblatt oder in der Arbeitsmappe bedeuten würde.

Die Benutzerdefinierte Funktion RANGEINVERSION(Bereich) erwartet einen Bereich, der sich aus einer Selektion, einem Namen oder aus VBA-Code heraus ergeben kann.
Das Tabellenblatt RANGEINVERSION der folgenden Arbeitsmappe bietet dazu einen Test mittels des Namens Testrange an:

Linie glätten 5

Wie in Linie glätten 4 versprochen, folgt nun das – im Vergleich zu 2 Polynomen 3. und 4. Grades – deutlich einfachere und trotzdem funktionierende Prinzip zur Bestimmung einer Tangente mit den beiden Nachbarpunkten.

Gegeben seien ein Anfangspunkt A, ein Mittenpunkt M und ein Endpunkt E, durch die eine geglättete Kurve verlaufen soll.
Gesucht ist die Tangente im Punkt M, die jener der von mir favorisierten Straklatte am nächsten kommt.
Tangentenvektor \( \vec m \) als Linearkombination der normierten Vektoren \( \vec a = \vec {AM} \) und \( \vec e = \vec {ME} \): \( \vec m = p \cdot \frac {\vec a}{\vert \vec a \vert} + \frac 1p \cdot \frac {\vec e}{\vert \vec e \vert} \)
Gewichtungsfaktor \( p \) ist dabei eine Potenz mit dem Quotienten der Vektorenbeträge als Basis und einem Gewichtungsexponenten \( q \) als Exponent: \( p = \left ( \frac { \vert \vec e \vert }{ \vert \vec a \vert } \right ) ^q = \left ( \frac { \vert \vec e \vert ^2 }{ \vert \vec a \vert ^2 } \right ) ^{q/2} \)
Der Tangentenwinkel \( \varphi \) ergibt sich zu: \[ \varphi = \arctan \frac {m_y}{m_x} = \arctan \frac {\left ( \vert \vec e \vert ^2 \right ) ^{0{,}5+q} a_y + \left ( \vert \vec a \vert ^2 \right ) ^{0{,}5+q} e_y}{\left ( \vert \vec e \vert ^2 \right ) ^{0{,}5+q} a_x + \left ( \vert \vec a \vert ^2 \right ) ^{0{,}5+q} e_x} \]
Damit lässt sich mit \( – \infty \le q \le + \infty \) der Tangentenwinkel \( \varphi \) beliebig zwischen den beiden Vektoren \( \vec a \) und \( \vec e \) einstellen.
Die Microsoft’sche Methode ergibt sich somit beim Gewichtungsexponenten \( q = -0{,}5 \).

Das Tabellenblatt Gewichtung dient der Bestimmung des Gewichtungsexponenten \( q \):

  • 5 unterschiedlichen Gewichtungsexponenten \( q \) lassen sich in Zelle B8 aktivieren, um die Vektoraddition \( \vec a_p + \vec e_p \) und den Verlauf der Segmente 1 und 2 im Diagramm zu veranschaulichen.
  • Wie in einem Falle von Linie glätten 4 liegen ja auch hier 2 Polynome 3. Grades vor. Um für den dortigen Fall mit A(-1;1), M(0;0) und E(1;2) den gleichen Tangentenwinkel zu erhalten, bräuchte es \( q=0{,}722557… \), was mit einer Abweichung von nur 2,2% “verdächtig” nahe an \( \frac {1}{\sqrt{2}} = 0{,}707106… \) liegt!
  • Der Kehrwert des Goldenen Schnittes mit \( \frac {\sqrt {5} – 1}{2} = 0{,}618033… \) wäre mir übrigens auch sehr willkommen gewesen. 😉

Im Tabellenblatt Spline werden an 4 Segmenten folgende Effekte demonstriert:

  • Tangentenlänge \( l \): Die Länge der Tangenten der 5 Punkte
  • Anzahl der Zwischenpunkte \( n \): Nach dem Grundsatz “So wenig wie möglich, so viel wie nötig” braucht es hierfür noch einen variablen Ansatz. Da der Gradient der Steigung im Allgemeinen an den Punkten größer ist, wurde die Verteilung der Punkte sinusförmig gewählt.
  • Spannung \( c \): In die einzelne Kurve eines kubisch hermiteschen Splines integriert, lässt sich damit der Verlauf zwischen den Punkten steuern: \( f(t) = (1 + 2 t) (1 – t)^2 p_1 + t^2 (3 – 2 t) p_2 + c t (1 – t) \left [ (1 – t) m_1 – t m_2 \right ] \). Standard sei 1, 0 führt zu einem Polygonzug und negative Werte rufen eine Schleifenbildung hervor.
  • Gewichtungsexponent \( q \): Mein Favorit ist \( \frac {1}{\sqrt{2}} \), Microsoft würde \( -0{,}5 \) verwenden.
  • Methode: “Geyer” ist der Versuch einer Verbesserung der Option “Linie glätten”, “Microsoft” ist der aktuelle Standard.
  • Verzerrung: “Unzulässig” bewirkt gleiche Achsen-Skalierungen durch die automatisierte Wahl geeigneter Achsen-Grenzen, “Zulässig” überlässt diese Wahl Excel.

Die folgende Datei enthält die beiden obig beschriebenen Tabellenblätter zum spielerischen Nachvollziehen meines Ansatzes:

VERGLEICH mit Sortierung

Die Funktion VERGLEICH hatte ich schon des Öfteren problemlos benutzt, als ein damaliger Kollege um meinen Rat ersuchte, weil augenscheinlich vorhandene Werte einer Liste damit nicht gefunden wurden.
Das genaue Studium der Hilfe offenbarte, dass wir beide offensichtlich bis dahin den optionalen Vergleichstyp nicht einmal ignoriert hatten!
Für mich hatte das deswegen keine Konsequenzen, weil meine Suchen immer in aufsteigend sortierten Matrizen stattfanden. Er aber suchte nach den genau übereinstimmenden Werten, was ohne Angabe von Vergleichstyp=0 nur zufällig funktionieren konnte.

Vor kurzem wurde ich von einem ehemaligen Kollegen konsultiert, der in einer umfangreichen Auswertung wiederum mit VERGLEICH arbeitete und Vergleichstyp nicht angegeben hatte. Bezüglich seiner Fragestellung spielte das schlussendlich nur eine vernachlässigbare Rolle.
Aber es ergab sich für mich die Frage, warum VERGLEICH die Sortierung nicht gleich selbst “intern” erledigt, wenn man den Vergleichstyp als “1 oder nicht angegeben” oder “-1” festlegt. Da ohnehin “nur” die relative Position des gefunden Wertes in der Suchmatrix ausgegeben wird, bräuchte es dazu doch keine “externe” Sortierung?!

Mit dem vor kurzem veröffentlichten Quicksort drängt sich diese Lösung nun fast auf. Und so entstand nun die Benutzerdefinierte Funktion MATCH2(Suchkriterium;Suchmatrix;[Vergleichstyp]), die sich völlig identisch wie VERGLEICH verhält, aber gegebenenfalls eine interne Sortierung vornimmt. In gewohnter Manier ist auch MATCH2 für Matrixformeln (Arrayformeln) konzipiert!
Im Sinne einer kompakten Lösung wurden die Function MATCH2 als auch die Subroutine QUICKSORT4MATCH2 in einem Modul basMATCH2 untergebracht.
Die folgende Datei demonstriert die zusätzlichen Fähigkeiten von MATCH2:

Winkel zwischen Vektoren

Für die Berechnung des Winkels zwischen Vektoren wird die Umformung des Skalarprodukts \( \vec a \cdot \vec b = \vert \vec a \vert \vert \vec b \vert cos∢( \vec a, \vec b ) \) verwendet: \[ \varphi = \arccos \frac { \vec a \cdot \vec b } { \vert \vec a \vert \vert \vec b \vert } = \arccos \frac { a_1 b_1 + a_2 b_2 + a_3 b_3 } { \sqrt {a_1^2+a_2^2+a_3^2} \sqrt {b_1^2+b_2^2+b_3^2} } \]
Die dafür zur Verfügung stehende Excel-Funktion ARCCOS liefert den Arkuskosinus im Bogenmaß (Radiant) im Wertebereich von 0 (Null) bis \( \pi \) (Pi).
Damit lässt sich aber eine mir immer mal wieder gestellte Frage nicht eindeutig beantworten: “Um welchen Winkel muss man einen Vektor \( \vec a \) drehen, damit er zu einem Vektor \( \vec b \) gleichrichtet ist?”
ARCCOS liefert immer den eingeschlossenen Winkel zwischen 0 und 180°, auch wenn es der Implementwinkel (Ergänzungswinkel auf 360°) wäre. Das ist dem Kommutativgesetz geschuldet, welchem das Skalarprodukt gehorcht: \( \vec a \cdot \vec b = \vec b \cdot \vec a \).

Ein für die Fallunterscheidung notwendiger Indikator ist die y-Komponente des Vektors \( \vec b \) nach der gemeinsamen Drehung des Vektors \( \vec a \) in die z-x-Ebene. Bei \( b_y^\prime<0 \) ist der gesuchte Winkel nämlich der Implementwinkel. Das Minus für die Subtraktion liefert die Funktion VORZEICHEN (Sgn in VBA), wobei \( b_y^\prime=0 \) noch abgefangen werden muss, weil in diesem Fall 1 und nicht 0 gelten muss.

Die folgende Datei zeigt die Umsetzung “Schritt für Schritt” umfänglich mittels Drehmatrix zur Drehung um die z-Achse.
Für die Formeln ist dies nicht nötig, da nur die y-Komponente des gedrehten Vektors \( \vec b \) benötigt wird. Die “Formel ohne Zellbezüge” enthält die Berechnung von \( b_y^\prime \) 3 Mal, was die “Formel mit Namenbezug” mittels eines Namens erledigt.
Die Benutzerdefinierte Funktion VECTORANGLE(VektorA;VektorB) kann mit Zellbezügen und Matrixkonstanten umgehen und via VBA aufgerufen werden. Sie kann als Matrixformel (Arrayformel) angewendet werden, wobei Zeilenvektoren Voraussetzung sind. Spaltenvektoren müssen mittels MTRANS passend gemacht werden. Der 2-dimensionale Fall ist abgedeckt, indem die z-Koordinate als 0 angenommen wird:

Quicksort

Ob ich mit Quicksort während meiner Ausbildung jemals direkt Bekanntschaft geschlossen habe, ist mir nicht mehr erinnerlich, in der Praxis reichte mir jedenfalls immer Bubblesort.

Rückblickend ist es nicht verwunderlich, dass das Sortieren mittels Bubblesort in VBA stets zufriedenstellend ablief. Offensichtlich deswegen, weil immer nur kleine Auflistungen vorkamen, was nie zeitkritisch war.
Dann aber kam ein Array mit zehntausenden Elementen, das Stunden dafür abverlangte. Insbesondere deswegen, weil nach bis zu 3 Kriterien sortiert werden konnte, der Algorithmus somit auch entsprechend oft aufgerufen wurde!

Nicht wissend, ob denn Quicksort die für meine Bedürfnisse beste Methode sei, wurde Google bemüht. Über Sortieralgorithmen findet sich überraschend viel, wahrscheinlich das tägliche Brot vieler “Listenverarbeiter”. Die vertiefte Suche ergab, dass Quicksort als der schnellste Sortieralgorithmus in der Praxis gilt!

Leider konnte ich keine fertige Lösung finden, die alle meine Anforderungen erfüllte:

  • Eine Benutzerdefinierte Funktion für das Tabellenblatt, die auch vom VBA-Code aufgerufen werden kann
  • Eine rekursive Prozedur, die direkt von VBA-Code aufgerufen werden kann
  • Ausgabe der Ergebnisse in Abhängigkeit vom Aufrufer, d. h. Ausgabe in Spalte oder Zeile eines Tabellenblattes bzw. Zeilenvektor für VBA

Für die Umsetzung nahm ich Anleihen bei Microsoft und Online-Excel.

Die Benutzerdefinierte Funktion QUICKSORT(Matrix;[Absteigend = FALSCH]) erwartet eine einspaltige oder einzeilige Matrix, die gemäß der optionalen Sortierreihenfolge sortiert wird. Fehlt diese, dann wird aufsteigend sortiert. Wahrheitswerte werden numerisch verarbeitet, wobei WAHR (= 1) als True (= -1) einsortiert wird! Die Funktion muss als Matrixformel (Arrayformel) eingegeben werden.
In VBA kann die von QUICKSORT rekursiv aufgerufene Prozedur QUICKSORT4VBA(Matrix;[Absteigend = FALSCH]) direkt benutzt werden.

Die folgende Datei zeigt neben Quicksort auch noch die Möglichkeit, numerische Werte mittels der Funktionen KLLEINSTE und KGRÖSSTE zu sortieren:

Linie glätten 4

In Kubischer Spline mutmaße ich, dass die Straklatte der Idealfall für eine substantielle Verbesserung der Option “Linie glätten” (engl. “Smoothed line”) sei.
In Parametrische Spline-Interpolation erwähne ich, dass ich schon ein deutlich einfacheres und trotzdem funktionierendes Prinzip für eine Näherung mit den zwei Nachbarpunkten gefunden habe.
Um meine Gedankengänge – auch für mich selbst – nachvollziehbar zu erhalten, möchte ich allerdings vorerst meine Näherungsversuche zur Straklatte und deren schlussendlich gesuchte Steigung am Mittenpunkt präsentieren:

  • Die naheliegende natürliche Parametrische Spline-Interpolation durch 3 Punkte ist ein Schuss in den Ofen, weil sich allerhöchstens in Sonderfällen zufällig ein Kraftgleichgewicht ergibt. Dazu müssen sich nämlich die Tangentennormalen aller 3 Punkte in einem Punkt treffen. Den beiden Polynomen 3. Grades kann man das auch gar nicht vorwerfen, da sie dazu auch nicht die nötigen “Freiheiten” haben, um das überhaupt vorsehen zu können! Das Ergebnis ist die immer wieder ernüchternde Micrsoft’sche Methode.
  • Ein einzelnes Polynom muss den 5. Grad aufweisen, um alle Bedingungen erfüllen zu können. Da in den beiden Endpunkten die 2. Ableitung Null sein muss, bleibt eine übrig, die der allgemeinen Anwendbarkeit einen Strich durch die Rechnung macht, da sie sich unzulässigerweise in den betrachteten Bereich “einschleicht”!
  • Zu Versuchen mit höheren Graden und geschickten Annahmen mit beispielsweise komplexen Nullstellen sei nur angemerkt, dass sie fruchtlos waren. Ob dies der grundsätzlichen Unmöglichkeit oder meinem mathematischen Unvermögen geschuldet ist, werde ich wohl selbst nicht eruieren können.
  • Diese komplexen Höhen trieben mich in die triviale Niederung des 1. Grades. Die Straklatte wird durch 2 Geraden (Sekanten) ersetzt. Die Normalen darauf in den Endpunkten schneiden sich in einem Punkt, dessen Verbindung zum Mittenpunkt die Steigung in selbigem festlegt. Trotz “brutalem” Eck am Mittenpunkt zeigt sich schon der erwartete Widerspruch zur aktuellen Glättung!
  • Preisfrage: Was passiert, wenn man 2 Polynome 3. Grades heranzieht und alle Bedingungen bis auf das Kräftegleichgewicht einhält? Man kommt auf kompliziertem Weg zu Microsoft, deckungsgleich mit der oben erwähnten Spline-Interpolation!
  • Wenn man bei 2 Polynomen 3. Grades das Kräftegleichgewicht erfüllt und dafür die gleiche Krümmung am Mittenpunkt “opfert”, dann verstärkt sich der obige Widerspruch noch! Aber auch die Unsicherheit, wo denn die “Wahrheit” liegen könnte.
  • Um das einzelne Polynom 5. Grades zu ersetzen, braucht es eines 3. und eines 4. Grades. Da das Polynom 4. Grades auch einen “überzähligen” Wendepunkt hat, muss dieser “ausgeschlossen” werden. Dies gelingt verlässlich, wenn der vom Mittenpunkt weiter entfernte Punkt via 4. Grad verbunden ist!
    Dieser Ansatz bestätigt den vorhergehenden sehr gut.

Resümee:

  • 2 Polynome 1. Grades führen zu einer einfachen Formel für die gesuchte Steigung, wird aber durch keinen weiteren Ansatz bestätigt.
  • 2 Polynome 3. und 4. Grades erfüllen alle Bedingungen und werden durch 2 Polynome 3. Grades bestätigt. Der Aufwand ist aber unvertretbar hoch!
  • Also wird demnächst eine “Näherung der Näherung” in Form eines “deutlich einfacheres und trotzdem funktionierendes Prinzips” vorgestellt.

Oben Erwähntes habe ich wie immer in “Excel gegossen”, damit es nachvollziehbar bleibt und “spielbar” wird. Die folgende Datei enthält dazu die Ansätze mit

  • 1 Polynom 5. Grades,
  • 2 Polynome 1. Grades,
  • 2 Polynome 3. Grades (Microsoft),
  • 2 Polynome 3. Grades und
  • 2 Polynome 3. und 4. Grades:

UND für Matrixformeln

Der Funktion UND(Wahrheitswert1;[Wahrheitswert2];…) können bis zu 255 (30 in Excel 97 – 2003) Bedingungen übergeben werden, die entweder als WAHR oder als FALSCH bewertet werden können. Diese Argumente dürfen auch als Arrays (Matrizen) vorliegen, was einen verleiten könnte, UND auch in einer Matrixformel zu verwenden, was aber daran scheitert, dass immer nur ein Wert zurückgegeben wird!

Abhilfe

Anstatt UND(Wahrheitsarray1;Wahrheitsarray2;…) nehme man bei Matrixformeln das Produkt Wahrheitsarray1*Wahrheitsarray2*…

Alternative

Die Benutzerdefinierte Funktion AND4AF(Wahrheitswert1;[Wahrheitswert2];…) (Abkürzung für “AND for Array Formulas”) funktioniert wie das normale UND (allerdings werden beliebig viele Argumente entgegengenommen), wenn sie von einer “gewöhnlichen” Formel aufgerufen wird, in allen anderen Fällen (Aufruf durch Matrixformel, VBA,…) werden die Wahrheitswerte wie folgt abgearbeitet:

  • 2-dimensionale Matrix führt zum Fehler #WERT!
  • 1-dimensionale Matrizen können gemischt als Spalten- und Zeilenvektoren vorliegen
  • Der größte Vektor bestimmt den Ergebnisumfang
  • Fehlende Werte eines kleineren Vektors werden ignoriert
  • Ein Einzelwert wird zu einem Vektor mit einer Komponente
  • Dabei werden wie beim normalen UND Text und fast alle Zahlen ignoriert, denn 0 entspricht FALSCH

Die folgende Datei zeigt die Verwendung der Benutzerdefinierten Funktion AND4AF im Vergleich zum normalen UND anschaulich für die verschiedensten Fälle: