H-Infinity "a stabilizing controller cannot be found"

:) hey guys

I'm trying to make an H-Infinity controler, but it's not working. Can anyone see what I might be doing wrong, or test this program in MATLAB to see if it's just an Octave problem?

I posted this on reddit, but there is something wrong with my account, so I can't post comments.

My system is a just a 1D mass. The control effort (u) and the disturbance (w) effect the system in the same way (by applying a force)

Code:
pkg load control

% 1D mass effected by force (1/s^2)
% x = [x x_dot]'
A = [0 1;0 0];
B = [0 1]';
C = [1 0];


% unweighted system
% outputs = [x u x]'
%            \/  |
%             z  y
%
% disturbance effects the system the same way that the control input does
% (a force) so B matrix is the same
P = ss(A,[B B],[C; 0 0; C],[0 0;0 1;0 0]);

% apply weights
Wu=zpk([-1],[-100],10); % weight for control actuator effort
Wx=zpk([-1],[-.01],.1); % weight for disturbance rejection
one = ss([],[],[],[1]);
zero = ss([],[],[],[0]);
P = [Wx zero zero;zero Wu zero;zero zero one]*P;

% we can find a simple stabilizing controler
% with maximum closed loop response singular values on the order of 1
% bode plots of closed_loop_x and closed_loop_u
% show maximum response to disturbance of 0dB
% bandwidth limited (for realizability) PD controller K=-10x-10x_dot
K=-(10+zpk([0],[],10)*zpk([],[-1000,-1000],1000^2));
closed_loop = lft(P,K,1,1);
isstable(closed_loop);
closed_loop_x = [one zero]*closed_loop;
closed_loop_u = [zero one]*closed_loop;


% :/ but this (below) doesn't work :)
%
% An infinite bandwidth controller should produce a higher H-infinity response
% because of the x10 weight penalty on high frequency control effort
%
% And weak feedback should also produce a high H-infinity response because
% because of (with or without weighting) unimpeded response to disturbance
%
% So feedback that is either too weak or too strong produce bad controllers
% by H-Infinity metric. And I found one that works nicely.
% :) why can't hinfsyn?
hinfsyn(P,1,1)
This produces:
Code:
error: hinfsyn: 12: a stabilizing controller cannot be found
error: called from
    hinfsyn at line 249 column 48
    file_name at line 48 column 1
:) thank you
 
Temporarily use constant weights, for example, Wu = tf(1); Wx = tf(1), to see if synthesis works.
Then, gradually increase the frequency dependence of weights to test feasibility boundaries.
Test in MATLAB if possible — Octave's hinfsyn is not always equivalent.
 
Top