[Bascom] Pierwiastkowanie
[Bascom] Pierwiastkowanie
Czy jest jakies konkretne polecenie lub prosty algorytm, umożliwiający wyciągnięcie pierwiastka z podanej liczby?
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.
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. "
Cytat z manuala Bascomowego:
"SQR() (>= 1.11.6.
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. "
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.
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.
Tak o funkcjach sinusów znalazlem w helpie
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_stopniaAlek pisze:Jeśli nie zależy na szybkości działania to można spróbować wyciągać pierwiastek sześcienny iteracyjnie.
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
, 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
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
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
-
K_o_n_r_a_d
- Użytkownik
- Posty: 123
- Rejestracja: 29 lip 2005, 10:21
- Lokalizacja: Lublin
A tutaj na AVRa, ale w Bascomie zrobisz wszystko to samo co i w Pascalu.mathieiov pisze:Jasam, http://www.mikroe.com/en/compilers/mikropascal/pic/ Co prawda nie AVR ale...
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 chodziK_o_n_r_a_d pisze:A tutaj na AVRa, ale w Bascomie zrobisz wszystko to samo co i w Pascalu.
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
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
http://www.mikroe.com/en/compilers/
A konkretnie tu:
http://www.mikroe.com/en/compilers/mikropascal/avr/
Sentyment jest zrozumiały