1.¨Ubungsblatt - FB3

Werbung
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.
Herunterladen