24.04.2013 Aufrufe

MATLAB - Eine Einführung - TUM

MATLAB - Eine Einführung - TUM

MATLAB - Eine Einführung - TUM

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

mit (j = 1, . . . , n − 1)<br />

hj<br />

λj =<br />

hj + hj−1<br />

µj = 1 − λj<br />

6<br />

dj =<br />

hj + hj−1<br />

Für den natürlichen Spline setzt man noch<br />

yj+1 − yj<br />

hj<br />

λ0 = d0 = dn = µn = 0. 1<br />

1.2 Implementierung in <strong>MATLAB</strong><br />

− yj<br />

<br />

− yj−1<br />

.<br />

hj−1<br />

In diesem Abschnitt werden uns ein kurzes <strong>MATLAB</strong> Skript ansehen, welches die Koeffizienten der<br />

Polynome die den kubischen Spline beschreiben ausrechnet. Da dies nur eine kurze Motivation für die<br />

Verwendung von <strong>MATLAB</strong> sein soll, werden wir die Implementierung nicht in voller Ausführlichkeit<br />

besprechen. Die genaue Funktionsweise sollte mit Hilfe der späteren Ausführungen verständlich werden.<br />

Die Funktion kspline bekommt als Eingabeparameter ein Vektor x mit den Stützstellen und ein<br />

Vektor y mit den zu interpolierenden Werten. Zurückgegeben wird eine (n − 1) × 4-Matrix, in deren i-ter<br />

Zeile die Koeffizienten des kubischen Polynoms des Intervalls [xi, xi+1] stehen.<br />

1 function [ P ] = k s p l i n e ( x , y )<br />

2 n = length ( x ) ;<br />

3 j j = 1 : n−1; j = 2 : n−1;<br />

4 h = [ x ( j j +1)−x ( j j ) ] ;<br />

5 lambda = [ 0 , h ( j +1)./( h ( j )+h ( j + 1 ) ) ] ;<br />

6 mu = [1−lambda ( j ) , 0 ] ;<br />

7 d = [ 0 , ( 6 . / ( h ( j )+h ( j + 1 ) ) ) . ∗ ( ( y ( j +1)−y ( j ) ) . / h ( j +1) . . .<br />

8 − ( y ( j )−y ( j −1))./ h ( j ) ) , 0 ] ;<br />

9 A = 2∗eye ( n ) + diag ( lambda , 1) + diag (mu, −1);<br />

10 M = (A \ d ’ ) ’ ;<br />

11 alpha = y ( j j ) ; gamma = M( j j ) / 2 ;<br />

12 beta = ( y ( j j +1)−y ( j j ) ) . / h ( j j +1) − h ( j j +1).∗(2∗M( j j )+M( j j +1))/6;<br />

13 d e l t a = (M( j j +1)−M( j j ) ) . / ( 6 ∗ h ( j j +1));<br />

14 P = [ alpha ’ , beta ’ , gamma’ , delta ’ ] ;<br />

15 end<br />

In der ersten Zeile des Skripts speichern wir die Anzahl der Punkte in der Variable n und erzeugen<br />

Vektoren jj und j in dem die Zahlen von 1 bzw. 2 bis n − 1 stehen. Dann berechnen wir die Länge<br />

der Intervalle [xi, xi+1] und speichern diese in h. Auf dieselbe Weise berechnen wir die λi, µi und di. Die<br />

Einträge λ0, µn, d0 und dn werden hierbei explizit auf Null gesetzt. Man sieht, wie sich die Formeln aus<br />

dem vorherigen Abschnitt nahezu eins zu eins im <strong>MATLAB</strong> Code wiederfinden.<br />

In Zeile 9 erzeugen wir die Matrix aus (1.1) indem wir auf eine mit zwei multiplizierte Einheitsmatrix<br />

die Vektoren lambda und mu auf die Nebendiagonalen addieren.<br />

Der Aufruf M = (A \ d’)’; löst nun das Gleichungssystem (1.1). Der hierbei verwendete Backslash-<br />

Operator wählt automatisch das Verfahren welches das Gleichungssystem möglichst effizient löst, z.B.<br />

eine Cholesky-Zerlegung bei einer symmetrisch positiv definiten Matrix. Da Vektoren in <strong>MATLAB</strong> standardmäßig<br />

Zeilenvektoren sind, müssen wir die rechte Seite d mit ’ transponieren und die Lösung auf die<br />

selbe Weise zurück in einen Zeilenvektor transformieren. Alternativ hätten wir auch den Slash-Operator<br />

verwenden können, um das zweimalige Transponieren zu vermeiden: M = d / A;.<br />

Nachdem die Momente bestimmt sind, berechnen die letzten Zeilen der Funktion die Koeffizienten<br />

des Polynoms und schreiben sie in die (n − 1) × 4-Matrix P. Damit ist alles berechnet.<br />

An diesem Beispiel kann man gut erkennen, wie effektiv der gegebene Algorithmus implementiert<br />

wurde. Wir sind komplett ohne Kontrollstrukturen wie z.B. Schleifen ausgekommen. Zusätzlich lässt sich<br />

der Programmcode sehr gut lesen und ist gut verständlich.<br />

1 Mit dieser Wahl folgt sofort M0 = S ′′ (x0) = Mn = S ′′ (xn) = 0<br />

8

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!