Zum Inhalt

Analysis

CindyScript ist eine rein numerische Sprache. Es werden keine symbolischen Berechnungen durchgeführt. Trotzdem ist es möglich, einige Operationen durchzuführen, die normalerweise nur in Symborsystemen möglich sind. Zum Beispiel kann man numerisch die Ableitung einer Funktion berechnen oder eine Tangente zu einer bestimmten Funktion konstruieren. In diesem Abschnitt werden die Verwendungen dieser beiden Funktionen veranschaulicht.

Ableitungen und Tangenten

Berechnung einer Ableitung: d(<function>,<var>)

Beschreibung: Dieser Operator erzeugt eine Funktion, die die Ableitung einer anderen Funktion ist, die als erstes Argument übergeben wird. Die Variable von <function>, nach der die Ableitung berechnet werden soll, muss die Standard-Laufvariable # sein. Die freie Variable der Ableitung ist gegeben als zweites Argument.

Beispiel: Der folgende Code demonstriert die Verwendung des Operators:

f(x):=(x-3)*(x-2)*(x-1)*x*.4;
g(x):=d(f(#),x);
h(x):=d(g(#),x);
plot(f(x),size->2);
plot(g(x),color->(0.8,0,0));
plot(h(x),color->(0,0,0));

Die Ausgabe, die dieses Programm erzeugt, ist die folgende Zeichnung. Die blaue Linie ist die ursprüngliche Funktion f(x), die rote Linie ist die erste Ableitung g(x), und die schwarze Linie ist die zweite Ableitung h(x).

Die zweite Ableitung wurde als die Ableitung der ersten Ableitung berechnet. Es ist jedoch ein Wort der Warnung angebracht. Der Ableitungsoperator basiert vollständig auf numerischen Prinzipien. Wenn f(x) die Funktion ist, die abgeleitet werden soll, dann kann die entsprechende Ableitung als d(f(#),x) definiert werden. Hier bezeichnet x die Position, an der die Ableitung ausgewertet werden soll. Der Wert der Ableitung wird dann durch die Formel berechnet

(f(x+eps)-f(x-eps))/2eps

für eine ausreichend kleine Zahl eps. Dies gibt eine angemessene Annäherung an die echte Ableitung an diesem Punkt. Jedoch erhöht die mehrfache Anwendung dieses Operators hintereinander den Fehler erheblich. Nach etwa fünf Iterationen ist das Ergebnis nicht mehr brauchbar. Daher sollte man nicht erwarten, eine angemessene Berechnung mit einer fünften Ableitung durchzuführen.

Modifizierer: Standardmäßig ist die Konstante eps in der obigen Formel auf 0,0001 eingestellt. Dieser Wert bildet einen angemessenen Kompromiss zwischen Zuverlässigkeit bei höheren Ableitungen und Genauigkeit. Dieser Wert kann mit dem Modifizierer eps-><number> geändert werden.


Tangente: tangent(<function>,<var>)

Beschreibung: Dieser Operator ist dem Operator, der die Ableitung einer Funktion berechnet, sehr ähnlich. Anstatt den Wert der Ableitung zu berechnen, berechnet dieser Operator die homogenen Koordinaten einer Tangente zur Funktion an einem Punkt. Der Punkt wird als zweites Argument eingegeben.

Beispiel: Der folgende Beispielcode berechnet viele Tangenten zu einer Parabel:

f(x):=(x^2)/4;
repeat(250,start->-30,stop->30,x,
  t=tangent(f(#),x);
  draw(t,alpha->.3);
);
plot(f(x),size->3,color->(0,0,0));

Das folgende Bild zeigt das vom Programm erstellte Ergebnis.

Das Ergebnis der Tangensfunktion ist ein Drei-Vektor mit homogenen Koordinaten. Darüber hinaus wird das Linienattribut dieses Vektors gesetzt (siehe Geometrische Operatoren), sodass die Koordinaten automatisch als eine Linie gezeichnet werden.



Fortgeschrittene Berechnungen

Erraten des Wertes einer reellen Zahl: guess(<number>)

Beschreibung: Der Guess-Operator ist möglicherweise einer der ausgefeilsten und leistungsstärksten Operatoren von CindyScript. Er kann verwendet werden, um eine symbolische Bedeutung aus einem numerischen Gleitkommawert wiederzugewinnen. Der Guess-Operator erwartet eine Zahl als Eingabe und gibt eine Zeichenkette zurück. Die Zeichenkette sollte ein symbolischer Ausdruck sein, der die Eingabezahl beschreibt. Der Guess-Operator versucht, eine Zeichenkette der Form zu generieren

a+b*sqrt(c),

wobei a, b und c rationale Zahlen mit Zähler und Nenner nicht größer als etwa 1000 sind. Wenn die Eingabezahl auf die beschriebene Weise mit angemessener numerischer Genauigkeit ausdrückbar ist, wird der Guess-Operator diesen Ausdruck generieren. Wenn nicht, gibt der Guess-Operator die ursprüngliche Eingabezahl zurück.

So ist es möglich, den Guess-Operator zu verwenden, um zu ermitteln, ob eine Zahl rational ist (dann ist b 0) oder die Lösung einer quadratischen Gleichung.

Beispiele: Dieser Operator ist manchmal äußerst nützlich, um verborgene Eigenschaften geometrischer Konstruktionen zu entdecken. Wir veranschaulichen dies mit einigen Beispielen. Das erste Bild zeigt eine Konstruktion, in der die Steigung der Linie und die Koordinaten des Schnittpunkts zweier Kreise „erraten" werden:

Wenn die Eingabekoordinaten und Radien ganze Zahlen sind, sind die resultierenden Zahlen rational oder Lösungen quadratischer Gleichungen mit relativ kleinen Koeffizienten. Die nächsten zwei Beispiele zeigen zwei ernsthafte Anwendungen des Ratens. Das erste vergleicht zwei Längen in einem regelmäßigen Pentagramm. Das Längenverhältnis wird genau das goldene Verhältnis sein. Das zweite Beispiel zeigt eine schöne Verbindung zwischen zwei Flächen von Quadraten in einer einfachen Konstruktion.

Bemerkung: Das Arbeitstier hinter dem Guess-Operator ist der sogenannte PSLQ-Algorithmus, ein wirklich genialer Algorithmus, der (wenn reelle Zahlen x, y und z gegeben sind) ganzzahlige Abhängigkeiten a·x+b·y+c·z=0 entdecken kann. Wenn man überprüfen möchte, ob die reelle Zahl x die Lösung einer quadratischen Relation ist, muss man nach einer ganzzahligen Relation der Form a+b·x+c·x²=0 suchen. So funktioniert die Implementierung des Guess-Operators. Die Lösung wird dann aus den berechneten Integralkoeffizienten rekonstruiert.


Wurzeln eines Polynoms: roots(<list>)

Beschreibung: Die Funktion roots kann die Wurzeln eines univariaten Polynoms berechnen. Als Eingabe akzeptiert sie die Koeffizienten des Polynoms, geordnet vom niedrigsten zum höchsten Grad. Die Ergebnisse sowie die Koeffizienten können komplexe Zahlen sein.

Beispiele: Wenn man beispielsweise die Wurzeln des Polynoms 1+x2=0 berechnen möchte, kann man einfach roots([1,0,1]) aufrufen. Der resultierende Ausdruck ist [-0-i*1,-0+i*1], da das Polynom die zwei komplexen Wurzeln +i und -i hat.

Der folgende Code berechnet und zeichnet die Wurzeln eines kubischen Polynoms, das durch seine Koeffizienten gegeben ist.

a=0.4;
b=-0.4;
c=-3;
d=-1;
f(x):=a*x^3+b*x^2+c*x+d;
plot(f(x),size->2);
r=roots([d,c,b,a]);
forall(r,draw((#,0)))

🤖 Diese Seite wurde automatisch mit KI (Claude) übersetzt und wartet noch auf Überprüfung. → Alle KI-übersetzten Seiten