Section 36-05.mws

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 z = exp(i*theta), 0 <= theta `` <= 2*Pi , encircles, or wraps around the origin, once. The closed contour described by z = exp(i*theta), 0 <= theta `` <= 4*Pi , is a circle traced twice, and therefore encircles or wraps around the origin twice. In general, if C is a closed contour, the number of times C wraps around the point z = zeta is called the winding number of C with respect to zeta , and is given by

nu(C,zeta) = 1/2/Pi/i Int(1/(z-zeta),z = C .. ``)

This integral reflects such a geometric property of the contour C because the antiderivative is a branch of the logarithm. The integral actually measures the change in the argument of the logarithm. If C wraps around zeta once, the argument of the logarithm will increase(or decrease) by 2*Pi . Hence, the number of times C wraps around zeta is reflected by the change in the argument of the logarithm generated by the antiderivative for the winding-number integral.

>

Example 36.24

Let C be the circle z(t) = exp(i*t), 0 <= t `` <= 2*Pi , that is,

> Z := exp(I*t);

Z := exp(I*t)

>

and take zeta = 0 . The winding number nu(C,0) is then

nu(C,0) = 1/2/Pi/i Int(i,t = 0 .. 2*Pi) = 1

since C encloses z = 0 once.

To implement this calculation in Maple, write the integral

> q := (1/2/Pi/I)*Int(diff(Z,t)/Z,t=0..2*Pi);

q := -1/2*I*Int(I,t = 0 .. 2*Pi)/Pi

>

and obtain its value with

> value(q);

1

>

As expected, C encloses z = 0 once.

This would be the result for any other z inside C . For example, the winding number nu(C,(1+i)/2) is given by the integral

nu(C,(1+i)/2) = 1/2/Pi/i Int(i*exp(i*t)/(exp(i*t)-(1+i)/2),t = 0 .. 2*Pi) = ...

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);

q1 := -1/2*I*Int(I*exp(I*t)/(exp(I*t)-1/2-1/2*I),t ...

>

Maple laborously evaluates this integral to

> value(q1);

1

>

The integral defining the winding number is easily computed by Cauchy's residue theorem, and we have

nu(C,zeta) = ``(1/2/Pi/i)*2*Pi*i*Res(1/(z-zeta),z =... = Res(1/(z-zeta),z = zeta) = 1

whenever C is a simple closed curve enclosing zeta just once.

>

Example 36.25

Let C be the limacon defined in polar coordinates ``(r,t) by r = 1+3*cos(t) , that is,

> R := 1+3*cos(t);

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);

[Maple Plot]

>

We write C as z(t) = r(t)*exp(i*t) , that is, as

> Z := R*exp(I*t);

Z := (1+3*cos(t))*exp(I*t)

>

and compute the winding number about z = 1 , a point inside the "inner" loop, as

nu(C,1) = 1/2/Pi/i int(i*(1+3*exp(i*t))*exp(i*t)/((1+3*cos(t))*exp(i*t...

indicating that the limacon wraps twice around z = 1 .

In Maple, this winding number nu(C,1) for C is given by the integral

> q := Int(diff(Z,t)/(Z-1),t=0..2*Pi)/(2*Pi*I);

q := -1/2*I*Int((-3*sin(t)*exp(I*t)+I*(1+3*cos(t))*...

>

the value of which Maple computes to be

> value(q);

2

>

The winding number about zeta = 3 , a point inside the limacon, but not inside the inner loop, is

nu(C,3) = 1/2/Pi/i int(i*(1+3*exp(i*t))*exp(i*t)/((1+3*cos(t))*exp(i*t...

indicating that the limacon wraps around z = 1 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);

q1 := -1/2*I*Int((-3*sin(t)*exp(I*t)+I*(1+3*cos(t))...

>

which evaluates to

> value(q1);

1

>

As expected, the winding number is 1,

>

Example 36.26

Let C 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);

Z1 := 1+3*exp(I*t)

Z2 := 2+2*exp(I*t)

Z3 := 1+exp(I*t)

Z4 := 2*exp(I*t)

>

The contour C 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);

[Maple Plot]

>

Inside C there are points which are enclosed twice by the contour. The winding number nu(C,1) 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);

q := -1/2*I*(2*Int(I,t = -Pi .. 0)+Int(2*I*exp(I*t)...

>

and evaluates to

> value(q);

2

>

As anticipated, the winding number with respect to z = 1 is 2, indicating that the contour C wraps around z = 1 twice.

The point z = 3 is inside the contour, but not inside the "inner" loop. Thus, the winding number nu(C,3) 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);

q1 := -1/2*I*(Int(3*I*exp(I*t)/(-2+3*exp(I*t)),t = ...

>

whose value is

> value(q1);

1

>

As expected, the winding number with respect to z = 3 is 1, indicating that the contour C wraps around z = 3 but once.

>

The Principle of the Argument

1. D is a simply connected domain;

2. G(z) is analytic in D , except, perhaps for a finite number of poles;

3. C is a simple closed positively-oriented contour in D ;

4. G(z) has neither poles nor zeros on C ;
5.
G(z) has N zeros and P poles inside C ;

== `>`

1/2/Pi/i Int(`G'`(z)/G(z),z = C .. ``) = N-P

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;

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]);

G := (z-2-3*I)/((z-4+I)*(z+5-2*I))

>

Then `G'`/G will be

> GG := simplify(diff(G,z)/G);

GG := -(z^2-4*z-6*I*z+13-14*I)/((z-2-3*I)*(z-4+I)*(...

>

Notice that `G'`/G now has simple poles at all three points which lie within C , the circle abs(z) = 7 . Hence, parametrize C by

> Z := 7*exp(I*t);

Z := 7*exp(I*t)

>

and write the integral

> q := Int(subs(z=Z,GG),t=0..2*Pi)/(2*Pi*I);

q := -1/2*I*Int(-(49*exp(I*t)^2-28*exp(I*t)-42*I*ex...

>

Unfortunately, Maple evaluates this incorrectly,

> simplify(value(q));

61/377+123/377*I

>

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));

0

>

However, the integral can be evaluated by the Cauchy residue theorem, and we have

1/2/Pi/i Int(`G'`(z)/G(z),z = C .. ``) = 1/2/Pi/i ``(2*Pi*i) Sum(Res(`G'`/G,P[k]),k = 1 .. 3) = Sum(Res(`G'`/G,P... = N-P

that is, we have the individual residues

> for k from 1 to 3 do
residue(GG,z=P[k]);
od;

1

-1

-1

>

and for their sum

> add(residue(GG,z=P[k]),k=1..3) = N-P;

-1 = 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 C is described by z = f(t), alpha <= t `` <= beta ;

2. H(z) is analytic on C ; inside C , H(z) may have a finite number of poles;

3. H(z) <> zeta[0] on C ;

4. Gamma is the image of C under H ; that is, Gamma is given by zeta = F(t) = H(f(t)), alpha <= t `` <= beta ;

5. inside C , the function H(z)-zeta[0] has N zeros and P poles, counted with respect to multiplicity and order;

6. nu(Gamma,zeta[0]) is the winding number of Gamma about the point zeta[0] ;

== `>`

nu(Gamma,zeta[0]) = N-P

In essence, this theorem says that N-P for the function H(z) inside C is the winding number for Gamma , the image of C under the mapping induced by H(z) . To find out something about the number of poles and zeros H(z) has inside C , obtain the winding number for Gamma , the image of C under the mapping w = H(z) . If the winding number of Gamma can be obtained geometrically, without resort to integration, then the theorem gives a geometric tool for counting poles and zeros of H(z) ,

If H(z) is a polynomial, it has no poles in the finite complex plane. Furthermore, if the winding number nu(Gamma,zeta[0]) were known, then this extension of the principle of the argument yields N , the number of zeros H(z)-zeta[0] has inside C .

The proof of this theorem is straightforward. Starting with the definition of the winding number, we have

nu(Gamma,zeta[0]) = 1/2/Pi/i Int(1/(zeta-zeta[0]),zeta = Gamma .. ``) = 1/2/Pi/i... Int(`F'`(t)/(F(t)-zeta[0]),t = alpha .. beta) = 1/2... Int(`H'`(f(t))*`f '`(t)/(H(f(t))-zeta[0]),t = alpha... Int(`H'`(z)/(H(z)-zeta[0]),z = C .. ``)

Now, the last integral is just N-P , a result which follows by setting G(z) = H(z)-zeta[0] in the principle of the argument.

>

Example 36.28

Let C be the contour consisting of the right half of the circle abs(z) = R and that part of the imaginary axis satisfying -i*R <= z `` <= i*R . 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);

[Maple Plot]

>

If H(z) = z-3 , that is,

> H := z-3;

H := z-3

>

the equation H(z) = 0 has one solution, z = 3 , in the right half-plane. Thus, H(z) has one zero, and no poles in the right half-plane.

The image of C under the map H(z) is the contour Gamma , shown on the right in Figure 36.16, and traced dynamically in the following animation. Both C and Gamma 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]);

[Maple Plot]

>

The contour Gamma encircles the origin once, so the winding number with respect to zeta = 0 is nu(Gamma,0) = 1 . Hence, H(z) has exactly one zero in the right half-plane.

We verify this by computing

nu(Gamma,0) = 1/2/Pi/i Int(`H'`(z)/(H(z)-zeta[0]),z = C .. ``) = 1/2/Pi/i Int(`H'`(z)/H(z),z = C .. ``) = 1/2/Pi/i Int(1/(z-3),z = C .. ``) = 1

where, since zeta[0] = 0 , the integrand becomes `H'`(z)/(H(z)-zeta[0]) = `H'`(z)/H(z) .

The rightmost contour integral can be evaluated in Maple as follows. The contour C is parametrized by the two functions

> Z1 := R*exp(I*t);
Z2 := I*t;

Z1 := R*exp(I*t)

Z2 := I*t

>

The contour integral is, except for the factor 1/2/Pi/i , 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);

q1 := Int(I*R*exp(I*t)/(R*exp(I*t)-3),t = -1/2*Pi ....

q2 := Int(I/(I*t-3),t = R .. -R)

>

For the contour C to enclose z = 3 , the zero of H(z) , R 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));

1

>

Example 36.29

Let C be the contour defined in Example 36.28, and let H(z) be the polynomial

> H := (z-2)*(z-3);

H := (z-2)*(z-3)

>

Clearly, H(z) has two zeros, z = 2 and z = 3 , both in the right half-plane. The image of C under the mapping induced by H(z) is Gamma , 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]);

[Maple Plot]

>

The contour Gamma 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]);

[Maple Plot]

>

The contour Gamma encircles zeta[0] = 0 twice, so the the winding number is nu(Gamma,0) = 2 , and the function H(z)-zeta[0] = H(z) has two zeros in the right half-plane. Since

`H'`(z)/H(z) = (2*z-5)/(z-2)/(z-3) = 1/(z-2)+1/(z-3)

the winding number is

nu(Gamma,0) = 2*Pi*i/2/Pi/i [Res(`H'`/H,2)+Res(`H'`/H,3)] = 2

Working in Maple, we can obtain a direct evaluation of the contour integral

nu(Gamma,0) = 1/2/Pi/i Int(`H'`(z)/H(z),z = C .. ``)

if we define Q(z) = `H'`(z)/H(z) by

> Q := diff(H,z)/H;

Q := (2*z-5)/((z-2)*(z-3))

>

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);

q := Int(I*(2*R*exp(I*t)-5)*R*exp(I*t)/((R*exp(I*t)...

>

The factor 1/2/Pi/i 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));

2

>

for the winding number of Gamma with respect to zeta[0] = 0 . This is consistent with the animation of the trace of Gamma .

>

Example 36.30

With C again as in Example 36.28, let H(z) be the polynomial

> H := z^3/10+z^2+9*z+4;

H := 1/10*z^3+z^2+9*z+4

>

a function with the three zeros

> fsolve(H=0,z,complex);

-4.766198420-7.926283728*I, -4.766198420+7.92628372...

>

are all in the left half-plane. There are no zeros in the right half-plane. Consequently, Gamma , the image of C under the mapping induced by H(z) should not encircle zeta[0] = 0 . Figure 36.18 shows Gamma when R = 12 .

> 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);

[Maple Plot]

>

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 zeta[0] = 0 by Gamma , and the winding number is correctly determined to be nu(Gamma,0) = 0 .

For R = 5 , the following animation of the tracing of Gamma clearly shows that Gamma 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]);

[Maple Plot]

>

The following animation shows a dynamic tracing of Gamma in the case R = 12 .

> 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);

[Maple Plot]

>

Careful observation shows the black portion of Gamma is traced in the counterclockwise sense, whereas, the red portion is traced in the clockwise sense. Thus, there is no net encirclement of zeta[0] = 0 by Gamma , and the winding number is correctly determined to be nu(Gamma,0) = 0 .

>

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 T(z) = A(z)/B(z) , the poles of T(z) are the zeros of B(z) . Determining the location of the zeros of B(z) is equivalent to determining the poles of T(z) , and the poles of T(z) 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 T(z) 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.

>