Re: An Elegant way of plotting the Pole-Zero diagram
- To: mathgroup at smc.vnet.net
- Subject: [mg88843] Re: [mg88833] An Elegant way of plotting the Pole-Zero diagram
- From: Bob Hanlon <hanlonr at cox.net>
- Date: Mon, 19 May 2008 05:15:35 -0400 (EDT)
- Reply-to: hanlonr at cox.net
Probably not "elegant"
The PlotMarkers for ListPlot doesn't work properly if the second list of points (zeros in this case) has only one point. For a single zero, the single point is duplicated to make the list seem to have two points.
Clear[poleZeroPlot];
The PlotMarkers for ListPlot doesn't work properly if the second list of points (zeros in this case) has only one point. For a single zero, the single point is duplicated to make the list seem to have two points.
poleZeroPlot[transferFunction_, s_: s] :=
Module[{denom, num, poles, zeros, pz, axStyle},
denom = Denominator[transferFunction];
num = Numerator[transferFunction];
poles = If[FreeQ[denom, s], {},
({Re[#], Im[#]} & /@ (s /.
Solve[denom == 0, s]))];
zeros = If[FreeQ[num, s], {},
({Re[#], Im[#]} & /@ (s /.
Solve[num == 0, s]))];
pz = Join[poles, zeros];
zeros = If[Length[zeros] == 1, Join[zeros, zeros], zeros];
axStyle = {Blue, AbsoluteDashing[{5, 5}]};
ListPlot[{poles, zeros} /. {} -> Sequence[],
PlotMarkers -> (Style[#, {Bold, Red, 16}] & /@
If[Length[poles] == 0, {"O"},
If[Length[zeros] == 0, {"X"},
{"X", "O"}]]),
Frame -> True,
Axes -> True,
AxesStyle -> {axStyle, axStyle},
PlotRange -> 1.1 {
{Min[-1, Min[pz[[All, 1]]]],
Max[1, Max[pz[[All, 1]]]]},
{Min[-1, Min[pz[[All, 2]]]],
Max[1, Max[pz[[All, 2]]]]}},
Epilog -> Append[axStyle,
Circle[{0, 0}, 1]],
AspectRatio -> Automatic]]
poleZeroPlot[(s + 2)/(s^2 + 1/4)]
poleZeroPlot[(s^2 + 1/4)/(s + 2)]
poleZeroPlot[s^2 + 1/4]
poleZeroPlot[1/(z^2 + 1/4), z]
Bob Hanlon
---- bk2005usa at gmail.com wrote:
> Hi to All:
>
> Would anyone care to provide an elegant way of plotting the pole-zero
> diagram of a transfer function H[s], using the conventional symbols,
> namely, "x" for poles and "0" for zeros. Mathematica does not have a
> built-in function to draw those symbols---like "Point[] and
> PointSize[].
> Your help will be appreciated
> Lemiel
>