11

Is there a command to find the poles of a function $f=f(z)$?

example: let $$f(z) = \frac{1}{z^2-1}$$ then we know that the poles are at $z=\pm 1$ but is there a special command in mathematica to do this?

user64494
  • 26,149
  • 4
  • 27
  • 56
mapel
  • 195
  • 2
  • 3
  • 7

3 Answers3

14

There is a special function for this: it's called TransferFunctionPoles. For the case you asked for:

TransferFunctionPoles[TransferFunctionModel[{{1/(z^2 - 1)}}, z]]

which returns the expected answer that there are two poles at

{{{-1, 1}}}

TransferFunctionPoles can also handle multivariable input/output models of the kind that control engineers like to play with, including symbolic transfer functions and time-delay systems. There are a number of related commands including TransferFunctionZeros, TransferFunctionModel, StateSpaceModel ways of converting continuous to discrete models, and special plotting functions like RootLocusPlot and NyquistPlot.

bill s
  • 68,936
  • 4
  • 101
  • 191
  • 5
    It doesn't work with Tan[z]. It complains about polynomial numerators and denominators. Is this method restricted to rational functions? – Michael E2 Jun 12 '13 at 17:18
  • 5
    @@Michael E2 -- Whenever you see the phrase "transfer function," it implies rational functions. – bill s Jun 12 '13 at 18:12
4

Since V 13.0 we have FunctionPoles:"

From the documentation: "FunctionPoles returns a list of pairs {pole, multiplicity}."

f = 1 / (z^2 - 1);

FunctionPoles[f, z]

{{-1, 1}, {1, 1}}

To only get the poles:

{a, b} = FunctionPoles[f, z][[All, 1]]

{-1, 1}

Plot[f, {z, -10, 10},
 Epilog -> {Red, Dashed, InfiniteLine[{a, 0}, {0, 1}], InfiniteLine[{b, 0}, {0, 1}]},
 PlotRange -> Automatic]

enter image description here

eldo
  • 67,911
  • 5
  • 60
  • 168
2

Use FunctionDomain to find the real domain, then remove the whole line from the domain found. What is left are the poles. (this is all on the real line)

ClearAll[f,z]
f         = 1/(z^2-1)
domain    = FunctionDomain[f,z,Reals];
wholeLine = -Infinity < z < Infinity;

Reduce[ wholeLine && Not[domain],z,Reals]

Mathematica graphics

f         = Tan[z];
domain    = FunctionDomain[f,z,Reals];
wholeLine = -Infinity<z<Infinity;

Reduce[ wholeLine && Not[domain],z,Reals]

Mathematica graphics

It works for 2D also

ClearAll[f,x,y]
f         = 1/x Log[y];
domain    = FunctionDomain[f,{x,y},Reals];
wholeLine = {-Infinity<x<Infinity && -Infinity<y<Infinity};

Reduce[Join[wholeLine,{Not[domain]}],{x,y},Reals]

Mathematica graphics

Nasser
  • 143,286
  • 11
  • 154
  • 359