[Bascom] Pierwiastkowanie

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
Awatar użytkownika
Kulpina
Użytkownik
Posty: 2037
Rejestracja: 28 lip 2005, 16:57
Lokalizacja: Sanok
Kontakt:

[Bascom] Pierwiastkowanie

Post autor: Kulpina » 07 sie 2008, 10:31

Czy jest jakies konkretne polecenie lub prosty algorytm, umożliwiający wyciągnięcie pierwiastka z podanej liczby?

Jasam
Użytkownik
Posty: 422
Rejestracja: 27 mar 2007, 21:09

Post autor: Jasam » 07 sie 2008, 11:55

Można użyć funkcji SQR(w większości języków pierwiastkowanie kwadratowe to sqrt lub sqr)
Cytat z manuala Bascomowego:
"SQR() (>= 1.11.6.8)
Przeznaczenie: Zwraca wartość pierwiastka kwadratowego podanej liczby.
Składnia:
zmienna = SQR( wartość )
gdzie:
zmienna- zmienna w której umieszczony będzie wynik działania funkcji,
wartość- zmienna której wartość pierwiastka należy obliczyć.

Opis: Gdy jako parametr funkcji SQR podano liczbę typu Single, należy koniecznie w programie
dodać dyrektywę: $lib = "FP_TRIG.LBX".Gdy funkcja SQR jest wywoływana z parametrem typu Byte, Integer, Word lub Long, używana jest wtedy procedura SQR pochodząca z biblioteki MCS.LBX. Jako alternatywę można użyć biblioteki SQR_IT.LBX lub SQR.LBX. "

Awatar użytkownika
Kulpina
Użytkownik
Posty: 2037
Rejestracja: 28 lip 2005, 16:57
Lokalizacja: Sanok
Kontakt:

Post autor: Kulpina » 07 sie 2008, 14:38

A są polecenia dotyczące innych operacji matematycznych? sin, cos, tg, pierwiastek sześcienny itp?

[ Dodano: 2008-08-07, 15:39 ]
sinus znalazłem :mrgreen: Ale pierwiastka sześciennego chyba nie ma

Jasam
Użytkownik
Posty: 422
Rejestracja: 27 mar 2007, 21:09

Post autor: Jasam » 07 sie 2008, 15:57

Pierwsiastka sześciennego nie ma o ile wiem. Ale wszystkie funkcje trygonometryczne są- także hiperbolicznie:
zmienna = TAN( liczba )
zmienna = SIN( liczba )
zmienna = COS( liczba )

Hiperbolicznie to wygląda np. SINH,TANH itd...
Jest dostępny także arcustangens w dwóch wersjach:
zmienna = ATN( wartość )
zmienna = ATN2( x , y )

Pierwsza z nich zwraca wartośc arcustangensa liczby wyrażonej w radianach. Jest to odwrotność funkcji tangensa.
Druga zaś zwraca wartość arcustangensa z pełnego zakresu kąta gdzie:
zmienna- zmienna typu Single której przypisuje się wynik działania funkcji,
x- zmienna typu Single określająca odległość na osi OX.
y- zmienna typu Single określająca odległość na osi OY.

Awatar użytkownika
Alek
Użytkownik
Posty: 547
Rejestracja: 27 lip 2003, 12:37
Lokalizacja: Warszawa
Kontakt:

Post autor: Alek » 07 sie 2008, 18:06

Jeśli nie zależy na szybkości działania to można spróbować wyciągać pierwiastek sześcienny iteracyjnie.

Awatar użytkownika
Kulpina
Użytkownik
Posty: 2037
Rejestracja: 28 lip 2005, 16:57
Lokalizacja: Sanok
Kontakt:

Post autor: Kulpina » 07 sie 2008, 18:35

Tak o funkcjach sinusów znalazlem w helpie :mrgreen:
Alek pisze:Jeśli nie zależy na szybkości działania to można spróbować wyciągać pierwiastek sześcienny iteracyjnie.
Ale to chyba nie sa proste działania, łatwo byłoby w bascomie przeprowadzić takie algorytmy? Np: http://pl.wikipedia.org/wiki/Algorytm_o ... go_stopnia

Awatar użytkownika
Alek
Użytkownik
Posty: 547
Rejestracja: 27 lip 2003, 12:37
Lokalizacja: Warszawa
Kontakt:

Post autor: Alek » 07 sie 2008, 21:48

Wydaje się, że byłoby to dość łatwe; do realizacji tego zadania potrzebujesz tak naprawdę jedynie operacji mnożenia, dodawania i dzielenia. Rozpatrzmy konkretnie Twój przypadek.

Chcesz znaleźć pierwiastek sześcienny z liczby X. Niech W będzie wartością przybliżoną tego pierwiastka. W momencie, gdy wartość przybliżona W będzie równa wartości pierwiastka sześciennego z liczby X poniższa funkcja przyjmie wartość zero:

f(W)=W^3-X

Pochodna powyższej funkcji f'(W)=3W^2 lub, co widać by było dobrze z wykresu f(W)
f'(W)=f(W)/(W-pierwiastek sześcienny z X)

Zachodzi więc równość:

3W^2=W^3-X/(W-pierwiastek sześcienny z X)

Przekształcając powyższe równanie otrzymamy w końcu:

pierwiastek sześcienny z X=2W^3+X/3W^2

Odnoszę wrażenie, że to, co pokazałeś w linku jest toczka w toczkę tym, co napisałem powyżej. Operują tam tylko bardziej ogólnymi wzorami, ale jest to właśnie metoda iteracyjna. Powtarza się czynności tak długo, aż zyska się żądaną dokładność.

Załóżmy, że chcesz obliczyć pierwiastek sześcienny z ośmiu z dokładnością 6 miejsc po przecinku. Między nami wiemy, że ten pierwiastek to dwa :grin: , ale załóżmy, że zupełnie nie wiemy ile to jest. Przyjmijmy przy pierwszej iteracji, że pierwiastek sześcienny z ośmiu jest równy po prostu liczbie podpierwiastkowej 8 (W=8, X=8). Po przeprowadzeniu pierwszej iteracji uzyskamy wynik 5,375. W drugiej iteracji podstawiamy otrzymany dopiero co wynik (W=5,375, X=8) i otrzymamy 3,675635. Wstawiając z kolei w trzeciej iteracji W=3,675635 i X=8 uzyskamy 2,647804, w czwartej 2,145565, w piątej 2,009652, w szóstej 2,000046 i w siódmej 2,000000 i coś tam na kolejnych pozycjach. Nieco iteracji można było oszczędzić przyjmując np. w pierwszym kroku pierwiastek z liczby równy 1/2 liczby (będzie zmniejszać liczbę iteracji przy wyciąganiu pierwiastka z większych liczb, natomiast chyba będzie zwiększać ich liczbę przy wyciąganiu pierwiastków z liczb mniejszych od dwóch.)

Ile iteracji ma wykonać program? Ano tyle, by dany pierwiastek wyciągnąć z potrzebną dokładnością. Wystarczy w tym celu porównywać ze sobą wartości W z kolejnych dwóch iteracji. Jeśli wartości te nie różnią się na żądanym miejscu po przecinku program zatrzymujemy :!: .

Ponieważ bardzo rzadko programuję poniższy program będzie na bank zawierał błędy składni a może i inne poważniejsze błędy. W przypadku wyżej opisanej metody iteracyjnej wyglądałby on mniej więcej tak:

Dim pierwiastek_sześcienny as long
Dim W as long
Dim X as long
X=8
W=X (opcjonalnie W=X/2)
do 'początek pętli nieskończonej; poniżej wzór iteracyjny rozbity na elementarne kroki
pierwiastek_sześcienny=W*W
pierwiastek_sześcienny=pierwiastek_sześcienny*W
pierwiastek_sześcienny=2*pierwiastek_sześcienny
pierwiastek_sześcienny=pierwiastek_sześcienny/3
pierwiastek_sześcienny=pierwiastek_sześcienny/W
pierwiastek_sześcienny=pierwiastek_sześcienny/W
if W<0,999999*pierwiastek_sześcienny or W>0,999999*pierwiastek sześcienny then ' jest to porównanie wyników z dwóch kolejnych iteracji
W=pierwiastek_sześcienny 'jest to zaczęcie kolejnej iteracji
else
exit do 'uzyskaliśmy pierwiastek sześcienny z zadaną dokładnością w zmiennej pierwiastek_sześcienny i żegnamy się z pętlą nieskończoną
end if
loop

Awatar użytkownika
joon
Użytkownik
Posty: 2076
Rejestracja: 30 cze 2007, 22:56
Lokalizacja: Kraków, Przemyśl, Warszawa
Kontakt:

Post autor: joon » 08 sie 2008, 13:37

Jak ja kiedyś bawiłem się z takimi rzeczami samodzielnie w Pascalu to metodą przybliżeń to robiłem, czasu troszkę schodziło ale własne rozwiązanie było :)

Jasam
Użytkownik
Posty: 422
Rejestracja: 27 mar 2007, 21:09

Post autor: Jasam » 08 sie 2008, 14:09

W Pascalu to wiadomo, że zawsze miło się pobawić różnymi "matematykaliami":) Swoją drogą ciekawy pomysł z dziedziny s-f, a mainowicie komplilator Pascala na AVRy. No nie wiem jak was, ale mnie by ucieszyło to bardzo. Ale to fantazja...

mathieiov
Moderator
Posty: 829
Rejestracja: 31 lip 2005, 9:04
Lokalizacja: --

Post autor: mathieiov » 08 sie 2008, 14:11

:arrow: Jasam, http://www.mikroe.com/en/compilers/mikropascal/pic/ Co prawda nie AVR ale... ;)

K_o_n_r_a_d
Użytkownik
Posty: 123
Rejestracja: 29 lip 2005, 10:21
Lokalizacja: Lublin

Post autor: K_o_n_r_a_d » 08 sie 2008, 18:11

mathieiov pisze::arrow: Jasam, http://www.mikroe.com/en/compilers/mikropascal/pic/ Co prawda nie AVR ale... ;)
A tutaj na AVRa, ale w Bascomie zrobisz wszystko to samo co i w Pascalu.

Jasam
Użytkownik
Posty: 422
Rejestracja: 27 mar 2007, 21:09

Post autor: Jasam » 08 sie 2008, 18:25

K_o_n_r_a_d pisze:A tutaj na AVRa, ale w Bascomie zrobisz wszystko to samo co i w Pascalu.
Tutaj to znaczy gdzie? Nie widzę żadnego linka. Wiem, że pod względem funkcjonalności Pascal na procesory będzie podobny do Basica, ale mam pewien sentyment do Pascala i dlatego ucieszyłby mnie taki kompilator. Myślę, że koledzy elektronicy-programiści rozumieją o co mi chodzi ;)
Ostatnio zmieniony 08 sie 2008, 19:23 przez Jasam, łącznie zmieniany 2 razy.

K_o_n_r_a_d
Użytkownik
Posty: 123
Rejestracja: 29 lip 2005, 10:21
Lokalizacja: Lublin

Post autor: K_o_n_r_a_d » 08 sie 2008, 19:14

Hehe... zapomniałem linka:
http://www.mikroe.com/en/compilers/

A konkretnie tu:
http://www.mikroe.com/en/compilers/mikropascal/avr/

Sentyment jest zrozumiały :)

Jasam
Użytkownik
Posty: 422
Rejestracja: 27 mar 2007, 21:09

Post autor: Jasam » 08 sie 2008, 19:26

Łaaaaaaaaaał! Niezłe!- chociaż właściwiej byłoby,gdybym pwoiedział, że to jest super-extrade luxe-super. Nie słyszałem o tym wcześniej więc dzięki wielkie K_o_n_r_a_d :mrgreen: Widzę, że mój pascalosentyment zostanie zaspokojony :)

ODPOWIEDZ