Senkrechter Vektor

Hallo,

ich habe ein Problem mit einem Vektor welches mir eigentlich zu einfach erscheint um es hier zu posten. Trotzdem komme ich nicht auf die Lösung und versuchs dennoch mal auch auf die Gefahr hin mir dumm vorzukommen wenn jemand mir die Lösung sagt:

Ich habe irgendeinen (Einheis-)Vektor und brauche nun einen Algorithmus der mir einen Vektor zurückgibt der senkrecht auf dem Ersten steht.

  • Wie schon geschrieben…kann eigentlich nicht schwer sein. Aber trotzdem komme ich im allgemeinen Fall nicht auf die Lösung.

Wer kann mir helfen?

Danke im Voraus.

Ich habe irgendeinen (Einheis-)Vektor und brauche nun einen
Algorithmus der mir einen Vektor zurückgibt der senkrecht auf
dem Ersten steht.

Das Skalarprodukt senkrechter Vektoren ist Null.

Erstmal danke für die Antwort, aber:

Das Skalarprodukt senkrechter Vektoren ist Null.

Das weiß ich auch, es hilft mir nur nicht weiter. Das ist geeignet um zu überprüfen ob zwei Vektoren senkrecht aufeinander stehen, wenn aber (x,y,z) der vorhandene Vektor ist und (i,j,k) der zu findende dann sieht die Formel so aus:

ix + jy + kz = 0

Das kann ich auflösen und schauen obs hinkommt und auch eine dritte Komponente bestimmen. Mehr aber nicht.

Also ganz so einfach ist die Lösung nun auch wieder nicht.

Doch, die Lösung ist so einfach. Du mußt nur zwei der drei Komponenten des gesuchten Vektor vorgeben und dann nach der dritten umstellen:

z = (jy+kz)/i (für i0)

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Komische Darstellung
Seltsam, mir wurde nur das hier:
Ich habe irgendeinen (Einheis-)Vektor und brauche nun einen
Algorithmus der mir einen Vektor zurückgibt der senkrecht auf
dem Ersten steht.

Das Skalarprodukt senkrechter Vektoren ist Null.

als Antwort angezeigt…daher auch meine seltsame Antwort. Als Mail hab ich dann auch den Rest bekommen:

Mir ist bewußt, dass es unendlich viele senkrechte Vektoren gibt, ich brauche aber nur irgendeinen von denen.

Martin

Hallo Martin,

Das Skalarprodukt senkrechter Vektoren ist Null.

Das weiß ich auch, es hilft mir nur nicht weiter.

Doch :smile:

wenn aber (x,y,z) der vorhandene Vektor
ist und (i,j,k) der zu findende …

dann setze

i = 0
j = z
k = -y

ix + jy + kz = 0\*x + z\*y + (-y)\*z = 0 + yz - yz = 0

Gruß, Ralf

aufm Schlauch
Danke.

Meine Güte, ich hab mir das mit dem Skalarprodukt vorher auch schon angesehen aber irgendwie hat das nicht hingehauen…scheinbar habe ich bei der Implementierung irgendeinen Fehler gemacht und dachte es liegt an der Rechnung an sich.
Heute werd ich mich wohl nicht mehr damit beschäftigen sondern Feierabend machen aber wenn ich diesen Programmteil fertig geschrieben habe dann stelle ich ihn hier für Interessierte rein.

martin

vom Schlauch stups
Damit du mit klaren Kopf in den Feierabend gehen kannst:

vorhandener Vektor: (x,y,z)
dazu senkrechter Vektor: (1,1,-(x+y)/z))

Viel Spaß beim Saufen!

Gruß
Oliver

für z ungleich null.
Prost

Mir ist bewußt, dass es unendlich viele senkrechte Vektoren
gibt, ich brauche aber nur irgendeinen von denen.

???
Na wenn Du weißt wie die aussehen, dann such Dir doch einfach einen aus.
Vielleicht hilft ein Beispiel, damit die Sache klar wird?

Der Vektor (1,2,3) aus dem Standartraum R^3.
Dazu senkrecht sind alle Vektoren (a,b,c) mit
1a + 2b + 3c = 0 , daher mit (1,2,3)*(a,b,c) = 0
Das sind unendlich viele.
Aber Du brauchst ja nur einen, sagst Du.
Also suchen wir uns einen aus. Sei a=1 und b=1. Wenn wir dann noch c=-1 wählen erfüllt das Tripel (1,1,-1) unsere Bedinung.

Oder soll der eine senkrechte Vektor auch noch irgendwas anderes erfüllen?

Die Frage nach dem Algorithmus lässt sich vielleicht nur mit einer Fallunterscheidung lösen.
Wenn z nicht Null ist, dann erfüllt der Vektor
(1,1, -(x+y)/z ) die Bedingung, wie Oliver schon gepostet hat.
Ansonsten (wenn z=0), dann Tut es der Vektor (0,0,1).

Natürlich kannst Du auch immer den Nullvektor nehmen, der steht sowieso auf allem senkrecht. :wink:

Der angebotene Algorithmus lässt sich leicht auf die anderen Standarträume übertragen. Also auf den R^2 oder den R^4.

Beste Grüße,
Zwergenbrot

Gram-Schmidt
Hi,

Hallo,

das Verfahren dazu ist das „Gram-Schmidt’sche Orthomormierungsverfahren“. http://mathworld.wolfram.com/Gram-SchmidtOrthonormal…

Ich habe irgendeinen (Einheis-)Vektor und brauche nun einen
Algorithmus der mir einen Vektor zurückgibt der senkrecht auf
dem Ersten steht.

Dann nimmst Du einen beliebigen anderen Vektor (der nicht linear abhängig vom ersten Vektor ist) et voila: Du hast die Orthonormalen Basisvektoren des Subraums.

Die anderen Vorschläge, die hier in der Diskussion aufgetaucht sind, funktionieren im Allgemeinen (unendlich dimensionale VR) nicht.
Die Integralgleichung kann analytisch unlösbar sein.

Ciao R.

Zusatz
Gram-Schmidt ist natürlich auch für endlichdimensionale Vektorräume das Standardverfahren für Dein Problem: Du willst eine 2*m matrix ortho(norm)ieren.
http://www.cs.utexas.edu/users/cline/CS383C/Gram-Sch…

Salut,

das Verfahren dazu ist das „Gram-Schmidt’sche
Orthomormierungsverfahren“.
http://mathworld.wolfram.com/Gram-SchmidtOrthonormal…

Äh nein nicht ganz, obwohl man mit gewissen zusätzlichen Konstruktionen auch damit zum Ziel kommt.
Das Gram-Schmidt’sche Orthonomierungsverfahren scheint mir auf den ersten Blick ein Verfahren zu sein, um aus einer allgemeinen Basis eine Orthonormal-Basis zu gewinnen. (Ich kannte bisher nur das Erhard-Schmidt’sche Verfahren und hoffe jetzt einfach mal, dass die beiden ich das Gram-… jetzt nicht in die falsche Schublade schiebe).

Natürlich könnte er seinen Vektor zu einer Basis ergänzen, diese dann orthonomieren und dann einen Vektor auswählen (der nicht der ursprüngliche ist).
Er hat aber nur einen Vektor gegeben, zu dem er ein beliebiges Element des Orthogonalraumes sucht. Da wirkt ein solches Orhogonalisierungsverfahren etwas übertrieben, meine ich.

Die anderen Vorschläge, die hier in der Diskussion aufgetaucht
sind, funktionieren im Allgemeinen (unendlich dimensionale VR)
nicht.
Die Integralgleichung kann analytisch unlösbar sein.

Die bisher angegebenen Algorythmen funktionieren natürlich nur unter Einschränkungen, da hast Du völlig recht. Schon ein anderes Skalarprodukt wirft die These, man müsste nur (1,1,-(x+y)/z ) nehmen, über den Haufen. Zumal das auch keine Lösung ist, wenn der Raum eine von drei verschiedene Dimension besitzt.
Und natürlich sind zwar alle endlich dim. VRs zu je einem Standartraum isomorph aber den Isomorphismus muss man halt auch erstmal in den Algorythmus bringen. Und von den unendlichen VRs hat dann noch niemand was gesagt.
Alles richtig. (zumindest glaub ich das)

Aber die Frage klang nicht so, als würde dem Fragesteller der Erhalt irgendwelcher Unterräume oder ähnliches besonders am Herzen liegen.
Daher halte ich, wie gesagt, das von Dir angegebene Gram-Schmidt’sche Verfahren für: „Mit Kanonen auf Spatzen schießen.“

Nichts desto trotz, freue ich mich jedoch über den Hinweis und den Link und werde mir das noch genauer ansehen. Da kann man/ich bestimmt was lernen.

Mit den aller besten Grüßen,
Zwergenbrot

Hi,

Das Gram-Schmidt’sche Orthonomierungsverfahren scheint mir auf
den ersten Blick ein Verfahren zu sein, um aus einer
allgemeinen Basis eine Orthonormal-Basis zu gewinnen.

Genau.
Nichts anderes will er ja tun.

Er hat aber nur einen Vektor gegeben, zu dem er ein beliebiges
Element des Orthogonalraumes sucht. Da wirkt ein solches
Orhogonalisierungsverfahren etwas übertrieben, meine ich.

Mag sein, dass man in trivialen und einfachen Fällen durch Raten schneller zum Ziel kommt. Programmieren kann man „geschicktes Raten“ allerdings nur für Spezialfälle.

Aber die Frage klang nicht so, als würde dem Fragesteller der
Erhalt irgendwelcher Unterräume oder ähnliches besonders am
Herzen liegen.

Sollte ihm als LRT-Student aber :wink:.

Daher halte ich, wie gesagt, das von Dir angegebene
Gram-Schmidt’sche Verfahren für: „Mit Kanonen auf Spatzen
schießen.“

Dafür ist es in jedem FE-Programm implementiert, beispielsweise bei der Extraktion der Eigenwerte und Eingenvektoren, QR-Zerlegungen etc.

Ciao R.

Hallo Baer,

Genau.
Nichts anderes will er ja tun.

Na nur fast. Er hat ja keine Basis, sondern nur einen einzelnen Vektor. (Der ist schon Basis von nem Unterraum, aber das hilft ja nicht weiter)
Also muss er vorher noch ne Basis draus machen. Zumindest einen linear unabhängigen Vektor muss er also noch bauen. Richtig?

Mag sein, dass man in trivialen und einfachen Fällen durch
Raten schneller zum Ziel kommt. Programmieren kann man
„geschicktes Raten“ allerdings nur für Spezialfälle.

Richtig. Fand die Fallunterscheidung auch nicht so schön.

Sollte ihm als LRT-Student aber :wink:.

Nicht nur als LRT-Student. Das sollte eigentlich jedem Menschen wichtig sein. :wink:

Dafür ist es in jedem FE-Programm implementiert,
beispielsweise bei der Extraktion der Eigenwerte und
Eingenvektoren, QR-Zerlegungen etc.

Ein guter Punkt. Den hatte ich nicht bedacht.
Fehlt nur noch die Sache mit dem l.u. Vektor, damit er was zum orthonomieren hat. Aber daran sollte es wahrscheinlich nicht scheitern.

Beste Grüße,
Zwergenbrot

Algorithmus in c++
Hallo nochmals,

es kam mir vor allem darauf an, einen einfachen Algorithmus zu finden der einen sonderfall in meinem Programm abdeckt. Das Gram-Schmidt-Verfahren schien mir nicht geeignet da es bei Satellitensoftware sehr darauf ankommt mit möglichst wenig Rechenaufwand ein robustes Programm auszuführen.
Hier, wie schon angekündigt mein Algorithmus welcher im Prinzip Achse und Winkel für die Vektorrotation/Koordinatentransformation für den Fall ausgibt, dass die Vektoren identisch bzw. genau entgegengesetzt sind.

Gruß an alle und danke für die Mühen.

martin

//Abfrage und Absicherungen für Fehler/Sonderfälle

if(normSSO==0 || normSECI==0) return 0;

//Sicherstellung, dass nicht ein Vektor gleich dem Zweiten ist
if(SSO[0]==SECI[0] && SSO[1]==SECI[1] && SSO[2]==SECI[2] )
{
printf("!!!gleiche Vektoren!!!\n\n");
Rot[0]=1; Rot[1]=1; Rot[2]=1; alpha=0;
return 1;

}
// Ein Vektor ist entgegengesetzt des Zweiten
if(SSO[0]==-SECI[0]&&SSO[1]==-SECI[1]&&SSO[2]==-SECI[2])
{
printf("!!!Gegensätzliche Vektoren!!!\n\n");
if (SSO[2]!=0)
{
Rot[0]=1; Rot[1]=1;
Rot[2] = -(SSO[0]+SSO[1]) / SSO[2];
alpha = pi;
printf(„Rotationsachse:\n“);
printf("\t\t%7.4f\n",Rot[0]);
printf("\tRot=\t%7.4f\t\talpha:\t%7.4f°\n",
Rot[1],alpha*180/pi);
printf("\t\t%7.4f\n\n",Rot[2]);

}
else
{
if(SSO[1]!=0)
{
Rot[0] = 1; Rot[2] = 1;
Rot[1] = (SSO[0]+SSO[2]) / SSO[1];
alpha = pi;
}
else
{
Rot[2] = 1; Rot[1] = 1;
Rot[0] = (SSO[2]+SSO[1]) / SSO[0];
alpha = pi;
}
}
printf(„Rotationsachse:\n“);
printf("\t\t%7.4f\n",Rot[0]);
printf("\tRot=\t%7.4f\t\talpha:\t%7.4f°\n",
Rot[1],alpha*180/pi);
printf("\t\t%7.4f\n\n",Rot[2]);
return 1;
}