Geometrie und Topologie
Fakultät für Mathematik
Technische Universität München

Glatte Kurven durch Stützstellen

Obwohl Lineare Algebra sich im Wesentlichen mit geradlinigen Objekten befasst, kann sie auch dazu benutzt werden, nicht-geradlinige Kurven durch eine gegebene Menge von Stützstellen zu legen. Im folgenden Beispiel wird eine Kurve aus stückweise kubischen Kurven-Stücken durch vier Stützpunkte gelegt. Die einzelnen Kurvenstücke werden hierbei sogar glatt aneinander angesetzt. Weiterhin sind die Randsteigungen anpassbar.




Das Problem des Auffindens der Kurvenparameter kann komplett auf das Lösen eines linearen Gleichungssystems zurückgeführt werden. Sind $a_3x^3+a_2x^2+a_1x+a_0$, $b_3x^3+b_2x^2+b_1x+b_0$ und $c_3x^3+c_2x^2+c_1x+c_0$ die Gleichungen der drei Kurvenstücke, so ergibt sich für die Stützstellen 1,2,3,4 das folgende zu lösende Gleichungssystem: \[ \left(\begin{array}{cccccccccccccccccc} 1&1&1&1&0&0&0&0&0&0&0&0\\ 8&4&2&1&0&0&0&0&0&0&0&0\\ 0&0&0&0&8&4&2&1&0&0&0&0\\ 0&0&0&0&27&9&3&1&0&0&0&0\\ 0&0&0&0&0&0&0&0&27&9&3&1\\ 0&0&0&0&0&0&0&0&64&16&4&1\\ 3&2&1&0&0&0&0&0&0&0&0&0\\ 12&4&1&0&-12&-4&-1&0&0&0&0&0\\ 0&0&0&0&27&6&1&0&-27&-6&-1&0\\ 0&0&0&0&0&0&0&0&48&8&1&0\\ 12&2&0&0&-12&-2&0&0&0&0&0&0\\ 0&0&0&0&18&2&0&0&-18&-2&0&0\\ \end{array}\right) \cdot \left(\begin{array}{cccccccccccccccccc} a_3\\ a_2\\ a_1\\ a_0\\ b_3\\ b_2\\ b_1\\ b_0\\ c_3\\ c_2\\ c_1\\ c_0\\ \end{array}\right) = \left(\begin{array}{cccccccccccccccccc} y_1\\ y_2\\ y_2\\ y_3\\ y_3\\ y_4\\ h_1\\ 0\\ 0\\ h_2\\ 0\\ 0\\ \end{array}\right) \] Der komplette Programmcode für feste Stützstellen 1,2,3,4 ist im Folgenden angegeben.
A.x=1;
B.x=2;
C.x=3;
D.x=4;

h1=(E-A).y/(E-A).x;
h2=(F-D).y/(F-D).x;

m=[
[1,1,1,1,0,0,0,0,0,0,0,0],
[8,4,2,1,0,0,0,0,0,0,0,0],
[0,0,0,0,8,4,2,1,0,0,0,0],
[0,0,0,0,27,9,3,1,0,0,0,0],
[0,0,0,0,0,0,0,0,27,9,3,1],
[0,0,0,0,0,0,0,0,64,16,4,1],
[3,2,1,0,0,0,0,0,0,0,0,0],
[12,4,1,0,-12,-4,-1,0,0,0,0,0]
, [0,0,0,0,27,6,1,0,-27,-6,-1,0],
[0,0,0,0,0,0,0,0,48,8,1,0],
[12,2,0,0,-12,-2,0,0,0,0,0,0],
[0,0,0,0,18,2,0,0,-18,-2,0,0]
];

v=[A.y,B.y,B.y,C.y,C.y,D.y,h1,0,0,h2,0,0];
a=Linearsolve[m,v];

plot[x^3*a_1+x^2*a_2+x*a_3+a_4,start->1,stop->2];
plot[x^3*a_5+x^2*a_6+x*a_7+a_8,start->2,stop->3];
plot[x^3*a_9+x^2*a_10+x*a_11+a_12,start->3,stop->4];