PE Szybkie
wyliczanie funkcji ATAN Archiwum
1.Resolver
czyli selsyn jest dokładnym i sprawdzonym w praktyce sensorem kąta
powszechnie używanym w maszynach CNC i robotach. Jego wielkim
mankamentem jest skomplikowany i rozbudowany przetwornik A/D.
Przy
zasilaniu rotora w szczycie zasilającego napięcia sinusoidalnego
możemy jednocześnie spróbkować stan napięć z uzwojeń
wyjściowych SIN i COS i przetworzyć je przetwornikiem A/D.
Kombinacja znaków SIN i COS daje nam jednoznaczny przedział
mierzonego kąta. Dzieląc mniejszą co do wartości bezwzględnej
wartość ( SIN lub COS ) przez większą otrzymany liczbę z
przedziału -1...1 ( z której obliczymy arcustangens i prostej
tożsamości arcuscotangens ) i rozważania zawężamy do
przedziału argumentu 0..1 jako że arctg(x)=-arctg(-x). Pełny kąt
uzyskamy z trywialnych tożsamości.
2.Funkcje
trygonometryczne i niektóre inne można efektywnie wyliczyć znaną
od lat metodą COORDIC jeśli jest do tego specjalizowany hardware
lub dedykowane instrukcje procesora. Wymagane jest tylko dodawanie i
przesuwanie. Wymagane są też wcześniej wyliczone wartości
pomocnicze w tabeli. Metody tej użyto w koprocesorach numerycznych
8087 i 80287 do procesorów Intela w komputerach PC XT i AT. Metodę
tą stosuje też w koprocesorach konkurencyjna Motorola. W układach
kalkulatorów naukowych metoda jest stosowana od lat.
3.Funkcje
można dość gęsto stablicować i interpolować liniowo lub co
najwyżej kwadratowo między wartościami wziętymi z tabeli. Metoda
jest efektywna ale potrzeba dużo miejsca na tablice z wartościami
funkcji.
4.Łatwe
jest wyznaczenie wielomianu interpolacyjnego dla danej funkcji choćby
wielomianu Lagrangea. Użycie wysokich stopni wielomianów które
wydawałoby się prowadzą do dużej dokładności daje kontr
intuicyjny efekt przeciwny - tak zwany efekt Rungego – ogromne
oscylacje wartośc wielomianu między węzłami przez które
wielomian przechodzi. Efekt Rungego jest w pozornej sprzeczności z
twierdzeniem Weierstrassa o tym że istnieje ciąg wielomianów
interpolujących coraz wyższych rzędów o coraz lepszej
dokładności. Dokładny wielomian oczywiście istnieje ale dla
nieznanych węzłów ! Najgorsze są często wielomiany o
równoodległych węzłach.
5.Jeśli
komputer nie ma koprocesora używa się funkcji bibliotecznych w
których stosuje się wielomiany aproksymujące i mnożenie i
dodawanie zmiennoprzecinkowe. Mimo iż w ich napisanie włożono
wiele wysiłku funkcje są powolne i nie zawsze tak dokładne jak
powinny być.
6.Wielomiany
najlepiej średniokwadratowo aproksymujące daną funkcje można
łatwo wyliczyć metodą najmniejszych kwadratów. Ale...z reguły
chcemy aby błąd mieścił się w określonym pasie tolerancji czyli
konieczne jest stosowanie kryterium błędu Min-Max a nie
średniokwadratowego.
7.Arcustangens
jest funkcją cyklometryczną. Im funkcja w interesującym przedziale
jest bardziej pogięta tym mniej dokładna i trudniejsza jest jej
aproksymacja wielomianem. Korzystając z trywialnych tożsamości
wystarczy funkcje atan (krótsza i wygodniejsza nazwa) móc wyliczyć
dla argumentu z przedziału 0...1.
Dla
atan(0)=0 a atan(1)=Pi/4. Gdy funkcje atan przybliżymy linią prostą
(Pi/4) x poprowadzoną przez te punkty to błąd przybliżenia jest
zbliżony ( ale tylko zbliżony !) do funkcji kwadratowej ale jest
koszmarnie duży, na wykresie ( cyan ) zmniejszono go
dziesięciokrotnie. Błąd ten dla argumentu x=0 wynosi zero i dla 1
wynosi zero czyli można go przybliżyć wielomianem ax(1-x). Chcąc
aby ten wielomian pokrył się z błędem dla x=0.5, a=0.284. Na
wykresie kolorem niebieskim pokazano błąd aproksymacji z takim
współczynnikiem. Faktycznie dla x=0, x=0.5 i x=1 błąd jest zerowy
ale niestety nie spełnia on kryterium minimaksowego. Spełnia to
kryterium dla a=0.273 i błąd jest zerowy dla x=0, x=1 i dla circa
x=0.364. Maksymalna wartość bezwzględna błędu wynosi 0.0376
rad czyli 0.22 stopnia ( przelicznik jest ca 5.73... ).
Funkcja
atan ze wzrastającym argumentem x coraz to bardziej się zgina co
sugeruje użycie dla redukcji błędu wielomianu ax(1-x)(1+bx).
Minimaksowe własności aproksymacji ( kolor czerwony) uzyskujemy dla
circa a=0.2447 i b= 0.2709. Błąd zeruje się dla x = 0, 0.28,
0.67 i 1.
Maksymalna
wartość bezwzględna błędu wynosi ca 0.0015 rad czyli 0.086
stopnia.
Gdy
współczynniki aproksymacji skwantujemy ( to osobny temat) i
skwantujemy argument oraz wynik do dokładności 16 bitowej i
zastosujemy arytmetykę stałoprzecinkową 16 bitową błąd
przekracza 0.0021 rad. Zastosowanie arytmetyki stałoprzecinkowej
jako ułamkowej jest osobnym tematem i tam jako przykład podano kod
źródłowy funkcji atan w asemblerze '286.
Wniosek
z porównania błędów aproksymacji jest taki że dokładniejsza
aproksymacja 4 rzędu jest niecelowa bowiem za mało dokładna jest
arytmetyka 16 bitowa a w szybkich zastosowaniach czasu rzeczywistego
tylko takiej wolno nam użyć.
Alternatywnie można stablicować ale duża dokładność wymaga interpolacji czyli nie ma to sensu
OdpowiedzUsuńWitam Ważny jest czas obliczeń i dokładność wyniku.
Usuń