You are on page 1of 18

12.

3 Curvature, torsion and


the TNB frame
Acknowledgments: Material from a Georgia Tech worksheet by Jim Herod, School of
Mathematics, herod@math.gatech.edu, is incorporated into the section on curvature, torsion and
the TNB frame.
Definition [Curvature] If T is the unit tangent vector of a smooth curve, the
dT
curvature function of the curve is κ = .
ds

Definition [Principal unit normal vector] At a point where κ ≠ 0, the principal unit
1 dT
normal vector for a curve in the plane is N= .
κ ds

Definition [The binormal vector] The binormal vector of a smooth curve is B = T


x N.

Definition [Torsion] Let B = T x N. The torsion function of a smooth curve is


dB
τ=−
ds
.N. Torsion measures how the curve twists.
Definition [The tangential and normal components of acceleration]
2
d2 s d  ds 
a = aT T + aN N, where aT = 2 = |v|, and aN = κ  = κ v 2 are the
dt dt  dt 
tangential and normal scalar components of acceleration.

2
aN = a 2 − aT .

A vector formula for curvature


vxa
κ= .
v3

Formulas for curves in space


v
Unit tangent vector: T = .
v
dT dT
Principal unit normal vector: N = /
dt dt
Binormal vector: B = T x N
dT vxa
Curvature: κ = = .
ds v3
  x' y' z'  
dB   ( −2 )
Torsion: τ = −
ds
.
N = det  x" y"

z"   v x a

 x"' y"' z"' 

Tangential and normal scalar components of acceleration:


a = a T T + aN N
d
aT = |v|
dt
2
aN = κ v 2 = a 2 − aT
>

The velocity vector and unit tangent


Perhaps as much as any other place, the computations for the tangent and the normal to a
curve are best accomplished with a computer. The calculus to obtain these geometric notions
for even simple functions can be formidable. Because these ideas arise so prominently in the
task of resolving both motion and the forces causing motion, it is well that the ideas be
understood at the beginnings of a study of multidimensional calculus. We will give
computational tools and illustrate the ideas with examples.
Contrast the graphs of R1(t) = [ t, f( t ) ] and R2(t) = [ t2, f( t2 ) ]. The graphs have exactly the
same appearance. A unit tangent for R1 or R2 should be the same, even though speed along the
two graphs, as parameterized, is different. While the tangent vectors for the two should have
the same directions, you should expect the tangent vector for the graphs to have different
lengths.
Below, we draw two graphs for comparison with their tangent vectors. The point will be
that while the two graphs have the same appearance, they sweep out the shapes at different
rates and draw a particular section in different time spans.
> plot({[t,sin(t),t=0..2*Pi],[t^2,sin(t^2),t=0..(2*Pi)^(1/2)]})
;
Look at the animation below to compare the speed of the two functions.
> restart:with(plots):
h:=(t,u)->piecewise(u<t,sin(u));
Cc:=animate({h(t^2,u)},u=0..17*Pi,t=0..17*Pi,frames=100,color
=green,numpoints=400):
Dd:=animate({h(t,u)},u=0..17*Pi,t=0..17*Pi,frames=100,numpoin
ts=400,thickness=3,color=red):
display({Cc,Dd},axes=normal,view=[0..50,-1..1]);
Warning, the name changecoords has been redefined

h := ( t, u ) → piecewise( u < t, sin( u ) )


Below, we compare the derivatives of R1 and R2. We expect these two to have the same
direction, but different lengths.
> restart:with(linalg):
Warning, the protected names norm and trace have been redefined and
unprotected

> x:=t->t; y:=t->sin(t);


R1:=t->vector([x(t),y(t)]);
x := t → t
y := sin
R1 := t → [ x( t ), y( t ) ]
We compute R1 prime -- the tangent to the graph of R1.
> assume(t,real);
> R1p:=t->map(diff,R1(t),t);
R1p(t);
sqrt(dotprod(R1p(t),R1p(t)));
R1p := t → map( diff, R1( t ), t )
[ 1, cos( t~ ) ]
1 + cos( t~ )2
Here is the computation for R2.
> R2:=t->vector([x(t^2),y(t^2)]);
R2 := t → [ x( t2 ), y( t2 ) ]
> R2p:=t->map(diff,R2(t),t);
R2p(t);
sqrt(dotprod(R2p(t),R2p(t)));
R2p := t → map( diff, R2( t ), t )
[ 2 t~, 2 cos( t~2 ) t~ ]
2
2 t~2 + cos( t~2 ) t~2

Note that the derivatives -- the tangent vectors -- for R1 and for R2 are different. they have the
same directions, but different lengths.
> simplify(%);
2
2 1 + cos( t~2 ) t~
The graph below shows the curves and the tangent vectors (velocity vectors), R1'(t) and R2'(t).
The longer tangent vector is the tangent for R2.
> with(plots):with(plottools):
Warning, the name changecoords has been redefined

Warning, the name arrow has been redefined

> s1 :=
plot({[t,sin(t),t=0..16*Pi],[t^2,sin(t^2),t=0..(16*Pi)^(1/2)]
}):
A:=plots[display](seq(PLOT(arrow(R2(s/20),subs(t=s/20,evalm(R
2p(t))), .1, .3, .1, color=green)), s=0..200),
insequence=true):

> B:=plots[display](seq(PLOT(arrow(R1(s/20),subs(t=s/20,evalm(R
1p(t))), .1, .3, .1, color=pink)), s=0..200),
insequence=true):
display({A,B,s1},axes=normal,view=[0..50,-10..10]);
The Unit Tangent Vector T

We identity |R '(t)| as speed and T(t) = R'(t)/ | R '(t) | as the unit tangent vector.


R( t )
∂ ∂t
Definition: Speed(t) = R( t ) and T(t) = .
∂t speed( t )

For a three dimensional curve,

R(t) = [x(t), y(t), z(t)],

2 2 2
∂  ∂  ∂ 
speed(t) =  x( t )  +  y( t )  +  z( t )  .
 ∂t   ∂t   ∂t 

and
T(t) = [x '(t), y '(t), z '(t)] / speed(t).
Example:
> x:=t->cos(t); y:=t->sin(t); z:=t->t;
R3:=t->vector([x(t),y(t),z(t)]);
assume(t,real);
x := cos
y := sin
z := t → t
R3 := t → [ x( t ), y( t ), z( t ) ]
> R3p:=t->map(diff,R3(t),t);
R3p(t);
speed:=sqrt(dotprod(R3p(t),R3p(t)));
T:=t->R3p(t)/speed;
simplify(evalm(T(t)));
R3p := t → map( diff, R3( t ), t )
[ −sin( t~ ), cos( t~ ), 1 ]
speed := 1 + sin( t~ )2 + cos( t~ )2
R3p( t )
T := t →
speed
 1 1 1 
 − 2 sin( t~ ), 2 cos( t~ ), 2 
 2 2 2 
> evalm(%);
 1 1 1 
 − 2 sin( t~ ), 2 cos( t~ ), 2 
 2 2 2 
Of course, this velocity vector R '(t) points in the direction of the tangent vector, T(t). R ' is a
multiple of T:

(*) R ' (t) = speed(t) * T(t).

THE NORMAL VECTOR

In thinking about how to define the unit normal vector, we ask what properties it should
have? Here are three:
(1) The normal vector should be perpendicular to the tangent vector.
(2) The unit normal vector should have length one.
(3) The normal vector should lie in the plane of R ' and R ' '.

Toward getting such a vector, consider T '. This vector is perpendicular to the unit tangent for

< T , T > = 1,
and
< T ', T > + < T , T ' > = 0.

(Prove this.)
Thus, T ' meets Condition 1. However T ' does not meet condition (2). Thus, we define the unit
normal

(**) N(t) = T '(t) / | T '(t) |.

This N meets Conditions (1) and (2). What about Condition (3)? Recall (*). Take the derivative
of both sides:

(***) R ' '(t) = speed '(t) T(t) + speed(t) T '(t).

Define curvature, κ to be the number valued function

κ = |T '(t)|/ speed(t).

From (**), T '(t) = | T '(t) | N


= κ speed(t) N(t).

Substitute this into (***) and we have

R ' '(t) = speed '(t) T(t) + speed2 κ N.

Thus, the unit normal as defined above meets the Conditions (1), (2), and (3).

Computational summary:

R(t) is the curve,

speed = | R '(t) |.


R( t )
∂t
Unit Tangent = T(t) = .
speed( t )

T( t )
∂t
Unit Normal = .

T( t )
∂t


T( t )
∂t
curvature = κ = = | R ' x R ' '| / speed3.
speed( t )

It seems appropriate to work some problems.

Illustrations

Find the unit tangent, the unit normal, and curvature for each of the following.

Example 1. R(t) = [ 3 cos(t), 3 sin(t), 0]

> restart:
> with(linalg):assume(t,real);
Warning, the protected names norm and trace have been redefined and
unprotected

Define
> x:=t->3*cos(t); y:=t->3*sin(t); z:=t->0;
R:=t->vector([x(t),y(t),z(t)]);
x := t → 3 cos( t )
y := t → 3 sin( t )
z := 0
R := t → [ x( t ), y( t ), z( t ) ]
> Rp:=t->map(diff,R(t),t);
Rp(t);
Rp := t → map( diff, R( t ), t )
[ −3 sin( t~ ), 3 cos( t~ ), 0 ]
> sqrt(dotprod(Rp(t),Rp(t)));
simplify(%);
>
3 sin( t~ )2 + cos( t~ )2
3
> speed:=unapply(%,t);
speed := 3
The Unit Tangent
> unitT:=t->evalm(Rp(t)/speed(t));
unitT(t);
 Rp( t ) 
unitT := t → evalm 
 speed( t ) 
[ −sin( t~ ), cos( t~ ), 0 ]
> Tp:=t->map(diff,unitT(t),t);
map(simplify,Tp(t));
Tp := t → map( diff, unitT( t ), t )
[ −cos( t~ ), −sin( t~ ), 0 ]
The Unit Normal
> N:=t->evalm(Tp(t)/sqrt(dotprod(Tp(t),Tp(t))));
map(simplify,N(t));
 Tp( t ) 
N := t → evalm 
 dotprod( Tp( t ), Tp( t ) ) 
[ −cos( t~ ), −sin( t~ ), 0 ]
> Rpp:=t->map(diff,Rp(t),t);
Rpp(t);
Rpp := t → map( diff, Rp( t ), t )
[ −3 cos( t~ ), −3 sin( t~ ), 0 ]
Curvature
> topK:=crossprod(Rp(t),Rpp(t));
kappa:=simplify(sqrt(dotprod(topK,topK))/speed(t)^3);
topK := [ 0, 0, 9 sin( t~ )2 + 9 cos( t~ )2 ]
1
κ :=
3
>
 t2 
Example 2. R(t) =  t, , 0 .
 2 
> restart:
> with(linalg):assume(t,real);
Warning, the protected names norm and trace have been redefined and
unprotected

> x:=t->t; y:=t->t^2/2; z:=t->0;


R:=t->vector([x(t),y(t),z(t)]);
x := t → t
1
y := t → t2
2
z := 0
R := t → [ x( t ), y( t ), z( t ) ]
> Rp:=t->map(diff,R(t),t);
Rp(t);
Rp := t → map( diff, R( t ), t )
[ 1, t~, 0 ]
> sqrt(dotprod(Rp(t),Rp(t)));
simplify(%);
>
1 + t~2
1 + t~2
> speed:=unapply(%,t);
>
speed := t~ → 1 + t~2
The Unit Tangent
> unitT:=t->evalm(Rp(t)/speed(t));
unitT(t);
 Rp( t ) 
unitT := t → evalm 
 speed( t ) 
 1 t~ 
 , , 0 

 1 + t~ 2
1 + t~2 
> Tp:=t->map(diff,unitT(t),t);
map(simplify,Tp(t));
Tp := t → map( diff, unitT( t ), t )
 t~ 1 
− , , 0 
 (3 / 2) (3 / 2) 
 ( 1 + t~ )
2
( 1 + t~ )
2

The Unit Normal
> N:=t->evalm(Tp(t)/sqrt(dotprod(Tp(t),Tp(t))));
map(simplify,N(t));
 Tp( t ) 
N := t → evalm 
 dotprod( Tp( t ), Tp( t ) ) 
 t~ 1 
− , , 0 

 1 + t~2 1 + t~2 
> Rpp:=t->map(diff,Rp(t),t);
Rpp(t);
Rpp := t → map( diff, Rp( t ), t )
[ 0, 1, 0 ]
Curvature
> topK:=crossprod(Rp(t),Rpp(t));
kappa:=simplify(dotprod(topK,topK)/speed(t)^3);
topK := [ 0, 0, 1 ]
1
κ := (3 / 2)
( 1 + t~2 )
>

Example 3:R(t) = [ exp(t) cos(t), exp(t) sin(t), exp(t) ]


We also draw the unit tangent and the unit normal for this last graph.
> restart:
> with(linalg): with(plots): with(plottools):assume(t,real);
Warning, the protected names norm and trace have been redefined and
unprotected

Warning, the name changecoords has been redefined

Warning, the name arrow has been redefined

> x:=t->exp(t)*cos(t); y:=t->exp(t)*sin(t); z:=t->exp(t);

x := t → et cos( t )
y := t → et sin( t )
z := exp
> x:=t->cos(t); y:=t->sin(t); z:=t->1/2*t;
x := cos
y := sin
1
z := t → t
2
> R:=t->vector([x(t),y(t),z(t)]);
R := t → [ x( t ), y( t ), z( t ) ]
> Rp:=t->map(diff,R(t),t);
map(simplify,Rp(t));
Rp := t → map( diff, R( t ), t )
[ et~ ( cos( t~ ) − sin( t~ ) ), et~ ( sin( t~ ) + cos( t~ ) ), et~ ]
> sqrt(dotprod(Rp(t),Rp(t)));
simplify(%);
2 2 2
( et~ cos( t~ ) − et~ sin( t~ ) ) + ( et~ sin( t~ ) + et~ cos( t~ ) ) + ( et~ )
3 et~
> speed:=unapply(%,t);
speed := t~ → 3 et~
The Unit Tangent
> unitT:=t->evalm(Rp(t)/speed(t));
unitT(t);
 Rp( t ) 
unitT := t → evalm 
 speed( t ) 
 1 3 ( et~ cos( t~ ) − et~ sin( t~ ) ) 1 3 ( et~ sin( t~ ) + et~ cos( t~ ) ) 1 
 3 
3 , ,
 et~ 3 et~ 3 
> Tp:=t->map(diff,unitT(t),t);
map(simplify,Tp(t));
Tp := t → map( diff, unitT( t ), t )
 1 1 
 − 3 ( sin( t~ ) + cos( t~ ) ), − 3 ( −cos( t~ ) + sin( t~ ) ), 0 
 3 3 
The Unit Normal
> N:=t->evalm(Tp(t)/sqrt(dotprod(Tp(t),Tp(t))));
map(simplify,N(t));
 Tp( t ) 
N := t → evalm 
 dotprod( Tp( t ), Tp( t ) ) 
 1 1 
 − 2 ( sin( t~ ) + cos( t~ ) ), − 2 ( −cos( t~ ) + sin( t~ ) ), 0 
 2 2 
> Rpp:=t->map(diff,Rp(t),t);
Rpp(t);
Rpp := t → map( diff, Rp( t ), t )
[ −2 et~ sin( t~ ), 2 et~ cos( t~ ), et~ ]
The Binormal vector
> B:=t->evalm(crossprod(unitT(t),N(t)));
map(simplify,B(t));
B := t → evalm( crossprod( unitT( t ), N( t ) ) )
1 1 1 
 6 ( −cos( t~ ) + sin( t~ ) ), − 6 ( sin( t~ ) + cos( t~ ) ), 6 
6 6 3 
Curvature
> topK:=crossprod(Rp(t),Rpp(t));
kappa:=simplify(dotprod(topK,topK)/speed(t)^3);
2
topK := [ ( et~ sin( t~ ) + et~ cos( t~ ) ) et~ − 2 ( et~ ) cos( t~ ),
2
−2 ( et~ ) sin( t~ ) − ( et~ cos( t~ ) − et~ sin( t~ ) ) et~,
2 ( et~ cos( t~ ) − et~ sin( t~ ) ) et~ cos( t~ ) + 2 ( et~ sin( t~ ) + et~ cos( t~ ) ) et~ sin( t~ ) ]
2
κ := 3 et~
3
>

Here, we draw the curve, the unit tangent, and the unit normal
> base:=convert(map(evalf,subs(t=Pi/4,R(t))),list);
directionT:=convert(map(evalf,subs(t=Pi/4,unitT(t))),list);
directionN:=convert(map(evalf,subs(t=Pi/4,N(t))),list);
directionB:=convert(map(evalf,subs(t=Pi/4,B(t))),list);
base := [ 1.5508831969180257476, 1.5508831969180257476, 2.1932800507380154566 ]
directionT := [ 0., .81649658092772603269, .57735026918962576449 ]
directionN := [ -1.0000000000000000000, .61237243569579452454 10-19, 0. ]
directionB :=
[ -.35355339059327376220 10-19, -.57735026918962576451, .81649658092772603272 ]
> sqrt(dotprod(directionT,directionB));Digits:=20;
0.
Digits := 20
> K:=spacecurve([x(t),y(t),z(t)],t=0..Pi/2,axes=NORMAL,color=GR
EEN):
J:=arrow(base, directionT, [1/4, 1/4, 1/4],
.2,.4,1/10,axes=NORMAL,color=red):
L:=arrow(base, directionN, [1/4, 1/4, 1/4],
.2,.4,1/10,axes=NORMAL,color=BLACK):
M:=arrow(base, directionB, [1/4, 1/4, 1/4],
.2,.4,1/10,axes=NORMAL,color=blue):
> display({J,K,L,M},axes=NORMAL,orientation=[-10,80],scaling=co
nstrained,color=BLACK);
> n:=20:lastpt:=Pi/2:Jj:=array(1..n):Ll:=array(1..n):Mm:=array(
1..n):base:=array(1..n):pic:=array(1..n):
K:=spacecurve([x(t),y(t),z(t)],t=0..lastpt,scaling=constraine
d,axes=NORMAL,color=GREEN):
for i from 1 to n do
base[i]:=convert(map(evalf,subs(t=lastpt*i/n,R(t))),list):
Jj[i]:=arrow(base[i],
convert(map(evalf,subs(t=lastpt*i/n,unitT(t))),list), [1/4,
1/4, 1/4],
.2,.4,1/10,axes=NORMAL,color=red):
Ll[i]:=arrow(base[i],
convert(map(evalf,subs(t=lastpt*i/n,N(t))),list), [1/4, 1/4,
1/4],
.2,.4,1/10,axes=NORMAL,color=BLACK):
Mm[i]:=arrow(base[i],
convert(map(evalf,subs(t=lastpt*i/n,B(t))),list), [1/4, 1/4,
1/4],
.2,.4,1/10,axes=NORMAL,color=blue):
pic[i]:=display({K,Jj[i],Ll[i],Mm[i]},axes=NORMAL,orientation
=[-10,80],scaling=constrained,color=BLACK):
od:
> display(seq(pic[i], i=1..n),
scaling=constrained,insequence=true);
>
>

Exercise for the student.


Find the unit tangent, the unit normal, and curvature for the ellipse
x2 y2
+ = 1, a > b.
a2 b2
Determine where the curvature is maximum and where it is minimum. Note that a parametric
representation for this ellipse is x(t)=a cos(t), y(t)=b sin(t), z(t)=0.
>
>

You might also like