Placeobs.m
上传用户:eighthdate
上传日期:2014-05-24
资源大小:270k
文件大小:3k
源码类别:

其他行业

开发平台:

Matlab

  1. function [K,G, Af] = placeobs(A,B,C,P,Pe)
  2. %  H. Saadat,  1998
  3. clc
  4. % discr=[
  5. %' This function is used for the combined pole placement and observer  '
  6. %' design based on Ackermann`s formula.  A is the system matrix, B is  '
  7. %' the input column vector and C is the output row vector.             '
  8. %' P is a row vector containing the desired closed-loop poles and Pe is'
  9. %' the desired estimator roots.  The function displays the gain vectors'
  10. %' K and G, open-loop plant transfer function and the controlled system'                                               '
  11. %  closed-loop transfer function. Also, the function returns the gains '
  12. %  K & G, and the combined system matrix.                              '
  13. %'                                                                    '];
  14. %disp(discr)
  15. n=length(A);
  16.   for i=1:n;
  17.   S(:,n+1-i) = A^(n-i)*B;
  18.   end
  19.   if rank(S)~=n
  20.   error('System is not state controllable')
  21.   else
  22. T=inv(S);
  23.    end
  24. q=zeros(1,n); q(n)=1;
  25. H=q*T;
  26. p=poly(P);
  27. AL=zeros(n);
  28. for i=1:n+1
  29. AL=AL+p(n+2-i)*A^(i-1);
  30. end
  31. K=H*AL;        % Regulator constants
  32. fprintf('Feedback gain vector K  n'),
  33. for i=1:n, fprintf('  %g',K(i)),fprintf(' '),end,fprintf('nn')
  34.   for i=1:n;
  35.   V(n+1-i,:) = C*A^(n-i);
  36.   end
  37.   if rank(V)~=n
  38.   error('System is not state observable')
  39.   else
  40. W=inv(V);
  41.    end
  42. qe=zeros(n,1); qe(n)=1;
  43. He=W*qe;
  44. pe=poly(Pe);
  45. AL=zeros(n);
  46. for i=1:n+1
  47. AL=AL+pe(n+2-i)*A^(i-1);
  48. end
  49. G=AL*He;         % estimator constants
  50. fprintf('Estimator gain vector G: n'),
  51. for i=1:n, fprintf('  %gn',G(i)), end,fprintf('n')
  52. Ae=A-G*C-B*K;  Be=G; Ce=-K; De=0;
  53. [numG, denG]=ss2tf(Ae,Be,Ce,De,1);
  54. numG=-numG; D=0;
  55. for i=1:length(numG)
  56. if abs(numG(i)) <= 1e-08 numG(i)=0; else,end,end
  57. [num, den]=ss2tf(A,B,C,D,1);
  58. for i=1:length(num)
  59. if abs(num(i)) <= 1e-08 num(i)=0; else,end,end
  60. z=zeros(n);
  61. Af=[A-B*K B*K; z A-G*C];
  62. numopen=conv(num,numG);
  63. denopen=conv(den,denG);
  64. denclsd=numopen+denopen;
  65. %fprintf('Open-loop Plant transfer function: n'),
  66. %fprintf('Numerator   ')
  67. %for i=1:length(num), fprintf('  %g',num(i)),fprintf('  '),end,fprintf('n')
  68. %fprintf('Denominator ')
  69. %for i=1:length(den), fprintf('  %g',den(i)),fprintf('  '),end,fprintf('nn')
  70. fprintf('Open-loop Plant')
  71. GH = tf(num,den)
  72. %fprintf('Controller-estimator transfer function: n'),
  73. %fprintf('Numerator   ')
  74. %for i=1:length(numG), fprintf('  %g',numG(i)),fprintf('  '),end,fprintf('n')
  75. %fprintf('Denominator ')
  76. %for i=1:length(denG), fprintf('  %g',denG(i)),fprintf('  '),end,fprintf('nn')
  77. fprintf('Controller-estimator')
  78. CEG = tf(numG, denG)
  79. %fprintf('Controlled system closed-loop transfer function: n')
  80. %fprintf('Numerator   ')
  81. %for i=1:length(numopen), fprintf('  %g',numopen(i)),fprintf('  '),end,fprintf('n')
  82. %fprintf('Denominator ')
  83. %for i=1:length(denclsd), fprintf('  %g',denclsd(i)),fprintf('  '),end,fprintf('nn')
  84. fprintf('Controlled system closed-loop')
  85. T = tf(numopen, denclsd)
  86. fprintf('Combined controller observer system matrix n')
  87. disp(Af)