Algorithmes pour le traçage de fonctions (adaptatives?)

21

Je recherche des algorithmes pour dessiner des graphiques 2D standard pour des fonctions qui peuvent ou non avoir des singularités. Le but est d'écrire un "Mini-CAS", donc je n'ai pas de connaissance a priori sur les types de fonctions, les utilisateurs veulent faire un graphique.

Ce problème est très ancien, donc j'imagine qu'il doit y avoir des algorithmes standard dans la littérature. Pour une fois je n'ai pas eu beaucoup de succès à trouver des références via Google.

J'ai trouvé un algorithme intéressant, à savoir celui de "YACAS - Livre d'algorithmes" nommé "Tracé de fonction adaptative".

Bref:

  • Existe-t-il des algorithmes standard?
  • Existe-t-il une suite de tests pour les fonctions connues difficiles à tracer?
  • Quels sont les articles intéressants à lire?
soegaard
la source
2
Peut-être que la question serait mieux comprise avec le "traçage de fonction" au lieu de "dessin de graphique"? J'ai mal interprété le titre au début (théorie des graphes).
astrojuanlu
@ Juanlu001 Merci pour la suggestion. J'ai changé de titre.
soegaard
Quand vous dites 2D, voulez-vous dire tracer une fonction à une variable telle que , ou êtes-vous également intéressé par une fonction à deux variables ( f ( x , y ) ) montrée en 2D avec par exemple différentes couleurs / nuances représentant des valeurs différentes? f(x)f(x,y)
Szabolcs
Eh bien, je voulais dire tracer une fonction d'une variable. Cependant, j'aimerais également entendre parler d'algorithmes pour choisir les points à évaluer dans un paramètre à deux variables. Je ne suis pas si intéressé à entendre parler des couleurs et des ombres.
soegaard
Pour les fonctions 2D, voir ma question et réponse ici . Ce que j'ai fait là-bas était assez limité et ne fonctionnera pas si bien pour une fonction arbitraire. De plus, il manque certaines étapes essentielles dans la description sans lesquelles la méthode ne convergera pas correctement: j'avais besoin d'insérer un nouveau point d'échantillonnage au milieu de chaque bord du maillage qui disparaîtrait lors de la prochaine retangulation. (suite)
Szabolcs

Réponses:

10

J'ai implémenté la routine d'échantillonnage adaptatif de Mathematica ici sur GitHub (c'est un seul fichier C, remontez à l'arborescence source pour le fichier d'en-tête). J'ai trouvé une description de la routine dans un grand livre sur Mathematica il y a longtemps, et j'utilise des variations sur cette implémentation depuis un certain temps maintenant. Il fait essentiellement un échantillon linéaire approximatif sur le domaine d'intérêt, puis revient pour affiner les régions de haute courbure. Il est possible que certaines fonctionnalités très nettes soient manquées, mais en pratique, je trouve cela extrêmement rare. Ce fichier contient également la version parallèle.

Victor Liu
la source
1
De quel livre s'agit-il? Est-ce celui que j'ai lié? Savez-vous ce qui change exactement dans leur implémentation entre les versions 5 et 6?
Szabolcs
1
@Szabolcs: Non, je pense que c'était dans la section 4.1.3 de ce livre . La description applique une très ancienne version de Mathematica. Les versions plus récentes (peut-être à partir de la v6) détectent les asymptotes verticales et suppriment les lignes verticales parasites des tracés. Les nouvelles versions font certainement beaucoup de prétraitement symbolique sophistiqué pour traiter les discontinuités, les régions indéfinies et les coupures de branches.
Victor Liu
Le prétraitement symbolique dont vous parlez est appelé «détection d'exclusion» dans la documentation. Il peut être désactivé soit en Exclusions -> Nonemasquant la structure de votre fonction Ploten la définissant comme f[x_?NumericQ] := .... Ce n'est pas ce à quoi je faisais référence lorsque j'ai posé des questions sur les changements. Je crois qu'il y a eu quelques changements à l'algorithme, comme v5 et v6 échantillonnés à différents points. Pour le moment, je ne peux pas tester la v5 pour comparer à nouveau.
Szabolcs
"The Mathematica Graphics Guidebook" contenait une très bonne discussion du problème. J'ai particulièrement apprécié le fait que les courtes entrées de l'algorithme aient également été décrites.
soegaard
Je ne trouve plus le fichier GitHub, a-t-il bougé?
Andrei
12

Savoir comment les autres SAE font cela pourrait vous aider.

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

  1. Commencez avec une grille de points régulièrement espacée sur le domaine de traçage. (Dans Mathematica, il y a un paramètre pour contrôler le nombre à prendre, appelé PlotPoints.)

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

  3. Si nous n'avons pas encore atteint la limite d'itération (définie par MaxRecursiondans Mathematica), répétez à partir de l'étape 2.

Une partie de cela est discutée dans le livre Mathematica in Action de Stan Wagon, que vous pouvez voir ici sur Google Books .

J'ai implémenté cet algorithme avant d'avoir un meilleur contrôle sur le nombre de fois où ma fonction coûteuse à calculer a été évaluée. Voici le code Mathematica pour l'étape 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
la source
7

La page Web de MathWorld sur les graphiques de fonctions contient des références à plusieurs articles qui semblent être pertinents sur le traçage de fonctions adaptatives. Citant la page:

De bonnes routines pour tracer des graphiques utilisent des algorithmes adaptatifs qui tracent plus de points dans les régions où la fonction varie le plus rapidement (Wagon 1991, Math Works 1992, Heck 1993, Wickham-Jones 1994). Tupper (1996) a développé un algorithme [...]

D'un autre côté, sur Google, je suis tombé sur un papier

www.cs.uic.edu/~wilkinson/Publications/plotfunc.pdf

qui explique comment bien choisir le domaine et d'autres choses. J'espère qu'ils vous sont utiles.

astrojuanlu
la source
1

J'ai trouvé ce sujet et j'ai pensé que je devrais partager la page de problème du développeur pour l'ajouter à la bibliothèque Julia Plots.jl. Nous avons essayé un tas de techniques pour voir ce qui donnerait de bons résultats, à partir des notes sur l'implémentation de Mathematica. En ajoutant de l'élagage, une petite perturbation pour ne pas démarrer exactement aux points finaux de l'intervalle, une limite de récursivité et un estimateur d'erreur à double maille étaient tous nécessaires pour "obtenir le bon résultat". Le fil vous pointe également vers le code open source pour l'implémentation. Il a donc fallu un peu de peaufinage, mais l'ajout de ces fonctionnalités l'a rendu assez robuste (selon les tests, comme indiqué dans le fil).

Chris Rackauckas
la source