Algorithmik kontinuierlicher Systeme | 24. Juli 2015 · die Methode rekursiv mit der halbierten...

30
TN Teilnehmernummer (von Platzkarte) Prof. Dr. G¨ unther Greiner 24. Juli 2015 Lehrstuhl f¨ ur Graphische Datenverarbeitung der Universit¨ at Erlangen–N¨ urnberg Algorithmik kontinuierlicher Systeme — 24. Juli 2015 Angaben zur Person (Bitte in DRUCKSCHRIFT ausf¨ ullen!): Name, Vorname: ................................................................ Geburtsdatum: ................................................................ Matrikelnummer: ................................................................ Studienfach: ................................................................ Nicht von der Kandidatin bzw. vom Kandidaten auszuf¨ ullen ! Bewertung: Aufgabe 1 2 3 4 5 6 7 8 9 10 Max. Punktzahl 6 8 10 13 9 9 7 11 8 9 Erreichte Punkte Gesamtpunktzahl Note

Transcript of Algorithmik kontinuierlicher Systeme | 24. Juli 2015 · die Methode rekursiv mit der halbierten...

TNTeilnehmernummer

(von Platzkarte)

Prof. Dr. Gunther Greiner 24. Juli 2015Lehrstuhl fur Graphische Datenverarbeitungder Universitat Erlangen–Nurnberg

Algorithmik kontinuierlicher Systeme — 24. Juli 2015

Angaben zur Person (Bitte in DRUCKSCHRIFT ausfullen!):

Name, Vorname: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Geburtsdatum: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Matrikelnummer: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Studienfach: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Nicht von der Kandidatin bzw. vom Kandidaten auszufullen !

Bewertung:

Aufgabe 1 2 3 4 5 6 7 8 9 10

Max. Punktzahl 6 8 10 13 9 9 7 11 8 9

Erreichte Punkte

Gesamtpunktzahl

Note

Algorithmik kontinuierlicher Systeme, 24. Juli 2015 2

Organisatorische Hinweise

Die folgenden Hinweise bitte aufmerksam lesen und die Kenntnisnahme durch Unterschriftbestatigen!

• Bitte legen Sie Ihren Studentenausweis und einen Lichtbildausweis zur Personenkontrolle bereit.

• Hilfsmittel (außer Schreibmaterial und Taschenrechner) sind nicht zugelassen. Andere elektronischeGerate sind auszuschalten.

• Fragen zu den Prufungsaufgaben werden grundsatzlich nicht beantwortet.

• Die Losung einer Aufgabe muss auf das jeweilige Aufgabenblatt geschrieben werden. Sollte der Platznicht reichen, so verwenden Sie die Zusatz-Seiten am Ende der Klausur. Fugen Sie einen Hinweis inIhre Losung ein, dass die Losung auf den Zusatz-Seiten fortgesetzt wurde und beschriften Sie diese mitNamen und Aufgabennummer.

• Es konnen durch die Aufsicht zusatzlich Seiten eingeheftet werden, sollte mehr Platz benotigt werden.Bitte beschriften Sie den Kopf dieser Seiten mit Ihrem Namen und der Aufgabennummer. Streichen Siealles, was nicht bewertet werden soll, doppelt aus.

• Auf Ihrem Platz befinden sich einige lose Blatter Schmierpapier. Bei Bedarf konnen Sie zusatzlichesSchmierpapier von der Aufsicht anfordern. Das Schmierpapier muss abgegeben werden, es wird abernicht bewertet.

• Wenn Sie die Prufung aus gesundheitlichen Grunden abbrechen mussen, so muss Ihre Prufungsunfahig-keit durch eine Untersuchung bei einem Vertrauensarzt nachgewiesen werden. Melden Sie sich bei derAufsicht und lassen Sie sich das entsprechende Formular aushandigen.

• Die Bearbeitungszeit betragt 90 Minuten.

• Uberprufen Sie die Prufungsaufgaben auf Vollstandigkeit (30 Seiten inklusive Deckblatt) und einwand-freies Druckbild.

• Vergessen Sie nicht, auf dem Deckblatt die Angaben zur Person inklusive der Teilnehmernummer (TN)von Ihrer Platzkarte einzutragen und die Erklarungen auf dieser Seite zu unterschreiben.

• Viel Erfolg!

Erklarungen

Durch meine Unterschrift bestatige ich den Empfang der vollstandigen Klausurunterlagen und die Kenntnis-nahme der obigen Informationen.

Erlangen, 24. Juli 2015 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .(Unterschrift)

Algorithmik kontinuierlicher Systeme, 24. Juli 2015 3

1 Theoriefragen (6 Punkte)

a) Beantworten Sie die folgenden Fragen! Schreiben Sie ihre Antwort in die rechte Spalte der Tabelle!

Welche Komplexitat hat die Matrix-Vektor-Multiplikation A~b, wenn A einetridiagonale (n× n)-Matrix ist und ~b ein n-Vektor ist?

O( )

Welche Komplexitat hat die Berechnung der Euklidischen Norm eines n-Vektors?

O( )

Welche Komplexitat hat das Losen eines Gleichungssystems A~x = ~b, wennA eine (n×n)-Matrix und ~b ein n-Vektor ist und die LR-Zerlegung A = LRgegeben ist?

O( )

Welche Komplexitat hat die Berechnung der QR-Zerlegung A = QR einer(n× n)-Matrix A?

O( )

Welche Komplexitat hat die Durchfuhrung eines Iterationsschrittes des Ja-cobi-Verfahrens fur eine vollbesetzte (n× n)-Matrix?

O( )

Welchen Grad hat eine Bezier-Kurve, die durch n Kontrollpunkte definiertist?

Wie groß ist der Approximationsfehler des Catmull-Rom-Interpolanten imFalle aquidistanter Schrittweite h ?

O( )

Wie groß ist der Approximationsfehler der iterierten Simpson-Regel fur dieSchrittweite h ?

O( )

b) Nennen Sie ein Iterationsverfahren das quadratisch konvergiert.

c) Was bedeutet quadratische Konvergenz (bzw. Konvergenzordung 2)?

Algorithmik kontinuierlicher Systeme, 24. Juli 2015 4

2 Direkte Verfahren fur lineare Gleichungssysteme (8 Punkte)

a) Bestimmen Sie die LR-Zerlegung folgender Matrix mit Zeilen-Pivotisierung.

A =

0 4 24 6 4−2 −1 3

=

︸ ︷︷ ︸

P0

·

︸ ︷︷ ︸

A∗

= P0 ·

︸ ︷︷ ︸

L∗

·

︸ ︷︷ ︸

A∗∗

= P0 ·

︸ ︷︷ ︸

L

·

︸ ︷︷ ︸

R

Algorithmik kontinuierlicher Systeme, 24. Juli 2015 5

b) Von der Matrix C ist die LR-Zerlegung bekannt, es gilt

C =

2 0 2 14 2 3 20 −4 4 4−4 0 −6 −5

=

1 0 0 02 1 0 00 −2 2 0−2 0 −2 1

2 0 2 10 2 −1 00 0 1 20 0 0 1

Losen Sie das folgende lineare Gleichungssystem (unter Verwendung der LR-Zerlegung)

C~x = ~b fur ~b = [0, 1,−4, 2]T .

Algorithmik kontinuierlicher Systeme, 24. Juli 2015 6

c) Bei der Ubertragung einer QR-Zerlegung der Matrix B sind Daten verloren gegangen. Bestimmen Sie diefehlenden Eintrage, sodass gilt:

B =

−1 1 1 −1

1 1 −1 −1

1 1 0 2

1 −1 −2 0

=1

1 −1 1

1 1 −1

1 1 1 1

1 1

︸ ︷︷ ︸

Q

·

0 −2 1

0 0

0 0 1 2

0 0 1

︸ ︷︷ ︸

R

Algorithmik kontinuierlicher Systeme, 24. Juli 2015 7

3 Singularwertzerlegung (SVD) (10 Punkte)

Die Singularwertzerlegung einer Matrix A hat bekanntermaßen die Darstellung A = UΣVT .

a) Geben Sie fur den zweidimensionalen Fall (A ∈ R2×2) eine geometrische Interpretation fur die Sin-gularwertzerlegung an. D.h., wie wird ein Vektor ~x ∈ R2 durch die Matrizen VT , Σ und U transformiert,wenn man UΣVT~x berechnet?

• Wirkung von ~x 7→ VT~x:

• Wirkung von ~y 7→ Σ~y:

• Wirkung von ~z 7→ U~z:

b) In welchem Zusammenhang stehen die Eigenwertzerlegungen von ATA bzw. AAT und die Sinuglarwert-zerlegung von A = UΣVT ?

Tipp: Eigenwertzerlegungen haben immer die Form EDET , wobei die Spalten von E die Eigenvektorenund die Eintrage der Diagonalmatrix D die Eigenwerte sind.

Algorithmik kontinuierlicher Systeme, 24. Juli 2015 8

Betrachten Sie nun die Matrix A = 125

104 −32 −56 −3232 4 32 44−122 76 8 76

26 −28 26 67

, deren Singularwertzerlegung bekannt ist:

A = UΣVT =1

3 0 −4 00 −3 0 −44 0 −3 00 −4 0 3

︸ ︷︷ ︸

U

8 0 0 00 4 0 00 0 2 00 0 0 1

︸ ︷︷ ︸

Σ

1

4 −2 −1 −2−2 1 −2 −4−1 −2 4 −2−2 −4 −2 1

︸ ︷︷ ︸

VT

c) Bestimmen Sie die Kondition κ2(A) der Matrix A bezuglich der 2-Norm.

d) Bestimmen Sie das Bild im(A) und den Kern ker(A) der Matrix A.

im(A) =

ker(A) =

e) Bestimmen Sie die beste Rang-1-Approximation von A (im Sinne der Frobenius-Norm).

Algorithmik kontinuierlicher Systeme, 24. Juli 2015 9

4 Programmierung: Median Cut (13 Punkte)

In dieser Aufgabe soll der Algorithmus Median Cut in C++ implementiert werden. Dazu wird die KlasseMedianCut verwendet. Im Gegensatz zu den Ubungsaufgaben ist keine Fehlerbehandlung erforderlich.

Tipp: Sie konnen die Teilaufgaben a) bis c) auch ohne Wissen uber den Median-Cut-Algorithmusbearbeiten.

Der Algorithmus wird dazu verwendet, eine Punktewolke auf wenige Reprasentanten zu reduzieren.

Die folgende Abbildung veranschaulicht den aus der Vorlesung bekannten Ablauf des Algorithmus:

Abbildung 1: Ablauf des Median Cut Algorithmus

Entgegen der Vorlesung werden in dieser Aufgabe die Reprasentanten (Kreuze) nicht als Mittelpunkt derBounding Box, sondern als Mittelwert der entsprechenden Punkte gewahlt.

Hinweis: Sie finden die Klassenstrukturen auch auf der Seite 29, die zum Heraustrennen vorgesehen ist.

Die Klasse MedianCut hat die folgende Struktur:

class MedianCut {public :// ! Klassen KonstruktorMedianCut ( const std : : vector<Point2d>& pointc loud ) ;

// ! E in s t i e g spunk t zur Berechnung des Median Cutstd : : vector<Point2d> ComputeMedianCut ( int nCuts ) ;

private :// ! Berechne Bounding Box (min , max) der u bergebenen Punktewolke pcstat ic void ComputeBoundingBox ( const std : : vector<Point2d>& pc ,

Point2d& min , Point2d& max ) ;

// ! S o r t i e r t d i e u bergebene Punktewolke en t l ang der X− bzw . Y−Achsestat ic void SortPointCloudAlongXAxis ( std : : vector<Point2d>& pointc loud ) ;stat ic void SortPointCloudAlongYAxis ( std : : vector<Point2d>& pointc loud ) ;

// ! Gibt den Repra sentanten der Punkte zur u ck ( h i e r : Mi t t e lwe r t )stat ic Point2d GetRepresentat ive ( const std : : vector<Point2d>& pointc loud ) ;

// ! Rekurs ive Berechnung des Median Cut// ! ( nCuts : maximale Anzahl der Sch r i t t e , cCuts : a k t u e l l e r S c h r i t t )stat ic void MedianCutRecursion ( std : : vector<Point2d> subpointc loud ,

int cCuts , int nCuts , s td : : vector<Point2d>& r e s u l t ) ;

// ! K la s s enva r i a b l estd : : vector<Point2d> m pointcloud ;} ;

Hinweis: Verandern Sie die Klassenstruktur nicht, d.h. fuhren Sie keine neuen Attribute oder Methoden ein.

Algorithmik kontinuierlicher Systeme, 24. Juli 2015 10

Der zu implementierende Algorithmus erhalt als Eingabe einen std::vector<Point2d>, der eine 2D-Punktewolkereprasentiert. Ein Point2d hat folgende – aus den Ubungen bekannte – Struktur:

class Point2d {public :

f loat x , y ; // ! In terne Dar s t e l l ungPoint2d ( f loat x , f loat y ) ; // ! Konstruktor. . . // ! we i t e r e Konstruktoren und Operatoren

} ;

Hinweis: Sie konnen davon ausgehen, dass fur Objekte der Klasse Point2d alle arithmetischen Standardope-ratoren (+, -, *, /, =, ==, !=, +=, -=, *=, /=) zur Verfugung stehen.

a) Implementieren Sie zunachst den Konstruktor der MedianCut-Klasse, der als Parameter eine Referenz aufeine konstante 2D-Punktewolke besitzt und diese in die Membervariable m pointcloud abspeichert.

b) Implementieren Sie die Funktion void ComputeBoundingBox(const std::vector<Point2d>& pc, Point2d&

min, Point2d& max), welche die Bounding Box (min, max) der ubergebenen Punktewolke pc berechnet.

Hinweis: Sie konnen die Anzahl der Elemente in einem std::vector mit der Methode size() abrufen.Außerdem durfen Sie davon ausgehen, dass die Punktewolke immer mindestens ein Element enthalt.

void MedianCut::ComputeBoundingBox(const std::vector<Point2d>& pc,

Point2d& min, Point2d& max) {

}

Algorithmik kontinuierlicher Systeme, 24. Juli 2015 11

c) Implementieren Sie die Funktion Point2d GetRepresentative(const std::vector<Point2d>& point-

cloud), welche den Reprasentanten fur die ubergebenen Punktewolke liefert. Dazu soll der Mittelwert derPunkte berechnet und zuruckgegeben werden.

Hinweis: Sie konnen die Anzahl der Elemente in einem std::vector mit der Methode size() abrufen.Außerdem durfen Sie davon ausgehen, dass die Punktewolke immer mindestens ein Element enthalt.

Point2d MedianCut::GetRepresentative(const std::vector<Point2d>& pointcloud) {

Point2d result;

return result;

}

d) Implementieren Sie die Methode std::vector<Point2d> ComputeMedianCut(int nCuts). Diese ist derEinstiegspunkt der rekursiven Berechnung des Median Cut Algorithmus und ruft intern die Methode voidMedianCutRecursion(...) mit den entsprechenden initialen Startwerten auf. nCuts gibt dabei die Anzahlder auszufuhrenden Cut-Schritte an (d.h. maximale Rekursionstiefe).

std::vector<Point2d> MedianCut::ComputeMedianCut(int nCuts) {

std::vector<Point2d> result;

return result;

}

Algorithmik kontinuierlicher Systeme, 24. Juli 2015 12

e) Die Methode MedianCutRecursion(std::vector<Point2d> subpointcloud, int cCuts, int nCuts,

std::vector<Point2d>& result) berechnet rekursiv den Median Cut. Dazu wird nach Bestimmung derBounding Box die Punktewolke entweder entlang der X- oder entlang der Y-Achse sortiert und anschließenddie Methode rekursiv mit der halbierten Punktewolke aufgerufen. Im Basisfall wird mit der MethodeGetRepresentative(...) ein Reprasentant berechnet und an den Ergebnisvektor result angehangt (z.B.mittels push back(...)).

Hinweis: Benutzen Sie zum Sortieren der Punktewolke entlang der X-Achse bzw. Y-Achse die MethodenSortPointCloudAlongXAxis(...) bzw. SortPointCloudAlongYAxis(...), die in der Klasse MedianCut

bereitgestellt werden. Sie durfen fur die Klasse std::vector alle bekannten Methoden verwenden.

void MedianCut::MedianCutRecursion(std::vector<Point2d> subpointcloud, int cCuts,

int nCuts, std::vector<Point2d>& result) {

if (subpointcloud.empty()) return;

}

Algorithmik kontinuierlicher Systeme, 24. Juli 2015 13

5 Iterative Losungsverfahren (9 Punkte)

Gegeben seien die 4× 4-Matrix A sowie der Vektor ~b mit

A =

2 0 1 −1

1 2 1 0

0 1 1 1

2 2 0 2

~b =

4

2

2

4

.

a) Fuhren Sie einen Schritt des Jacobi-Verfahrens zur Losung von A~x = ~b durch. Verwenden Sie alsStartvektor ~x0 = [1,−1, 1,−1]T .

b) Fuhren Sie einen Schritt des SOR-Verfahrens mit Relaxationsparameter ω = 32 zur Losung von A~x = ~b

durch. Verwenden Sie als Startvektor ~x0 = [1,−1, 1,−1]T .

Algorithmik kontinuierlicher Systeme, 24. Juli 2015 14

c) Die Losung der diskretisierten Poissongleichung

4ui,j − ui+1,j − ui,j+1 − ui−1,j − ui,j−1 = 0

auf einen aquidistanten, rechteckigen Gitter mit Gitterabstand h wird iterativ mit dem Jacobi-Verfahrengelost.

In der folgenden Tabelle ist zu den Gitterweite h = 2−3, 2−4 die Anzahl der Iterationen eingetragen, dienotig sind, um die angegebenen Fehlertoleranzen τ = 10−3, 10−4 einzuhalten.

τ = 10−3 τ = 10−4 τ = 10−5

h = 2−3 154 207

h = 2−4 620 830

h = 2−5

Erganzen Sie diese Tabelle und schatzen Sie insbesondere die Anzahl der Iterationen, die notwendig ist,um bei Schrittweite h = 2−5 die Fehlertolerenz τ = 10−5 einzuhalten.

Hinweis: Die Anzahl der Unbekannten/Gleichungen ist proportional zu 1h2

d) Schatzen Sie nun fur dieses Problem die Anzahl der Iterationen, die notig sind wenn man das Sytem mitdem Gauss-Seidel-Verfahren iterativ lost und zwar fur Schrittweiten h = 2−3, 2−4, 2−5 und Fehlertole-ranzen τ = 10−3, 10−4, 10−5 .

τ = 10−3 τ = 10−4 τ = 10−5

h = 2−3

h = 2−4

h = 2−5

e) Nun wird das Problem mit dem SOR-Verfahren iterativ gelost und zwar jeweils unter Verwendung desoptimalen Relaxationsparameter ωopt.

Erganzen in der folgenden Tabelle die fehlenden funf Wert (wiederum jeweils die geschatzte Anzahl derIterationen, die notig ist um bei Gitterweite h die Fehlertoleranz τ einzuhalten).

τ = 10−3 τ = 10−4 τ = 10−5

h = 2−3 13 18

h = 2−4 25 35

h = 2−5

Algorithmik kontinuierlicher Systeme, 24. Juli 2015 15

6 Konjugierte Richtungen, nichtlineare Optimierung (9 Punkte)

a) Betrachten Sie die Matrix A =

2 1 01 2 10 1 2

. Bestimmen Sie 3 Vektoren ~r1, ~r2, ~r3 die paarweise zueinander

A-konjugiert sind.

Im Weiteren soll folgende Kostenfunktion (Zielfunktional) minimiert werden.

F (x, y) = x2 +y4

2− 2xy + 3 y − 4x+ 2

b) Fuhren Sie einen Schritt des Gradienten-Verfahrens durch. Wahlen Sie als Startwert [x0, y0] = [3, 1]und als Schrittweite t = 1

4 .

Algorithmik kontinuierlicher Systeme, 24. Juli 2015 16

Erinnerung: Die folgende Kostenfunktion (Zielfunktional) soll minimiert werden.

F (x, y) = x2 +y4

2− 2xy + 3 y − 4x+ 2

c) Fuhren Sie nun einen Schritt des Newton-Verfahrens durch. Wahlen Sie als Startwert [x0, y0] = [3, 1] .

Hinweis: Die Inverse einer 2-Matrix

[a bc d

]ist gegeben durch

[a bc d

]−1

= 1ad−bc ·

[d −b−c a

]

d) Nennen Sie zwei Abbruchkriterien fur Iterationsverfahren.

Algorithmik kontinuierlicher Systeme, 24. Juli 2015 17

7 Least Squares Approximation (7 Punkte)

a) Gegeben sind Datenpunkte xi und zugehorige Datenwerte yi

xi -1 0 2 3

yi 0 0 2 2

Bestimmen Sie die Gerade y = m ·x+ t die diese Daten im least squares Sinne am besten approximiert.

Algorithmik kontinuierlicher Systeme, 24. Juli 2015 18

b) Das uberbestimmte lineare Gleichungssystem A~x = ~b mit

A =

5 4 5

3 4 −2

1 −2 3

1 6 −4

, ~b =

1

7

7

3

und unbekanntem ~x =

x1

x2

x3

soll im least squares Sinne gelost werden.

Dabei ist die QR-Zerlegung von A bekannt, es gilt:

A = QR wobei Q =1

5 −1 3 −1

3 1 −5 −1

1 −3 −1 5

1 5 1 3

und R =

6 6 3

0 6 −6

0 0 3

0 0 0

Losen Sie das uberbestimmte Gleichungssystem A~x = ~b unter Verwendung der QR-Zerlegung.

Algorithmik kontinuierlicher Systeme, 24. Juli 2015 19

8 Programmierung: Polynominterpolation (11 Punkte)

In dieser Aufgabe soll eine unbekannte Funktion f(x) : R→ R mittels einiger Abtastpunkte (xi, yi)T , i = 1, . . . , n

durch ein Polynom p(x) des Grades n − 1 interpoliert werden. Die Implementierung erfolgt in C++. Im Ge-gensatz zu den Ubungsaufgaben ist keine Fehlerbehandlung erforderlich.

Zur Interpolation der Samples soll die Monombasis fur Polynome verwendet werden, d.h.

f(x) ≈ p(x) =n−1∑i=0

aixi.

Zum Bestimmen der Monomkoeffizienten muss bekanntermaßen ein Gleichungssystem A~x = ~b gelost werden,wobei der Losungsvektor ~x die Koeffizienten enthalt.

Hinweis: Sie finden die Klassenstrukturen auch auf der Seite 29, die zum Heraustrennen vorgesehen ist.

Die Klasse Point2d, die einen 2D-Punkt (x, y)T darstellt, ist vorgegeben und hat folgende Struktur:

class Point2d {public :

f loat x , y ; // ! In terne Dar s t e l l ung. . . // ! Konstruktoren und Operatoren

} ;

Eine m× n-Matrix wird von der Klasse Matrix reprasentiert:

class Matrix {public :

Matrix (unsigned int height , unsigned int width ) ; // ! Konstruktor

// ! Operatoren zum Lese− und S c h r e i b z u g r i f f (m: Ze i l e , n : Spa l t e )f loat& operator ( ) ( unsigned int m, unsigned int n ) ;f loat operator ( ) ( unsigned int m, unsigned int n) const ;

unsigned int getHeight ( ) const ; // ! Anzahl der Ze i l enunsigned int getWidth ( ) const ; // ! Anzahl der Spa l t en. . . // ! we i t e r e Methoden und Operatoren

} ;

Die Klasse MonomCurve reprasentiert ein Polynom in Monomdarstellung:

class MonomCurve {public :

MonomCurve( const std : : vector<f loat>& c o e f f i c i e n t s ) ; // ! Konstruktor

f loat EvaluateAt ( f loat x ) const ; // ! Auswerten an S t e l l e xf loat I n t e g r a l ( f loat a , f loat b) const ; // ! Wert des I n t e g r a l s von a b i s b

// ! s t a t i s c h e Methoden zum Au f s t e l l e n des Gle ichungssys temsstat ic Matrix ComputeSystemMatrix ( const std : : vector<Point2d>& c o n t r o l Po i n t s ) ;stat ic Matrix ComputeRHS( const std : : vector<Point2d>& c o n t r o l Po i n t s ) ;

private :s td : : vector<f loat> m c o e f f i c i e n t s ; // ! In terne Dar s t e l l ung ( Monomkoef f iz ienten )

} ;

Hinweis: Verandern Sie die Klassenstrukturen nicht, d.h. fuhren Sie keine neuen Attribute oder Methodenein.

Algorithmik kontinuierlicher Systeme, 24. Juli 2015 20

a) Implementieren Sie die Methode Matrix ComputeSystemMatrix(const std::vector<Point2d>& con-

trolPoints, unsigned int degree), die die Systemmatrix A zur Bestimmung der Polynomkoeffizien-ten aufstellt. Die Methode erhalt als Eingabeparameter die Samplepunkte (controlPoints) und soll dieMatrix A zuruckgeben.

Hinweis: Sie konnen die Anzahl der Elemente in einem std::vector mit der Methode size() abrufen.

Matrix MonomCurve::ComputeSystemMatrix(const std::vector<Point2d>& controlPoints) {

}

b) Implementieren Sie nun die Methode Matrix ComputeRHS(const std::vector<Point2d>& controlPoints),die die rechte Seite ~b des Gleichungssystems bestimmt. Die Methode erhalt als Eingabeparameter die Sam-plepunkte (controlPoints) und soll den Vektor ~b zuruckgeben.

Hinweis: Ein Vektor ~b ∈ Rn kann als Matrix der Große n× 1 implementiert werden.

Matrix MonomCurve::ComputeRHS(const std::vector<Point2d>& controlPoints) {

}

Algorithmik kontinuierlicher Systeme, 24. Juli 2015 21

c) Implementieren Sie die Methode float Integral(float a, float b), die das Integral∫ ba p(x)dx analy-

tisch berechnet. Bilden Sie hierzu zunachst die Stammfunktion des Polynoms und werten Sie dieses neuePolynom an den entsprechenden Stellen aus.

Tipp: Sie konnen innerhalb der Methode ein neues Objekt des Typs MonomCurve anlegen und zur Aus-wertung verwenden.

float MonomCurve::Integral(float a, float b) const {

float result;

return result;

}

Algorithmik kontinuierlicher Systeme, 24. Juli 2015 22

9 Bezier-Kurven (8 Punkte)

a) Betrachten Sie die quadratischen Bezier-Kurven

CW (t) =

004

·B20(t) +

024

·B21(t) +

042

·B22(t) , CO(t) =

402

·B20(t) +

424

·B21(t) +

444

·B22(t) ,

Bestimmen Sie mit Hilfe des Algorithmus von deCasteljau die Kurvenpunkte CW

(14

)und CO

(14

).

Algorithmik kontinuierlicher Systeme, 24. Juli 2015 23

b) Die beiden Randkurven werden linear kombiniert. Auf diese Weise entsteht die folgenden Flache

S(s, t) = (1− s) · CW (t) + s · CO(t)

Die Mittelinie M(t) = S(12 , t)

dieser Flache ist eine quadratische Bezier-Kurve. Bestimmen Sie dieKontrollpunkte dieser Kurve.

c) Bestimmen Sie den Flachenpunkt S(12 ,

14

).

d) Die Diagonale D(t) = S(t, t) dieser Flache ist eine kubische Bezier-Kurve, D(t) =∑3

i=0~diB

3i (t) .

Bestimmen Sie die beiden Kontrollpunkte ~d0 und ~d3 dieser Kurve.

Algorithmik kontinuierlicher Systeme, 24. Juli 2015 24

10 Multivariate Interpolation (9 Punkte)

10.1 Baryzentrische Koordinaten

Gegeben sei jeweils ein Dreieck ∆(R,S, T ) sowie die zugehorigen baryzentrischen Koordinaten [ρ, σ, τ ].Dabei ist jeweils ρ das Gewicht von R, σ das Gewicht von S und τ das Gewicht von T .

a) Bestimmen Sie den Wertebereich der baryzentrischen Koordinaten [ρ, σ, τ ] fur folgende Gebiete (gestri-chelte Linien gehoren nicht zu einem Gebiet):

Algorithmik kontinuierlicher Systeme, 24. Juli 2015 25

Im Nachfolgenden sei R = [0, 3]T , S = [6, 3]T und T = [4.5, 6]T .

b) Bestimmen Sie die baryzentrischen Koordinaten der Punkte Q0 = [4.5, 5]T und Q1 = [1.5, 0]T bezuglichdes Dreiecks ∆(R,S, T ) .

Algorithmik kontinuierlicher Systeme, 24. Juli 2015 26

c) Der PunktQ liegt im Dreieck ∆(A,B,C) und seine baryzentrischen Koordinaten α, β und γ bzgl. ∆(A,B,C)seien bekannt (siehe linke Abb.).

Mit Hilfe der baryzentrischen Koordinaten von Q sollen die Teilungsverhaltnisse der Strecken AB, AQA

und AC (siehe rechte Abb.) bestimmt werden.

Drucken Sie diese Teilungsverhaltnisse mit Hilfe der baryzentrischen Koordinaten α, β, γ aus:

a : b = :

c : d = :

e : f = :

10.2 Bilineare Interpolation

Im Rechteck mit den Eckpunkten P00 = [−1,−1]T , P10 = [5,−1]T , P11 = [5, 3]T und P01 = [−1, 3]T sind dieWerte f00 = 0, f10 = 6, f11 = 2 bzw. f01 = 6 gegeben. Diese Werte werden ins Innere bilinear interpoliert.

Bestimmen Sie die Werte des Interpolanten im Punkt P = [1, 2]T sowie im Mittelpunkt M = 14(P00 + P10 +

P11 + P01) des Rechtecks.

Hinweis: Eine Skizze ist unter Umstanden hilfreich.

Algorithmik kontinuierlicher Systeme, 24. Juli 2015 27

Algorithmik kontinuierlicher Systeme, 24. Juli 2015 28

Algorithmik kontinuierlicher Systeme, 24. Juli 2015 29

Anhang zur Programmierung: Klassenubersicht

Hinweis: Sie durfen dieses Blatt gerne aus der Klausur heraustrennen. Es wird nicht bewertet.

class MedianCut {public :// ! Klassen KonstruktorMedianCut ( const std : : vector<Point2d>& pointc loud ) ;

// ! E in s t i e g spunk t zur Berechnung des Median Cutstd : : vector<Point2d> ComputeMedianCut ( int nCuts ) ;

private :// ! Berechne Bounding Box (min , max) der u bergebenen Punktewolke pcstat ic void ComputeBoundingBox ( const std : : vector<Point2d>& pc ,

Point2d& min , Point2d& max ) ;

// ! S o r t i e r t d i e u bergebene Punktewolke en t l ang der X− bzw . Y−Achsestat ic void SortPointCloudAlongXAxis ( std : : vector<Point2d>& pointc loud ) ;stat ic void SortPointCloudAlongYAxis ( std : : vector<Point2d>& pointc loud ) ;

// ! Gibt den Repra sentanten der Punkte zur u ck ( h i e r : Mi t t e lwe r t )stat ic Point2d GetRepresentat ive ( const std : : vector<Point2d>& pointc loud ) ;

// ! Rekurs ive Berechnung des Median Cut// ! ( nCuts : maximale Anzahl der Sch r i t t e , cCuts : a k t u e l l e r S c h r i t t )stat ic void MedianCutRecursion ( std : : vector<Point2d> subpointc loud ,

int cCuts , int nCuts , s td : : vector<Point2d>& r e s u l t ) ;

// ! K la s s enva r i a b l estd : : vector<Point2d> m pointcloud ;} ;

class Point2d {public :

f loat x , y ; // ! In terne Dar s t e l l ungPoint2d ( f loat x , f loat y ) ; // ! Konstruktor. . . // ! we i t e r e Konstruktoren und Operatoren

} ;

Hinweis: Sie konnen davon ausgehen, dass fur Objekte der Klasse Point2d alle arithmetischen Standardope-ratoren (+, -, *, /, =, ==, !=, +=, -=, *=, /=) zur Verfugung stehen.

Algorithmik kontinuierlicher Systeme, 24. Juli 2015 30

Hinweis: Sie durfen dieses Blatt gerne aus der Klausur heraustrennen. Es wird nicht bewertet.

class Matrix {public :

// ! KonstruktorMatrix (unsigned int height , unsigned int width ) ;

// ! Operatoren zum Lese− und S c h r e i b z u g r i f f (m: Ze i l e , n : Spa l t e )f loat& operator ( ) ( unsigned int m, unsigned int n ) ;f loat operator ( ) ( unsigned int m, unsigned int n) const ;

// ! Anzahl der Ze i l enunsigned int getHeight ( ) const ;

// ! Anzahl der Spa l t enunsigned int getWidth ( ) const ;

. . . // ! we i t e r e Methoden und Operatoren} ;

class MonomCurve {public :

// ! KonstruktorMonomCurve( const std : : vector<f loat>& c o e f f i c i e n t s ) ;

// ! Auswerten an S t e l l e xf loat EvaluateAt ( f loat x ) const ;

// ! Wert des I n t e g r a l s von a b i s bf loat I n t e g r a l ( f loat a , f loat b) const ;

// ! s t a t i s c h e Methode zum Au f s t e l l e n der Systemmatrix Astat ic Matrix ComputeSystemMatrix ( const std : : vector<Point2d>& c o n t r o l Po i n t s ) ;

// ! s t a t i s c h e Methode zum Au f s t e l l e n der rech ten Se i t e bstat ic Matrix ComputeRHS( const std : : vector<Point2d>& c o n t r o l Po i n t s ) ;

private :// ! In terne Dar s t e l l ung ( Monomkoef f iz ienten )std : : vector<f loat> m c o e f f i c i e n t s ;

} ;