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
>