Quelle est la meilleure façon de trouver les discontinuités d'une fonction boîte noire?

20

Il a été suggéré que cela pourrait être un meilleur endroit pour cette question que Mathematics Stack Exchange où je l'ai posée auparavant .

Supposons que l'on ait une fonction de boîte noire qui peut être évaluée n'importe où (à moindre coût) sur un intervalle spécifié et qu'il n'y ait pas de bruit (sauf la granularité à virgule flottante, par exemple). Quelle serait la meilleure façon de trouver les discontinuités de cette fonction? Je ne sais pas combien il pourrait y avoir de discontinuités et il n'y en a peut-être pas.[une,b]

Je peux penser à quelques méthodes simples (échantillonnage uniforme, affiner là où il y a de grandes différences entre les échantillons, ...), mais peut-être y a-t-il une meilleure façon?

La fonction est "raisonnable" dans la mesure où l'on pourrait supposer qu'elle a au plus un nombre fini de discontinuités, de même pour les dérivés supérieurs, cela ne me dérange pas si de petites discontinuités pathologiques sont manquées ... (l'application est un traçage automatisé des fonctions 1d) .

-

Merci à tous ceux qui ont répondu, en particulier Pedro; la méthode décrite dans Pachón, Platte et Trefethen semble être la meilleure approche pour moi, donc je vais maintenant l'implémenter

n00b
la source
Je dois me demander si l'une des méthodes proposées peut gérer
1X-1X
JM
@JM: J'ajouterai un tracé de cette fonction lorsque j'aurai terminé l'implémentation.
n00b
@ n00b: Vous pourriez trouver ce concept utile. : mathoverflow.net/q/165038/14414
Rajesh Dachiraju

Réponses:

18

Si vous utilisez Matlab, vous pourriez être intéressé par le projet Chebfun . Chebfun prend une fonction, l'échantillonne et essaie de la représenter comme un interpolant polynomial. Si votre fonction présente des discontinuités, Chebfun devrait être capable de les détecter avec la splitting oncommande. Vous pouvez trouver quelques exemples ici .

Si vous êtes intéressé par les algorithmes sous-jacents, une bonne référence est l'article de Pachón, Platte et Trefethen " Piecewise Smooth Chebfuns ".

Pedro
la source
Merci Pedro, je connais Chebfun qui est génial, mais énorme (et vient avec un coût implicite élevé via la licence Matlab). Je cherche donc vraiment un petit algorithme serré pour ce problème que j'implémenterais moi-même.
n00b
@ n00b: Bon point. J'ai ajouté une référence à l'article décrivant les algorithmes sous-jacents, par exemple pour la détection des contours.
Pedro
Ah, excellent! Je n'avais pas vu ce document et, contrairement à mes attentes, il semble que le chercheur de discontinuité Chebfun n'utilise pas réellement Chebfuns - donc cela semble être éminemment utilisable. Je vais le lire attentivement et inspecter le code correspondant ....
n00b
11

Je soupçonne que l'algorithme chebfun doit sembler plus pratique, mais il est nécessaire de mentionner une autre façon de détecter les discontinuités, à savoir la transformée en ondelettes discrète. Vous pouvez vous faire une idée de son fonctionnement en consultant cette page de documentation Mathematica , voir la section> Applications> Détecter les discontinuités et les arêtes.

En bref, vous pouvez prendre DWT de F

faleichik
la source
8

Les méthodes pondérées essentiellement non oscillantes (WENO) utilisent des «indicateurs de lissage» pour détecter les discontinuités dans les méthodes de volume fini et de différence. D'après la description de Chebfun donnée par Pedro, il semble que l'idée générale soit la même: construire un ensemble de polynômes d'interpolation et les utiliser pour calculer une certaine mesure de lissage.

Voir GS Jiang et CW Shu, Efficient Implementation of Weighted ENO Schemes, J.Comput.Phys., Vol. 126, p. 202-228, 1996.

Matthew Emmett
la source
5

Avec @Pedro, j'examinerais les algorithmes de détection des contours. Une discontinuité est un infini sur le dérivé, alors pensez à regarder un maillage de plus en plus fin et à cibler les régions d'intérêt.

L'approximation des différences finies à la dérivée d'une fonction continue devrait diminuer à mesure que le maillage est affiné. La comparaison du résultat de différence finie pour la dérivée entre les mailles pourrait alors révéler des divergences dans le gradient qui signalent des discontinuités.

F(X)=sjegn(X)|X|X=0hX0

Phil H
la source
1
Une subtilité du problème est que, bien qu'une discontinuité puisse être considérée comme ayant une infinité dans la dérivée, l'inverse n'est pas vrai - le signe de fonction (x) * sqrt (| x |) est parfaitement continu à x = 0, mais le dérivé y est infini
n00b
Je suis également en désaccord avec le commentaire selon lequel "toute fonction continue devrait être fluide à une échelle suffisamment petite". La douceur est liée aux dérivés continus; la continuité de la fonction d'origine est une condition nécessaire, mais pas suffisante.
Geoff Oxberry
1
@GeoffOxberry: a supprimé cette déclaration. C'est un résultat raisonnable dans FD, mais pas analytiquement.
Phil H