Lösungsbeschreibung des Preisrätsels vom September 2020

Punktwolke

Bild 1

1.) die gegebenen Punkte

$$ P_1=\Bigg(\matrix{156\cr -22\cr 76}\Bigg)\quad P_2=\Bigg(\matrix{1\cr -72\cr -47}\Bigg)\quad P_3=\Bigg(\matrix{102\cr 84\cr 115}\Bigg)\quad P_4=\Bigg(\matrix{-74\cr -112\cr -117}\Bigg)\\ P_5=\Bigg(\matrix{36\cr -84\cr -35}\Bigg)\quad P_6=\Bigg(\matrix{-58\cr 84\cr 22}\Bigg)\quad P_7=\Bigg(\matrix{135\cr -188\cr -46}\Bigg)\quad P_8=\Bigg(\matrix{-81\cr 37\cr -22}\Bigg)\quad $$

2.) Schreibweise von Vektoren

Punkte werden auch Ortsvektoren genannt, weil sie den Endpunkt eines Vektors bilden, der im Ursprung des Koordinatensystems beginnt. Man kann also mit Punkten in Vektorschreibweise genauso umgehen wie mit allen anderen Vektoren, die nicht im Ursprung beginnen. Deshalb kann man schreiben: $$ \overrightarrow{OP_1}=\overrightarrow{p_1}=\Bigg(\matrix{x_1\cr y_1\cr z_1}\Bigg) = \Bigg(\matrix{156\cr -22\cr 76}\Bigg)$$ Wenn man den Abstands-Vektor $\overrightarrow{a}$ zwischen Punkt 1 und Punkt 2 berechnen will, geht das so: $$ \style{color:darkgreen}{\overrightarrow{a}}=\overrightarrow{P_1P_2}=\style{color:blue}{\overrightarrow{p_2}}-\style{color:red}{\overrightarrow{p_1}}= \style{color:blue}{\Bigg(\matrix{1\cr -72\cr -47}\Bigg)}-\style{color:red}{\Bigg(\matrix{156\cr -22\cr 76}\Bigg)}=\style{color:darkgreen}{\Bigg(\matrix{-155\cr -50\cr -123}\Bigg)}\tag{1} $$ Es werden also die x, y und z-Differenzen jeweils separat gebildet.

Die 3d-Grafik im Bild 2 unten zeigt diese Differenzbildung.

Bild 2

3.) Rechnen mit Vektoren

Die Schreibweise ist nur ein Aspekt bei Vektoren. Ein anderer ist die Mathematik in Programmiersprachen. Vektoren werden als "Array" in Variablen gespeichert, das bedeutet übersetzt etwa Datenreihe oder Datenfeld. Das ist eine eindimensionale Liste von Werten, die über ihre Positionsnummer in der Liste erreichbar sind. Die Nummerierung beginnt bei Null.
In den meisten Programmiersprachen werden dafür eckige Klammern verwendet, in denen eine Anzahl von Werten mit Kommata getrennt eingeschrieben sind und so einer Variablen zugewiesen werden (Zeile 4 und 5 in Programmcode 1 unten). In diesem Fall sind es immer genau drei Werte mit den Positionsnummern 0 für x, 1 für y und 2 für z, die ebenfalls in eckigen Klammern nach einem Variablennamen den Zugriff auf einen einzelnen Wert ermöglichen ( z.B. benutzt im Rückgabewert der "sub"-Funktion in Zeile 2).

function sub($a, $b) {
    return [ $a[0]-$b[0], $a[1]-$b[1], $a[2]-$b[2] ];
}
$p1 = [156, -22, 76];
$p2 = [1, -72, -47];
$a = sub($p1, $p2);
// $a ist nun der Vektor [155, 50, 123]

Programmcode 1

Bei der hier verwendeten Programmiersprache PHP müssen alle Variablen mit einem Dollar-Zeichen beginnen, in der Sprache JavaScript ist alles sehr ähnlich jedoch ohne Dollar-Zeichen. Wie man an dem Programmcode 1 beispielhaft sieht, muss die Vektor-Schreibweise (1) für die mathematische Berechnung durch Funktionen ergänzt werden, bevor ein korrektes Ergebnis damit berechnet werden kann. Das gilt auch für die folgenden weiteren Operatoren: $$\begin{alignat}{3} \text{Vektor-Addition: }\quad\overrightarrow{x} =& \,\overrightarrow{u}+\overrightarrow{v}\quad &\text{(Funktion "add")} \\ \text{Vektor-Subtraktion: }\quad\overrightarrow{x} =& \,\overrightarrow{u}-\overrightarrow{v}\quad &\text{(Funktion "sub")} \\ \text{Vektor multipliziert mit Zahl: }\quad\overrightarrow{x} =& \,\overrightarrow{u}\cdot k\quad &\text{(Funktion "mul")} \\ \text{Vektor dividiert durch Zahl: }\quad\overrightarrow{x} =& \,\overrightarrow{u} / k\quad &\text{(Funktion "div")} \\ \text{Skalarprodukt zweier Vektoren: }\quad k =& \,\overrightarrow{u}\odot\overrightarrow{v}\quad &\text{(Funktion "punkt")} \\ \text{Kreuzprodukt zweier Vektoren: }\quad\overrightarrow{x} =& \,\overrightarrow{u}\otimes\overrightarrow{v} &\quad\text{(Funktion "kreuz")} \\ \text{Spatprodukt dreier Vektoren: }\quad V =& \,\overrightarrow{u}\otimes\overrightarrow{v}\odot\overrightarrow{w} &\quad\text{(Funktion "spat")} \\ \text{Betrag oder Länge eines Vektors: }\quad d =& \,\sqrt{\overrightarrow{u}\odot\overrightarrow{u}}=|\overrightarrow{u}| &\quad\text{(Funktion "betrag")} \end{alignat}$$

// addiert die zwei Vektoren "a" und "b"
function add($a, $b) {              
    return [$a[0] + $b[0], $a[1] + $b[1], $a[2] + $b[2]];
}
// subtrahiert Vektor "b" von Vektor "a"            
function sub($a, $b) {              
    return [$a[0] - $b[0], $a[1] - $b[1], $a[2] - $b[2]];
}
// multipliziert Vektor "a" mit Zahl "k"
function mul($a, $k) {              
    return [$a[0] * $k, $a[1] * $k, $a[2] * $k];
}
// dividiert Vektor "a" durch Zahl "k"
function div($a, $k) {              
    return [$a[0] / $k, $a[1] / $k, $a[2] / $k];
}
// bildet das Skalarprodukt aus Vektor "a" und Vektor "b"
function punkt($a, $b) {            
    return $a[0] * $b[0] + $a[1] * $b[1] + $a[2] * $b[2];
}
// bildet das Kreuzprodukt aus Vektor "a" und Vektor "b"
function kreuz($a, $b) {            
    return [ $a[1] * $b[2] - $a[2] * $b[1], 
             $a[2] * $b[0] - $a[0] * $b[2], 
             $a[0] * $b[1] - $a[1] * $b[0] ];
}
// bildet das Spatprodukt aus Vektor "a", "b" und "c"
function spat($a, $b ,$c) {         
    return punkt(kreuz($a, $b), $c);
}
// berechnet den Betrag, also die Länge von Vektor "a"
function betrag($a) {               
    return sqrt(punkt($a, $a));
}
// berechnet das Volumen eines Tetraeders aus den 4 Eckpunkten
function volumen($a, $b, $c, $d) {  
    $u = sub($a, $b);
    $v = sub($a, $c);
    $w = sub($a, $d);
    return abs(spat($u, $v, $w) / 6);
}
// berechnet den Abstand von Punkt "d" zur Ebene des Dreiecks "abc"
function distanz($a, $b, $c, $d) {  
    $u = sub($a, $b);
    $v = sub($a, $c);
    $w = sub($a, $d);
    $x = kreuz($u, $v);
    return abs(punkt($x, $w) / betrag($x));
}

Programmcode 2

4.) das Suchen der Punkte, die in einer Ebene liegen

Nach der langen Vorbereitung geht es jetzt schnell zur Lösung der Rätselfragen. Die folgende Überlegung soll die Arbeit daran optimieren.

Drei Punkte bilden auch im Raum eine Fläche, die eine Ebene festlegt. Nun könnte man alle Kombinationen von 3 aus 8 Punkten als Dreieck ansehen und die übrigen 5 Punkte daraufhin prüfen, ob sie in der Ebene des Dreiecks liegen. Die Anzahl der verschiedenen Dreiecke ist $\left( { \scriptstyle \matrix{8\cr 3} } \right)=56$ multipliziert mit $5$ sind $280$ Prüfungen. Da man ohnehin nur mit Rechnerunterstützung zum Ergebnis kommt ist der Aufwand überschaubar. Andererseits ist offensichtlich, dass es dabei zu Wiederholungen der gleichen vier beteiligten Punkte kommt, nämlich 4 mal: einer der vier Punkte ist derjenige, dessen Abstand zur Dreieckebene auf Null geprüft werden muss und das kann jeder der vier Punkte mal sein. Tatsächlich kommt man mit $\left( { \scriptstyle \matrix{8\cr 4} } \right)=70$ Prüfungen aus, nämlich alle verschiedenen Kombinationen von 4 aus 8.

Wie laufen diese Prüfungen ab? Bei der Suche im Internet gibt es viele Hinweise auf die Berechnung des Abstands eines Punktes von einer Ebene. Aber die einfachste Lösung habe ich nirgendwo gefunden: man nimmt jeweils die vier Punkte als Eckpunkte eines Tetraeders an und berechnet das Volumen.

Wenn das Volumen des Tetraeders Null ist sind alle vier Punkte mit Sicherheit in einer Ebene.

Nun wird langsam klar, welchen Sinn die Vorarbeiten zum Rechnen mit Vektoren hatten. Es ist die Funktion "volumen" in Zeile 36 von Programmcode 2, die sofort eingesetzt werden kann. Es müssen nur noch die 70 Vierergruppen damit geprüft werden. Das Ergebnis zeigt die folgende Tabelle 1:

ZeileTetraeder EckpunkteTetraeder Volumen
11 2 3 43,3333
21 2 3 51046,0000
31 2 3 6835,0000
41 2 3 7838,3333
51 2 3 8763,8333
61 2 4 5133,3333
71 2 4 6111,6667
81 2 4 7111,6667
91 2 4 894,1667
101 2 5 61641,0000
111 2 5 71507,6667
121 2 5 81003,8333
131 2 6 7111,6667
141 2 6 81999,6667
151 2 7 81905,5000
161 3 4 51596,0000
171 3 4 61273,3333
181 3 4 71283,3333
191 3 4 81171,3333
201 3 5 6226,0000
211 3 5 71316,0000
221 3 5 81841,0000
231 3 6 71231,6667
241 3 6 81634,6667
251 3 7 8514,5000
261 4 5 62532,6667
271 4 5 72132,6667
281 4 5 81766,3333
291 4 6 7335,0000
301 4 6 83268,0000
311 4 7 82985,5000
321 5 6 72390,3333
331 5 6 82671,3333
341 5 7 83916,5000
351 6 7 82731,0000
362 3 4 5420,0000
372 3 4 6330,0000
382 3 4 7330,0000
392 3 4 8310,0000
402 3 5 61656,0000
412 3 5 72076,0000
422 3 5 81035,0000
432 3 6 7330,0000
442 3 6 82035,5000
452 3 7 82345,5000
462 4 5 6870,0000
472 4 5 7870,0000
482 4 5 8535,0000
492 4 6 70,0000
502 4 6 81062,5000
512 4 7 81062,5000
522 5 6 7870,0000
532 5 6 834,5000
542 5 7 8500,5000
552 6 7 81062,5000
563 4 5 62436,0000
573 4 5 73696,0000
583 4 5 8840,0000
593 4 6 7990,0000
603 4 6 82458,0000
613 4 7 83388,0000
623 5 6 72532,0000
633 5 6 82691,0000
643 5 7 84956,0000
653 6 7 83648,5000
664 5 6 72610,0000
674 5 6 81363,0000
684 5 7 82968,0000
694 6 7 83187,5000
705 6 7 81466,5000

Tabelle 1

Die einzige Zeile mit einem Volumen von Null ist die Zeile 49 mit den Punkten 2, 4, 6 und 7. Damit ist die erste Rätselfrage beantwortet.

5.) der Abstand der übrigen 4 Punkte von der Ebene

Die Methode mit dem Volumen eines Tetraeders kann auch für die zweite Frage eingesetzt werden. Dabei verschwindet das Volumen des Tetraeders nicht und man kann als Ziel dessen Höhe berechnen. Das ist sehr einfach. Man wählt aus den vier Punkten 2, 4, 6 und 7 drei aus, egal welche, und bildet damit ein Dreieck, welches die Grundseite des Tetraeders sein soll. Mit dem vierten hinzukommenden Punkt außerhalb der Ebene ist wie schon bekannt das Volumen zu berechnen. Weiterhin ist die Fläche des Dreiecks ebenfalls leicht mit dem Kreuzprodukt zweier Seitenvektoren zu berechnen. Dann ist die Höhe des Tetraeders und damit der Abstand von der Ebene $$ h=\frac{3\cdot Volumen}{Grundseite}=\frac{3\cdot\frac16\cdot |Spatprodukt|}{\frac12 \cdot |Kreuzprodukt|}=\frac{|\overrightarrow{u}\otimes\overrightarrow{v}\odot\overrightarrow{w}|}{|\overrightarrow{u}\otimes\overrightarrow{v}|} $$ und das ist die Funktion "distanz" in Zeile 43 von Programmcode 2.

In der folgenden Tabelle 2 sind die Abstände der Punkte 1, 3, 5 und 8 von der Ebene berechnet, und nicht nur mit einem Dreieck als Grundseite, sondern in allen 4 Varianten. Es kommt natürlich immer das gleiche heraus und damit ist die Rätselfrage 2 beantwortet.

ZeileDreieckPunkt 1Punkt 3Punkt 5Punkt 8
12 4 60,035769480,105706840,278681660,34034398
22 4 70,035769480,105706840,278681660,34034398
32 6 70,035769480,105706840,278681660,34034398
44 6 70,035769480,105706840,278681660,34034398

Tabelle 2




Diese Informationen wurden zusammengestellt von

Kurzbewertung dieser Information:
sehr gut gut befriedigend
ausreichend mangelhaft ungenügend