Funktionsorientierte Programmierung

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>Scheme</language>
[[Programmierparadigmen_-_Computerübungen|Zurück zur Übungsübersicht]]<br />

==Symbolisches Differenzieren==

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

<center><math>f : x \rightarrow f(x)</math></center>

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

===Beispiel: Ableitung einer Summe===
Die mathematische Notation für die Ableitung y´ einer Summe y sieht wie folgt aus:

<center><math>y = u + v \Rightarrow y' = u' + v'</math></center>

Daraus ergibt sich folgende Schemeprozedur:
<code id="4af2bf97bbee3">
(define derive+
  (lambda (u v)
    (list '+ (derive u) (derive v))))
</code>

'''Hinweis:''' Beachten Sie, dass die abzuleitenden Funktionen in der Regel verkettet sind.

===derive-, derive*, derive/ ===
Erstellen Sie nach dem Vorbild von <tt>derive+</tt> drei weitere Prozeduren <tt>derive-</tt>,<tt>derive*</tt> und <tt>derive/</tt>.
<code id="4af2bf97bc67e">
;Ihre 3 Prozeduren derive-, derive* und derive/
</code>

===derive-sin, derive-cos===
Implementieren Sie 2 weitere Prozeduren <tt>derive-sin</tt> und <tt>derive-cos</tt> für die Ableitung der Sinus- und der Kosinusfunktion.
<code id="4af2bf97bce66">
;Ihre 2 Prozeduren derive-sin und derive-cos
</code>

===Top-Level-Ableitungsprozedur===
Schreiben Sie eine (top-level-) Ableitungsprozedur, welche <tt>derive+</tt> und die Prozeduren aus den vorherigen Aufgaben nutzt. <tt>derive</tt> 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äfixausdrücke dürfen enthalten:
* die Variable, nach der abgeleitet wird, also <tt>x</tt>,
* Symbole für Konstanten (im mathematischen Sinn) und Zahlen, z. B. A und 4,
* Namen einstelliger Funktionen, wie <tt>sin</tt> und <tt>cos</tt>
* Symbole für zweistellige Operationen, wie <tt>+</tt> und <tt>*</tt>.

'''Hinweis:''' Stellen Sie sicher, dass '''ALLE''' Hilfsprozeduren in den oberen code-Blöcken stehen!

'''WICHTIG:''' Beachten Sie die Ausgaben der Aufrufbeispiele!

'''Aufrufbeispiele'''
<tt>
 > (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)))
</tt>

<code id="4af2bf97bd623">;Definition der Top-Level-Ableitungsprozedur</code>

<eval id="4af2bf97be5b9">;Testen Sie hier Ihre Prozeduren</run>

<check>
 (equal? (derive '(+ (* x x) (sin x))) '(+ (+ (* 1 x) (* x 1)) (* 1 (cos x))))
</check>

Wenn Sie möchten, können nun weitere Term-Vereinfachungen vorgenommen werden. Beispielsweise kann <tt>(* 0 a)</tt> durch 0 ersetzt werden usw. Hierzu sind weitere Prozeduren notwendig.

[[Programmierparadigmen_-_Computerübungen|Zurück zur Übungsübersicht]]