A vector is defined as having three dimensions as being represented by an ordered collection of three numbers:   (X, Y, Z).

If you imagine a graph with the   x   and   y   axis being at right angles to each other and having a third,   z   axis coming out of the page, then a triplet of numbers,   (X, Y, Z)   would represent a point in the region,   and a vector from the origin to the point.

Given the vectors:

        A = (a1,  a2,  a3) 
        B = (b1,  b2,  b3) 
        C = (c1,  c2,  c3) 

then the following common vector products are defined:

 The dot product       (a scalar quantity)
  A • B = a1b1   +   a2b2   +   a3b3  
 The cross product       (a vector quantity)
  A x B = (a2b3  -   a3b2,     a3b1   -   a1b3,     a1b2   -   a2b1)  
 The scalar triple product       (a scalar quantity)
  A • (B x C) 
 The vector triple product       (a vector quantity)
  A x (B x C) 


Task

Given the three vectors:

        a = ( 3,    4,    5)
        b = ( 4,    3,    5)
        c = (-5,  -12,  -13)

 Create a named function/subroutine/method to compute the dot product of two vectors.
 Create a function to compute the cross product of two vectors.
 Optionally create a function to compute the scalar triple product of three vectors.
 Optionally create a function to compute the vector triple product of three vectors.
 Compute and display: a • b
 Compute and display: a x b
 Compute and display: a • (b x c), the scalar triple product.
 Compute and display: a x (b x c), the vector triple product.


References

   A starting page on Wolfram MathWorld is   Vector Multiplication .
   Wikipedia   dot product. 
   Wikipedia   cross product. 
   Wikipedia   triple product.


Related tasks

   Dot product
   Quaternion type


 
#!/bin/ksh
 
# Vector products
#	# dot product (a scalar quantity) A • B = a1b1 + a2b2 + a3b3  + ...
#	# cross product (a vector quantity) A x B = (a2b3 - a3b2, a3b1 - a1b3, a1b2 - a2b1)
#	# scalar triple product (a scalar quantity) A • (B x C) 
#	# vector triple product (a vector quantity) A x (B x C) 
 
#	# Variables:
#
typeset -a A=(  3    4    5 )
typeset -a B=(  4    3    5 )
typeset -a C=( -5  -12  -13 )
 
#	# Functions:
#
 
#	# Function _dotprod(vec1, vec2) - Return the (scalar) dot product of 2 vectors
#
function _dotprod {
	typeset _vec1 ; nameref _vec1="$1"	# Input vector 1
	typeset _vec2 ; nameref _vec2="$2"	# Input vector 2
	typeset _i ; typeset -si _i
	typeset _dotp ; integer _dotp=0
 
	for ((_i=0; _i<${#_vec1[*]}; _i++)); do
		(( _dotp+=(_vec1[_i] * _vec2[_i]) ))
	done
	echo ${_dotp}
}
 
#	# Function _crossprod(vec1, vec2, vec) - Return the (vector) cross product of 2 vectors
#
function _crossprod {
	typeset _vec1 ; nameref _vec1="$1"	# Input vector 1
	typeset _vec2 ; nameref _vec2="$2"	# Input vector 2
	typeset _vec3 ; nameref _vec3="$3"	# Output vector
 
	_vec3+=( $(( _vec1[1]*_vec2[2] - _vec1[2]*_vec2[1] )) )
	_vec3+=( $(( _vec1[2]*_vec2[0] - _vec1[0]*_vec2[2] )) )
	_vec3+=( $(( _vec1[0]*_vec2[1] - _vec1[1]*_vec2[0] )) )
}
 
#	# Function _scal3prod(vec1, vec2, vec3) - Return the (scalar) scalar triple product of 3 vectors
#
function _scal3prod {
	typeset _vec1 ; nameref _vec1="$1"	# Input vector 1
	typeset _vec2 ; nameref _vec2="$2"	# Input vector 2
	typeset _vec3 ; nameref _vec3="$3"	# Input vector 3
	typeset _vect ; typeset -a _vect	# temp vector
 
	_crossprod _vec2 _vec3 _vect		# (B x C)
	echo $(_dotprod _vec1 _vect)		# A • (B x C)
 
}
 
#	# Function _vect3prod(vec1, vec2, vec3, vec) - Return the (vector) vector triple product of 3 vectors
#
function _vect3prod {
	typeset _vec1 ; nameref _vec1="$1"	# Input vector 1
	typeset _vec2 ; nameref _vec2="$2"	# Input vector 2
	typeset _vec3 ; nameref _vec3="$3"	# Input vector 3
	typeset _vec4 ; nameref _vec4="$4"	# Output vector
	typeset _vect ; typeset -a _vect	# temp vector
 
	_crossprod _vec2 _vec3 _vect		# (B x C)
	_crossprod _vec1 _vect _vec4		# A x (B x C)
}
 
 ######
# main #
 ######
 
print "The dot product A • B = $(_dotprod A B)"
 
typeset -a arr
_crossprod A B arr
print "The cross product A x B = ( ${arr[@]} )"
 
print "The scalar triple product A • (B x C) = $(_scal3prod A B C)"
 
typeset -m crossprod=arr ; typeset -a arr
_vect3prod A B C arr
print "The vector triple product A x (B x C) = ( ${arr[@]} )"
 