Genauigkeit bei Vektorrechnung

Neue Frage »

alterDackel Auf diesen Beitrag antworten »
Genauigkeit bei Vektorrechnung
Hallo,

nach langer mathematischer Abstinenz versuche ich mich in die Vektorrechnung einzuarbeiten. Konkret im 3D-Raum.
Dazu habe ich mir ein einfaches Beispiel vorgenommen:
[attach]41094[/attach]
Es geht also um einen Kreisbogen, der über 3 Punkte bestimmt ist.
Der Mittelpunkt sollte ja vernachlässigbar sein, ich habe ihn auf 110/90 gesetzt.

In einer Abhandlung zur Vektorrechnung fand ich den Hinweis, dass die Vektorformel des Kreises im 2D-Raum genauso ist, wie im 3D-Raum.

Um das zu überprüfen habe ich ein kleines Java-Programm geschrieben, das mir die entsprechende Teile ausrechnet.
Ich fange mit dem Kreisbogen in der X/Y-Ebene an (also Z=0) und lasse mir die Vektoren und den Winkel zwischen den Vektoren berechnen (und ausgeben).

Anschließend drehe ich die Ebene des Kreises um die X-Achse um 30° (Y-Werte werden kleiner, Z-Werte größer).
Mit den neuen Koordinaten lasse ich mir wieder die Vektoren MP1 und MP2 sowie deren Winkel berechnen und ausgeben.

Dabei kommt heraus, dass sowohl in der X/Y-Ebene, als auch in der gedrehten Ebene die Längen der Vektoren MP1 und MP2 nicht gleich sind. In der X/Y-Ebene ist der Fehler zu verschmerzen - der Unterschied wird erst an der 4. Nachkommastelle signifikant.

Nach der Drehung vergrößert sich der Fehler auf ca. 4% - was natürlich nicht mehr akzeptabel ist.

Mein erster Verdacht fiel auf den double-Datentyp. Also habe ich alle Klassen auch als Festkommavarianten erstellt. Der Unterschied zwischen Festkomma-Variante und double-Variante war vernachlässigbar.
Um sicher zu gehen habe ich die Klassen auch noch mit BigDecimal erstellt und dort mit der Anzahl der Nachkommastellen gespielt (MathContext). Bei 5 Nachkommastellen weicht das Ergebnis noch von den anderen beiden Varianten ab. Ab 10 Nachkommastellen ist kein Unterschied mehr auszumachen und es bringt auch keine Verbesserung, die Anzahl der Nachkommastellen auf 50 zu erhöhen.

Jetzt zu meiner Frage: habe ich ein Verständnis-Problem, was das Thema angeht, oder woran könnte der Fehler liegen? Wenn die 3 Varianten bis auf 3 Stellen nach dem Komma identisch sind, kann es wohl kaum noch an dem Datentyp der Zahlen liegen.

Schätze, irgendwie habe ich mich verlaufen und weiß nicht mehr weiter :O
riwe Auf diesen Beitrag antworten »

zunächst: die "verdächtige" Gleichung beschreibt in R2 einen Kreis in R3 aber eine KUGEL

zum Rest kann man ohne Einsicht in deine Programmkünste nix sagen, wenn allerdings die Beträge der beiden Vektoren verschieden sind, stimmt ganz sicher etwas nicht
(bei mir sind sie mit und ohne (Ver)Drehung identisch Augenzwinkern
alterDackel Auf diesen Beitrag antworten »

Hallo Werner,

Danke für Deine Unterstützung!
Wie Du schon richtig vermutet hast, war es um meine Programmierkünste nicht so weit bestellt.
Hatte einen Denkfehler drin.

Aber selbst nach Korrektur des Denkfehlers, bekomme ich keine identischen Werte für die Beträge der Vektoren.
Einmal sind es 59,99969 und dann sind es 60,00000
Identisch sind die jeweiligen Werte bei double und BigDecimal - bei Festkommazahlen mit long ist die Abweichung größer.

Weiß nicht, ob die Gleichung verdächtig ist, jedenfalls fand ich diese (für alle Punkte X auf dem Kreisbogen):

X = r * cos(alpha) * Ve1 + r * sin(alpha) * Ve2

wobei Ve1 und Ve2 Einheitsvektoren in der Ebene des Kreises sind, die auf einander senkrecht stehen. Die Einheitsvektoren müsste man also vorher aus den Vektoren MP1 und MP2 herleiten.
X wäre jeweils der Vektor vom Kreismittelpunkt zum Randpunkt.

Zumindest habe ich es so verstanden.
riwe Auf diesen Beitrag antworten »

soweit ist das schon richtig,
nimm doch einfach (1,0)^T und (0,1)^T als Basis, damit hast du



und wegen des trigonometrischen Pythagoras sollte das immer einen Betrag von

|x| = r bzw. hier r= 60 ergeben Augenzwinkern
alterDackel Auf diesen Beitrag antworten »

Zitat:
nimm doch einfach (1,0)^T und (0,1)^T als Basis, damit hast du

Hm, weiß nicht, ob ich Dich richtig verstehe.
(1,0) und (0,1) sind 2dimensionale Vektoren?

Falls ja, will ich die ja gerade vermeiden.
Der Punkt ist ja nicht, dass ich möglichst einfach zu einem Ergebnis kommen will, sondern dass ich einen Weg finden will, der allgemein gültig ist (also auch dann, wenn ich nix über die 3 Punkte und deren Lage weiß).

Meine Ausgangslage ist einfach die, dass ich 3 beliebige Punkte im Raum habe und daraus eine Kreisbogen berechnen will. Etwas Schwierigkeiten habe ich noch mit dem Winkel, also heraus zu finden, wann der Winkel der berechnete ist und wann es die Differenz zum Vollkreis ist.
riwe Auf diesen Beitrag antworten »

das ist aber eine ganz andere Aufgabe als am Anfang.
da geht´s eigentlich nur um die Berechnung des Kreisradius.

zum 2. Problem: damit mußt du leben Augenzwinkern
die entsprechende Orientierung mußt du wohl selbst festlegen.
 
 
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »