¨U B U N G E N zu Programmiersprache 1 (C und C++) WS 2015

Ü B U N G E N
zu Programmiersprache 1 (C und C++)
WS 2015/2016
Übungsblatt 7: In der Übungsstunde!
45)
a) Programmieren Sie die rechte Rechtecksregel als Funktion double int RR(double
∫1
a, double b) , um 0 cos(x) dx zu approximieren. Geben Sie den Näherungswert
und den Fehler aus.
b) Übergeben Sie zusätzlich einen unsigned n an den Integrator, der das Intervall
in n gleich lange Teilintervalle unterteilt und aufsummiert. Geben Sie für n =
10k , k = 0, . . . , 5 die Näherung und den Fehler aus.
c) Übergeben Sie auch die zu integrierende Funktion an den Integrator.
46)
a) Berechnen Sie mit dem Newton-Verfahren die Quadratwurzel einer positiven
reellen Zahl a = 4 (d.h. lösen Sie x2 − a = 0 mit der globalen Variablen double
a = 4 ) auf ca. 12 Stellen. Geben Sie die Zwischenwerte der Iteration und den
Fehler h aus.
b) Stellen Sie das Newtonverfahren auf numerische Ableitung mit dem symmetrischen
Differenzenquotienten um, wobei Sie als Startwert immer 1 nehmen und das
optimale h = 10−5 beim SDQ verwenden.
Übungsblatt 7: Die Aufgaben 47 bis 49 sind Pflicht!
47)
a) Programmieren
int LR(double
diese analog.
b) Programmieren
int MR(double
diese analog.
Sie analog zu den Übungen die linke Rechtecksregel als Funktion
(*p)(double), double a, double b, unsigned n) . Testen Sie
Sie analog zu den Übungen die Mittelpunktsregel als Funktion
(*p)(double), double a, double b, unsigned n) . Testen Sie
48) Benutzen Sie die beiden Rechtecksregeln, um die Aufgabe 37 der Mathematik-Übungen
zu lösen. Geben Sie die Unter- und Obersummen für 5, 50, 500, 5000, 50000 Teilintervalle aus:
n = ...: ... <= Integral (= ...) <= ...
Den Wert des Integrals berechnen Sie mit Maple auf 15 Stellen genau. Ein Plot der
2
Funktion e−x sollte Ihnen verraten, welche Integrationsregel die Untersumme und
welche die Obersumme liefert.
Ü B U N G E N
zu Programmiersprache 1 (C und C++)
WS 2015/2016
49)
a) Berechnen Sie analog zu Beispiel 46 die Nullstelle von f (x) = x7 + x − 1 mit
dem Newtonverfahren (Startwert 1 und h = 10−5 ) auf 6 Stellen. Die Ausgabe
des Newtonverfahrens soll in jedem Schritt auch die Iterationszahl ausgeben.
b) Berechnen Sie danach die Lösung auf 12 Stellen. Wieviele Iterationen müssen Sie
dabei zusätzlich zu a) machen?
c) (Fleissaufgabe) Schaffen Sie es, das Newtonverfahren in eine eigene Funktion
auszulagern?
int newton(
// gib Iterationszahl zurueck
double (*p)(double),// Loese (*p)(x) = 0
double *x,
// Startwert und Loesung (Pointer!)
double TOL,
// erlaubter Fehler
int imax)
// maximale Iterationszahl
Kann die Zielgenauigkeit nicht erreicht werden, soll die Funktion eine Fehlermeldung ausgeben. Der Aufruf newton(&f, &x, 1e-14, 5) aus main() sollte
dann nur 5 Iterationen machen und die Fehlermeldung ausgeben.
50)
a) Plotten Sie mit Maple die reelle Funktion f (x) = x cos(x)−1 und deren Ableitung
f ′ (x) im Intervall [0,5] in einen Plot und berechnen Sie die Nullstelle und die 2
lokalen Extrema mit Maple auf 14 Stellen genau. Stellen Sie dazu mit Digits:=14 ;
die gewünschte Stellenanzahl ein und verwenden Sie fsolve(f, x=a..b) , um
eine Nullstelle von f(x) im Intervall [a,b] zu finden (das Intervall [a,b] wählen Sie
geeignet).
b) Programmieren Sie diese Funktion f (x) als C-Funktion double f(double x) .
Die Ableitung double fs(double x) programmieren Sie, indem Sie die numerische Ableitung (d.h. return diff(&f, x); ) verwenden.
c) Lagern Sie das Newtonverfahren in eine eigene Funktion double newton(double
(*p)(double), double x, double eps) aus ( x Startwert, eps Genauigkeit).
Vor der Iteration sollte die Zeile
Newtonverfahren mit Startwert ... ausgegeben werden.
d) Schreiben Sie im Hauptprogramm eine Schleife, die solange reelle Zahlen a einliest,
bis keine mehr eingegeben werden. Führen Sie mit diesem Startwert das Newtonverfahren für f (x) = 0 zur Berechnung der Nullstellen auf. Danach führen Sie
mit demselben Startwert das Newtonverfahren für die Gleichung f ′ (x) = 0 zur
Berechnung von stationären Werten (z.B. lokale Maxima, Minima) auf. Wählen
Sie Startwerte in der Nähe der zu suchenden Lösungen und die Genauigkeit
10−13 .
e) Erweitern Sie Ihre Newton-Funktion so, dass maximal 30 Iterationen ausgeführt
werden. Wird dieser Wert überschritten, soll die Funktion ausgeben:
Newtonverfahren mit Startwert ... hat versagt! Mailen Sie den Output
Ihres Programmlaufes und den Quellcode.
Blatt 2
Ü B U N G E N
51)
zu Programmiersprache 1 (C und C++)
WS 2015/2016
a) Programmieren Sie analog zu den Übungen die Trapezregel als Funktion
int TR(double (*p)(double), double a, double b, unsigned n) . Testen Sie
diese analog.
b) Programmieren Sie analog zu den Übungen die Simpsonregel (Sie brauchen nur 1
Zeile: return (int TR(p, a, b, n)*(2./6.)+int MR(p, a, b, n)*(4./6.); ).
Testen Sie diese analog.
Blatt 3