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

其他行业

开发平台:

Matlab

  1. function [K,Af]= placepol(A,B,C,P)
  2. %  H. Saadat, 1998
  3. clc
  4. % discr=[
  5. %' This function is used for the pole placement design based on the    '
  6. %' Ackermann`s formula.  A is the system matrix, B is the input column '
  7. %' vector & C is the output row vector.   P is a row vector containing '
  8. %' the desired closed-loop poles.  The function displays the feedback  '
  9. %' vector K, the open-loop plant transfer function and the controlled  '
  10. %' closed-loop transfer function. The gain K and the closed-loop system'
  11. %' matrix Af are returned.                                             '
  12. %'                                                                    '];
  13. %disp(discr)
  14. n=length(A);
  15.   for i=1:n;
  16.   S(:,n+1-i) = A^(n-i)*B;
  17.   end
  18.   if rank(S)~=n
  19.   error('System is not state controllable')
  20.   else
  21. T=inv(S);
  22.    end
  23. q=zeros(1,n); q(n)=1;
  24. H=q*T;
  25. p=poly(P);
  26. AL=zeros(n);
  27. for i=1:n+1
  28. AL=AL+p(n+2-i)*A^(i-1);
  29. end
  30. K=H*AL;        % Requlator constants
  31. Af=A-B*K;      % Closed-loop system matrix
  32. fprintf('Feedback gain vector K  n'),
  33. for i=1:n, fprintf('  %g',K(i)),fprintf(' '),end,fprintf('nn')
  34. D=0;
  35. if length(C(:,1)) > 1 return
  36. else
  37. [num, den]=ss2tf(A,B,C,D,1);
  38. for i=1:length(num)
  39. if abs(num(i)) <=1e-08 num(i)=0;else end,end
  40. [numclsd, denclsd]=ss2tf(Af,B,C,D,1);
  41. for i=1:length(numclsd)
  42. if abs(numclsd(i)) <=1e-08 numclsd(i)=0;else end,end
  43. %fprintf('Uncompensated Plant transfer function: n'),
  44. %fprintf('Numerator   ')
  45. %for i=1:length(num), fprintf('  %g',num(i)),fprintf('  '),end,fprintf('n')
  46. %fprintf('Denominator ')
  47. %for i=1:length(den), fprintf('  %g',den(i)),fprintf('  '),end,fprintf('nn')
  48. fprintf('Uncompensated Plant')
  49. GH = tf(num, den)
  50. %fprintf('Compensated system closed-loop transfer function: n')
  51. %fprintf('Numerator   ')
  52. %for i=1:length(numclsd), fprintf('  %g',numclsd(i)),fprintf('  '),end,fprintf('n')
  53. %fprintf('Denominator ')
  54. %for i=1:length(denclsd), fprintf('  %g',denclsd(i)),fprintf('  '),end,fprintf('nn')
  55. fprintf('Compensated system closed-loop')
  56. T = tf(numclsd, denclsd)
  57. fprintf('Compensated system matrix A - B*K n')
  58. disp(Af)
  59. end