I'm working on a problem that involves a CUK converter. In control theory, a system is marginally stable if the real part of all eigenvalues are equal to zero. Actually, the eigenvalues of a matrix $A$ in a thing called the space-state model. Okay, so I have this matrix $A$ that depends of another matrices. Okay, when a system is unstable we would like to fix it using a controller. So I'm trying to figure out a gain $k_c$ that makes the system marginally stable. The code to do that is the following:

kst = 1/10;
ka = 1/20;
A = {{-64.383, 0, -22.35, 0}, {0, 0, 27.65, -50}, {1788, -2212, 0, 
    0}, {0, 4000, 0, -333.333}};
B = {3619.3, 3619.3, -29800, 0} ;
Cc = {0, 0, 0, 1} ;
NSolve[Re[Eigenvalues[A - Outer[Times, B ka kst kc, Cc]]] == 0, kc]
 Re[Eigenvalues[A - Outer[Times, B ka kst kc, Cc]]] < 0, kc, Reals]

(The part about FindInstace is to know what values of kc makes the system stable).

Okay, the output for NSolve is a huge matrix. Since it is pretty large I will write a few elements of it.

{{Re[Root[System`ReduceDump`P$77107[1], 3]] -> 0, 
  Re[Root[System`ReduceDump`P$77107[1], 4]] -> 0, 
  Re[Root[System`ReduceDump`P$77107[1], 2]] -> 
   0}, {Re[Root[System`ReduceDump`P$77107[1], 3]] -> 0, 
  Re[Root[System`ReduceDump`P$77107[1], 4]] -> 0, 
  Re[Root[System`ReduceDump`P$77107[1], 2]] -> 
   0}, {Re[Root[System`ReduceDump`P$77107[1], 3]] -> 0, 
  Re[Root[System`ReduceDump`P$77107[1], 4]] -> 0, 
  Re[Root[System`ReduceDump`P$77107[1], 2]] -> 0},
  • That is the output for NSolve.Here is where the first question comes up: What does it mean that output? Mathematica was unable to solve the equation or the equation just hasn't any solutions?

  • The output for FindInstance says kc->0. But that isn't correct. Actually If I set kc=0.8 I get the real parts of the eigenvalues negative.

  • 1
    $\begingroup$ If you're just interested in numerical solutions for this problem have a look at NRoots. Also some of the functions specifically for Control theory calculations in guide/ControlSystems might be useful for your problem. $\endgroup$ Commented Sep 8, 2017 at 18:36

1 Answer 1


If you are not very particular about using Solve/NSolve, you can determine that graphically using RootLocusPlot.

tfm = TransferFunctionModel[
      StateSpaceModel[{A, Transpose@{B} ka kst kc, {Cc}}], s]
RootLocusPlot[tfm, {kc, 0, 5}, AspectRatio -> Full]

enter image description here

It appears that the system will become marginally stable when $kc=2.5$.


The manual way to obtain the marginally stable value.

Compute the characteristic polynomial. (The roots of this polynomial are the closed-loop eigenvalues.)

charPoly = Denominator[SystemsModelFeedbackConnect[tfm][s][[1, 1]]]==0

9.30495*10^9 + 5.41032*10^9 kc + 5.05222*10^7 s - 1.1819*10^7 kc s + 322585. s^2 + 72386. kc s^2 + 397.716 s^3 + s^4 == 0

The stability test.

stableQ[k_] := AllTrue[s /. NSolve[charPoly /. kc -> k, s], Re[#]<0 &]

TableForm[Table[{k, stableQ[k]}, {k, 2, 3, 0.1}], 
          TableHeadings -> {{}, {"kc", "stableQ"}}]

enter image description here

  • $\begingroup$ I'm not very familiar with Root Locus (I'm a student of control theory and we haven't seen that yet in class). It seems the graph is very clear but honestly I think I'm not getting it. Why do you say kc=2.5 makes the system M.S? Isn't it supposed to be kc=250? $\endgroup$ Commented Sep 8, 2017 at 19:46
  • 1
    $\begingroup$ I'm sure it will be clear to you once you understand the root locus plot. It will be marginally stable at $kc=250$ when (for example) $kst=1/100$ and $ks=1/200$. For the values in the question it's 2.5. $\endgroup$ Commented Sep 8, 2017 at 19:55
  • $\begingroup$ I did read a lot about Root Locus method and it makes sense but I'm still unclear about how to get the k value. Because what you have there as matrices aren't the ones I need. I tried to do the same with the correct matrices and I got a different plot but I'm unsure on how to get the k value. Is there any method in Mathematica to get that "k"? $\endgroup$ Commented Sep 8, 2017 at 21:58
  • 1
    $\begingroup$ I suspect that you are mixing up the closed- and open-loop systems. I will update the answer on how to figure it out manually using NSolve. RootLocusPlot is also essentially using NSolve to get the plot. $\endgroup$ Commented Sep 9, 2017 at 21:09
  • $\begingroup$ I tried using the correct matrices for my problem. That is, AA=A-B ka kc kstC ; BB=B ka kc ; C is the same matrix you used. When doing the same you did, I get a wrong table. Actually, it says "False" for every k value. If you think I should create a new post, please let me know. $\endgroup$ Commented Sep 9, 2017 at 22:23

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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