Vector Sums

by
K. D.  Stroyan
University of Iowa

copyright 1997 by Academic Press, Inc. - All rights reserved.

Special Mathematica Functions used in this NoteBook

We told you not to look.  This horrible stuff sets various defaults and defines some functions needed to draw the geometric side of the lexicon.  Ignore the details here and go on to the lesson.

Off[General::spell];
Off[General::spell1];
Off[ParametricPlot3D::ppcom]
Needs["Graphics`Colors`"]

SetOptions[Graphics,Axes->False,AxesOrigin->{0,0},AspectRatio->Automatic];
SetOptions[Graphics3D,ViewPoint->{5,2,1},Boxed->False,AspectRatio->Automatic];
SetOptions[ParametricPlot3D,ViewPoint->{5,2,1},AspectRatio->Automatic];
SetOptions[Plot3D,ViewPoint->{5,2,1},AspectRatio->Automatic];
SetOptions[ParametricPlot,AspectRatio->Automatic];
SetOptions[Plot,AspectRatio->Automatic];

colorQ[a_]:=(Head[a]===RGBColor);
grayQ[a_]:=(Head[a]===GrayLevel);
thickQ[a_]:=(Head[a]===Thickness);
absthickQ[a_]:=(Head[a]===AbsoluteThickness);
notruleQ[u_] := !(Head[u]===Rule);
ruleQ[u_] := (Head[u]===Rule);

Norm::usage = "Norm[expr] returns the Euclidean length of the
		vector, 'expr'.";

Norm[a_?VectorQ] := Sqrt[a.a];

Angle[a_?VectorQ,b_?VectorQ] := ArcCos[(a.b)/(Norm[a] Norm[b])]

Proj[a_?VectorQ,b_?VectorQ] := ((a.b)/(b.b))b

tol = .5*10^-6;

OrthUp[a_?VectorQ] :=
	Module[{b,c,d,f},
		d = N[a/Norm[a]];
		If[Chop[d[[3]]^2 - 1,tol] == 0, b={1,0,0} ,
		b = {0,0,1} - d[[3]] d; b = b/Norm[b];];
	Return[b]];
	
OrthSet[a_?VectorQ] :=
	Module[{b,c,d},
		d = N[a/Norm[a]];
		If[Chop[d[[1]],tol]==0,b={1,0,0},
			 If[Chop[d[[2]],tol]==0,b={0,1,0},
			  b={-d[[2]],d[[1]],0}]];
			b=b/Norm[b];c = Cross[d,b];
	Return[{b,c/Norm[c],d}]];

				
Rotate[a_?VectorQ,theta_] :=
	Module[{u,v,r},
		u = OrthSet[a];
		v = Transpose[u];
		r = N[{{Cos[theta],-Sin[theta],0},{Sin[theta],Cos[theta],0},{0,0,1}}];
	Return[v.r.u]];

Vector2D[tail_,tip_,opts___]:=
	Module[{ntail,ntip,sopts,Punit,up,arrow},
	ntail = N[tail];
	ntip = N[tip];
	
	sopts = Join[Select[{opts},colorQ],Select[{opts},
				thickQ],Select[{opts},absthickQ],Select[{opts},grayQ]];

If[Chop[ntail.ntail+ntip.ntip,tol] == 0,
			(*too small to plot or not number*)
			Return[Graphics[Point[{0,0}]]];
	,						
If[Chop[(ntip-ntail).(ntip-ntail),tol] == 0,
		Return[Graphics[{Join[sopts,{Line[{ntail,ntip}]}]}]];
	,
	Punit = (.075 Norm[ntip-ntail]/Norm[ntip-ntail]) (ntip-ntail) ;
	up = 0.15 {-Punit[[2]],Punit[[1]]};
	arrow = Line[{ntail,ntip,ntip-Punit+up,ntip,ntip-Punit-up}];
	]];
Return[Graphics[{Join[{AbsoluteThickness[2]},Join[sopts,{arrow}]]}]];
];

Vector3D[tail_,tip_,opts___]:=
	Module[{ntail,ntip,sopts,Punit,up,u2,u3,u4,rotmat,arrow},
	ntail = N[tail];
	ntip = N[tip];
	
	sopts = Join[Select[{opts},colorQ],Select[{opts},
				thickQ],Select[{opts},absthickQ],Select[{opts},grayQ]];

If[Chop[ntail.ntail+ntip.ntip,tol] == 0,
			(*too small to plot or not number*)
			Return[Graphics3D[Point[{0,0,0}]]];					
	,		
If[Chop[(ntip-ntail).(ntip-ntail),tol] == 0,
		Return[Graphics3D[{Join[sopts,{Line[{ntail,ntip}]}]}]];
	,
	Punit = (ntip-ntail);
	rotmat = Rotate[Punit,N[Pi/2]];
	up = OrthUp[Punit];
	Punit = .075 Punit;
	up = .15 Norm[Punit] up;
	u2 = rotmat.up;
	u3 = rotmat.u2;
	u4 = rotmat.u3;
	arrow = Line[{ntail,ntip,
				ntip - Punit + up,ntip,
				ntip - Punit + u2,ntip,
				ntip - Punit + u3,ntip,
				ntip - Punit + u4}];
	]];
Return[Graphics3D[{Join[{AbsoluteThickness[2]},Join[sopts,{arrow}]]}]];
];

aRCtAN[y_,x_] := Module[{v},
	If[ Chop[N[x],tol] == 0 ,If[ N[y] < 0, v = -N[Pi/2], v = N[Pi/2]],
		v = N[ArcTan[y/x]];
		If[ x < 0 && y < 0, v = N[Pi -  v],v]];
	Return[v]];

Arc2D[X_,Y_,opts___] := Graphics[{opts,
		Disk[{0,0},1,{Min[
							aRCtAN[
						N[X[[2]]],N[X[[1]]]
								]
							,
							aRCtAN[
							N[Y[[2]]],N[Y[[1]]]
								]
						]
						,
					Max[
							aRCtAN[
						N[X[[2]]],N[X[[1]]]
								]
							,
							aRCtAN[
							N[Y[[2]]],N[Y[[1]]]
								]
						]}
				]}
				];
Arc3D[X_,Y_] := 
	Module[{t,U,V},
		U[V_]:= N[(1/Sqrt[V.V]) V];
		Return[Graphics3D[
		Polygon[Append[Table[U[t X + (1-t) Y],{t,0,1,0.1}],{0,0,0}]]
				]
		]
	];

(*Zero Arrow causes trouble. Put in Vector?*)

Vector[tail_,tip_,opts___]:=
	If[Length[N[tail]]==2,Return[Vector2D[tail,tip,opts]],
		Return[Vector3D[tail,tip,opts]]];
		
Arrow[vec_,opts___]:= 
	Module[{a,b},
				If[Length[N[vec]]==2,
				a=ToExpression["Tail"]/.Select[{opts},ruleQ]/.
					{ToExpression["Tail"]->{0,0}};
				Return[Vector2D[a,a+vec,opts]],
				a=ToExpression["Tail"]/.Select[{opts},ruleQ]/.
					{ToExpression["Tail"]->{0,0,0}};
				Return[Vector3D[a,a+vec,opts]]]
				];

Frame2D[delta_] := 
      Graphics[{
            {Green,Line[{{-delta/4,0},{delta,0}}]},
                    Text["x",{1.01 delta,0}],
            {Green,Line[{{0,-delta/4},{0,delta}}]},
                    Text["y",{0, 1.01 delta}]}];

Frame3D[delta_] := 
      Graphics3D[{
            {Green,Line[{{-delta/4,0,0},{delta,0,0}}]},
                    Text["x",{1.01 delta,0,0}],
            {Green,Line[{{0,-delta/4,0},{0,delta,0}}]},
                    Text["y",{0, 1.01 delta,0}],
            {Green,Line[{{0,0,-delta/4},{0,0,delta}}]},
                    Text["z",{0,0,1.01 delta}]}];

View2D[stuff_] := Show[stuff,Frame2D[1]];
View3D[stuff_] := Show[stuff,Frame3D[1]];

Notebook Overview

Vector sum is given algebraiclaly as follows:

X = {x1,x2} & Y = {y1,y2} =>  X + Y = {x1+y1 , x2+y2}

X = {x1,x2,x3} & Y = {y1,y2,y3} =>  X + Y = {x1+y1 , x2+y2, x3+y3}

For example, {1,-2,4} + {5, -3, -7} = {(1+5) , (-2 -3) , (4 - 7)} = {6 , -5, -3}.

The geometrical interpretation is this.  If  Z = X + Y, then  Z is the vector from  0  to the tip of  Y  when it is drawn with its tail at the tip of  X.  This is shown below.

References to the Text

Section 15.3

Text section 15.3 explains why adding like components in algebra is the "tips-to-tails" geometric law of vector addition.

Vector Sum: Tips - to - tails

The next computation uses the Arrow[.] and View[.] commands (from the Initialization cell) to show the geometric meaning of adding like components of a vector.

<Enter > and see for yourself.

2-D

X = {3, 4}; Y = {-5, 2}; Z = X + Y; Print[X, " + ", Y, " = ", Z]; View2D[{Arrow[X, Blue], Graphics[Text["X",  .9 X -  .1 Y]], 
        Arrow[Y, Blue], Graphics[Text["Y",  .9 Y -  .1 X]], 
        Arrow[Y, Tail -> X, Brown], 
        Graphics[Text["Y with tail at X",  .7 Y + 1.2 X]], 
        Arrow[Z, Blue], Graphics[Text["Z", 1.1 Z]]}]; View2D[{Arrow[X, Blue], Graphics[Text["X",  .9 X -  .1 Y]], 
        Arrow[X, Tail -> Y, Red], 
        Graphics[Text["X with tail at Y",  .7 X + Y]], Arrow[Y, Blue], 
        Graphics[Text["Y",  .9 Y -  .1 X]], Arrow[Z, Blue], 
        Graphics[Text["Z", 1.1 Z]]}]; View2D[{Arrow[X, Blue], Graphics[Text["X", 1.1 X]], 
        Arrow[Y, Blue], Graphics[Text["Y", 1.1 Y]], 
        Graphics[{Yellow, Polygon[{{0, 0}, X, X + Y, Y}]}], Arrow[Z, Blue], 
        Graphics[Text["Z", 1.1 Z]]}];

Print["Geometric length of X =", Norm[X]]; Print["Geometric length of Y =", Norm[Y]]; Print["Geometric length of Z =", Norm[Z]];

3-D

X = {3, 5, 4}; Y = {1, -2, 1}; Z = X + Y; Print[X, " + ", Y, " = ", Z]; View3D[{Arrow[X, Blue], Graphics3D[Text["X",  .9 X -  .1 Y]], 
        Arrow[Y, Blue], Graphics3D[Text["Y", 1.1 Y]], 
        Arrow[Y, Tail -> X, Brick], 
        Graphics3D[Text["Y with tail at X",  .4 Y + 1.1 X]], 
        Arrow[Z, Blue]}]; View3D[{Arrow[X, Blue], Graphics3D[Text["X", 1.1 X]], 
        Arrow[X, Tail -> Y, Carrot], 
        Graphics3D[Text["X with tail at Y",  .4 X + 1.1 Y]], 
        Arrow[Y, Blue], Graphics3D[Text["Y", 1.1 Y]], Arrow[Z, Blue]}]; 
    View3D[{Arrow[X, Blue], Graphics3D[Text["X", 1.1 X]], 
        Arrow[Y, Blue], Graphics3D[Text["Y", 1.1 Y]], Arrow[Z, Blue], 
        Graphics3D[Text["Z", 1.1 Z]], 
        Graphics3D[Polygon[{{0, 0, 0}, X, X + Y, Y}]]}];

Print["Geometric length of X =", Norm[X]]; Print["Geometric length of Y =", Norm[Y]]; Print["Geometric length of Z =", Norm[Z]];

Exercises

Exercise 15.3.1

Compute X + Y geometrically and algebraically for

X = {3,5} & Y = {2,1}

X = {-3,4} & Y = {-2,-5}

X = {-3,-4} & Y = {4,-2}

X = {5,3,4} & Y = {1,6,2}

X = {4,6,2} & Y = {-5,2,3}

X = {-2,-4, 2} & Y = {2, 6, 3}

Which pairs of vectors satisfy the norm identity:

| X + Y | = | X | + | Y | ?

When will this be true?  (Give a geometric and algebraic condition.)