I am new to using the CVXOPT module for Python and would definitely appreciate any illumination as to why the exception is thrown for my problem. (Also my first time posting a problem anywhere, so please do excuse any faux pas I may have committed.)
Using Python, I am trying to solve the LMI feasibility problem with matrices $P$, $K$ as variables:
$$A^T P + PA - C^TK^T - KC < 0,$$ $$P > 0,$$
where $A \in \mathbb{R}^{n x n}$, $P=P^T$ and, $C \in \mathbb{R}^{n x m}$, and $K \in \mathbb{R}^{m x n}$. This is formulated as,
\begin{align} \mathrm{minimise}:&\ \ t\\ \mathrm{subj}:&\ \ A^T P + PA - C^TK^T - KC + t I < 0,\\ &\ \ P > 0, \end{align}
where $I$ is the identity matrix of appropriate dimensions. I am using the numerical values,
$$A = \begin{array}{ccc} \left[\begin{array}{ccc} 0.1 & -1.0 & 0.0 \\ 1.0 & 0.1 & 0.0 \\ 0.0 & 0.0 & -0.28 \end{array}\right] & , & C = I. \end{array}$$
I tried first solving,
$$A^T P + PA + t I< 0$$ $$P > 0$$
and it worked fine. Using the PICOS frontend, the code is here:
import numpy
import cvxopt
import picos as pic
# Parameters of the Rabinovich-Fabrikant system
g = 0.1
a = 0.14
A_mat = numpy.matrix([
[g, -1.0, 0.0],
[1.0, g, 0.0],
[0.0, 0.0, -2 * a]
])
C_mat = numpy.identity(3)
# Create problem instance.
prob = pic.Problem()
# Define variables.
t = prob.add_variable('t', 1)
P = prob.add_variable('P', (3, 3), vtype='symmetric')
# Define parameters.
A = pic.new_param('A', A_mat)
C = pic.new_param('C', C_mat)
I = pic.new_param('I', numpy.identity(3))
# Constraints
prob.add_constraint(P >> 0)
prob.add_constraint(A.T * P + P * A - t * I << 0)
# Set objective and solve.
prob.set_objective('min', t)
prob.solve()
The problem begins when I add the 'K' variable in, adding before '# Define parameters' the line,
K = prob.add_variable('K', (3, 3))
I am not sure how PICOS/CVXOPT interprets just adding another variable, without using it in any 'add_constraint', but it throws the exception in the subject
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/mnt/NonlinearObserver/SolveWithPicos.py", line 78, in <module>
prob.solve()
File "/usr/local/lib/python3.4/dist-packages/picos/problem.py", line 4555, in solve
primals, duals, obj, sol = self._cvxopt_solve()
File "/usr/local/lib/python3.4/dist-packages/picos/problem.py", line 4809, in _cvxopt_solve
self.cvxoptVars['b'])
File "/usr/local/lib/python3.4/dist-packages/cvxopt/coneprog.py", line 573, in conelp
raise ValueError("Rank(A) < p or Rank([G; A]) < n")
ValueError: Rank(A) < p or Rank([G; A]) < n
The same error occurs even if I replace the LMI constraint with,
prob.add_constraint(A.T * P + P * A - C.T * K.T - K * C + t * I << 0)
Regarding the exception thrown, it seems clear to me that (from the cvxopt documentation) A=0 for me since I have no equality constraints. So, 'rank(A) < p' should not be the issue? Then, the questions become:
What exactly is n in the exception?
What is [G ; A]?
Is there something mathematically obvious about (the rank of the left side of) $A^T P + PA - C^TK^T - KC + t Id < 0$ that I am missing which will cause the exception to be thrown?
For those in the know of control theory (I am amateur at best here), I am ok with $C$ being a truncated identity matrix, corresponding to observing only a subset of the underlying state. For example, $C = \left[\begin{array}{ccc} 1 & 0 & 0 \\ 0 & 1 & 0\end{array} \right]$. Would that help?
I had no luck with tracing through the source code in coneprog.py (got a bit dizzy doing so in the process...maybe it's because I still got lots to learn...).
Thanks a lot for reading! Hopefully this is not a redundant question, but I have searched for days without luck...
The reference for the optimization you are trying to solve is present at http://cvxopt.org/userguide/coneprog.html.
Now, addressing your questions (out of order so things are clearer):
1 and 2) Matrix $A$ defines the equality constraints of the problem and p is the number of equality constraints (thus the number of rows in A). While matrix $G$ defines the inequality constraint. And finally, $n$ is the number of variables in your optimization (size of $x$).
$\text{rank}([G, A]) < n $ means that the combination of your equality and inequality constraints do not span the whole free variable space of your optimization and thus it is a unbounded Linear Programming (optimal $t = -\infty$). While $\text{rank}(A) < p$ means that the equality constraints are ill defined.
From the fact that you do not have equality constraints I'd assume you have the second. And why is answered in your third question.
3) Since $A^TP+PA < 0$ already has a solution, it is easy to see that $ K \equiv 0 $ is a solution to your problem. However, there are infinitely other solutions that results in the same value of $ t $. This causes your system to be have infinite valid solutions and be ill-defined ($ \text{rank}([G, A]) < n $) for this specific solver.
4) Be sure that for any choice of matrix C is system is output controllable. If you problem had a high number of states this would help since the optimization would be too big, but for the size you have it shouldn't be a problem.