Über Summen zum Integral :-D
Allgemein Scheme
Die Summer der ersten n Zahlen zu berechnen ist ja nicht schwer, in Scheme kann es wie folgt aussehen:
(define (sum-numbers a b)
(if (> a b)
0
(+ a (sum-numbers (+ a 1) b))
)
)
(sum-numbers 1 10)
Ergebnis -> 55
Kategorie Die Summer der ersten n Zahlen zu berechnen ist ja nicht schwer, in Scheme kann es wie folgt aussehen:
(define (sum-numbers a b)
(if (> a b)
0
(+ a (sum-numbers (+ a 1) b))
)
)
(sum-numbers 1 10)
Ergebnis -> 55
Diese Implementierung der Funktion sum-numbers
kann man natürlich verallgemeinern
(define (sum term a next b)
(if (> a b)
0
(+ (term a) (sum term (next a) next b))
)
)
Man übergibt der Funktion sum nicht nur die Grenzen a und b, sondern auch eine Funktion term, welche den Wert berechnet, der hinzuaddiert werden soll.
Weiters die Funktion next, welche die Regel enthält wie a erhöht werden soll um b zuerreichen.
Für die Summe der ersten n natürlichen Zahlen wäre die Indentitäts- und eine Increment-Funktion hilfreich.
Kann in Scheme so aussehen ->
(define (identity x) x)
(define (inc x) (+ x 1))
Der Aufruf der Funktion Summe über die ersten n Zahlen -> (sum identity 1 inc 100)
So und wie kann man nun das Integral berechnen?
Definiere ->
(define (integral f a b dx)
(define (add-dx x) (+ x dx))
(* (sum f (+ a (/ dx 2)) add-dx b) dx)
)
Diese Funktion nähert das Integral der einer Funktion f in den Grenzen a und b mit der Schrittweite dx.
z.B.:
(integral square 0 1 0.001)
wobei square durch
(define (square x) (* x x))
definiert ist.
Will man die Schrittweite nun verkleinern auf 0.00001
Dann meldet sich die Scheme Laufzeitumgebung, dass die Rekursivtiefe erreicht wurde und nichts mehr geht
Eine "endrekursive" Implementierung der Funktion sum kann wie folgt aussehen ->
(define (sum term a next b)
(define (iter a result)
(if (> a b)
result
(iter (next a) (+ (term a) result))
)
)
(iter (next a) (term a))
)
Wenn man diese benutzt, kann man das Integral wirklich mit der Schrittweite 0.00001 berechnen.
Gruß JJR
(define (sum term a next b)
(if (> a b)
0
(+ (term a) (sum term (next a) next b))
)
)
Man übergibt der Funktion sum nicht nur die Grenzen a und b, sondern auch eine Funktion term, welche den Wert berechnet, der hinzuaddiert werden soll.
Weiters die Funktion next, welche die Regel enthält wie a erhöht werden soll um b zuerreichen.
Für die Summe der ersten n natürlichen Zahlen wäre die Indentitäts- und eine Increment-Funktion hilfreich.
Kann in Scheme so aussehen ->
(define (identity x) x)
(define (inc x) (+ x 1))
Der Aufruf der Funktion Summe über die ersten n Zahlen -> (sum identity 1 inc 100)
So und wie kann man nun das Integral berechnen?
Definiere ->
(define (integral f a b dx)
(define (add-dx x) (+ x dx))
(* (sum f (+ a (/ dx 2)) add-dx b) dx)
)
Diese Funktion nähert das Integral der einer Funktion f in den Grenzen a und b mit der Schrittweite dx.
z.B.:
(integral square 0 1 0.001)
wobei square durch
(define (square x) (* x x))
definiert ist.
Will man die Schrittweite nun verkleinern auf 0.00001
Dann meldet sich die Scheme Laufzeitumgebung, dass die Rekursivtiefe erreicht wurde und nichts mehr geht
Eine "endrekursive" Implementierung der Funktion sum kann wie folgt aussehen ->
(define (sum term a next b)
(define (iter a result)
(if (> a b)
result
(iter (next a) (+ (term a) result))
)
)
(iter (next a) (term a))
)
Wenn man diese benutzt, kann man das Integral wirklich mit der Schrittweite 0.00001 berechnen.
Gruß JJR