FB MI - Mathematik Univ.-Prof. Dr. Thomas Schuster M.Sc. Dipl.-Phys. Anne Wald Sommersemester 2017 12. Übungsblatt zur Programmierung für Mathematiker Aufgabe 1 Makros 4 Punkte a) Schreiben Sie Makros REAL, IMAG, SETZE_REAL und SETZE_IMAG, mit denen Sie auf Realbzw. Imaginärteil komplexer Zahlen lesend bzw. schreibend zugreifen können. Die komplexen Zahlen sollen analog zum Skript als Struktur definiert werden. b) Schreiben Sie ein Makro zur Ausgabe komplexer Zahlen am Bildschirm. Hinweis: Aufgabe 2. c) Schreiben Sie die Funktionen newComplexPolar() und complexProduct() aus dem Skript als Makros, wobei jedoch die Struktur selbst, statt ein Zeiger auf diese durch die Makros zurückgegeben werden soll. d) Testen Sie Ihre Makros in einem Hauptprogramm, indem Sie zunächst eine komplexe Zahl definieren und diese überschreiben, eine zweite mit Hilfe des Makros NEW_COMPLEX_POLAR definieren und anschließend das Produkt dieser beiden Zahlen berechnen. Geben Sie die komplexen Zahlen am Bildschirm aus. Aufgabe 2 Makros Welches der folgenden Makros liefert beim Aufruf 2 Punkte PRINT_COMPLEX("Zahl %d: ", z1, 1); die Ausgabe Zahl 1: 1.000000-2.000000i, wenn z1 eine komplexe Zahl ist mit Realteil 1.0 und Imaginärteil -2.0? a) #define PRINT_COMPLEX(_FMT_STR, Z, ...) \ printf(_FMT_STR "%lf%+lfi\n", REAL((Z)), IMAG((Z)), ##__VA_ARGS__) 1 b) #define PRINT_COMPLEX(_FMT_STR, Z, ...) \ printf(_FMT_STR "%lf%+lfi\n", #__VA_ARGS__, REAL((Z)), IMAG((Z))) c) #define PRINT_COMPLEX(_FMT_STR, Z, ...) \ printf(_FMT_STR "%lf%+lfi\n", ##__VA_ARGS__, REAL((Z)), IMAG((Z))) d) #define PRINT_COMPLEX(_FMT_STR, Z, ...) \ printf("%lf%+lfi\n", ##__VA_ARGS__, REAL((Z)), IMAG((Z))) Aufgabe 3 Vektoriteration in MATLAB 4 Punkte Das Ziel bei der Vektoriteration ist die numerische Bestimmung des betragsmäßig größten Eigenwertes λm einer Matrix A ∈ Rn×n und eines zugehörigen Eigenvektors vm . Sei ein Startwert x(0) ∈ Rn gegeben. Für k = 0, 1, ..., kmax iteriert man nun u(k+1) := Ax(k) sowie x (k+1) := u(k+1) (k+1) (k+1) (k) , λ := uj2 uj1 (k) , xj1 wobei die Indizes j1 , j2 ∈ {1, ..., n} so bestimmt werden, dass (k) (k) xj1 = x ∞ , (k+1) (k+1) uj2 = u ∞ . Dann gilt lim λ(k) = λm , k→∞ lim x(k) = β · vm . k→∞ für ein β ∈ R. Implementieren Sie die Iteration in Matlab mithilfe der Matrix-Funktionen sum, max, abs, norm etc. Testen Sie Ihr Programm für die Matrix 3 2 A= 1 1 2 2 1 0 1 1 1 0 4 3 3 4. Verwenden Sie z.B. den Startwert x(0) = (1, 1, 1, 1)T sowie kmax = 15 und vergleichen Sie das Ergebnis der Iteration mit dem Ergebnis der Matlab-Funktion eig. Abgabe: Dienstag, 18.07.2017 bis 16.00 Uhr per Mail an [email protected] 2