Mam pętlę sterowania działającą z wysoką częstotliwością i trzeba obliczyć pierwiastek kwadratowy każdego cyklu. Typowe pierwiastki kwadratowe działają dobrze, ale zajmują zbyt wiele czasu. Ponieważ wartość, którą biorę pierwiastek kwadratowy nie zmienia się zbytnio w każdym cyklu, chciałbym znaleźć iteracyjny pierwiastek kwadratowy, który zbiegnie się, a następnie prześledzi poprawny wynik. W ten sposób mogę wykonać pojedynczą iterację za każdym razem, a nie za wiele.śledzenie pierwiastka kwadratowego z ruchomej wartości
Problem polega na tym, że wszystkie powtarzające się pierwiastki kwadratowe, które widziałem, prawdopodobnie zawiodą, gdy dane wejściowe ulegną zmianie. W szczególności wygląda na to, że pojawią się problemy, gdy wejście zmieni się na zero, a następnie ponownie wzrośnie - metody nie lubią zaczynać od zgadywania zerowego.
Mój zakres wejściowy wynosi 0-4.5 i potrzebuję precyzji około 0,01, więc użycie inkrementu/dekrementacji o wartości 0,01 może potrwać zbyt długo - chcę, aby w większości zbiegał się z 10 cyklami lub mniej.
FYI Używam stałego punktu 16/32bit, wejście to 16bit q12. Jest na mikrokontrolerze, więc nie jestem zainteresowany wykorzystaniem 1K do tabeli odnośników. Kod jest również generowany z modelu Simulink, a jego funkcje wyszukiwania tabel są dość pełne narzutów.
Czy jest to dobre rozwiązanie?
Jeden strzał Metoda Halleya (http://www.mathpath.org/Algor/squareroot/algor.square.root.halley.htm) powinien robić dobrze. Jeśli chcesz uniknąć dzielenia, zaktualizuj 1/sqrt (x) zamiast tego i użyj Newtona lub Halleya. –
Co masz na myśli, zmiana wartości? Mówisz, że chcesz znaleźć 'sqrt (x + epsilon)' wiedząc 'x' i' sqrt (x) 'bez konieczności obliczania go bezpośrednio?Czy możesz powiedzieć, że rejestr zawierający x jest niestabilny i może zmienić się w środku obliczeń (!?!)? –
Zobacz funkcję 'FastSqrt' używaną w grach http://www.gamedev.net/topic/278840-fast-sqrt/ – ja72