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