Krótka notka o logarytmowaniu
Transkrypt
Krótka notka o logarytmowaniu
Krótka notka o logarytmowaniu Adam Kolany Potrafimy pisemnie dodawać, odejmować, mnożyć, dzielić, a nawet potrafimy pisemnie wyznaczać pierwiastek kwadratowy z dowolnej liczby. Ale czy potrafimy pisemnie logarytmować, czyli wyznaczać wartości logarytmów różnych liczb w różnych podstawach? Przypomnijmy: logarytmem z liczby dodatniej c przy podstawie δ (δ > 0, δ 6= 1) jest taka liczba ℓ = log δ (c), że δ ℓ = c. Oczywiście nigdy nie uda nam się z wyjątkiem trywialnych przypadków otrzymać dokładnej wartości logarytmu, ale w końcu pierwiastkowanie, czy nawet dzielenie pisemne nie zawsze dadzą nam wynik dokładny. Pamiętamy oczywiście, że logarytmować możemy jedynie liczby dodatnie, no i że podstawa logarytmu nie może być jedynką. Oczywiście też musi być dodatnia. Z definicji logarytmu i własności funkcji wykładniczej, dostajemy znany wzór: log δ (c · d) = log δ (c) + log δ (d) dla dodatnich c, d. Ponadto, pamiętamy doskonale, że log δ (cr ) = r · log δ (c), dla dowolnej liczby rzeczywistej r (nam wystarczy to wiedzieć dla r naturalnych). Te dwie obserwacje pozwolą nam na sformułowanie “pisemnego” algorytmu logarytmowania. Zacznijmy od przykładu. Policzmy ile wynosi ℓ = log 3 (16). Najpierw zauważmy, że 16 = 32 · ( 16 9 ), skąd ℓ = 16 2 13 16 2 = 3 + 81 ∈ (3, 3 ), skąd 2 + log 3 9 . Zauważmy dalej, że 9 256 256 2 1 1 1 1 1 13 13 1 16 ℓ = 2 + · log 3 = 2 + · (1 + log 3 1 + = 2 + · (1 + log 3 = 2 + + · log 3 . = 2 + · log 3 3 + 2 9 2 81 2 3 · 81 2 243 2 2 243 22 176 256 = 23110 ∈ (3, 32 ), dostajemy dalej Biorąc pod uwagę fakt, że 243 256 256 22 2176 2176 1 1 1 1 1 1 1 1 1 1 1 1 1 =2+ + · =2+ + · + · log 3 · log 3 · log 3 110 = 2 + + · + · · log 3 111 2 2 243 2 2 22 243 2 2 22 3 2 2 22 2 22 3 176 23 ∈ (3, 32 ), mamy Ponieważ 32111 ℓ=2+ 2176 23 223·176 1 1 1 1 1 1 1 + + · log 3 111 + + · log 3 23·111+1 = =2+ + 2 2 · 22 2 · 22 · 23 3 2 2 · 22 2 · 22 · 23 2 · 22 · 23 3 24048 1 1 1 1 =2+ + + + · log 3 2554 2 2 · 22 2 · 22 · 23 2 · 22 · 23 3 1 1 + 2·22·23 ? To Cóż, zaczyna to być nudne. Zadajmy sobie pytanie ile się pomylimy, jeśli poprzestaniemy na ℓ = 2 + 12 + 2·22 4048 2 jest akurat proste. Liczba 32554 jakkolwiek jest z przedziału (1, 3), skąd jej logarytm mieści się w zakresie (0, 1). paskudna, ℓ=2+ 4048 1 1 Opuszczając zatem składnik 2·22·23 · log 3 322554 pomylimy się o co najwyżej 2·22·23 ≈ 9.8814229249011851 · 10−4 . Idąc jeden 4048 275 1 1 1 + 2·22·23 + 2·22·23·275 ≈ 2,523719008264463 z błędem rzędu ∈ (3, 32 ), skąd ℓ ≈ 2 + 12 + 2·22 krok dalej, stwierdzamy, że 322554 1 2·22·23·275 ≈ 3.5932446999640677 · 10−6 , co jak na domowe warunki jest niezłą dokładnością. Wartość log 3 (16) wyznaczona za pomocą linuksowego narzędzia bc (jako ln(16)/ ln(3)) wynosi 2,5237190144 . . . . Rozbieżność jak widzimy pojawia się na ósmym miejscu po przecinku Wprowadźmy teraz trochę porządku w nasze rozważania. Zapiszmy zastosowaną procedurę bardziej formalnie. Np. w postaci schematu blokowego: W języku perl w wersji rekurencyjnej główna część tej procedury zajmuje tylko kilka linijek: sub logarytm{ # $x∈(1,$beta), $n∈ N - parametry aktualne funkcji, my ($x,$n)=@ ; # $beta - parametr globalny podstawa logarytmu. return 1 unless ($n); my ($x0,$d)=$x; for ( $d=1; $x <= $beta; $d++ ) $x *= $x0; return ( ( 1 + logarytm($x/$beta,$n-1) ) / $d );} Zainteresowanych zachęcamy do zaimplementowania tego algorytmu w arkuszu kalkulacyjnym. Sosnowiec, 1 Październik 2009