Bei dieser Übung ging es darum, erste eigene Funktionen zu schreiben und grundlegende Strukturen von Haskell zu üben.
Meine Lösungen zum Download: uebung1.zip
Die letzte Aufgabe hatte es ein wenig in sich. Darum stelle ich meinen Lösungsansatz an dieser Stelle noch einmal etwas genauer vor.
Gefordert ist die Lösung einer quadratischen Gleichung, von der die Parameter a, b und c der Normalenform 0 = ax^{2}+bx+c als Parameter an die Funktion übergeben werden.
Das Problem liegt darin, dass es nicht immer reelle Lösungen für quadratische Gleichungen gibt. Daher ist der erste Lösungsansatz mittels bekannter p-q-Formel nicht anwendbar. Die Lösung und damit der Rückgabewert der Funktion muss ein Tupel zweier komplexer Zahlen sein.
Die Lösung quadratischer Gleichungen mit komplexen Zahlen wird auf der folgenden Seite der Universität Würzburg erklärt: Komplexe Zahlen als Lösungen quadratischer Gleichungen.
Dieser Lösungsansatz baut auf einer Fallunterscheidung auf. Der Term d = b^{2} - 4ac wird dabei als Diskriminante bezeichnet. Man unterscheidet die Fälle d \geq 0 und d < 0.
Zur Umsetzung in Haskell wird die Berechnung der Diskriminante in eine where-Anweisung ausgelagert. Zusammen mit dem Typsynonym für komplexe Zahlen und der Signatur ergibt sich folgendes Gerüst:
`
type Complex = (Double, Double)
quadrat :: Double -> Double -> Double -> (Complex, Complex)
quadrat a b c
| (d >= 0) = ...
| otherwise = ...
where
d = b*b-4*a*c
`
Die genaue Berechnung der Werte lässt sich der Übersichtlichkeit halber in die Berechning des Realteils und des Imaginärteils aufteilen, die dann je nach Fall zu den Endergebnissen zusammengefügt werden. Diese Berechnung wird ebenfalls in die where-Anweisung ausgelagert:
`
...
where
r = (-1) * (b / 2*a)
i = sqrt(abs(d)) / (2*a)
...
`
Für den Fall d \geq 0 heißt das, dass Realteil und Imaginärteil addiert (x{1}) beziehungsweise subtrahiert (_x{2}_) werden, ansonsten werden sie an die jeweilige Stelle der Lösung gesetzt:
`
...
| (d >= 0) = ((r+i, 0), (r-i, 0))
| otherwise = ((r, i), (r, (-i)))
...
`