Kolejnym zastosowaniem klauzuli MODEL będzie napisanie prostego zapytania wyliczającego liczbę pi ( ludolfinę ) z zadaną dokładnością z wykorzystaniem algorytmu Leibniza
Zapytanie zwraca cztery kolumny, druga to wartość liczby PI obliczona z funkcji arcus sinus, trzecia
to przybliżona wartość pi obliczona ze wzoru Leibniza, czwarta to moduł różnicy pomiędzy kolumną drugą a trzecią. Zwiększając dokładność o kolejne rzędy wielkości odczujemy istotne wydłużenie działania zapytania. Iterowanie zakończy się w momencie spełnienia jednego z warunków: osiągniemy zakładaną dokładność lub liczba iteracji osiągnie wartość umieszczona w nawiasie po słowie kluczowym ITERATE .
Jak możemy się łatwo przekonać obserwując ostatnia kolumnę, jest to algorytm wolnozbieżny, jego zastosowanie ma tylko charakter edukacyjny, aby pokazać możliwość obsługi ciągów liczbowych przez iteracyjną klauzulę MODEL ..
SELECT
d + 1 "Nr iteracji",
PI_ASIN "Pi z funkcji asin",
4 *PI_COMPUTED "Wartość obliczona",
DIFF "Różnica"
FROM (SELECT 0 d FROM DUAL)
MODEL
DIMENSION BY ( 0 d)
MEASURES (
CAST( 0 AS NUMBER) PI_ASIN,
CAST( 0 AS NUMBER) PI_COMPUTED,
CAST( 0 AS NUMBER) DIFF )
RULES
ITERATE (1000000000) UNTIL (ITERATION_NUMBER >1 AND DIFF [ITERATION_NUMBER ] < 0.01)
(
PI_ASIN[ ITERATION_NUMBER ] =ASIN(1)*2,
PI_COMPUTED[ ITERATION_NUMBER] =
CASE ITERATION_NUMBER
WHEN 0 THEN 1
ELSE
PI_COMPUTED[ ITERATION_NUMBER -1 ] + POWER( -1, ITERATION_NUMBER) / (2*ITERATION_NUMBER +1)
END,
DIFF [ ITERATION_NUMBER] = ABS(4*PI_COMPUTED[ ITERATION_NUMBER ] - PI_ASIN[ITERATION_NUMBER] ))
Brak komentarzy:
Prześlij komentarz