With the simplification to the open-loop system function in place, you can dive in and find the closed-loop system function of the CD/DVD case study, with full variable substitution. Here’s the closed-loop system function H(s) with the simplified open-loop system function applied:

With Ka = 50, you have a natural frequency of 15.95 rad/s and damping factor of 0.78.

The feedback connection has definitely changed things. There’s no longer a pole at s = 0. The roots given Ka = 50 are

```In [83]: Ka = 50
In [84]: roots([1, 25, Ka*16/pi])
Out[84]: array([-12.5+9.91957201j, -12.5-9.91957201j])```

This is a complex conjugate pole pair in the left-half plane, so H(s) is stable! Check the exact G0(s) model. After working through the math by hand to find H(s), you can use PyLab to numerically root the denominator polynomial:

```In [85]: roots([1, 1250+25, 25*1250, Ka*4000*10/(2*pi)])
Out[85]: array([-1250.21 +0.j, -12.396+10.047j, -12.396-10.047j])```

The complex conjugate root pair for the exact closed-loop model is close to the simplified model. A third real root is included at –1,250 rad/s, again resulting in a time constant that decays very rapidly relative to the complex conjugate poles.

The frequency response, magnitude, and phase plots also play a role in control system design. To plot the frequency response, use w,H=freqs(b,a,w) from the signal package:

```In [145]: w = logspace(0,4,500)
In [146]: b,a = ssd.position_CD(50,'fb_approx')
In [147]: w,H_simple = signal.freqs(b,a,w)
In [148]: b,a = ssd.position_CD(50,'fb_exact')
In [149]: w,H_exact = signal.freqs(b,a,w)
In [151]: semilogx(w,20*log10(abs(H_simple)))
In [152]: semilogx(w,20*log10(abs(H_exact)),'r')
In [156]: semilogx(w,angle(H_simple)*180/pi)
In [157]: semilogx(w,angle(H_exact)*180/pi,'r')```
Credit: Illustration by Mark Wickert, PhD

The third pole at 1,250 rad/s (from the exact model) kicks in at about 80 dB of loop attenuation. This has little impact on the closed-loop performance as long as the loop gain isn’t too large.