« Das Pascalsche Dreieck | Main| Lambda »

Über Summen zum Integral :-D

0
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

Mach einen Kommentar

:-D:-o:-p:-x:-(:-):-\:angry::cool::cry::emb::grin::huh::laugh::lips::rolleyes:;-)

Amazon


Impressum

Firmenname: Peanuts-Soft
Straße Nummer: Biinger Strasse 8
PLZ Ort: 55263 Wackernheim
Telefon: +491772134526
E-Mail: joerg.reck @ peanuts-soft.de
Disclaimer: Peanuts-Soft übernimmt keine Garantie dafür, dass die auf dieser Website bereitgestellten Informationen vollständig, richtig und stets aktuell sind. Dies gilt auch für alle Links, auf die verwiesen wird. Peanuts-Soft ist für die Inhalte, auf die per Link verwiesen wird, nicht verantwortlich. Peanuts-Soft haftet nicht für konkrete, mittelbare und unmittelbare Schäden oder Schäden, die durch fehlende Nutzungsmöglichkeiten, Datenverluste oder entgangene Gewinne – sei es aufgrund der Nichteinhaltung vertraglicher Verpflichtungen, durch Fahrlässigkeit oder eine andere unerlaubte Handlung – im Zusammenhang mit der Nutzung von Dokumenten oder Informationen bzw. der Erbringung von Dienstleistungen entstehen, die auf dieser Web Site zugänglich sind.
Datenschutz: Inhalt und Gestaltung der Internetseiten sind urheberrechtlich geschützt. Eine Vervielfältigung der Seiten oder deren Inhalte bedarf der vorherigen schriftlichen Zustimmung von Peanuts-Soft.


Locations of visitors to this page

Powered By

Domino BlogSphere
Version 3.0.2