Sie sind auf Seite 1von 4

Informatik Übung (WS21/22)

Übung 4: Schleifen für Fortgeschrittene (100 Punkte)

Aufgabe 1: Nullstellenermittlung (30 Punkte)


Die Nullstelle der Funktion 𝑓𝑓(𝑥𝑥) = 𝑥𝑥 + ln 𝑥𝑥 − 2 im Intervall [𝑎𝑎, 𝑏𝑏] soll auf einfache Weise
iterativ bestimmt werden. Dazu soll das Verfahren der Intervallhalbierung angewandt
werden. Im Verfahren wird für den Mittelpunkt des Intervalls der Funktionswert bestimmt
und dann entschieden, ob die Suche oberhalb oder unterhalb fortgesetzt wird. Das
Suchintervall wird entsprechend neu definiert bzw. halbiert. Zur Vereinfachung gilt die
Annahme, dass 𝑓𝑓(𝑎𝑎) < 0 und 𝑓𝑓(𝑏𝑏) > 0 ist.
Für die Lösung gilt:
Der Mittelpunkt des Intervalls ist 𝑐𝑐 = (𝑎𝑎 + 𝑏𝑏)/2.
𝑓𝑓(𝑐𝑐) = 0 ⇒ 𝑥𝑥0 = 𝑐𝑐
𝑓𝑓(𝑐𝑐) < 0 ⇒ 𝑥𝑥0 ∈ [𝑐𝑐, 𝑏𝑏]
𝑓𝑓(𝑐𝑐) > 0 ⇒ 𝑥𝑥0 ∈ [𝑎𝑎, 𝑐𝑐]
Tipp zum Finden geeigneter Startwerte 𝑎𝑎, 𝑏𝑏: Skizzieren Sie den Funktionsverlauf
für 𝑥𝑥 > 0.
Schreiben Sie ein Programm, das:
• Die Intervallgrenzen a und b vom Benutzer einliest und sicherstellt, dass die
Annahmen 𝑓𝑓(𝑎𝑎) < 0 und 𝑓𝑓(𝑏𝑏) > 0 eingehalten werden. Die Werte werden so lange
abgefragt, bis ein gültiger Wert eingeben wurde.
• Die Nullstelle mittels einer do…while Schleife und dem beschriebenen Verfahren
bestimmt. Die Genauigkeit der Nullstelle soll 10−6 betragen.
• Bei jedem Iterationsschritt soll der Mittelpunkt c des Intervalls und der
Funktionswert 𝑓𝑓(𝑐𝑐) ausgeben werden. Die Werte sollen mit einer Genauigkeit von 8
Stellen ausgegeben werden.
• Am Ende des Programms wird die gefundene Nullstelle ausgeben.
Die Ausgabe soll wie folgt aussehen:

Laden Sie bitte einen Screenshot


Ihrer Ausgabe mit hoch.

Achten Sie auf die Regeln für


guten Programmierstil!

B-MB Informatik Übung

Fakultät Maschinenbau und Versorgungstechnik Seite 1 von 4


Aufgabe 2: Operationen mit einem 1D Array (25 Punkte)
Gegeben sei ein Vektor
𝑣𝑣 = (1,5,2,8,7,10,4).
Folgendes ist zu programmieren:
1. Initialisieren Sie einen array mit den Werten von 𝑣𝑣.
2. Führen Sie folgende Operationen a. – d. mit Hilfe von Schleifen durch. Speichern
Sie die jeweiligen Ergebnisse in passenden Variablen und geben Sie diese in der
Konsole aus.
a. Berechnen Sie das Produkt aller Elemente des Vektors 𝑣𝑣.
𝑣𝑣
b. Bilden Sie die Quotienten aus 𝑣𝑣𝑖𝑖+1.
𝑖𝑖
c. Extrahieren Sie die Indizes der Elemente des Vektors 𝑣𝑣, deren Zahlenwert
kleiner als 6 ist.
i. Speichern Sie die Indizes in einem array . Ggf. ungenutzte Einträge
des Zielfeldes sollen mit -1 initialisiert werden.
ii. Speichern Sie die Indizes in einem vector.
iii. Welche Variante sehen Sie als vorteilhaft? Begründen Sie kurz.
d. Bestimmen Sie die Länge (euklidische Norm) des Vektors 𝑣𝑣 nach der Formel
|𝑣𝑣| = �∑ 𝑣𝑣𝑖𝑖2 .

Die Ausgabe soll wie folgt aussehen:

Laden Sie bitte einen Screenshot Ihrer Ausgabe mit hoch.

Prof. Dr.-Ing. Philipp Gölzer

Fakultät Maschinenbau und Versorgungstechnik Seite 2 von 4


Aufgabe 3: Vektor einlesen (20 Punkte)
Stellen Sie sich vor, die Operationen aus Aufgabe 2 sollen auf einen Vektor beliebiger Größe
ausgeführt werden. Schreiben Sie dazu ein Programm, das ganzzahlige Werte über die
Kommandozeile in einen vector<int> einliest.

Die Eingabe soll beendet werden, sobald das Wort Fertig eingegeben wird. Dabei könnten
Ihnen die Funktionalitäten des Datentyps string helfen (siehe Folien LE 3).
Zur Kontrolle soll anschließend der eingegebene Vektor sowie die Größe des Vektors
ausgegeben werden.
Verwenden Sie als Laufvariable einen Iterator.
Wenden Sie Ihr Programm auf den Vektor 𝑣𝑣 aus Aufgabe 2 an.

Die Ausgabe soll wie folgt aussehen:

Laden Sie bitte einen Screenshot Ihrer Ausgabe mit hoch.


Achten Sie auf die Regeln für guten Programmierstil!

Aufgabe 4: Vektorisierung zweidimensionaler Felder (25 Punkte)


Bei der numerischen Lösung physikalischer Probleme treten in der Regel sehr große lineare
Gleichungssysteme auf. Das zugehörige zweidimensionale Feld hat oft sehr viele Null-
Elemente. Diese Eigenschaft möchte man sich bei der effizienten Speicherung dieser Felder
zunutze machen und die Null-Elemente gar nicht erst abspeichern. Dazu verwendet man
das Compressed-Sparse-Row-Format, bestehend aus drei Vektoren:
1. Werte-Vektor: enthält alle von Null verschiedenen Elemente des Feldes
2. Spalten-Index-Vektor: enthält die Spaltenindizes (2.Dimension) der von Null
verschiedenen Elemente
3. Zeilen-Zeiger-Vektor: gibt an, ab welcher Stelle im Werte- (und Spalten-
Index-Vektor) die Einträge für die jeweilige Reihe zu finden sind.
Der Werte- und Spalten-Index-Vektor sind gleich lang und haben als Größe die Anzahl der
nicht-Null-Elemente des zweidimensionalen Feldes. Der Zeilen-Index-Vektor hat die Größe
der Anzahl an Zeilen des Feldes.

Prof. Dr.-Ing. Philipp Gölzer

Fakultät Maschinenbau und Versorgungstechnik Seite 3 von 4


Folgendes Beispiel soll das Speicherformat veranschaulichen.
Gegeben sei das Feld mat:
2.Dimension
mat 0 1 2 3 4 5
0 1 0 -1 0 0 0
1 0 5 0 0 0 0
1.Dimension 2 -2 0 4 6 2 0
3 0 0 2 7 0 0
4 0 0 8 0 0 1

Die Vektoren des Compressed-Sparse-Row-Format lauten dann:


Werte-Vektor = 1 -1 5 -2 4 6 2 2 7 8 1
(0,0) (0,2) (1,1) (2,0) (2,2) (2,3) (2,4) (3,2) (3,3) (4,2) (4,5)

Spalten-Index-Vektor = 0 2 1 0 2 3 4 2 3 2 5

0 2 3 7 9
Zeilen-Zeiger-Vektor =
0 1 2 3 4

Vervollständigen Sie das Programm INF-UE-4-4_Lueckentext_leer.cpp, das


1. das zweidimensionale Feld mat initialisiert und in der Konsole in Matrixformat
ausgibt.
2. das Feld in das Compressed-Sparse-Row-Format übersetzt und die drei Vektoren
ausgibt.

Die Ausgabe soll wie folgt aussehen:

Laden Sie bitte einen Screenshot Ihrer Ausgabe mit hoch.


Achten Sie auf die Regeln für guten Programmierstil!

Prof. Dr.-Ing. Philipp Gölzer

Fakultät Maschinenbau und Versorgungstechnik Seite 4 von 4

Das könnte Ihnen auch gefallen