# I think this is supposed to work...?

Hi, I’m trying to follow this paper

De Tommasi, L. and Gustavsen, B. and Dhaene, T., “Robust transfer function identification via an enhanced magnitude vector fitting algorithm”, Control Theory Applications, IET (2010), 1169 -1178.

In section 5 of that article, it mentions using CVX for creating DCP to get an optimized minimization, with constraints. Basically we have an overdetermined problem of the form AX=B and we want to solve for X such that AX will always yield non-negative values. (A is a matrix with as many columns as X has rows. A and B have the same number of rows, which can be very large depending on the number of frequency points being fitted)

I’ve tried to implement the following code:

``````        Bz = zeros(size(B));
cvx_begin()
variable X(Norder+offs) complex;
minimize( norm(A*X-B,2) );
subject to
A*(X) >= Bz;
if (opts.asympflag>1)
X(Norder+offs) >= 0;
end
cvx_end
``````

Here is the error I get:

``````Error using cvxprob/newcnstr (line 181)
Disciplined convex programming error:
Invalid constraint: {complex affine} >= {constant}

Error in cvx/ge (line 21)
b = newcnstr( evalin( 'caller', 'cvx_problem', '[]' ), x, y, '>=' );

Error in wmagvf (line 457)
A*X >= Bz;
``````

I’m a bit confused, since according to the paper:

Combining some DCP rules, it can be
found that a minimisation problem
consisting of a convex objective
function and ‘greater than’ inequality
constraints, where the left side is
concave and the right side is convex,
is a DCP problem. Problem (15) under
constraints (22) belongs to such
category of DCPs. In fact, the
objective function to be minimised
when solving (15) is convex, because
attainable by composition of an affine
inner component and a convex outer
component, that is the norm-2 function
(affine composition rule). Moreover,
left-hand sides of (22) are affine
(and therefore concave) whereas
right-hand sides are constant (and
therefore convex).

Thanks in advance for any help with this problem!

ng

I can’t address what is happening in the paper. But I can say that it actually makes no sense to specify an inequality with complex values. What does it mean to say `x >= y`, for instance, if both `x` and `y` are complex? Inequalities require real values on both sides.

The thing is, when we multiply A with X, we should get purely real non-negative values, and never complex values (even though A and X are complex). Therefore, the inequality should work out in the end.

Oh, I think it works now. I modified the code…

``````        Bz=zeros(size(B));
cvx_begin()
variable X(Norder+offs) complex;

minimize( norm(A*X-B,2) );
subject to
real(A*(X)) >= Bz;
if (opts.asympflag>1)
X(Norder+offs) >= 0;
end
cvx_end
``````

Note that the change was to wrap the condition

``````  A*(X) >= Bz
``````

with a real() as in

`````` real(A*(X)) >= Bz
``````

Thanks to mcg!