Ich suche nach Algorithmen, um Standard-2D-Graphen für Funktionen zu zeichnen, die Singularitäten haben oder nicht. Der Zweck ist es, ein "Mini-CAS" zu schreiben, so dass ich keine A-priori-Kenntnisse über die Arten von Funktionen habe, die die Benutzer grafisch darstellen möchten.
Dieses Problem ist sehr alt, daher stelle ich mir vor, dass es in der Literatur einige Standardalgorithmen geben muss. Diesmal hatte ich nicht viel Erfolg bei der Suche nach Referenzen über Google.
Ich habe einen interessanten Algorithmus gefunden, nämlich diesen aus dem "YACAS - Buch der Algorithmen" mit dem Namen "Adaptives Funktionsplotten".
Also in Kürze:
- Gibt es Standardalgorithmen?
- Gibt es eine Testsuite für bekannte schwer zu plottende Funktionen?
- Was sind die interessanten Artikel zum Lesen?
algorithms
visualization
Soegaard
quelle
quelle
Antworten:
Ich habe die adaptive Sampling-Routine von Mathematica hier auf GitHub implementiert (es ist eine einzelne C-Datei, gehen Sie zum Quelltextbaum für die Header-Datei). Ich habe vor langer Zeit eine Beschreibung der Routine in einem großen Buch über Mathematica gefunden und verwende seit einiger Zeit Variationen dieser Implementierung. Im Grunde genommen wird eine grobe lineare Stichprobe über den interessierenden Bereich erstellt und anschließend erneut durchlaufen, um Bereiche mit hoher Krümmung zu verfeinern. Es ist möglich, dass einige sehr scharfe Merkmale übersehen werden, aber in der Praxis finde ich dies äußerst selten. Diese Datei enthält auch die Parallelversion.
quelle
Exclusions -> None
deaktiviert werden, indem die Struktur Ihrer Funktion ausgeblendetPlot
wird, indem es als definiert wirdf[x_?NumericQ] := ...
. Dies ist nicht das, worauf ich mich bezog, als ich nach den Änderungen fragte. Ich glaube, es gab einige Änderungen am Algorithmus, da v5 und v6 an verschiedenen Punkten abgetastet wurden. Im Moment kann ich nicht auf v5 testen, um es noch einmal zu vergleichen.Zu wissen, wie andere CAS dies tun, könnte Ihnen helfen.
Beginnen Sie mit einem regelmäßig verteilten Punktraster auf der Plotdomäne. (In Mathematica gibt es einen Parameter, mit dem gesteuert werden kann, wie viele er annehmen soll
PlotPoints
.)Wenn wir die
MaxRecursion
in Mathematica festgelegte Iterationsgrenze noch nicht erreicht haben , wiederholen Sie den Vorgang ab Schritt 2.Einige davon werden in dem Buch Mathematica in Action von Stan Wagon behandelt, das Sie hier in Google Books sehen können .
Ich habe diesen Algorithmus zuvor implementiert, um besser steuern zu können, wie oft meine teure Berechnungsfunktion bewertet wurde. Hier ist der Mathematica-Code für Schritt 2:
quelle
Die MathWorld-Webseite zu Funktionsgraphen enthält Verweise auf verschiedene Artikel, die für die Darstellung adaptiver Funktionen relevant zu sein scheinen. Zitieren der Seite:
Andererseits bin ich bei Google auf ein Blatt Papier gestoßen
www.cs.uic.edu/~wilkinson/Publications/plotfunc.pdf
das erklärt, wie man die Domain und andere Dinge richtig auswählt. Ich hoffe, sie sind nützlich für Sie.
quelle
Ich fand dieses Thema und dachte, ich sollte die Entwickler-Issue-Seite freigeben, um dies der Julia-Bibliothek Plots.jl hinzuzufügen. Wir haben eine Reihe von Techniken ausprobiert, um herauszufinden, was gute Ergebnisse bringen würde, beginnend mit den Hinweisen zur Implementierung von Mathematica. Ein wenig Beschneiden, eine kleine Störung, um nicht genau an den Intervallendpunkten zu beginnen, eine Rekursionsgrenze und eine Doppelmaschen-Fehlerschätzung waren allesamt erforderlich, um "genau das Richtige zu erreichen". Der Thread verweist Sie auch auf den Open-Source-Code für die Implementierung. Es dauerte ein wenig, aber das Hinzufügen dieser Funktionen machte es ziemlich robust (laut den Tests, wie im Thread gezeigt).
quelle