Ü 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
© Copyright 2024 ExpyDoc