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 a
und b
, und ich finde z = zero(]a,b[)
. Ich teste, ob es z
wirklich 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 a
und geben könnte b
. Ich mache das Gegenteil, wenn f(a+ε)
und f(b-ε)
waren Negative.
Ab dem Punkt, den ich gefunden habe ( z
oder 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 a
und b
die 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.
quelle
Antworten:
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
chebroots
eine anonyme Funktion als erste Eingabe, das endliche Intervall als zweites und drittes Argument und einen GradN
als viertes und letztes Argument. Für vernünftige Ergebnisse können Sie einstellen ,N
auf100
.quelle
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.
quelle