Was ist der beste Weg, um Diskontinuitäten einer Black-Box-Funktion zu finden?

20

Es wurde vorgeschlagen, dass dies ein besserer Ort für diese Frage sein könnte als Mathematics Stack Exchange, wo ich es zuvor gefragt habe .

Angenommen, man hat eine Black-Box-Funktion, die in einem bestimmten Intervall überall (kostengünstig) ausgewertet werden kann und kein Rauschen aufweist (mit Ausnahme beispielsweise der Gleitkommagranularität). Was wäre der beste Weg, um die Diskontinuitäten dieser Funktion zu finden? Ich weiß nicht, wie viele Diskontinuitäten es geben könnte und keine.[a,b]

Ich kann mir einige einfache Methoden vorstellen (einheitliche Probenahme, Verfeinerung bei großen Unterschieden zwischen den Proben, ...), aber vielleicht gibt es einen besseren Weg?

Die Funktion ist "vernünftig", da man davon ausgehen könnte, dass sie höchstens endlich viele Diskontinuitäten aufweist, das gleiche gilt für höhere Ableitungen. Es macht mir nichts aus, wenn kleine pathologische Diskontinuitäten übersehen werden ... (die Anwendung zeichnet automatisch 1d-Funktionen) .

-

Vielen Dank an alle, die geantwortet haben, insbesondere an Pedro; Die in Pachón, Platte und Trefethen beschriebene Methode scheint der beste Ansatz für mich zu sein. Deshalb werde ich sie jetzt implementieren

n00b
quelle
Ich muss mich fragen, ob eine der vorgeschlagenen Methoden 1 bewältigen kann
1x1x
JM
@JM: Ich werde einen Plot dieser Funktion hinzufügen, wenn ich die Implementierung abgeschlossen habe.
n00b
@ n00b: Vielleicht findest du dieses Konzept nützlich. : mathoverflow.net/q/165038/14414
Rajesh Dachiraju

Antworten:

18

Wenn Sie Matlab verwenden, sind Sie möglicherweise am Chebfun-Projekt interessiert . Chebfun nimmt eine Funktion, tastet sie ab und versucht, sie als Polynominterpolante darzustellen. Wenn Ihre Funktion Diskontinuitäten aufweist, sollte Chebfun diese mit dem splitting onBefehl erkennen können . Hier finden Sie einige Beispiele finden Sie hier .

Wenn Sie sich für die zugrunde liegenden Algorithmen interessieren, ist Pachón, Platte und Trefethens Arbeit " Piecewise Smooth Chebfuns " eine gute Referenz .

Pedro
quelle
Danke Pedro, ich kenne Chebfun, das großartig, aber riesig ist (und mit hohen impliziten Kosten über die Matlab-Lizenz verbunden ist). Ich bin also auf der Suche nach einem kleinen, engen Algorithmus für dieses Problem, den ich selbst implementieren würde.
n00b
@ n00b: Guter Punkt. Ich habe einen Verweis auf das Papier hinzugefügt, in dem die zugrunde liegenden Algorithmen beschrieben werden, z. B. für die Kantenerkennung.
Pedro
Ah, ausgezeichnet! Ich hatte dieses Papier nicht gesehen und es scheint, dass der Chebfun-Diskontinuitätsfinder eigentlich keine Chebfuns verwendet - dies scheint also überaus brauchbar zu sein. Ich werde es sorgfältig lesen und den entsprechenden Code überprüfen ....
n00b
11

Ich vermute, dass der Chebfun-Algorithmus praktischer erscheinen muss, aber es ist notwendig, einen weiteren Weg zur Erkennung von Diskontinuitäten zu erwähnen, nämlich die diskrete Wavelet-Transformation. Auf dieser Mathematica-Dokumentationsseite können Sie sich ein Bild davon machen, wie es funktioniert. Siehe Abschnitt> Anwendungen> Diskontinuitäten und Kanten erkennen.

f

Faleichik
quelle
8

Bei den WENO-Methoden (Weighted Essially Non-Oscillatory) werden "Glättungsindikatoren" verwendet, um Diskontinuitäten bei Methoden mit endlichem Volumen und Differenzen zu erkennen. Aus der Beschreibung von Chebfun, die Pedro gegeben hat, scheint die allgemeine Idee dieselbe zu sein: Konstruiere eine Menge interpolierender Polynome und benutze sie, um ein gewisses Maß an Glätte zu berechnen.

Siehe GS Jiang und CW Shu, Efficient Implementation of Weighted ENO Schemes, J. Comput. 126, S. 202-228, 1996.

Matthew Emmett
quelle
5

Zusammen mit @Pedro würde ich mich mit Kantenerkennungsalgorithmen befassen. Eine Diskontinuität ist eine Unendlichkeit des Derivats. Betrachten Sie daher ein immer feiner werdendes Netz und die Zielregionen von Interesse.

Die endliche Differenzannäherung an die Ableitung einer stetigen Funktion sollte sich verringern, wenn das Netz verfeinert wird. Der Vergleich des Endlichdifferenzergebnisses für die Ableitung zwischen Maschen könnte dann Abweichungen im Gradienten aufdecken, die Diskontinuitäten signalisieren.

f(x)=sign(x)|x|x=0hx0

Phil H
quelle
1
Eine Feinfühligkeit des Problems ist, dass, obwohl eine Diskontinuität als unendlich in der Ableitung angesehen werden kann, das Gegenteil nicht zutrifft - das Funktionszeichen (x) * sqrt (| x |) ist bei x = 0 vollkommen stetig. aber die Ableitung ist dort unendlich
n00b
Ich bin auch nicht einverstanden mit der Bemerkung, dass "eine kontinuierliche Funktion in einem ausreichend kleinen Maßstab glatt sein sollte". Glätte hat mit kontinuierlichen Derivaten zu tun; Die Kontinuität der ursprünglichen Funktion ist eine notwendige, aber keine ausreichende Bedingung.
Geoff Oxberry
1
@GeoffOxberry: Diese Anweisung wurde entfernt. Es ist ein vernünftiges Ergebnis in FD, aber nicht analytisch.
Phil H