Finden Sie alle Wurzeln einer Funktion in einem bestimmten Intervall


9

Ich muss alle Wurzeln einer Skalarfunktion in einem bestimmten Intervall finden. Die Funktion kann Diskontinuitäten aufweisen. Der Algorithmus kann eine Genauigkeit von ε haben (z. B. ist es in Ordnung, wenn der Algorithmus keine zwei unterschiedlichen Wurzeln findet, die näher als ε liegen).

Gibt es einen solchen Algorithmus? Könnten Sie mir Papiere darüber zeigen?


Tatsächlich habe ich eine Funktion zum Finden einer Null in einem bestimmten Intervall unter Verwendung des Brent-Algorithmus und eine Funktion zum Finden eines Minimums in einem bestimmten Intervall. Mit diesen beiden Funktionen habe ich meinen eigenen Algorithmus erstellt, mich aber gefragt, ob es einen besseren Algorithmus gibt. Mein Algorithmus ist so:

Ich beginne mit einem Intervall [a,b]und einer Funktion f. Wenn sign(f(a+ε)) ≠ sign(f(b-ε)), ich weiß, gibt es mindestens eine Null zwischen aund b, und ich finde z = zero(]a,b[). Ich teste, ob es zwirklich eine Null ist (es könnte eine Diskontinuität sein), indem ich den Wert von z-εund betrachte z+ε. Wenn ja, füge ich es der Liste der gefundenen Nullen hinzu. Wenn f(a+ε)und f(b-ε)beide positiv sind, suche ich m = min(]a, b[). Wenn f(m)immer noch positiv ist, suche ich, m = max(]a,b[)weil es eine Diskontinuität zwischen aund geben könnte b. Ich mache das Gegenteil, wenn f(a+ε)und f(b-ε)waren Negative.

Ab dem Punkt, den ich gefunden habe ( zoder m), baue ich einen Stapel, der die Nullen, Diskontinuitäten und Wendepunkte meiner Funktion enthält. Nach der ersten Iteration sieht der Stapel nun so aus [a, z, b]. Ich starte den Algorithmus erneut aus Intervallen ]a,z[und ]z,b[. Wenn zwischen zwei Punkten aund bdie Extrema das gleiche Vorzeichen haben wie beide Intervallenden und es an beiden Extremen keine Diskontinuitäten gibt, entferne ich das Intervall vom Stapel. Der Algorithmus endet, wenn keine Intervalle mehr vorhanden sind.


2
Es gibt Methoden, die auf Intervallarithmetik basieren.
lhf

Antworten:


6

Wenn Sie Matlab verwenden, können Sie das Chebfun- System ausprobieren (Haftungsausschluss: Ich war früher ein aktiver Entwickler dieses Projekts). Es kann alle Wurzeln einer eindimensionalen Funktion in einem geschlossenen oder offenen Intervall mit Maschinengenauigkeit finden.

Die Hauptidee hinter dem Chebfun-Wurzelfinder besteht darin, eine Kombination aus rekursiver Halbierung und der Colleague-Matrix, einem Analogon der Companion-Matrix , für die Koeffizienten eines Interpolanten der Zielfunktion zu verwenden.

Ich habe eine vereinfachte Version des Codes hier . Die Funktion verwendet chebrootseine anonyme Funktion als erste Eingabe, das endliche Intervall als zweites und drittes Argument und einen Grad Nals viertes und letztes Argument. Für vernünftige Ergebnisse können Sie einstellen , Nauf 100.


0

Im Allgemeinen ist dies eine hoffnungslose Aufgabe - ohne Informationen über die Kontinuität und / oder Differenzierbarkeit der Funktion könnte alles passieren. Betrachten Sie zum Beispiel die MATLAB-Funktion, die im Intervall von 0 bis 1 definiert ist:

Funktion y = f (x)

y = 1,0;

if (x == 0,01)

y = 0,0;

Ende

if (x == 0,013)

y = 0,0;

Ende

if (x == 0,753124)

y = 0,0;

Ende

Wenn Sie diese Funktion als Blockbox behandeln, können Sie nicht erkennen, dass sie an diesen drei Punkten Nullen und keine anderen Punkte im Intervall von 0 bis 1 aufweist, ohne jede Gleitkommazahl zwischen 0 und 1 zu überprüfen.


1
Diese Art von Nullen ist eindeutig nicht zu finden, aber @Charles schien im schlimmsten Fall an Black-Box-Funktionen mit Sprungdiskontinuitäten interessiert zu sein, jedoch nicht an sogenannten entfernbaren Diskontinuitäten.
Bill Barth

1
Selbst wenn Sie sich darauf beschränken, Diskontinuitäten zu überspringen, und selbst wenn Sie sich auf kontinuierliche Funktionen beschränken, wenn die Funktion in bekannten Intervallen nicht Lipschitz-stetig ist, können Sie nicht sicher sein, alle Nullen aus Auswertungen an einer endlichen Anzahl von Punkten zu finden Holen Sie sich alle Wurzeln.
Brian Borchers

Betrachten Sie insbesondere die Funktion als Beispiel, bei dem es schwierig sein wird , alle Nullen im Intervall zu finden. sin(1/x)[0,1]
Wolfgang Bangerth

Das OP war bereit, ein anzugeben . Wenn die Funktion pathologisch ist, werden viele Nullen gefunden, aber es scheint, als wäre das Leben. Möglicherweise muss er auch eine maximale Anzahl von Intervallen für die Suche festlegen, um solche Pathologien zu vermeiden. ϵ
Bill Barth
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.