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.