Rash thoughts about .NET, C#, F# and Dynamics NAV.


"Every solution will only lead to new problems."

Saturday, 18. November 2006


Approximation des natürlichen Logarithmus

Filed under: Informatik,Navision — Steffen Forkmann at 20:21 Uhr

Da Navision in Bezug auf mathematische Funktionen nur ganz rudimentäre Funktionalität bietet, möchte ich in einer kleinen Serie eine Mathe-Bibliothek in C/AL entwickeln und dabei auf verschiedene Approximationsmöglichkeiten der einzelnen Funktionen eingehen.

Den Anfang möchte ich dieser Stelle mit der Approximation des natürlichen Logarithmus machen:

Möglichkeit 1 – Potenzreihenentwicklung:
Formel:

Ln-Potenzreihe über Taylorentwicklung

Implementierung:

LOCAL PROCEDURE LN_PowerSeries@1000000038(x@1 : Decimal) f : Decimal; VAR x_@1000000002 : Decimal; i@1000000003 : Integer; f_old@1000000001 : Decimal; BEGIN /// <summary> /// Calculates the LN by the "LN - Power Series" /// Requires 0 < x <= 2 /// </summary> IF (x <= 0) OR (x > 2) THEN ERROR(ArgumentOutOfRange,x); x_ := x - 1; i := 2; f := x_; REPEAT f_old := f; f := f + POWER(-1,i - 1) * POWER(x_,i) / i; i := i + 1; UNTIL ROUND(f_old,Precision) = ROUND(f,Precision); END;
Einschätzung:

Die Potenzreihenentwicklung ist wohl die bekannteste Formel zur Berechnung des Ln – gleichzeitig ist sie aber auch die Unpraktischste. Die zwei Hauptprobleme sind der kleine Definitionsbereich und die langsame Konvergenz.

Möglichkeit 2 – Reihenentwicklung über Areatangens Hyperbolicus:
Formel:

Areatangens Hyperbolicus - Potenzentwicklung

mit Restglied

Areatangens Hyperbolicus Restglied

Implementierung:
LOCAL PROCEDURE LN_AreaTangensHyp@1000000040(x@1 : Decimal) f : Decimal; VAR i@1000000003 : Integer; f_old@1000000001 : Decimal; f_@1000000002 : Decimal; BEGIN /// <summary> /// Calculates the LN by the "AreaTangens hyperbolicus - Power Series" /// Requires x > 0 /// </summary> IF x <= 0 THEN ERROR(ArgumentOutOfRange,x); f_ := 0; REPEAT f_old := f_; f_ := f_ + POWER((x-1)/(x+1),2*i+1) / (2*i+1); i := i + 1; UNTIL f_old = f_; f := f_ * 2; END;
Einschätzung:

Diese Folge hat für x und 1/x gleiches Konvergenzverhalten und ist umso genauer je näher x bei 1 liegt. Damit man immer im idealen Konvergenzbereich (1/Wurzel(2) bis Wurzel(2)) ist kann man das Argument noch geeignet verschieben. 

Möglichkeit 3 – Wurzelnäherung:
Formel:

Ln Wurzelentwicklung

Einschätzung:

Dies ist ein interessanter Ansatz, der in dieser Form erstmal für die Praxis ungeeignet ist, aber mit einigen Abwandlungen als Briggsche Regel mit guter Genauigkeit programmiert werden kann. Voraussetzung ist natürlich eine gute Näherung für die Quadratwurzel.

Möglichkeit 4 – Berechnung über den Dekadischen Logarithmus
Formel:

Logarithmus Basisumrechnung

Einschätzung:

Das Logarithmusgesetz ist natürlich erstmal unspektakulär – aber den dekadischen Logarithmus kann man nach der Goldenen Regel (nach Briggs) immer auf 30 Stellen genau berechnen. Wie das geht soll der nächste Teil der Serie zeigen.

Weiterführende Quellen:
Tags: ,

1 Comment »

  1. Klasse, muss gerade den Barwert in NAV berechnen und da kam Dein Code gerade recht 🙂

    Comment by alex — Friday, 3. September 2010 um 7:11 Uhr

RSS feed for comments on this post. | TrackBack URI

Leave a comment

XHTML ( You can use these tags): <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> .