Funktionsorientierte Programmierung

Aus ProgrammingWiki
Archivierte Version vom 2009-05-11T12:21:58+00:00. Aktuelle Version

Inhaltsverzeichnis

In dieser Übung geht es um das symbolische Differenzieren einstelliger Funktionen:

f : x -> f(x)

Dieses Verfahren kann in Scheme angemessen realisiert werden. Für jede Ableitungsregel schreiben Sie eine Prozedur.

Beispiel: Ableitung einer Summe

Die mathematische Notation fur die Ableitung y´ einer Summe y sieht wie folgt aus:

y = u + v => y´ = u´ + v´


Daraus ergibt sich folgende Schemeprozedur:

Hinweis: Arbeiten Sie in dieser Übung zu zweit an einem Rechner und nutzen Sie ein Tafelwerk! Außerdem gilt es zu beachten, dass die abzuleitenden Funktionen in der Regel verkettet sind.
Hinweis: Die folgenden Aufgaben sind lediglich auf Grund der Übersicht unterteilt. Die einzelnen Teilprozeduren sind nicht alleine lauffähig. Daher müssen alle Teilprozeduren in der letzten Aufgabe zusammen gesetzt werden um eine funktionsfähige Prozedur zum symbolischen Differenzieren zu erhalten.

derive-, derive*, derive/

Erstellen Sie nach dem Vorbild von derive+ drei weitere Prozeduren derive-, derive* und derive/.

derive-sin, derive-cos

Implementieren Sie 2 weitere Prozeduren derive-sin und derive-cos für die Ableitung der Sinus und der Kosinusfunktion.

Top-Level-Ableitungsprozedur

Schreiben Sie eine (top-level-) Ableitungsprozedur, welche derive+ und die Prozeduren aus den vorherigen Aufgaben nutzt. derive erwartet einen Ausdruck als Parameter, der die Funktion definiert. Es soll also nicht die entsprechende Prozedur für die Funktion übergeben werden, wie wir das üblicherweise tun. Es soll auch keine Prozedur zurückgegeben werden, sondern analog lediglich der die Ableitungsfunktion definierende Term in Gestalt eines Scheme-Ausdruckes.
Die Präfixausdrucke dürfen enthalten:

  • die Variable, nach der abgeleitet wird, also x,
  • Symbole für Konstanten (im mathematischen Sinn) und Zahlen, z. B. A und 4,
  • Namen einstelliger Funktionen, wie sin und cos
  • Symbole für zweistellige Operationen, wie + und *.


Hinweis: Beachten Sie, dass ALLE Hilfsprozeduren in den oberen code-Blöcken stehen!
WICHTIG: Beachten Sie die Ausgaben der Aufrufbeispiele!
Aufrufbeispiele

> (derive '(* x x))
(+ (* 1 x) (* x 1))
> (derive '(/ 1 x))
(/ (- (* 0 x) (* 1 1)) (* x x))
> (derive '(sin (* x x))
(* (+ (* 1 x) (* x 1)) (cos (* x x)))
> (derive '(cos (* x x))
(* (+ (* 1 x) (* x 1)) (* -1 (sin (* x x))))
> (derive '(+ (* x x) (sin x)))
(+ (+ (* 1 x) (* x 1)) (* 1 (cos x)))

<eval>;Testen Sie hier Ihre Prozeduren</eval>