Forum: PC-Programmierung Lineareverteilung bei logarithmischer darstellung. Wie?


von Holger K. (holgerkraehe)


Angehängte Dateien:

Lesenswert?

Hallo zusammen

Eigentlich ein ganz einfaches Problem.
Man betrachte das Bild welches angehängt ist.

Die X-Achse ist logarithmisch.
Die Punkte, nennen wir sie Messpunkte, sind jedoch gleichmässig über den 
gesamten X-Achsen-Bereich verteilt.

Meine Frage ist nun, wie berechne ich die X-Werte an welchen ich Punkte 
setzen muss, um ebenfalls eine gleichmässige Verteilung zu erhalten.

Angenommen ich möchte über eine Dekade 20 Messpunkte.
Dann habe ich an etwas wie dieses gedacht:

 PseudoCode 
1
xwert = 0;
2
i = 1;
3
stepsize = xrange / messpunkte;
4
5
while i != 10 + 1 do
6
 range = log(i+1) - log(i);
7
 steps = range * Messpunkte; //0.3 * 20 = ~6 Schritte von 1-2
8
9
 while steps != 0 do 
10
  //Wert für einen Messpunktmarker
11
  xwert = xwert + stepsize; 
12
 end;
13
end;

Der obige Code gibt mir leider eine ungleichmässige Verteilung.
Zwar relativ nahe am gewünschten Ziel, aber noch nicht optimal.

Hat vielleicht jemand sowas schonmal gemacht?
Danke

von Purzel H. (hacky)


Lesenswert?

Die Mathematik scheint zu fehlen... Eine Logkurve kompensiert man mit 
einer Exponentialfunktion.

von Holger K. (holgerkraehe)


Lesenswert?

Jetzt ist G. schrieb:
> Die Mathematik scheint zu fehlen... Eine Logkurve kompensiert man
> mit
> einer Exponentialfunktion.

Könntest du mir dazu eventuell ein Beispiel geben wie man dies in diesem 
Fall anwendet?

Danke

von Timm R. (Firma: privatfrickler.de) (treinisch)


Lesenswert?

Hi

schau dir an (Googel) wie man aus dem Index eines Tones (1 bis 12) und 
seiner Oktave die Frequenz berechnet. Das ist genau Dein Problem.

Die 12 Halbtöne müssen gleichmäßig über die Oktave verteilt sein, wobei 
die Frequenzen eben nicht linear sein dürfen, sondern geometrisch.

Tip: a^(i/12) also in deinem Fall sowas wie 10^(i/10)

vlg
 Timm

von Peter M. (r2d3)


Lesenswert?

Hallo Holger,

ein numerisches Beispiel für die logarithmische Skalierung auf der 
x-Achse:

Gegeben sein die Funktion y= exp(x/100).

Wertetabelle:

x       y        x'
1  1,010         0
10 1,105         1
100 2,718        2
1000  22026      3

x'=log10(x)

Auf einer Grafik würde statt x dann x' angezeigt.

Zurück geht es mit x=10^(x').

Du durchläufst in Deiner Schleife also x', rechnest die Werte y aber 
nicht für x' sondern für x aus.

: Bearbeitet durch User
von Holger K. (holgerkraehe)


Lesenswert?

danke, werde dies mal versuchen

von LostInMusic (Gast)


Lesenswert?

Generator für n + 1 Punkte mit linearem Anstieg (a = Koordinate des 
ersten Punkts; b = Koordinate des letzten Punkts):
1
  for k = 0 to n
2
    {
3
    x = a + k/n*(b - a)
4
    }

Dasselbe mit exponentiellem Anstieg:
1
  for k = 0 to n
2
    {
3
    x = exp(ln(a) + k/n*(ln(b) - ln(a)))
4
    }

Im ersten Fall liegen die Punkte äquidistant auf einer linearen Skala, 
im zweiten Fall liegen sie optisch äquidistant auf einer logarithmischen 
Skala und das deshalb, weil die Logarithmen der Punkte-Koordinaten 
äquidistant auf einer linearen Skala liegen. Alles klar? :-)

von Egon D. (Gast)


Lesenswert?

LostInMusic schrieb:

> Dasselbe mit exponentiellem Anstieg: [...]

Grundgütiger. x_neu = konstanterfaktor * x_alt

von LostInMusic (Gast)


Lesenswert?

OK, nur hängt an "konstanterfaktor" i. a. auch noch ne Formel dran, die 
den passenden Wert dafür aus den Randbedingungen (z. B. die 
Intervallgrenzen a und b) berechnet. Das relativiert die vermeintliche 
Einfachheit Deiner Lösung.

von Egon D. (Gast)


Lesenswert?

LostInMusic schrieb:

> OK, nur hängt an "konstanterfaktor" i. a. auch noch
> ne Formel dran, die den passenden Wert dafür aus den
> Randbedingungen (z. B. die Intervallgrenzen a und b)
> berechnet.

Klar -- nur macht man das einmal vorneweg. Es ist nicht
notwendig, innerhalb der Schleife mit der Exponenzial-
funktion zu laborieren.


> Das relativiert die vermeintliche Einfachheit Deiner
> Lösung.

Nur unwesentlich :)

von LostInMusic (Gast)


Lesenswert?

>Es ist nicht notwendig, innerhalb der Schleife mit der Exponenzial-
>funktion zu laborieren.

Aber möglicherweise ratsam, damit sich etwaige Rundungsfehler nicht mit 
jeder Iteration weiterverstärken.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.