home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 10 / 10.iso / l / l455 / 2.ddi / MUTOOLS2.DI$ / HINF_C.M < prev    next >
Encoding:
Text File  |  1993-03-11  |  2.6 KB  |  103 lines

  1.  
  2. % function [k] = hinf_c(p,nmeas,ncon,xinf,yinf,f,h,gfin,r12,r21)
  3. %
  4. % Form the controller given the gamma value and xinf, yinf
  5. %
  6. function [k] = hinf_c(p,nmeas,ncon,xinf,yinf,f,h,gfin,r12,r21)
  7. [a,bp,cp,dp,b1,b2,c1,c2,d11,d12,d21,d22,ndata] = hinf_sp(p,nmeas,ncon);
  8. np1 = ndata(1);
  9. np2 = ndata(2);
  10. nm1 = ndata(3);
  11. nm2 = ndata(4);
  12. np = max(size(a));
  13. %
  14. % form the submatrices f11,f12,f2 and h11,h12,h2
  15. %
  16. f11=f(1:(nm1-np2),:);
  17. f12=f((nm1-np2+1):nm1,:);
  18. f2=f((nm1+1):(nm1+nm2),:);
  19. h11=h(:,1:(np1-nm2));
  20. h12=h(:,(np1-nm2+1):np1);
  21. h2=h(:,(np1+1):(np1+np2));
  22. %
  23. %  partition d11
  24. %
  25. d1111=d11(1:(np1-nm2),1:(nm1-np2));
  26. d1112=d11(1:(np1-nm2),(nm1-np2+1):nm1);
  27. d1121=d11((np1-nm2+1):np1,1:(nm1-np2));
  28. d1122=d11((np1-nm2+1):np1,(nm1-np2+1):nm1);
  29. %
  30. %  form controller k
  31. %
  32. %  have to check for null ([]) values  of d1111,d1112,d1121,d1122
  33. %
  34.   [rd1111,cd1111]=size(d1111);
  35.    sd1112=max(size(d1112));
  36.    sd1121=max(size(d1121));
  37.    sd1122=max(size(d1122));
  38. %
  39. if rd1111==0 | sd1112==0
  40.   d11hat=-d1122;
  41. else
  42.   gdum=inv(gfin*gfin*eye(np1-nm2)-d1111*d1111');
  43.   d11hat=-d1121*d1111'*gdum*d1112-d1122;
  44. end
  45. %
  46. if sd1112==0 
  47.   d21hat=eye(np2);
  48. elseif  rd1111==0
  49.   d21hat=chol(eye(np2)-d1112'*d1112/gfin/gfin);
  50. else
  51.   gdum=inv(gfin*gfin*eye(np1-nm2)-d1111*d1111');
  52.   dum=eye(np2)-d1112'*gdum*d1112;
  53.   d21hat=chol(dum);
  54. end
  55. if  sd1121==0
  56.   d12hat=eye(nm2);
  57. elseif cd1111==0 
  58.   d12hat = chol(eye(nm2)-d1121*d1121'/gfin/gfin)';
  59. else
  60.   gdum=inv(gfin*gfin*eye(nm1-np2)-d1111'*d1111);
  61.   dum=eye(nm2)-d1121*gdum*d1121';
  62.   d12hat=chol(dum)';
  63. end
  64. %
  65. z = inv(eye(np)-yinf*xinf/(gfin*gfin));
  66. clear gdum dum
  67. b2hat=(b2+h12)*d12hat;
  68. c2hat=-d21hat*(c2+f12)*z;
  69. b1hat=-h2+(b2hat/d12hat)*d11hat;
  70. c1hat=f2*z+(d11hat/d21hat)*c2hat;
  71. ahat=a+h*cp+(b2hat/d12hat)*c1hat;
  72. %
  73. % form the controller for the case where d22 is zero
  74. %
  75. %  back-substitute scaling factors r12 and r21
  76. %
  77. b1hat=b1hat*r21;
  78. c1hat=r12*c1hat;
  79. bhat=[b1hat,b2hat];
  80. chat=[c1hat;c2hat];
  81. dhat=[r12*d11hat*r21,r12*d12hat;d21hat*r21,(0.*d11hat')];
  82. %  this part of the program allows for a d22 non-zero in the plant matrix
  83. %  it assumes that phi=0 
  84. %
  85. %  check that the det(i+d11hat*d22) is non-zero
  86. %
  87. % if (1-det(d11hat*d22)) < eps
  88. % if abs(det(eye(nm2)+d11hat*d22)) < eps
  89. if cond(eye(nm2)+d11hat*d22) > 1/eps
  90.    error('  det(I+d11hat*d22) is zero ')
  91.  end
  92. d22new=[d22,(0.*eye(np2));(0.*eye(nm2)),(0.*d22')];
  93. m=inv(eye(nm2+np2)+d22new*dhat);
  94. mhat=inv(eye(nm2+np2)+dhat*d22new);
  95. ahat=ahat-bhat*((eye(nm2+np2)-m)/dhat)*chat;
  96. bhat=bhat*m;
  97. chat=mhat*chat;
  98. dhat=dhat*m;
  99. k = pck(ahat,bhat(:,1:np2),chat(1:nm2,:),dhat(1:nm2,1:np2));
  100. %
  101. % Copyright MUSYN INC 1991,  All Rights Reserved
  102.