Unit 7: Complex Variables
Chapter 36: Applications
Section 36.5: the Nyquist stability criterion
Copyright
Copyright * 2001 by Addison Wesley Longman, Inc.
All rights reserved. No part of this publication may be reproduced, stored in a retrieval system, or transmitted, in any form or by any means, electronic, mechanical, photocopying, recording, or otherwise, without the prior written permission of the publisher. Printed in the United States of America.
Initializations
> restart;
>
with(linalg):
with(plots):
with(plottools):
with(inttrans):
with(student):
Warning, the protected names norm and trace have been redefined and unprotected
Warning, the name changecoords has been redefined
Warning, the name hilbert has been redefined
> interface(showassumed=0);
>
The Winding Number
The circle
, encircles, or wraps around the origin, once. The closed contour described by
, is a circle traced twice, and therefore encircles or wraps around the origin twice. In general, if
is a closed contour, the number of times
wraps around the point
is called the
winding
number
of
with respect to
, and is given by
This integral reflects such a geometric property of the contour
because the antiderivative is a branch of the logarithm. The integral actually measures the change in the argument of the logarithm. If
wraps around
once, the argument of the logarithm will increase(or decrease) by
. Hence, the number of times
wraps around
is reflected by the change in the argument of the logarithm generated by the antiderivative for the winding-number integral.
>
Example 36.24
Let
be the circle
, that is,
> Z := exp(I*t);
>
and take
. The winding number
is then
since
encloses
once.
To implement this calculation in Maple, write the integral
> q := (1/2/Pi/I)*Int(diff(Z,t)/Z,t=0..2*Pi);
>
and obtain its value with
> value(q);
>
As expected,
encloses
once.
This would be the result for any other
inside
. For example, the winding number
is given by the integral
which we can see if we write the integral in Maple as
> q1 := (1/2/Pi/I)*Int(diff(Z,t)/(Z-(1+I)/2),t=0..2*Pi);
>
Maple laborously evaluates this integral to
> value(q1);
>
The integral defining the winding number is easily computed by Cauchy's residue theorem, and we have
=
= 1
whenever
is a simple closed curve enclosing
just once.
>
Example 36.25
Let
be the limacon defined in polar coordinates
by
, that is,
> R := 1+3*cos(t);
>
The distinguishing feature of the limacon is the way it loops over itself, as seen in Figure 36.14
> display(plot([R,t,t=0..2*Pi],coords=polar, color=black, xtickmarks=5, ytickmarks=5, numpoints=500), labels=[x,y], labelfont=[TIMES,ITALIC,12], scaling=constrained);
>
We write
as
, that is, as
> Z := R*exp(I*t);
>
and compute the winding number about
, a point inside the "inner" loop, as
indicating that the limacon wraps twice around
.
In Maple, this winding number
for
is given by the integral
> q := Int(diff(Z,t)/(Z-1),t=0..2*Pi)/(2*Pi*I);
>
the value of which Maple computes to be
> value(q);
>
The winding number about
, a point inside the limacon, but not inside the inner loop, is
indicating that the limacon wraps around
but a single time.
In Maple, this winding number is given by the integral
> q1 := Int(diff(Z,t)/(Z-3),t=0..2*Pi)/(2*Pi*I);
>
which evaluates to
> value(q1);
>
As expected, the winding number is 1,
>
Example 36.26
Let
be closed contour consisting of four semicircles taken from the following circles.
>
Z1 := 1+3*exp(I*t);
Z2 := 2+2*exp(I*t);
Z3 := 1+exp(I*t);
Z4 := 2*exp(I*t);
>
The contour
is then seen in Figure 36.15.
>
p1 := complexplot(Z1,t=-Pi..0, color=black):
p2 := complexplot(Z2,t=0..Pi, color=black):
p3 := complexplot(Z3,t=-Pi..0, color=black):
p4 := complexplot(Z4,t=0..Pi, color=black):
display([p||(1..4)],scaling=constrained, labels=[` x`,`y `], labelfont=[TIMES,ITALIC,12], xtickmarks=7, ytickmarks=6);
>
Inside
there are points which are enclosed twice by the contour. The winding number
is computed as the sum of the four integrals
>
q := (Int(diff(Z1,t)/(Z1-1),t=-Pi..0)+
Int(diff(Z2,t)/(Z2-1),t=0..Pi)+
Int(diff(Z3,t)/(Z3-1),t=-Pi..0)+
Int(diff(Z4,t)/(Z4-1),t=0..Pi))/(2*Pi*I);
>
and evaluates to
> value(q);
>
As anticipated, the winding number with respect to
is 2, indicating that the contour
wraps around
twice.
The point
is inside the contour, but not inside the "inner" loop. Thus, the winding number
is given by the sum of the four integrals
>
q1 := (Int(diff(Z1,t)/(Z1-3),t=-Pi..0)+
Int(diff(Z2,t)/(Z2-3),t=0..Pi)+
Int(diff(Z3,t)/(Z3-3),t=-Pi..0)+
Int(diff(Z4,t)/(Z4-3),t=0..Pi))/(2*Pi*I);
>
whose value is
> value(q1);
>
As expected, the winding number with respect to
is 1, indicating that the contour
wraps around
but once.
>
The Principle of the Argument
1.
is a simply connected domain;
2.
is analytic in
, except, perhaps for a finite number of poles;
3.
is a simple closed positively-oriented contour in
;
4.
has neither poles nor zeros on
;
5.
has
zeros and
poles inside
;
==
A proof of this theorem can be found in [1], or in any similar text. The following example contains the key ideas from which the proof is typically constructed.
>
Example 36.27
Let the following three points
>
P[1] := 2+3*I;
P[2] := 4-I;
P[3] := -5+2*I;
>
be a zero, and two simple poles, respectively, for the function
> G := (z-P[1])/(z-P[2])/(z-P[3]);
>
Then
will be
> GG := simplify(diff(G,z)/G);
>
Notice that
now has simple poles at all three points which lie within
, the circle
. Hence, parametrize
by
> Z := 7*exp(I*t);
>
and write the integral
> q := Int(subs(z=Z,GG),t=0..2*Pi)/(2*Pi*I);
>
Unfortunately, Maple evaluates this incorrectly,
> simplify(value(q));
>
even if the real and imaginary parts of the integrand are separated, as in
> simplify(int(evalc(integrand(q)),t=0..2*Pi)/(2*Pi*I));
>
However, the integral can be evaluated by the Cauchy residue theorem, and we have
=
that is, we have the individual residues
>
for k from 1 to 3 do
residue(GG,z=P[k]);
od;
>
and for their sum
> add(residue(GG,z=P[k]),k=1..3) = N-P;
>
thereby verifying the principle of the argument in this case.
>
Principle of the Argument - Extended
The following theorem combines the constructs of the winding number and the principle of the argument.
1. the positively-oriented, simple closed contour
is described by
;
2.
is analytic on
; inside
,
may have a finite number of poles;
3.
on
;
4.
is the image of
under
; that is,
is given by
=
;
5. inside
, the function
has
zeros and
poles, counted with respect to multiplicity and order;
6.
is the winding number of
about the point
;
==
In essence, this theorem says that
for the function
inside
is the winding number for
, the image of
under the mapping induced by
. To find out something about the number of poles and zeros
has inside
, obtain the winding number for
, the image of
under the mapping
. If the winding number of
can be obtained geometrically, without resort to integration, then the theorem gives a geometric tool for counting poles and zeros of
,
If
is a polynomial, it has no poles in the finite complex plane. Furthermore, if the winding number
were known, then this extension of the principle of the argument yields
, the number of zeros
has inside
.
The proof of this theorem is straightforward. Starting with the definition of the winding number, we have
Now, the last integral is just
, a result which follows by setting
in the principle of the argument.
>
Example 36.28
Let
be the contour consisting of the right half of the circle
and that part of the imaginary axis satisfying
. This is the letter "D" shown on the left in Figure 36.16
>
R := 'R': C := 'C': G := 'G':
p1 := plot([[0,-5],[0,5]],color=cyan,thickness=3):
p2 := plot([5,t,t=-Pi/2..Pi/2],coords=polar,color=cyan,thickness=3):
p3 := plot([r,Pi/4,r=0..5],coords=polar,color=black):
p4 := textplot([2.5,1.8,`R`]):
p5 := plot([[0,0],[5.5,0]],color=black):
p6 := plot([[7,-5],[7,5]],color=cyan,thickness=3):
p7 := plot([7+5*cos(t),5*sin(t),t=-Pi/2..Pi/2], color=cyan,thickness=3):
p8 := plot([[7,0],[7+5/sqrt(2),5/sqrt(2)]],color=black):
p9 := plot([[9,-5],[9,5]],color=black):
p10 := plot([[7,0],[12.5,0]],color=black):
p11 := textplot([10,2.2,`R`]):
p12 := textplot([3.8,4.5,`C`],font=[TIMES,ROMAN,12]):
p13 := textplot({[-.3,-.1,`0`],[6.6,-.1,`-3`],[9.4,-.5,`0`]}):
p14 := textplot([11.24, 4.646,`G`],font=[SYMBOL,12]):
display([p||(1..14)],scaling=constrained,axes=none);
>
If
, that is,
> H := z-3;
>
the equation
has one solution,
, in the right half-plane. Thus,
has one zero, and no poles in the right half-plane.
The image of
under the map
is the contour
, shown on the right in Figure 36.16, and traced dynamically in the following animation. Both
and
are traced in the counterclockwise (positive) sense.
>
H1 := subs(z=5*exp(I*t),H):
H2 := subs(z=-I*t,H):
p5 := s -> complexplot(H1,t=-Pi/2..s,color=black,thickness=3):
p6 := s -> complexplot(H2,t=-5..s,color=black, thickness=3):
p7 := complexplot(H1,t=-Pi/2..Pi/2,color=black, thickness=3):
p8 := s -> display([p6(s),p7]):
display([seq(p5(k*Pi/20),k=-10..10),seq(p8(k/2),k=-10..10)], insequence=true, scaling=constrained, xtickmarks=[-2,0,1], ytickmarks=[-5,0,5]);
>
The contour
encircles the origin once, so the winding number with respect to
is
. Hence,
has exactly one zero in the right half-plane.
We verify this by computing
=
where, since
, the integrand becomes
.
The rightmost contour integral can be evaluated in Maple as follows. The contour
is parametrized by the two functions
>
Z1 := R*exp(I*t);
Z2 := I*t;
>
The contour integral is, except for the factor
, the sum of the two integrals
>
q1 := Int(diff(Z1,t)/(Z1-3),t=-Pi/2..Pi/2);
q2 := Int(diff(Z2,t)/(Z2-3),t=R..-R);
>
For the contour
to enclose
, the zero of
,
must be larger than 3, so make the assumption
> assume(R>3);
>
and find the winding number to be
> simplify(value( map(evalc,q1) + q2)/(2*Pi*I));
>
Example 36.29
Let
be the contour defined in Example 36.28, and let
be the polynomial
> H := (z-2)*(z-3);
>
Clearly,
has two zeros,
and
, both in the right half-plane. The image of
under the mapping induced by
is
, shown in Figure 36.17.
>
H1 := subs(z=5*exp(I*t),H):
H2 := subs(z=-I*t,H):
p5 := s -> complexplot(H1,t=-Pi/2..s,color=black,thickness=1):
p6 := s -> complexplot(H2,t=-5..s,color=black, thickness=1):
p7:=textplot([-8.519, 23.07,`G`],font=[SYMBOL,12]):
display([p5(Pi/2),p6(5),p7], scaling=constrained, xtickmarks=[-15,0,20], ytickmarks=[-15,-5,0,5,15]);
>
The contour
is traced dynamically in the following animation.
>
H1 := subs(z=5*exp(I*t),H):
H2 := subs(z=-I*t,H):
p5 := s -> complexplot(H1,t=-Pi/2..s,color=black,thickness=3):
p6 := s -> complexplot(H2,t=-5..s,color=black, thickness=3):
p7 := complexplot(H1,t=-Pi/2..Pi/2,color=black, thickness=3):
p8 := s -> display([p6(s),p7]):
display([seq(p5(k*Pi/20),k=-10..10),seq(p8(k/2),k=-10..10)], insequence=true, scaling=constrained, xtickmarks=[-20,-10,0,5], ytickmarks=[-15,-10,-5,0,5,10,15]);
>
The contour
encircles
twice, so the the winding number is
, and the function
has two zeros in the right half-plane. Since
=
the winding number is
Working in Maple, we can obtain a direct evaluation of the contour integral
if we define
by
> Q := diff(H,z)/H;
>
and compute the winding number from the integral
> q := Int((subs(z=R*exp(I*t),Q)*I*R*exp(I*t)),t=-Pi/2..Pi/2) + Int((subs(z=I*t,Q)*I),t=R..-R);
>
The factor
has been held in abeyance so that we can
map
an
evalc
onto the integrands before evaluating the integrals. We then get
> simplify(value(map(evalc,op(1,q))+map(evalc,op(2,q)))/(2*Pi*I));
>
for the winding number of
with respect to
. This is consistent with the animation of the trace of
.
>
Example 36.30
With
again as in Example 36.28, let
be the polynomial
> H := z^3/10+z^2+9*z+4;
>
a function with the three zeros
> fsolve(H=0,z,complex);
>
are all in the left half-plane. There are no zeros in the right half-plane. Consequently,
, the image of
under the mapping induced by
should not encircle
. Figure 36.18 shows
when
.
>
H1 := subs(z=12*exp(I*t),H):
H2 := subs(z=-I*t,H):
p5 := complexplot(H1,t=-Pi/2..Pi/2,color=black):
p6 := complexplot(H2,t=-12..12,color=red,linestyle=2):
p7 := textplot([150,200,`G`],font=[SYMBOL,12]):
display([p5,p6,p7], scaling=constrained, xtickmarks=[-150,0,100,200,300,400], ytickmarks=6);
>
Careful observation shows the large loop (solid black curve) is traced in the counterclockwise sense, whereas the small loop (dotted red curve) is traced in the clockwise sense. Thus, there is no net encirclement of
by
, and the winding number is correctly determined to be
.
For
, the following animation of the tracing of
clearly shows that
does not encircle the origin.
>
H1 := subs(z=5*exp(I*t),H):
H2 := subs(z=-I*t,H):
p5 := s -> complexplot(H1,t=-Pi/2..s,color=black,thickness=3):
p6 := s -> complexplot(H2,t=-5..s,color=black, thickness=3):
p7 := complexplot(H1,t=-Pi/2..Pi/2,color=black, thickness=3):
p8 := s -> display([p6(s),p7]):
display([seq(p5(k*Pi/20),k=-10..10),seq(p8(k/2),k=-10..10)], insequence=true, scaling=constrained, xtickmarks=6, ytickmarks=[-40,0,40]);
>
The following animation shows a dynamic tracing of
in the case
.
>
H1 := subs(z=12*exp(I*t),H):
H2 := subs(z=-I*t,H):
p5 := s -> complexplot(H1,t=-Pi/2..s,color=black):
p6 := s -> complexplot(H2,t=-12..s,color=red):
p7 := complexplot(H1,t=-Pi/2..Pi/2,color=black):
p8 := s -> display([p6(s),p7]):
display([seq(p5(k*Pi/20),k=-10..10),seq(p8(k),k=-12..12)], insequence=true, scaling=constrained, xtickmarks=[-150,0,100,200,300,400], ytickmarks=6);
>
Careful observation shows the black portion of
is traced in the counterclockwise sense, whereas, the red portion is traced in the clockwise sense. Thus, there is no
net
encirclement of
by
, and the winding number is correctly determined to be
.
>
The Nyquist Stability Criterion
In 1932, Harry Nyquist (1889-1976), an engineer at Bell Telephone Laboratories, articulated the use of the extended principle of the argument for determining where the poles of a transfer function in a linear feedback system are located. This usage has since been called the Nyquist stability criterion .
The transfer function of a feedback system (see Section 36.4) arises from a Laplace transform of the system. The poles of the transfer function are actually the eigenvalues or characteristic roots of the differential equation governing the system. If any of these poles (or eigenvalues) have postive real part, that is, if any pole is located in the right half-plane, the solution may contain exponential terms which grow without bound as time increases. Thus, determining whether or not there are poles of the transfer function in the right half-plane is tantamount to determining the stability of the feedback system.
If the transfer function of the feedback system is a completely reduced rational function of the form
, the poles of
are the zeros of
. Determining the location of the zeros of
is equivalent to determining the poles of
, and the poles of
are the eigenvalues, or characteristic roots, of the system. The solution of the differential equation underlying the feedback system will contain multiples of exponential terms whose exponents contain the eigenvalues. If any of the eigenvalues have positive real parts (because they fall in the right half-plane), the solution might grow unbounded as time increases. Thus, poles of
falling in the right half-plane means the feedback system could be unstable.
Engineering texts on feedback control (for example, [2] and [3]), contain additional detail on the use of the Nyquist stability criterion. In addition, we even find complex variables texts such as [4] discussing the notion of feedback systems and the Nyquist stability criterion.
>
References
[1] Louis L. Pennisi, Elements of Complex Variables, Holt, Rinehart and Winston, Inc., 1963.
[2] Charles L. Phillips and Royce D. Harbor, Feedback Control Systems, Alternate Second Edition, Prentice Hall, Inc., 1991.
[3] Gene F. Franklin, J. David Powell and Abbas Ememi-Naeini, Feedback Control of Dynamic Systems, Addison-Wesley Publishing Company, 1986.
[4] A. David Wunsch, Complex Variables with Applications, Second Edition, Addison-Wesley Publishing Company, 1994.
>