MATLAB - Eine Einführung - TUM
MATLAB - Eine Einführung - TUM
MATLAB - Eine Einführung - TUM
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