@@ -714,41 +714,47 @@ def nyquist_plot(syslist, omega=None, plot=True, omega_limits=None,
714714 if np .any (omega_sys * sys .dt > np .pi ) and warn_nyquist :
715715 warnings .warn ("evaluation above Nyquist frequency" )
716716
717- # Transform frequencies to continuous domain
718- contour = np .exp (1j * omega * sys .dt )
719- else :
720- contour = 1j * omega_sys
717+ # do indentations in s-plane where it is more convenient
718+ splane_contour = 1j * omega_sys
721719
722720 # Bend the contour around any poles on/near the imaginary axis
723721 if isinstance (sys , (StateSpace , TransferFunction )) \
724- and sys .isctime () and indent_direction != 'none' :
725- poles = sys .pole ()
726- if contour [1 ].imag > indent_radius \
727- and 0. in poles and not omega_range_given :
722+ and indent_direction != 'none' :
723+ if sys .isctime ():
724+ splane_poles = sys .pole ()
725+ else :
726+ # map z-plane poles to s-plane
727+ splane_poles = np .log (sys .pole ())/ sys .dt
728+
729+ if splane_contour [1 ].imag > indent_radius \
730+ and 0. in splane_poles and not omega_range_given :
728731 # add some points for quarter circle around poles at origin
729- contour = np .concatenate (
732+ splane_contour = np .concatenate (
730733 (1j * np .linspace (0. , indent_radius , 50 ),
731- contour [1 :]))
732- for i , s in enumerate (contour ):
734+ splane_contour [1 :]))
735+ for i , s in enumerate (splane_contour ):
733736 # Find the nearest pole
734- p = poles [(np .abs (poles - s )).argmin ()]
735-
737+ p = splane_poles [(np .abs (splane_poles - s )).argmin ()]
736738 # See if we need to indent around it
737739 if abs (s - p ) < indent_radius :
738740 if p .real < 0 or \
739741 (p .real == 0 and indent_direction == 'right' ):
740742 # Indent to the right
741- contour [i ] += \
743+ splane_contour [i ] += \
742744 np .sqrt (indent_radius ** 2 - (s - p ).imag ** 2 )
743745 elif p .real > 0 or \
744746 (p .real == 0 and indent_direction == 'left' ):
745747 # Indent to the left
746- contour [i ] -= \
748+ splane_contour [i ] -= \
747749 np .sqrt (indent_radius ** 2 - (s - p ).imag ** 2 )
748750 else :
749751 ValueError ("unknown value for indent_direction" )
750752
751- # TODO: add code to indent around discrete poles on unit circle
753+ # change contour to z-plane if necessary
754+ if sys .isctime ():
755+ contour = splane_contour
756+ else :
757+ contour = np .exp (splane_contour * sys .dt )
752758
753759 # Compute the primary curve
754760 resp = sys (contour )
0 commit comments