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:
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:
mit 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:
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:
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:
- Wikipedia-Artikel über Logarithmen
- Wikipedia-Artikel über Henry Briggs
- Logarithmus-Artikel auf mathematik.ch
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