home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 10 / 10.iso / l / l455 / 7.ddi / ROBUST.DI$ / DES2SS.M < prev    next >
Encoding:
Text File  |  1993-03-11  |  1.9 KB  |  90 lines

  1. function [ad,bd,cd,dd] = des2ss(Z1,Z2,Z3,Z4,Z5);
  2. % [SS_D] = DES2SS(SS_DES) or
  3. % [AD,BD,CD,DD] = DES2SS(A,B,C,D,E) reduces the descriptor form system
  4. %   into the regular state-space form via SVD of the descriptor E.
  5. %   
  6. %   Input Data: ss_des = mksys(a,b,c,d,e,'des');
  7. %   Output Data: ss_d  = mksys(a,b,c,d);
  8.  
  9. % R. Y. Chiang & M. G. Safonov 1/89
  10. % Copyright (c) 1988 by the MathWorks, Inc.
  11. % All Rights Reserved.
  12. % ---------------------------------------------------------------------
  13.  
  14. inargs = '(a,b,c,d,e)';
  15. eval(mkargs(inargs,nargin,'des'))
  16.  
  17. % check dimensional compatibility
  18. [a b;c d];
  19. [a' b;c d];
  20. [e b;c d];
  21. %
  22. % find the dim. of the null space of "e"
  23. %
  24. se = svd(e);
  25. k = size(find(se<1.e-12))*[1;0];
  26. %
  27. [ns,ns]=size(a);
  28. if ns==0,
  29.    ad=[];   bd=[];   cd=[];   dd=d;
  30.    return;
  31. end
  32. if k>ns,
  33.     error('DES2SS error: Cannot have k>ns');
  34. end
  35. if k<0,
  36.     error('DES2SS error: Cannot have k<0');
  37. end
  38. %
  39. [ue,se,ve] = svd(e);
  40. e=ue'*e*ve;
  41. a=ue'*a*ve;
  42. b=ue'*b;
  43. c=c*ve;
  44. ns1=ns-k;
  45. %
  46. if rank(e,1.e-12) < ns1
  47.    error('DES2SS error: [rank(e)+k] < size(a)');
  48. end
  49. %
  50. if rank(e,1.e-12) > ns1
  51.    disp('DES2SS warning: [rank(e)+k] > size(a)');
  52. end
  53. %
  54. sei2 = (inv(se(1:ns1,1:ns1)))^.5;
  55. a11 = a(1:ns1,1:ns1);
  56. bb1 = b(1:ns1,:);
  57. cc1 = c(:,1:ns1);
  58. if k>0,
  59.    a22 = a(ns1+1:ns,ns1+1:ns);
  60.    [ua,sa,va] = svd(a22);
  61.    a22=sa;
  62.    a12 = a(1:ns1,ns1+1:ns)*va;
  63.    a21 = ua'*a(ns1+1:ns,1:ns1);
  64.    a22i = pinv(a22);
  65.    bb2 = ua'*b(ns1+1:ns,:);
  66.    cc2 = c(:,ns1+1:ns)*va;
  67.    ad = a11 - a12*a22i*a21;
  68.    bd = bb1  - a12*a22i*bb2;
  69.    cd = cc1 - cc2 * a22i * a21;
  70.    dd = d - cc2 * a22i * bb2;
  71. else
  72.    ad=a11;
  73.    bd=bb1;
  74.    cd= cc1;
  75.    dd=d;
  76. end
  77. if ns1 > 0
  78.    ad= sei2*ad*sei2;
  79.    bd= sei2*bd;
  80.    cd= cd*sei2;
  81. else
  82.    ad = -1.e15*eye(ns); bd = zeros(ns,size(b)*[0;1]);
  83.    cd = zeros(size(c)*[1;0],ns);
  84. end
  85. %
  86. if xsflag
  87.    ad = mksys(ad,bd,cd,dd);
  88. end
  89. %
  90. % ------------- End of DES2SS.M --- RYC/MGS %