Berthold Hoffmann <hof> Klaus Hartke <hartke> Christian Maeder <maeder> Dennis Walter <dw> Diedrich Wolter <dwolter> Praktische Informatik 3 WS 2007/08 1. Übungsblatt Ausgabe: 29.10.2007 Bearbeitungszeit: Zwei Wochen 1 Schiefer Wurf 6 Punkte Ein mit der Anfangsgeschwingigkeit v0 und dem Winkel φ von der Erdoberfläche abgeworfener (oder getretener) Ball wird (ohne Berücksichtigung seines Luftwiderstandes) in der Entfernung v 2 sin(2φ) (1) d= 0 g wieder auf der Erde ankommen. Dabei ist die Fallbeschleunigung g = 9.80665 m s2 Implementieren Sie eine Funktion throw :: Double -> Double -> Double die aus der Anfangsgeschwindigkeit (erstes Argument) und dem Abwurfwinkel (zweites Argument) nach der Formel (1) die Wurfweite berechnet. Der Winkel soll in Grad angegeben werden. Deshalb muss das zweite Argument noch in Radiant umgewandelt werden. 2 Newton-Verfahren 14 Punkte Isaac Newton (1642 - 1727) erfand nicht nur die Schwerkraft, Trägheits-, Aktions- und Reaktionsgesetze (Kraft ist Masse mal Beschleunigung). Er begründete auch – unabhängig von Leibniz – die Differential- und Integralrechnung. Das Newton-Verfahren approximiert eine Nullstelle einer differenzierbaren Funktion f als Grenzwert einer Folge (ai ). Dabei ist a0 ein zu wählender Startwert und ai+1 berechnet sich aus ai durch: f (ai ) ai+1 = ai − ′ f (ai ) Mit Hilfe dieses Verfahrens soll unter Nutzung des Datentyps Rational eine beliebig genaue Annäherung der dritten Wurzel aus 2 berechnet werden. (Dazu wählt man als Funktion: f (x) = x3 − 2; die zugehörige Ableitung von f ist f ′ (x) = 3x2 . ) Die folgenden Funktionen sollen in eine Textdatei Uebung1.hs geschrieben werden, die mit folgender ersten Zeile beginnt: ‘module Uebung1 where’. (Modulnamen beginnen mit einem Großbuchstaben.) Der zu benutzende Typ Rational steht im Modul Ratio, der nicht zur Sprachbasis gehört. Daher muss dieser Modul in der zweiten Zeile der Textdatei mit ‘import Ratio’ geladen werden. Zu allen selbstdefinierten Funktionen sollten Sie die Typsignaturen explizit angeben! (Erstens ist das guter Stil, und zweitens vermeiden Sie so kryptische Fehlermeldungen wegen Sprachkonzepten, die erst später behandelt werden.) Kurze Kommentare können Sie übrigens zwischen ‘--’ und das Zeilenende schreiben; längere Kommentare sind von der Form ‘{- ... -}’. Durch ‘ghci Uebung1.hs’ wird ein Haskell-Interpreter aufgerufen, mit dem man Ausdrücke auswerten lassen kann. Innerhalb des Interpreters liefert die Eingabe von ‘:?’ Hilfe und ‘:q’ beendet die Sitzung. Beachten Sie, dass der Typ Rational, im Gegensatz zu Double oder Float, die rationalen Zahlen vollständig repräsentiert. 1. Implementieren Sie eine Funktion next :: Rational -> Rational die aus ai das nächste Folgenglied ai+1 berechnet. 2. Geben Sie eine Funktion an nextI :: Int -> Rational -> Rational die zu einem Startwert a0 das i-te Folgenglied ai berechnet. 3. Schreiben Sie eine Funktion approx :: Rational -> Rational -> Rational die zu einem sehr kleinen (ersten) Argument (ε > 0) und einem Startwert (zweites Argument) ein Ergebniswert an liefert, desen Funktionswert f (an ) im Betrag kleiner als ε ist. 4. Erstellen Sie eine weitere Funktion approxSteps, die statt des Approximationswertes an die Anzahl n der dazu nötigen Iterationen berechnet. Beachten/Prüfen Sie, dass das Ergebnis als Eingabe von nextI dasselbe Ergebnis wie approx liefert. 5. Erstellen Sie Varianten next’, nextI’, approx’ und approxSteps’ von den vorherigen Funktionen, die alle ein weiteres Argument (vom Typ Rational) erwarten, mit der Sie die dritte Wurzel nicht nur von 2, sondern von beliebigen rationalen Zahlen approximieren können. Folgende, in Haskell vordefinierte, Funktionen könnten für die Lösung nützlich sein: ^ :: Rational -> Int -> Rational abs :: Rational -> Rational -- Infix (Potenzieren) Auf der Seite www.arndt-bruenner.de/mathe/java/newton.htm kann das Newton-Verfahren animiert werden. P.S. Arbeit ist Kraft mal Weg. (Gemessen in Newtonmeter!) Dies ist Fassung 2 vom 26. Oktober 2007.