Joachim Mohr   Mathematik Musik Delphi
Siehe auch Einführung zum Zweierlogarithmus

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.


                       3       1  3  7   24  31  179  389
Näherungszahlen für lb(-) sind -, -, ——, ——, ——, ———, ———, ...
                       2       2  5  12  41  53  306  665

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''

                 5           1       5 3
Mathematisch: lb(-) ungefähr - , da (-) =1,953 ungefähr 2
                 4           3       4
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.

Auf diese Weise erhalten wir:

       1    1     1    1     1     1
Qui = (-  + —— + —— + ——— + ——— + ———— + ...)Ok 
       2    16   64   256   512   1024

    
    = 0,58496Ok + kleiner "Rest"
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;