Mathematica Stack Exchange is a question and answer site for users of Mathematica. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

At the moment I can find the limit of my transfer function as follows:

(5 4001.6`)/(5 4001.6` + (4 + s) (200 + s)) /. s -> 0

This works as I would expect and provides a final value of 0.961553 In this example my value of gain, k, is 4001.6` so re-writing the expression for arbitrary k would give:

   (5 k)/(5k + (4 + s) (200 + s)) /. s -> 0

I want to find a value of k that makes the result 0.95. To do this I was thinking about using a while loop.

I thought the while loop could start with k=1, compute the limit, test to see if less than 0.95, and if not increment k by one, and perform the test again, until the correct value of k is found:

This is what I have tried:

    k = 1; While[(5 k)/(5 k + (4 + s) (200 + s)) /. s < 0.95, k++]

However I get the error: "ReplaceAll::reps: {s<=0.95} is neither a list of replacement rules nor a valid dispatch table, and so cannot be used for replacing. >>"

Any help would be most appreciated.

share|improve this question
Shouldn't it be (... /. s -> 0) < 0.95? The error message is telling you that you forgot a ->. – Michael E2 Aug 14 '13 at 20:18
Ah, I think Michael has a better handle on your particular intent. Nevertheless consider reading: (1835) for some examples. – Mr.Wizard Aug 14 '13 at 20:19
By the way: FindRoot[0.95 == (5 k)/(5 k + (4 + s) (200 + s)) /. s -> 0, {k, 4000}] Out: {k -> 3040.} – Mr.Wizard Aug 14 '13 at 20:34
FWIW, Control`StaticGains[TransferFunctionModel[(5 k)/(5 k + (4 + s) (200 + s)), s]] will compute the steady-state gains. – Suba Thomas Aug 14 '13 at 21:52
There are easier ways to do this, but I am now confused about your TransferFunction. This can't be an actual transfer function. closed loop basic TF is $\frac{k H(s)}{1+ k H(s)}$ and what you do next is use RootLocusPlot to see where it crosses the $s$ axis for specific $k$. It is easy now to make a manipulate which varies $k$ and see which values causes it to become unstable. – Nasser Aug 14 '13 at 23:11
up vote 1 down vote accepted

Rather than try to code the numerical solver loop yourself, Mathematica has great built in functions. In the comments, @Mr.Wizard suggested FindRoot, but Solve may be easier for you:

Solve[((5 k)/(5 k + (4 + s) (200 + s)) /. s -> 0) == .95, k]

{{k -> 3040.}}
share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.