Logaritmes

In [3]:
import numpy as np
from numpy import log10 as log
from matplotlib import pyplot as plt

Statistici transformeren graag variabelen, en naast lineaire transformaties van de vorm $f(x) = ax + b$ zijn ook logaritmische transformaties van de vorm $f(x) = \log_b x$ heel populair. In deze post herhalen we kort de motivatie, definitie, grafiek en bijhorende rekenregels.

Motivatie

Stel dat we een vergelijking hebben van de vorm $x = b^y$. Kunnen we die apart oplossen naar $b$ en $y$? Voor $b$ hebben we een wortel nodig: $b = \sqrt[y]{a}$. Voor $y$ zitten we helaas vast. We hebben een wiskundig concept nodig dat $y$ uitdrukt in termen van $b$ en $x$.

Definitie

Om het logaritme te kunnen nemen van een getal $x$, moeten we eerst een basis $b$ kiezen. In de cursus statistiek 1 zal dat bijna altijd $b=10$ zijn. Dat geeft het gewone of Briggse logaritme. In dat geval laten we de $b$ gewoon achterwege in de formules, dus $\log x = \log_{10} x$. In vervolgcursussen kan die basis evengoed $b=2$ (binair logaritme), $b=e$ (natuurlijk logaritme $\ln$) of eender welk ander strikt positief getal zijn (behalve $1$). De definitie gaat als volgt:

$$\forall x \in \mathbb R_0^+: \log_b x = y \iff b^y = x$$

In woorden: tot welke macht moet ik $b$ verheffen om $x$ uit te komen? De simpelste voorbeelden zijn $\log 10 = 1$ want $10^1 = 10$ en $\log 1 = 0$ want $10^0 = 1$. Logaritmes werken ook voor decimale getallen. Zo heb je bijvoorbeeld $\log 0.1 = -1$ want $10^{-1} = \frac{1}{10} = 0.1$. Niet elk getal zal zo'n mooie ronde uitkomst hebben. $0 < \log 5 < 1$ want $10^0 < 5 < 10^1$, is zowat het enige dat we op het zicht kunnen zeggen. We hebben een rekenmachine of computer nodig om de exacte waarde uit te rekenen.

In [4]:
log(5)
Out[4]:
0.6989700043360189

Wiskundig gezien is het logaritme dus gedefinieerd als een inverse functie. Als $x = f(y) = b^y$, dan is $y = f^{-1}(x) = \log_b x$. Kenmerkend aan een inverse functie is dat ze het effect van de originele functie ongedaan maakt. Dus $f^{-1}(f(y)) = f^{-1}(b^y) = \log_b b^y = y$. Andersom mag ook: $f(f^{-1}(x)) = f(\log_b x) = b^{\log_b x} = x$. Je herkent een inverse functie ook aan de grafiek die het spiegelbeeld is van de originele functie rond de $y=x$ lijn.

Grafiek

Op de grafiek hieronder zie je zowel $f(x) = \log x$ als de inverse $f^{-1}(x) = 10^x$. Ook de $y=x$ rechte is aangegeven. Je ziet inderdaad dat de ene grafiek een spiegeling is dan de andere.

Enkele voorbeeldwaarden (o.a. die van hierboven) zijn op de grafiek aangeduid. Voor de $x$-waarden dicht bij nul is het moeilijk om het onderscheid te maken aangezien $\log x$ een verticale asymptoot heeft bij $x=0$. Opnieuw kan die verklaard worden door de horizontale asymptoot bij $y=0$ van $10^x$. Je kan inderdaad uit die formule nooit exact nul uitkomen, maar voor een heel grote negatieve exponent kom je wel dicht in de buurt:

$$\lim_{x \to -\infty} b^x = \lim_{x \to +\infty} \frac{1}{b^x} = 0$$

Voor grote $x$-waarden groeit de grafiek trager en trager, maar hij vlakt nooit helemaal af. Er is dus geen horizontale asymptoot te vinden.

In [5]:
xs = [0.0000000001, 0.00001, 0.1, 1, 5, 10]
ys = [-10, -5, -1, 0, 0.6990, 1]
In [6]:
xmin, xmax = -10, 10.5
x = np.arange(xmin, log(xmax), 0.01)

fig, (ax1) = plt.subplots(1, 1, figsize=[10, 10])
ax1.set_xlabel('$x$')
ax1.set_ylabel('$y$')
ax1.set_xlim([xmin, xmax])
ax1.set_ylim([xmin, xmax])
ax1.set_xticks(np.arange(xmin, xmax))
ax1.set_yticks(np.arange(xmin, xmax))
ax1.grid(which='both', alpha=0.2)
ax1.plot([xmin, xmax], [xmin, xmax], 'k--', alpha=0.2, label='$y = x$')
ax1.plot(10**x, x, label='$f(x) = \log_{10}(x)$')
ax1.plot(x, 10**x, label='$f^{-1}(x) = 10^x$')
ax1.scatter(xs, ys)
ax1.scatter(ys, xs)
ax1.legend();
No description has been provided for this image

Fun fact

Om het subtiele verschil tussen die kleine $x$-waarden beter in kaart te brengen, zouden we de schaal van de $x$-as kunnen veranderen ($x' = \log x$). Hieronder vind je daar een voorbeeld van. Die grafiek toont nog altijd $\log x$, maar is vanuit dit perspectief een rechte geworden. We tonen nu immers $f(x) = \log x = x'$ en dat is gewoon een rechte door de oorsprong.

In [7]:
xmin, xmax = 0.000001, 10
x = np.arange(xmin, xmax, 0.5)
y = log(x)

fig, (ax1) = plt.subplots(1, 1, figsize=[10, 10])
ax1.set_xlabel('$x$')
ax1.set_ylabel('$\log_{10}(x)$')
ax1.grid(which='both', alpha=0.2)
ax1.semilogx(x, y)
ax1.scatter(xs[1:], ys[1:]);
No description has been provided for this image

Rekenregels

Omdat het resultaat van een logaritme eigenlijk een exponent is, gelden daarvoor ook de rekenregels van exponenten. Je gaat hieronder dus o.a. de tegenhangers vinden van $b^x b^y = b^{x+y}$ en $(b^x)^y = b^{xy}$.

  • $\log_b 1 = 0 \iff b^0 = 1$
  • $\log_b b = 1 \iff b^1 = b$
  • $\log_b b^x = x \iff b^x = b^x$
  • $\log_b xy = \log_b x + \log_b y$
    • maar $\log_b (x+y) \neq \log_b x \cdot \log_b y$
  • $\log_b \frac{x}{y} = \log_b x - \log_b y$
  • $\log_b \frac{1}{x} = -\log_b x$
  • $\log_b (x^y) = y \log_b x$
  • $\log_b x = \dfrac{1}{\log_x b}$
  • verandering van basis $b$ naar $c \in \mathbb{R}_0^+ \setminus \{1\}$
    • $\log_b x = \dfrac{\log_c x}{\log_c b}$
    • $b^x = c^{x\log_c b}$

Zie ook formularium voorkennis

Je kan logaritmes natuurlijk ook laten voor wat ze zijn en doorbijten zonder:

xkcd-1162