Cassini-Funktion

Berechnung und Darstellung der Cassini-Funktion mit XY-Koordinaten

Zielgruppe sind StudentInnen und ambitionierte Informatik-Amateure

Grundkenntnisse der Informatik und der Tabellen-Kalkulation werden vorausgesetzt. Kenntnisse der Analytischen Geometrie und Erfahrung mit einfachen Beispielen (Kreis-Funktion) sind vorteilhaft.


Cassini-Funktion


Allgemeine Angaben sind mit jedem Standard Kalkulations-Programm anwendbar, spezielle Hinweise (z.B. Menü-Befehle) werden hier nur für LibreOffice und OpenOffice angegeben.

Berechnungs-Formeln


Quelle: Wikipedia (modif.)
Diese Funktion wird hier vorgestellt, weil sie als Besonderheit entweder 1 oder 2 getrennte Funktions-Linien aufweist, die je nach Vorgaben unterschiedlich aussehen können.

Wikipedia: Cassini-Kurve, Cassini-Oval, Lemniskate, Ellipse



Die Cassini-Funktion hat (ähnlich wie eine → Ellipse) 2 Brennpunkte F1(-c,0) und F2(+c,0)
Wenn a>c*sqrt(2) dann zeigt die Funktion eine geschlossene Kurve, die einer abgeflachten Ellipse ähnelt. In der Praxis beginnt man am besten mit diesem einfachen Fall.
Wenn a=c*sqrt(2) dann zeigt sie ein Oval mit Flachpunkten bei E1(0,sqrt(a2-c2)) und E2(0,-sqrt(a2-c2))
Wenn c...a...c*sqrt(2) dann zeigt sie ein eingedrücktes Oval ('Erdnuss') mit 6 Extremwerten.
Wenn a=c dann zeigt sie eine Lemniskate als Sonderform der Cassini-Funktion. Sie sieht wie eine liegende Ziffer 8 aus.
Wenn a<c dann zeigt sie 2 getrennte Ovale um die beiden Brennpunkte.

Die Cassini-Funktion hat nur für einen begrenzten Bereich von X-Werten reelle Lösungen, ebenso wie alle anderen geschlossenen Kurven (→ Kreis, → Ellipse,...). Wenn man versucht, sie außerhalb dieses Bereichs zu berechnen, dann erhält man Fehler-Werte. Das kann wenig erfahrene EntwicklerInnen verunsichern.
Es wird daher empfohlen, zuerst die Nullstellen zu berechnen:
Wenn a>=c dann ist das Oval nur zwischen diesen Grenzen berechenbar:
-sqrt(c2+a2) ... x ... +sqrt(c2+a2)
Wenn a<c dann sind die beiden Ovale nur zwischen diesen Grenzen berechenbar:
-sqrt(c2+a2) ... x ... -sqrt(c2-a2)
+sqrt(c2-a2) ... x ... +sqrt(c2+a2)


Wenn a<c dann wird die Berechnung der beiden Ovale kompliziert, weil es nicht für jeden Winkel 0...φ...2Pi eine Lösung gibt und weil man die Funktions-Linie aus 4 verschiedenen Teilen zusammensetzen muss. Es wird daher empfohlen, vor der Funktion die Anstiegs-Winkel der Tangenten vom Ursprung an die beiden Ovale (im Bogenmaß!) zu berechnen:
φ[t1] = arccos( sqrt(1-a4/c4) ) / 2
φ[t2] = -φ[t1]

Man berechnet dann beide (!) Lösungen der quadratischen Gleichung für die Winkel
0...φ...φ[t1]
Pi-φ[t1] ... φ ... Pi+φ[t1]

und setzt die Funktions-Linie aus den 4 berechneten Teilen zusammen.



Die Variable x wird in einem Bereich variiert, um die Funktions-Linie Punkt-weise zu berechnen:
Wenn a>=c dann variiert man die X-Koordinate im Bereich
-sqrt(c2+a2) ... x ... +sqrt(c2+a2)
Wenn a<c dann variiert man die X-Koordinate in den beiden Bereichen
-sqrt(c2+a2) ... x ... -sqrt(c2-a2)
+sqrt(c2-a2) ... x ... +sqrt(c2+a2)

Anfangs berechnet man die Funktionswerte y für ca. 30-50 X-Werte aus dem angegebenen Bereich. Wenn das funktioniert, dann verbessert man die Genauigkeit mit z.B. 200 berechneten Punkten. Fortgeschrittene EntwicklerInnen setzen die X-Werte in der Nähe der angegebenen Grenzen dichter und verbessern damit die Genauigkeit.

Wenn die hier vorgestellten 'sicheren' Vorgaben funktionieren, dann können sie andere Werte wählen und ausprobieren, wie ihre Programme darauf reagieren.



Die Spiegelung (Umkehrung der Vorzeichen) wird wesentlich rascher ausgeführt als die Berechnung der Cassini-Funktion. Dieser Trick wurde bei der Programmierung des ↑ Live-Beispiels angewendet, damit die Reaktion auf eine Änderung der Schieberegler so rasch wie möglich erfolgt.

Vorgaben



In den Kapiteln dieser Seite sind nur wenige allgemeine Angaben und Erklärungen enthalten. Der Text wurde auf die besonderen Eigenschaften der Cassini-Funktion gekürzt.


 AB
1Cassini-Funktion
2a2
3 
4c1
5Punkt
6x[p]1
7 
8y[1][p]=cassini(B6)
9y[2][p]=-B8
Das oben gezeigte ↑ Live-Beispiel enthält Vorgaben und Ergebnisse in einem einzigen Block in der linken oberen Ecke.
Diese Anordnung ist besonders kompakt und übersichtlich.
Man sollte jedoch die zur Eingabe vorgesehenen Zellen entweder deutlich kennzeichnen (im Beispiel durch grünen Hintergrund) oder im Layout voneinander trennen.

Die Parameter a und c der Cassini-Funktion und die X-Koordinate x[p] der zu berechnenden Punkte werden zunächst manuell in die Zellen B2, B4 bzw. B6 eingetragen.
Die Berechnung der Cassini-Funktion wird im ↓ nächsten Kapitel vorgestellt.

Da man meist keine tiefgestellten Indices xp formatieren kann, werden sie hier in Klammern als x[p] angegeben.



Kontrolle: Wenn sie die Zelle B2 erneut markieren, dann sollte links oben nicht die Adresse sondern der Name cas_a angezeigt werden.
Der Name ist ein Alias für die absolute Adresse, d.h. man kann ihn genauso verwenden wie den Ausdruck $B$2

Kontrolle: Geben sie in eine beliebige Zelle diese Formel ein:
=cas_a
Der aktuelle Wert des Parameters a wird angezeigt.

Einschränkungen:
Namen dürfen nur → ASCII-Buchstaben und Ziffern enthalten, keine Sonderzeichen, Umlaute oder Leerzeichen. Als Trennzeichen verwendet man das _ Underline-Zeichen.
Große und kleine Buchstaben werden normalerweise nicht unterschieden.
Namen anderer Objekte sind ausgeschlossen, z.B. von Zeilen, Spalten oder Adressen. Daher ist der Name cas_a erlaubt, nicht jedoch a



Setzen sie zur Eingabe des Parameters x[p] ein weiteres Schieberegler-Element ein und platzieren sie es anfangs rechts neben Zelle B7
Legen sie als Verknüpfte Zelle die Zelle reg_x oder $B$7 fest.
Tragen sie in die Zelle B6 diese Formel ein =reg_x/20‑2,5
Wenn man den Schieberegler bewegt, dann sollte sich der Zahlenwert von Zelle B7 im Bereich 0...100 ändern, jener von Zelle B6 im Bereich -2.5...+2.5
Schieben sie das fertige Regler-Element über den Bereich A7:B7, so wie im Live-Beispiel gezeigt.

Wenn das Beispiel zufriedenstellend funktioniert, dann kann man die Auflösung der Schieberegler erhöhen (z.B. von 0..100 auf0..1000). In diesem Fall muss man auch die Formeln in B2 und B6 anpassen.

Details zur → Programmierung von Schiebereglern.

Einzel-Berechnung



Die Formel ergibt nur dann einen Zahlenwert, wenn die Cassini-Funktion am angegebenen X-Wert mindestens 1 Lösung liefert.
In jedem anderen Fall ergibt die Formel einen Fehler-Wert.
Daher wird empfohlen, vor der Programmierung der Lösungs-Formel ungefähr diese Vorgaben mit den beiden Schiebereglern einzustellen:
a=2;   x=1



Die Namen der Zellen wurden so gewählt, dass man die Verwandtschaft mit der oben vorgestellten ↑ Berechnungs-Formel erkennen kann.
Zur besseren Lesbarkeit wurden Leerzeichen eingefügt. Man kann diese auch weglassen.



Die Berechnung mit einer "BenutzerInnen-definierten" Funktion in der Programmiersprache → Basic ist deutlich bequemer. Man muss diese Funktion allerdings importieren und die Ausführung von Basic-Programmen ausdrücklich zulassen.

Funktions-Linie als Polygon-Zug



Man kann Polar-Koordinaten verwenden. Variieren sie dazu die Position des einzeln untersuchten Punktes und verfolgen sie den Winkel der grün eingezeichneten Vektoren zur X-Achse:
+ Für a>>c lässt sich die geschlossene Funktionslinie (wie bei → Kreis oder → Ellipse) gut berechnen, weil man für jeden Winkel im Bereich 0°...360° ein Ergebnis erhält.
- Für a<=c gibt es Lösungen nur im eingeschränkten Winkel-Bereich zwischen den (im Diagramm nicht eingezeichneten) Tangenten durch den Ursprung.
Außerdem kann man die Funktions-Linie nahe an den Tangenten nicht gut berechnen, weil schon sehr kleine Änderungen des Richtungswinkels zu erheblichen Änderungen der Koordinaten der Funktionslinie führen.

Jede der angeführten Strategien ist programmierbar. Es ist allerdings wichtig, die jeweiligen Vorteile, Nachteile und Grenzen zu kennen und zu berücksichtigen. Das zum Download angebotene Demo-Beispiel verwendet die erst-genannte Version, d.h. die Variation der X-Koordinate im fix vorgegebenen Bereich -2.5...x...+2.5



Die Funktionslinie wird aus zahlreichen kleinen Segmenten zusammengesetzt. Dazu werden viele einzelne Punkte der Funktion berechnet und mit kurzen Linien verbunden.
Die X-Koordinaten dieser Punkte werden vorgegeben. Im Demo-Beispiel werden die X-Koordinaten von 501 Punkten im Bereich -2.5...x...+2.5 mit einem Abstand von Δx=0.01 vorgegeben.  Beispiel:
x[0]=-2.5
x[1]=-2.49
...
x[499]=+2.49
x[500]=+2.5



r[i] = x[i]2
p[i] = 2*(r[i] + t)
q[i] = (r[i] - t)2 - u
s[i] = -p[i]/2 + sqrt(p[i]2/4 - q)



Wenn s[i]>0 dann gibt es für die X-Koordinate x[i] zwei Lösungen:
y[i][1] = +sqrt(s[i])
y[i][2] = -sqrt(s[i])



Man sollte vorhersehbare Fehler-Werte immer abfangen und sinnvoll darauf reagieren, damit nur 'echte' Fehler auch so bezeichnet werden.

In diesem Fall kann man mit einer Bedingten Verzweigung ( WENN() ) reagieren: Die Quadratwurzel-Funktion wird nur dann berechnet, wenn s[i]>=0 ist.
In jedem anderen Fall ersetzt man das Ergebis am besten durch einen 'Leeren Text', ausgedrückt durch die Formel =""



Mit Hilfe solcher Hilfs-Funktionen können auch einfache AnwenderInnen die Aufgabe (hier: Berechnung der Cassini-Funktion) einfach, rasch und fehlerfrei ausführen.

Die Cassini-Funktion selbst wird in der Praxis natürlich kaum nachgefragtt. Sie steht hier stellvertretend für alle Funktionen, die für einfache AnwenderInnen nicht lösbar, zu aufwändig oder so kompliziert sind, dass dabei Fehler auftreten.


Damit wird die Aufgabe einfach, rasch und sicher lösbar, und zwar auch ohne (hier mathematische) Fachkenntnisse.

Details zur Programmiersprache → Basic, zur Verwendung von Basic-Modulen mit LibreOffice-Calc, MS-Excel, OpenOffice-Calc

Diagramm



Danach ergänzt man das XY-Diagramm mit einer zweiten Funktions-Linie. Dazu markiert man die Zahlen-Spalten x und y2

Die Tabellen-Kalkulation reagiert normalerweise sinnvoll:  Wenn es für ein bestimmtes Paar von Koordinaten keine Lösung gibt, dann wird die Funktions-Linie an dieser Stelle nicht angezeigt.



Fügen sie die 2. FunktionsLinie dazu:
DoppelKlick auf das Diagramm, sodass es mit einem schmalen grauen Rahmen umschlossen wird.
RechtsKlick in das markierte Diagramm / DatenBereiche / DatenReihe / Hinzufügen
Links wird eine neue 'Unbenannte Datenreihe' vorgeschlagen und bereits markiert.
Markieren sie rechts Datenbereich=Name:
Um eine Spalten-Überschrift einzutragen, klicken sie den Button rechts von 'Name' und markieren sie mit dem Mauszeiger die Zelle der Überschrift.
Um manuell einen Namen für diese Datenreihen einzugeben (z.B. Y2) tragen sie diesen in das Feld 'Bereich für Name' ein.


Beenden sie den Dialog mit 'OK'.

Formatieren sie auch die 2. Diagramm-Linie so wie gewünscht.

Beispiel 'Cassini-Funktion' zum Download


Basic-Quelltext:
Function cassini(Optional a As Variant, _
Optional c As Variant, Optional x As Variant, _
Optional trigger As Variant) As Double
Dim r, s, t As Double
If (IsMissing(a)) Then a = 1
If (IsMissing(c)) Then c = 1
If (IsMissing(x)) Then x = 0
If (IsMissing(trigger)) Then trigger = 0
trigger = trigger + 1
r = x * x
t = c * c
s = Sqr((r+t)^2 - (r-t)^2 + a^4) - r - t
If (s < 0) Then
s = s / 0
Else
s = Sqr(s)
End If
cassini = s
End Function

Programmierung des Live-Beispiels



Die Programmierung erfordert fortgeschrittene Kenntnisse (→ SVG, → Javascript). Für wenig erfahrene EntwicklewrInnen werden einfachere Beispiele empfohlen, z.B. → Kreis.