Ich habe einen Regelkreis, der mit hoher Frequenz läuft und jeden Zyklus eine Quadratwurzel berechnen muss. Typische Quadratwurzelfunktionen funktionieren gut, erfordern jedoch übermäßige Zeit. Da der Wert, den ich der Quadratwurzel nehme, sich nicht zu sehr bei jedem Zyklus ändert, würde ich gerne eine iterative Quadratwurzel finden, die konvergiert und dann das korrekte Ergebnis verfolgt. Auf diese Weise konnte ich bei jedem Zeitschritt eine einzige Iteration durchführen, anstatt viele.Verfolgungswurzelwurzel des sich bewegenden Wertes
Das Problem ist, dass alle iterativen Quadratwurzel-Methoden, die ich gesehen habe, wahrscheinlich fehlschlagen werden, wenn sich die Eingabe ändert. Insbesondere sieht es so aus, als würde es Probleme geben, wenn die Eingabe auf Null geht und dann wieder zunimmt - die Methoden möchten nicht mit einer Schätzung von Null beginnen.
Mein Eingabebereich ist 0-4,5 und ich brauche eine Genauigkeit von etwa 0,01, also könnte die Verwendung eines Inkrementes/Dekrements von 0,01 viel zu lange dauern - ich möchte, dass es in 10 Zyklen oder weniger konvergiert.
FYI Ich verwende 16/32bit Festpunkt der Eingang ist 16bit q12. Es ist auf einem Mikrocontroller, also bin ich nicht daran interessiert, 1K für eine Nachschlagetabelle zu verwenden. Der Code wird auch aus einem Simulink-Modell generiert, und ihre Tabellen-Lookup-Funktionen sind ziemlich voll mit Overhead.
Gibt es eine schöne Lösung?
Ein Schuss von Halleys Methode (http://www.mathpath.org/Algor/squareroot/algor.square.root.halley.htm) sollte in Ordnung tun. Wenn Sie die Division vermeiden möchten, aktualisieren Sie stattdessen 1/sqrt (x) und verwenden Sie Newton oder Halley. –
Was meinst du, der Wert ändert sich? Willst du sagen, dass du 'sqrt (x + epsilon)' wissen 'x' und' sqrt (x) 'finden willst, ohne es direkt berechnen zu müssen?Oder sagen Sie, dass das Register, das x enthält, flüchtig ist und sich in der Mitte der Berechnung (!?!) Ändern kann? –
Schauen Sie sich diese 'FastSqrt'-Funktion an, die beim Spielen verwendet wird http://www.gamedev.net/topic/278840-fast-sqrt/ – ja72