next up previous
Nächste Seite: Über dieses Dokument ...

7. Übung des Programmierpraktikums


Abgabetermin: 2. Juni 2009, 23:59 Uhr

Die Übungen sind grundsätzlich allein zu machen. Gruppenarbeit ist nicht erlaubt.
Abzugeben sind jeweils die sinnvoll dokumentierten Programmfiles (Files für Bsp. 5: bsp_5.cpp, bsp_5_fkt.cpp, bsp_5_fkt.hpp ) indem Sie diese in Ihr Verzeichnis im globalen Abgabeordner kopieren.

  1. In Aufgabe 19 (Blatt 6) haben wir die Vektorlängen (Feldlängen) nur statisch vereinbaren können.
    Ändern Sie Ihren Code (alternativ auch die Beispiellösung) entsprechend §6.4 des Skriptes so ab, daß nach dem Abfragen der Vektorlänge n die Vektoren dynamisch allokiert werden und dann die Berechnungen aus Aufgabe 19 folgen. Vergessen Sie nicht das explizite Deallokieren des dynamischen Speichers.

    Eingabedaten (n): (4), (20), (31553)
  2. In mathematics, the Fibonacci numbers form a sequence defined recursively by the following formulas:

    Fn = $\displaystyle \left\{\vphantom{ \begin{gathered}
0\text{~~~~~~~~~~~~~~~~~~~~~~...
... - 1} + F_{n - 2} \text{~~~~~~~~~~if }n > 1. \hfill \\
\end{gathered} }\right.$\begin{displaymath}\begin{gathered}
0\text{~~~~~~~~~~~~~~~~~~~~~~~~if }n = 0, \...
... F_{n - 2} \text{~~~~~~~~~~if }n > 1. \hfill \\
\end{gathered}\end{displaymath}

    Write a recursive function fibonacci(n) that computes the n-th element of the sequence. Show that the ratio of a term with respect to the previous one tends to $\displaystyle {\frac{{1+\sqrt{5}}}{{2}}}$.

    Input data (n): (2), (20), (60)
  3. Verändern Sie Ihr Hauptprogramm der vorigen Aufgabe so, Eingabedaten (n): (4), (20), (40), (60)
  4. Implementieren Sie eine Funktion riemann, zum (numerischen) Integrieren einer geg. Funktion f (x) mit Hilfe der Riemann-Summen

    $\displaystyle \int_{a}^{b}$f (x)dx = $\displaystyle \sum_{{j=1}}^{n}$f (a + jh) . h

    wobei das geg. Intervall von a bis b in (geg.) n gleichgroße Intervalle der Länge h unterteilt wird. Die zu integrierende Funktion ist ebenfalls eine INPUT-Größe der Parameterliste, siehe Beispielfunktion Bisect3 in §7.8 der Vorlesung (auch in Bisect3.cpp).

    Testdaten: sqrt() in [1, 4],    cos() in [0,$ \pi$/2],     log() in [1, e]
  5. Implementieren Sie eine Funktion derivative, die unter Verwendung einer gegebenen Schrittweite h, die numerische Ableitung der (über)gebenen Funktion f (x)) an einem vorgegebenen Punkt x berechnet. Verwenden Sie die Formel

    f'(x) = $\displaystyle {\frac{{f(x+h) - f(x-h)}}{{2h}}}$



    Testdaten: sqrt() in x = 4,    cos() in x = $ \pi$/6,     log() in x = 1,    
  6. In dieser Aufgabe müssen Sie sich unbedingt an die gegebenen Filebezeichnungen halten, die da wären bsp_26_fkt.hpp für das Headerfile und bsp_26_fkt.cpp für das Sourcefile Ihrer zu schreibenden/geschriebenen Funktionen. Kopieren Sie Ihre Funktionen derivative und riemann aus den beiden vorigen Aufgaben in Header- und Sourcefile, und testen Sie deren korrekte Nutzung in einem kurzen Hauptprogramm.

            Ende für LAK        
  7. Schreiben Sie verbesserte Funktionen riemann und derivative welche das bestimmte Integral (bzw. den Ableitungswert) mit einer Genauigkeit von $ \epsilon$ zurückgeben. Speichern Sie diese Funktionen ebenfalls in den Files bsp_26_fkt.hpp, bsp_26_fkt.cpp.
    Testen Sie deren korrekte Nutzung bei $ \epsilon$ = 10-4 mit den Testdaten aus Aufg. 24 und 25 in Ihrem Hauptprogramm.
    Achten Sie insbesondere bei der Differentiation darauf, daß die Schrittweite h nicht zu klein wird (Maschinen-Epsilon in §3.9 bzw. Reihe.cpp).
  8. Die Bestimmung der Nullstelle einer Funktion f (x) ist sehr effizient berechenbar mit der Newton-Iteration

    xn+1 : = xn - f (xn)/f'(xn)

    für einen geeigneten Startwert x0 $ \in$ [a, b] (die math. Voraussetzung, daß die Funktion xn - f (xn)/f'(xn) eine kontraktive Abbildung ist, muß in Ihrem Programm nicht getestet werden).
    Nutzen Sie Ihre Funktionen aus den Aufgaben 25 und  26 und erweitern Sie die Files bsp_26_fkt.hpp, bsp_26_fkt.cpp um Ihre Funktion newton_diff_approx(). Testen Sie Ihren Nullstellenloeser (und überprüfen Sie die Lösung) im Hauptprogramm mit den folgenden Funktionen:

    Testdaten:
    f (x) : = sin(x) - x/2
    g(x) : = - (x - 1.234567)(x + 0.987654)
    h(x) : = 3.0 - ex
    z(x) : = cos(x) - ex ln| x|

generelle Hinweise:
Die Befehle break, continue, goto sind nicht erlaubt.



Abgabe der Lösungen:
Die Abgabe der Lösungen (*.cpp-Files, *.hpp, ..., keine exe-Files) erfolgt ausschließlich durch das Kopieren dieser Files in Ihr (beim erstenmal anzulegendes) Verzeichnis Nachname_Vorname im globalen Abgabeordner y: \\pers.ad.uni-graz.at\fs\ou\621\stud_haase\Nachname_Vorname .
Hinweise hierzu sind unter der LV-Homepage zu finden.

Die Filenamen müssen dem Schema bsp_nummer, gefolgt von der Filextension, entsprechen. Z.B. ist in Beispiel 1 das File bsp_1.cpp abzugeben. Andere Filebezeichner zählen als nicht abgegebene Files.




next up previous
Nächste Seite: Über dieses Dokument ...
Gundolf Haase 2009-05-05