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];