$H_\infty$ control with stable controllers

This short illustration shows how to use hinfstruct to enforce stability of controllers in solving an $H_\infty$ problem.

Problem borrowed from "On the Stable Controller Parameterization Under Sufficient Condition", Youngjin Choi and Wan Kyun Chung, IEEE TAC vol. 46, no. 10, 2001. See also "Remarks on Strong Stabilization and Stable H-infinity Controller Design Suat Gumussoy and Hitay Ozbay IEEE TAC, vol. 50, no. 12, 2005, for a review of different techniques.

Contents

Build standard form

s = tf('s');
G = (s^2+0.1*s+0.1)/((s-0.1)*(s-1)*(s^2+2*s+3)); ny =1; nu =1; nx = 4;
[a,b,c,d] = ssdata(G) ;
P = ss(a , [b zeros(nx,1) b], [c;zeros(1,nx);c], [0 1 0;0 0 1; 0 1 0]) ;

Compute full-order optimal controller with hinfsyn

[K,clp,gamHinfsyn] = hinfsyn(P,ny,nu) ;

Show that full-order controller is unstable

max( real(eig(K)) ) ,
ans =

    0.1995

Use hinfstruct to synthesize reduced-order stable controller

Include controller stability constraints as a fictitious performance channel

k = 3 ; % prescribed controller order
C0 = ltiblock.ss('C0',k,1,1);
CL0 = lft(P, C0);
H0 = blkdiag( CL0 , 0*C0) ; % fictitious performance channel

Solve $H_\infty$ problem with hinfstruct

[H,gam] = hinfstruct(H0) ;
Css = ss(H.Blocks.C0) ;
Final: Peak gain = 16.3, Iterations = 149
       Spectral abscissa -2.61e-07 is close to bound -1e-07

Check stability of reduced-order controller and achieved $H_\infty$ norm

max( real(eig(Css)) ) , norm( lft(P , Css) , inf)
ans =

  -2.6128e-07


ans =

   16.2138

Compute stable controller of full order

C0 = ltiblock.ss('C0',order(P),1,1);
CL0 = lft(P, C0);
H0 = blkdiag( CL0 , 0*C0) ; % fictitious performance channel

Solve $H_\infty$ problem with hinfstruct

[H,gamHinfstruct] = hinfstruct(H0) ;
Css = ss(H.Blocks.C0) ;
Final: Peak gain = 16.2, Iterations = 87
       Spectral abscissa -1.08e-07 is close to bound -1e-07

Check controller stability

max( real( eig( Css ) ) ),
ans =

  -1.0841e-07

Compare achieved H-infinity norms with full-order unstable and stable controllers

fprintf(1,'\n\n HINFSYN:  %6.2f  HINFSTRUCT:  %6.2f \n\n', gamHinfsyn,  gamHinfstruct);

 HINFSYN:   12.02  HINFSTRUCT:   16.25