Algorithmen zur (adaptiven?) Funktionsdarstellung

21

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?
Soegaard
quelle
2
Vielleicht wäre die Frage mit "Funktionsplotten" besser zu verstehen als mit "Graphzeichnen"? Ich habe den Titel zunächst falsch interpretiert (Graphentheorie).
Astrojuanlu
@ Juanlu001 Danke für den Vorschlag. Ich habe den Titel geändert.
Soegaard
Wenn Sie 2D sagen, meinen Sie damit das Zeichnen einer Funktion mit einer Variablen wie , oder interessieren Sie sich auch für eine Funktion mit zwei Variablen ( f ( x , y ) ), die in 2D dargestellt wird, z. B. mit verschiedenen Farben / Schattierungen verschiedene Werte? f(x)f(x,y)
Szabolcs
Nun, ich wollte eine Funktion einer Variablen zeichnen. Ich würde jedoch auch gerne etwas über Algorithmen erfahren, mit denen Sie auswählen können, welche Punkte auch in einer Zwei-Variablen-Einstellung ausgewertet werden sollen. Ich bin nicht so daran interessiert, über Farben und Schattierungen zu hören.
Soegaard
Für 2D-Funktionen siehe meine Frage und Antwort hier . Was ich dort gemacht habe, war ziemlich begrenzt und wird für beliebige Funktionen nicht so gut funktionieren. Außerdem fehlen in der Beschreibung einige wesentliche Schritte, ohne die die Methode nicht ordnungsgemäß konvergiert: Ich musste in die Mitte jeder Kante des Netzes einen neuen Abtastpunkt einfügen, der bei der nächsten Retriangulation verschwinden würde. (Fortsetzung)
Szabolcs

Antworten:

10

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.

Victor Liu
quelle
1
Welches Buch ist das? Ist es der, den ich verlinkt habe? Wissen Sie, was sich in der Implementierung zwischen Version 5 und 6 genau ändert?
Szabolcs
1
@ Szabolcs: Nein, ich glaube es war in diesem Buch Abschnitt 4.1.3. Die Beschreibung bezieht sich auf eine sehr alte Version von Mathematica. Die neueren Versionen (möglicherweise ab Version 6) erkennen vertikale Asymptoten und entfernen die störenden vertikalen Linien aus den Plots. Die neuen Versionen haben definitiv eine Menge raffinierter symbolischer Vorverarbeitung, um Diskontinuitäten, undefinierte Regionen und Verzweigungsschnitte zu behandeln.
Victor Liu
Die symbolische Vorverarbeitung, von der Sie sprechen, wird in der Dokumentation als "Ausschlusserkennung" bezeichnet. Es kann entweder Exclusions -> Nonedeaktiviert werden, indem die Struktur Ihrer Funktion ausgeblendet Plotwird, indem es als definiert wird f[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.
Szabolcs
"The Mathematica Graphics Guidebook" enthielt eine sehr gute Diskussion des Problems. Mir hat besonders gut gefallen, dass auch die Mängel des Algorithmus beschrieben wurden.
Soegaard
Ich kann die GitHub-Datei nicht mehr finden. Wurde sie verschoben?
Andrei
12

Zu wissen, wie andere CAS dies tun, könnte Ihnen helfen.

f(x)(x(t),y(t))f(x)

  1. 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.)

  2. (x1,f(x1)),(x2,f(x2)),(x3,f(x3))x1+x22x2+x32

  3. Wenn wir die MaxRecursionin 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:

nd[{points_, values_}] :=
Transpose@{(Drop[points, 1] + Drop[points, -1])/2,
Differences[values]/Differences[points]}

subdivide1d[result_, resolution_, maxAngle_: 10] :=
  Module[
    {deriv, angle, dangle, pos, nf},
    deriv = nd[result\[Transpose]];
    angle = ArcTan[#2] & @@@ deriv;
    dangle = Differences[angle];
    pos = Flatten@Position[dangle, d_ /; Abs[d] > maxAngle/180 Pi];
    pos = Union[pos, pos + 1];
    nf = Nearest[result[[All, 1]]];
    Select[deriv[[pos, 1]], Abs[# - First@nf[#]] > resolution &]
  ]
Szabolcs
quelle
7

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:

Gute Routinen zum Zeichnen von Graphen verwenden adaptive Algorithmen, die mehr Punkte in Regionen zeichnen, in denen sich die Funktion am schnellsten ändert (Wagon 1991, Math Works 1992, Heck 1993, Wickham-Jones 1994). Tupper (1996) hat einen Algorithmus entwickelt [...]

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.

Astrojuanlu
quelle
1

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).

Chris Rackauckas
quelle