czwartek, 21 listopada 2019

PE Szybkie wyliczanie funkcji ATAN Archiwum

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ć.

2 komentarze:

  1. Alternatywnie można stablicować ale duża dokładność wymaga interpolacji czyli nie ma to sensu

    OdpowiedzUsuń
    Odpowiedzi
    1. Witam Ważny jest czas obliczeń i dokładność wyniku.

      Usuń