Definition des Logarithmus ohne gebrochene Hochzahlen
Zunächst ein Beispiel:
Wir haben gesehen: die Quint ist der lb(1.5)-fache Teil der Oktave:
3
Qui = lb(-)Ok
2
3
lb(-) ist die Zahl y mit der ich 2 potenzieren muss,
2
3
um - zu erhalten:
2
3 y 3
y=lb(-)〈=〉2 = - (*)
2 2
0 1
Da 2 = 1 und 2 = 2 folgt 0〈y〈 1
3
Also ist y in der Nähe von vielleicht -.
4
3
-
4
Was bedeutet aber 2 ?
3
-
4 4 -
Für den Mathematiker ist klar: 2 = \/8 .
3
-
4
Also ist 2 die die positive Zahl,
die vier Mal mit sich selbst multipliziert 8 ergibt.
Um den Logarithmus definierten zu können, muss ich also die
Potenzen von gebrochenen Hochzahlen beherrschen.
Ich habe mich gefragt: Kann man das Intervall der Quinte
nicht elementarer annähern?
Das ist möglich!
Und das Erstaunliche dabei ist: Ich lande wieder bei den
pythagoreischen Abschätzungen!
Diesmal mache ich den Ansatz:
Der Bruch m/n (m, n natürliche Zahlen) soll
den Logarithmus lb(3/2) annähern. Dann wird aus der Äquivalenz (*)
m
-
m 3 n 3
die Äquivalenz - = lb(-)〈=〉2 = - .
n 2 2
Und diese kann ich umformen zu:
m 3 m 3 n
- = lb(-)〈=〉 2 = (-)
n 2 2
Musikalisch gesprochen: Ich betrachte Vielfache der Quinte mit
Vielfachen der Oktave.
Dass das mit ganzen Zahlen nicht lösbar ist,
führte im vergleichbaren Fall der Geometrie zur Katastrophe der Pythagoreer:
Ihr göttliches Dogma "Alles ist Zahl" zerbrach.
Die Näherungszahlen kennen Sie schon: siehe Lektion 3.
Das fett gedruckte Verhältnis bedeutet musikalisch: 12 Quinten sind ungefähr 7 Oktaven.
Wählen wir als zweites Intervall die große Terz mit dem Frequenzverhältnis
5/4. Diesmal türmen wir
große Terzen aufeinander und vergleichen es mit Oktaven:
Erste Näherung: 3 große Terzen c'-e'-gis'-his' (In Eulerschreibweise: c ,e ,,gis ,,,his)
ergeben ungefähr eine (etwas zu tiefe) Oktav c'-c''
Einen besseren Vergleich ergibt: Drei Terzen hoch und eine Oktav zurück:
5 3
(-) : 2 = 0,977 (Fehler: 2,3%)
4
Gehen wir weitere Terzen nach oben und passend Oktaven nach unten, dann
erhalten wir die nächst bessere Näherung erst nach 28 Terzen
(28 Terzen hoch und 9 Oktaven abwärts).
5 9 5 28 9
Mathematisch: lb(-) ungefähr ——, da (-) : 2
4 28 4
= 1,00974 (Fehler: 0,974%)
Als Tabelle für die Näherungswerte (mit dem Fehler) von
5
von lb(-) erhalten als
4
1 9 19 47 207
- (2,3%), —— (0,974%), —— (0,43%), ——— (0,104%), ——— (0,016%), ...
3 28 59 146 643
Ganz ohne Taschenrechner ist es
5
so uns möglich lb(-) zu berechnen.
4
Anhang a Hörpsychologischer Algorithmus zur Berechnung des lb(x)
Für Informatiker wird im folgenden ein Algorithmus
zur Berechnung des lb(x) angeführt:
Aufgabe:
n
1,5
y = ——— soll möglichst genau 1 annähern (siehe Anhang 2)
m
2
Hörpsychologischer Algorithmus:
Setze zu Anfang m=0 und n=0:
Gehe Quinten nach oben, erhöhe n jeweils um 1.
Wenn du eine Oktave übertriffst, dann
gehe eine Oktave nach unten, erhöhe m um eins und
notiere (m;n) für den Näherungswert m/n von lb(1,5).
Die Tonfolge und zugehörige Wertepaare wäre folgende:
c g d' d (2;1) a e' e (4;2) h fis' fis (6,3) cis' cis (7;4)
gis dis' dis (9;5) ais eis' eis (11;6) his =?= c (12;7)
Ich erhalte so die Näherungswerte m/n für lb(1.5) = 0,584 962 ...
m n m/n
1 2 0,5
2 4 0,5
3 6 0,5
4 7 0,571 429
5 9 0,555 556
6 11 0,545 455
7 12 0,583 333
...
7
Bemerkung: Gut bekannt ist die Näherung lb(1,5)=——
12
Mit dem Quintenzirkel von 12 Quinten erhalte ich 7 Oktaven.
(Nicht genau: Der Unterschied ist das pythagoreische Komma.)
Mathematische Beschreibung zur Berechnung von lb(x):
(Eps ist die Schranke für die gewünschte Genauigkeit,
zum Beispiel eps=0,0001)
Setzte Anfangswerte: m=0, n=0 und y=1.
Wiederhole die folgenden Zeilen bis |y - 1| 〈 eps
Multipliziere y mit x und erhöhe n um 1 solange bis y > 2.
Dividiere y durch 2 und erhöhe m um 1.
Der Näherungswert von lb(x) ist dann m/n.
In der "Delphi-Ecke" natürlich noch als Pascal-Programm:
function lb(const x: extended): extended;
const eps = 1E-4;
var m,n,y,y0: extended;
{y = x^n/2^m soll möglichst nahe 1 approximieren}
begin
if x〈 0 then raise EMathError.Create('Negativer lb existiert nicht!');
if x〈 1 then Begin
result := - lb(1/x); //da lb(x) = - lb(1/x);
exit; //lb rekursiv
End;
if x〉> 2 then Begin
result := 1 + lb(x/2); //da lb(x) = lb(2*x/2) = 1 + lb(x/2) )
exit; //lb rekursiv
End;
//Jetzt 1 〈 x 〈〉 2 m := 0;
n := 0;
y := 1;
y0 := 100; //Schlechter als der erste y-Wert
repeat
repeat
y := y*x;
inc(n);
until y > 2;
y := y/2;
inc(m);
if abs(y - 1) 〈 abs(y0 - 1) then Begin
y0 := y;
//Gib zu Testzwecken m und n passend aus
End;
until abs(y - 1) 〈 eps;
result := m/n;
end;
Die Ausgabe sieht dann folgendermaßen aus:
m n m/n
1 2 0,5
4 7 0,571 429
7 12 0,583 333
31 53 0,584 906
210 359 0,584 958
389 665 0,584 962
...
Anhang b
Mathematischer Algorithmus zur Berechnung des lb(x)
hörpsychologisch interpretiert
Der folgende Algorithmus ist die einfachste Form des üblichen mathematischen Verfahrens,
um den lb(x) zu berechnen.
Ich erläutere ihn mit Qui = lb(3/2)·Ok. Analog geht dies auch mit jedem
Intervall der Oktave.
1
Da 2Qui > 1Ok, folgt Qui = -Ok + r1 (r1 : "kleiner" Rest)
2
Wir betrachten nun das Intervall i1 = 2Qui - Ok = 2r1 .
Nun verdoppeln wir das Intervall i1 und vergleichen es mit der Oktav.
Hier ist i1 der Ganzton und i2 = 2i1 die (pythagoreische) große Terz.
Wäre i2 〉 Ok gewesen, hätten wir i2 = 4Qui - 2Ok = Ok + "kleiner" Rest.
Wir könnten also schreiben Qui = 1/2Ok + 1/4Ok + ("kleiner" Rest):4 (Konjunktiv!).
Da aber i2 kleiner als die Oktave ist folgt: Qui = 1/2Ok + 0·1/4Ok + "kleiner" Rest.
Wobei ("kleiner" Rest) 〈 1/4Ok ist.
Durch Verdoppeln der Intervalle können wir in ähnlicher Weise feststellen,
ob wir noch 1/8Ok, 1/16Ok, 1/32Ok zur Quinte hinzurechnen können.
Mit dem Taschenrechner gerechnet: Qui = lb(3/2)Ok = 0,5849625Ok.
Diesen Algorithmus beschreibe ich im folgenden mathematisch:
Wir rechnen mit dem Frequenzverhältnis x (Bei der Quinte x=3/2).
Der Näherungswert a für lb(x) wird laufend verbessert.
Setzte Anfangswert a=0 und y = x.
0
2 2 1
Ist y > 2, dann setze y = y - 2 und addiere - zu a,
0 1 0 2
2
andernfalls setze y = y und addiere nichts zu a.
1 0
2 2 1
Ist y > 2, dann setze y = y - 2 und addiere - zu a,
1 2 1 4
2
andernfalls setze y = y und addiere nichts zu a.
2 1
1 1 1
Fahre so fort und addiere gegebenenfalls -, ——, ——, ...
8 16 32
Als Delphi-Programm:
function lb(const x: real): real;
var y, potenzvon2, a: real;
k: integer;
//Iteration lb(x) = 0,y1y2y3y4y5... (dual)
//lb(x*x)=2*lb(x) = y1,y2y3y4y5 ...
//Durch Quadrieren von x erhält man die Dualdarstellung
begin
if x 〈 0 then raise
EMathError.Create('Negativer lb existiert nicht!');
if x〈 1 then Begin
result := - lb(1/x); //da lb(x) = - lb(1/x);
exit; //rekursiv
End;
if x 〉 2 then Begin
result := 1 + lb(x/2);
//da lb(x) = lb(2*x/2) = 1 + lb(x/2)
exit; //rekursiv
End;
//Nun der eigentliche Algorithmus für 1 〈 x 〈= 2
potenzvon2 :=1;
y := x;
a := 0;
for k := 1 to 64 {Je nach Genauigkeit des Zahlentyps}
do Begin
potenzvon2 := potenzvon2/2; //1/2 1/4 1/8 1/16 ...
y:= y*y;
if y > 2 then Begin
y := y/2; 1 1 1
a := a + potenzvon2; //a = ?·- + ?·- + ?·- +
2 4 8
//... ? = 0 oder 1
End;
End;
result := a;
end;