Re: Generating Two Unit Orthogonal Vectors (correction)

*To*: mathgroup at smc.vnet.net*Subject*: [mg36428] Re: Generating Two Unit Orthogonal Vectors (correction)*From*: "Ersek, Ted R" <ErsekTR at navair.navy.mil>*Date*: Fri, 6 Sep 2002 03:17:01 -0400 (EDT)*Sender*: owner-wri-mathgroup at wolfram.com

OrthogonalUnitVectors that I sent a few minutes ago doesn't do what I thought it would. After making either definition below I get the following: In[2]:= s1=OrthogonalUnitVectors[{1,0,1/2,1,0},{0,1,-1,1/2,2}] Out[2]= {{0, -2/Sqrt[5], 0, 0, 1/Sqrt[5]}, {-2/3, -1/3, 0, 2/3, 0}, {-1/3, 2/3, 2/3, 0, 0}} The dot products below aren't zero, so the vectors aren't orthogonal. What went wrong? In[3]:= Part[s1,1].Part[s1,2] Out[3]= 2/(3*Sqrt[5]) In[4]:= Part[s1,1].Part[s1,3] Out[3]= -4/(3*Sqrt[5]) -------------- > Hugh Goyder and David Park gave a most elegant function to find two > vectors that are orthogonal to one vector in 3D. The key to coming up > with the elegant solution is an understanding of Mathematica's NullSpace > function. We can easily make the version from Hugh and David much more > general with the version below. > ------------- > OrthogonalUnitVectors[vect__?VectorQ]:= > #/Sqrt[#.#]&/@NullSpace[{vect}] > > ------------- > The version above will give a set of unit orthogonal vectors if given any > number of vectors in any dimension. > So besides giving it a 3D vector we can give it the following: > OrthogonalUnitVectors[{2,1,0,-1,1}] > or > OrthogonalUnitVectors[{0,1,0,1/2,1},{1,0,-1,1/2}] > > ------------ > But the short version above isn't very robust. > (1) Clear[x,y,z];NullSpace[{{x,y,z}}] > returns two vectors orthogonal to {x,y,z}, but the two vectors > NullSpace returns aren't orthogonal to each other. > So (OrthogonalUnitVectors) should only work with numeric vectors. > > (2) We should ensure all the vectors have the same dimension and length > >1. > > I give a less concise version below that corrects these problems. > ------------ > > OrthogonalUnitVectors[vect__?(VectorQ[#,NumericQ]&)]/; > (SameQ@@Length/@{vect})&&(Length[First[{vect}]]>1):= > #/Sqrt[#.#]&/@NullSpace[{vect}] > > -------------- > Regards, > Ted Ersek > Get Mathematica tips, tricks from > http://www.verbeia.com/mathematica/tips/Tricks.html >