home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / octa21eb.zip / octave / SCRIPTS.ZIP / scripts.fat / control / dgkfdemo.m < prev    next >
Text File  |  1999-04-29  |  12KB  |  349 lines

  1. # Copyright (C) 1996 A. Scottedward Hodel 
  2. #
  3. # This file is part of Octave. 
  4. #
  5. # Octave is free software; you can redistribute it and/or modify it 
  6. # under the terms of the GNU General Public License as published by the 
  7. # Free Software Foundation; either version 2, or (at your option) any 
  8. # later version. 
  9. # Octave is distributed in the hope that it will be useful, but WITHOUT 
  10. # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
  11. # FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License 
  12. # for more details.
  13. # You should have received a copy of the GNU General Public License 
  14. # along with Octave; see the file COPYING.  If not, write to the Free 
  15. # Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  16.  
  17. function dgkfdemo()
  18. # Octave Controls toolbox demo: H2/Hinfinity options demos
  19. # Written by A. S. Hodel June 1995
  20.  
  21.   save_val = page_screen_output;
  22.   page_screen_output = 1;
  23.   while (1)
  24.     clc
  25.     menuopt=0;
  26.     while(menuopt > 10 || menuopt < 1)
  27.       menuopt = menu('Octave H2/Hinfinity options demo', ...
  28.         'LQ regulator', ...
  29.         'LG state estimator', ...
  30.         'LQG optimal control design', ...
  31.         'H2 gain of a system', ...
  32.         'H2 optimal controller of a system', ...
  33.         'Hinf gain of a system', ...
  34.         'Hinf optimal controller of a SISO system', ...
  35.         'Hinf optimal controller of a MIMO system', ...
  36.         'Discrete-time Hinf optimal control by bilinear transform', ...
  37.         'Return to main demo menu');
  38.     endwhile
  39.     if (menuopt == 1)
  40.       disp('Linear/Quadratic regulator design:')
  41.       disp('Compute optimal state feedback via the lqr command...')
  42.       help lqr
  43.       disp(' ')
  44.       disp('Example:')
  45.       A = [0 1; -2 -1]
  46.       B = [0; 1]
  47.       Q = [1 0; 0 0]
  48.       R = 1
  49.       disp("Q = state penalty matrix; R = input penalty matrix")
  50.       prompt
  51.       disp('Compute state feedback gain k, ARE solution P, and closed-loop')
  52.       disp('poles as follows:');
  53.       cmd = "[k p e] = lqr(A,B,Q,R)";
  54.       run_cmd
  55.       prompt
  56.       disp("A similar approach can be used for LTI discrete-time systems")
  57.       disp("by using the dlqr command in place of lqr (see LQG example).")
  58.     elseif (menuopt == 2)
  59.       disp('Linear/Gaussian estimator design:')
  60.       disp('Compute optimal state estimator via the lqe command...')
  61.       help lqe
  62.       disp(' ')
  63.       disp('Example:')
  64.       A = [0 1; -2 -1]
  65.       disp("disturbance entry matrix G")
  66.       G = eye(2)
  67.       disp("Output measurement matrix C")
  68.       C = [0  1]
  69.       SigW = [1 0; 0 1]
  70.       SigV = 1
  71.       disp("SigW = input disturbance intensity matrix;")
  72.       disp("SigV = measurement noise intensity matrix")
  73.       prompt
  74.       disp('Compute estimator feedback gain k, ARE solution P, and estimator')
  75.       disp('poles via the command: ')
  76.       cmd = "[k p e] = lqe(A,G,C,SigW,SigV)";
  77.       run_cmd
  78.       disp("A similar approach can be used for LTI discrete-time systems")
  79.       disp("by using the dlqe command in place of lqe (see LQG example).")
  80.     elseif (menuopt == 3)
  81.       disp('LQG optimal controller of a system:')
  82.       disp('Input accepted as either A,B,C matrices or in system data structure form')
  83.       disp('in both discrete and continuous time.')
  84.       disp("Example 1: continuous time design:")
  85.       prompt
  86.       help lqg
  87.       disp("Example system")
  88.       A = [0 1; .5 .5];
  89.       B = [0 ; 2];
  90.       G = eye(2)
  91.       C = [1 1];
  92.       sys = ss2sys(A,[B G],C);
  93.       sys = syssetsg(sys,"in", ...
  94.                ["control input"; "disturbance 1"; "disturbance 2"]);
  95.       sysout(sys)
  96.       prompt
  97.       disp("Filtering/estimator parameters:")
  98.       SigW = eye(2)
  99.       SigV = 1
  100.       prompt
  101.       disp("State space (LQR) parameters Q and R are:")
  102.       Q = eye(2)
  103.       R = 1
  104.       cmd = "[K,Q1,P1,Ee,Er] = lqg(sys,SigW,SigV,Q,R,1);";
  105.       run_cmd
  106.       disp("Check: closed loop system A-matrix is")
  107.       disp(" [A      B*Cc]")
  108.       disp(" [Bc*C   Ac  ]")
  109.       cmd = "[Ac,Bc,Cc] = sys2ss(K);";
  110.       run_cmd
  111.       cmd = "Acl = [A , B*Cc ; Bc*C  Ac]";
  112.       run_cmd
  113.       disp("Check: poles of Acl:")
  114.       Acl_poles = sortcom(eig(Acl))
  115.       disp("Predicted poles from design = union(Er,Ee)")
  116.       cmd = "pred_poles = sortcom([Er;Ee])";
  117.       run_cmd
  118.       disp("Example 2: discrete-time example")
  119.       cmd1 = "Dsys = ss2sys(A,[G B],C,[0 0 0],1);";
  120.       cmd2 = "[K,Q1,P1,Ee,Er] = lqg(Dsys,SigW, SigV,Q,R);";
  121.       disp("Run commands:")
  122.       cmd = cmd1;
  123.       run_cmd
  124.       cmd = cmd2;
  125.       run_cmd
  126.       prompt
  127.       disp("Check: closed loop system A-matrix is")
  128.       disp(" [A      B*Cc]")
  129.       disp(" [Bc*C   Ac  ]")
  130.       [Ac,Bc,Cc] = sys2ss(K);
  131.       Acl = [A , B*Cc ; Bc*C  Ac]
  132.       prompt
  133.       disp("Check: poles of Acl:")
  134.       Acl_poles = sortcom(eig(Acl))
  135.       disp("Predicted poles from design = union(Er,Ee)")
  136.       pred_poles = sortcom([Er;Ee])
  137.     elseif (menuopt == 4)
  138.       disp('H2 gain of a system: (Energy in impulse response)')
  139.       disp('Example 1: Stable plant:')
  140.       cmd = "A = [0 1; -2 -1]; B = [0 ; 1]; C = [1 0]; sys_poles = eig(A)";
  141.       run_cmd
  142.       disp("Put into Packed system form:")
  143.       cmd = "Asys = ss2sys(A,B,C);";
  144.       run_cmd
  145.       disp("Evaluate system 2-norm (impulse response energy):");
  146.       cmd = "AsysH2 = h2norm(Asys)";
  147.       run_cmd
  148.       disp("Compare with a plot of the system impulse response:")
  149.       tt = 0:0.1:20;
  150.       for ii=1:length(tt)
  151.         ht(ii) = C*expm(A*tt(ii))*B;
  152.       endfor
  153.       plot(tt,ht)
  154.       title("impulse response of example plant")
  155.       prompt
  156.       disp('Example 2: unstable plant')
  157.       cmd = "A = [0 1; 2 1]";
  158.       eval(cmd);
  159.       cmd = "B = [0 ; 1]";
  160.       eval(cmd);
  161.       cmd = "C = [1 0]";
  162.       eval(cmd);
  163.       cmd = "sys_poles = eig(A)";
  164.       run_cmd
  165.       prompt
  166.       disp('Put into system data structure form:')
  167.       cmd="Bsys = ss2sys(A,B,C);";
  168.       run_cmd
  169.       disp('Evaluate 2-norm:')
  170.       cmd = "BsysH2 = h2norm(Bsys)";
  171.       run_cmd
  172.       disp(' ')
  173.       prompt('NOTICE: program returns a value without an error signal.')
  174.       disp('')
  175.  
  176.     elseif (menuopt == 5)
  177.       disp('H2 optimal controller of a system: command = h2syn:')
  178.       prompt
  179.       help h2syn
  180.       prompt
  181.       disp("Example system: double integrator with output noise and")
  182.       disp("input disturbance:")
  183.       disp(" ");
  184.       disp("       -------------------->y2");
  185.       disp("       |   _________");
  186.       disp("u(t)-->o-->| 1/s^2 |-->o-> y1");
  187.       disp("       ^   ---------   ^");
  188.       disp("       |               |");
  189.       disp("      w1(t)           w2(t)");
  190.       disp(" ")
  191.       disp("w enters the system through B1, u through B2")
  192.       disp("z = [y1 ; y2] is obtained through C1, y=y1 through C2");
  193.       disp(" ")
  194.       cmd = "A = [0 1; 0 0];  B1 = [0 0;1 0]; B2 = [0;1];";
  195.       disp(cmd)
  196.       eval(cmd);
  197.       cmd = "C1 = [1 0; 0 0]; C2 = [1 0];    D11 = zeros(2);";
  198.       disp(cmd)
  199.       eval(cmd);
  200.       cmd = "D12 = [0;1];    D21 = [0 1];    D22 = 0; D = [D11 D12; D21 D22];";
  201.       disp(cmd)
  202.       eval(cmd);
  203.       disp("Design objective: compute U(s)=K(s)Y1(s) to minimize the closed")
  204.       disp("loop impulse response from w(t) =[w1; w2] to z(t) = [y1; y2]");
  205.       prompt
  206.       disp("First: pack system:")
  207.       cmd="Asys = ss2sys(A,[B1 B2], [C1;C2] , D);";
  208.       run_cmd
  209.       disp("Open loop multivariable Bode plot: (will take a moment)")
  210.       cmd="bode(Asys);";
  211.       run_cmd
  212.       prompt("Press a key to close plot and continue");
  213.       closeplot
  214.       disp("Controller design command: (only need 1st two output arguments)")
  215.       cmd="[K,gain, Kc, Kf, Pc,  Pf] = h2syn(Asys,1,1);";
  216.       run_cmd
  217.       disp("Controller is:")
  218.       cmd = "sysout(K)";
  219.       run_cmd
  220.       disp(["returned gain value is: ",num2str(gain)]);
  221.       disp("Check: close the loop and then compute h2norm:")
  222.       prompt
  223.       cmd="K_loop = sysgroup(Asys,K);";
  224.       run_cmd
  225.       cmd = "Kcl = syscnct(K_loop,[3,4],[4,3]);";
  226.       run_cmd
  227.       cmd = "Kcl = sysprune(Kcl,[1,2],[1,2]);";
  228.       run_cmd
  229.       cmd="gain_Kcl = h2norm(Kcl)";
  230.       run_cmd
  231.       cmd="gain_err = gain_Kcl - gain";
  232.       run_cmd
  233.       disp("Check: multivarible bode plot:")
  234.       cmd="bode(Kcl);";
  235.       run_cmd
  236.       prompt
  237.       disp("Related functions: is_dgkf, is_contr, is_stabi,")
  238.       disp("                is_obsrv, is_detec")
  239.     elseif (menuopt == 6)
  240.       disp('Hinfinity gain of a system: (max gain over all j-omega)')
  241.       disp('Example 1: Stable plant:')
  242.       cmd = "A = [0 1; -2 -1]; B = [0 ; 1]; C = [1 0]; sys_poles = eig(A)";
  243.       run_cmd
  244.       disp('Pack into system format:')
  245.       cmd = "Asys = ss2sys(A,B,C);";
  246.       run_cmd
  247.       disp('The infinity norm must be computed iteratively by')
  248.       disp('binary search.  For this example, we select tolerance tol = 0.01, ')
  249.       disp('min gain gmin = 1e-2, max gain gmax=1e4.')
  250.       disp('Search quits when upper bound <= (1+tol)*lower bound.')
  251.       cmd = "tol = 0.01; gmin = 1e-2; gmax = 1e+4;";
  252.       run_cmd
  253.       cmd = "[AsysHinf,gmin,gmax] = hinfnorm(Asys,tol,gmin,gmax)"
  254.       run_cmd
  255.       disp("Check: look at max value of magntude Bode plot of Asys:");
  256.       [M,P,w] = bode(Asys);
  257.       xlabel('Omega')
  258.       ylabel('|Asys(j omega)| ')
  259.       grid();
  260.       semilogx(w,M);
  261.       disp(["Max magnitude is ",num2str(max(M)), ...
  262.     ", compared with gmin=",num2str(gmin)," and gmax=", ...
  263.         num2str(gmax),"."])
  264.       prompt
  265.       disp('Example 2: unstable plant')
  266.       cmd = "A = [0 1; 2 1]; B = [0 ; 1]; C = [1 0]; sys_poles = eig(A)";
  267.       run_cmd
  268.       disp("Pack into system format:")
  269.       cmd = "Bsys = ss2sys(A,B,C);";
  270.       run_cmd
  271.       disp('Evaluate with BsysH2 = hinfnorm(Bsys,tol,gmin,gmax)')
  272.       BsysH2 = hinfnorm(Bsys,tol,gmin,gmax)
  273.       disp(' ')
  274.       disp('NOTICE: program returns a value without an error signal.')
  275.       disp('')
  276.  
  277.     elseif (menuopt == 7)
  278.       disp('Hinfinity optimal controller of a system: command = hinfsyn:')
  279.       prompt
  280.       help hinfsyn
  281.       prompt
  282.       disp("Example system: double integrator with output noise and")
  283.       disp("input disturbance:")
  284.       A = [0 1; 0 0]
  285.       B1 = [0 0;1 0]
  286.       B2 = [0;1]
  287.       C1 = [1 0; 0 0]
  288.       C2 = [1 0]
  289.       D11 = zeros(2);
  290.       D12 = [0;1];
  291.       D21 = [0 1];
  292.       D22 = 0;
  293.       D = [D11 D12; D21 D22]
  294.       prompt
  295.       disp("First: pack system:")
  296.       cmd="Asys = ss2sys(A,[B1 B2], [C1;C2] , D);";
  297.       run_cmd
  298.       prompt
  299.       disp("Open loop multivariable Bode plot: (will take a moment)")
  300.       cmd="bode(Asys);";
  301.       run_cmd
  302.       prompt
  303.       disp("Controller design command: (only need 1st two output arguments)")
  304.       gmax = 1000
  305.       gmin = 0.1
  306.       gtol = 0.01
  307.       cmd="[K,gain] = hinfsyn(Asys,1,1,gmin,gmax,gtol);";
  308.       run_cmd
  309.       disp("Check: close the loop and then compute h2norm:")
  310.       prompt
  311.       cmd="K_loop = sysgroup(Asys,K);";
  312.       run_cmd
  313.       cmd = "Kcl = syscnct(K_loop,[3,4],[4,3]);";
  314.       run_cmd
  315.       cmd = "Kcl = sysprune(Kcl,[1,2],[1,2]);";
  316.       run_cmd
  317.       cmd="gain_Kcl = hinfnorm(Kcl)";
  318.       run_cmd
  319.       cmd="gain_err = gain_Kcl - gain";
  320.       run_cmd
  321.       disp("Check: multivarible bode plot:")
  322.       cmd="bode(Kcl);";
  323.       run_cmd
  324.       prompt
  325.       disp("Related functions: is_dgkf, is_contr, is_stabi,")
  326.       disp("                   is_obsrv, is_detec, buildssc")
  327.     elseif (menuopt == 8)
  328.       disp('Hinfinity optimal controller of MIMO system: command = hinfsyn:')
  329.       prompt
  330.       help hinfsyn
  331.       prompt
  332.       disp("Example system: Boeing 707-321 airspeed/pitch angle control")
  333.       disp(" ")
  334.       hinfdemo
  335.     elseif (menuopt == 9)
  336.       disp("Discrete time H-infinity control via bilinear transform");
  337.       prompt
  338.       dhinfdm
  339.     elseif (menuopt == 10)
  340.       return
  341.     endif
  342.     prompt
  343.   endwhile  
  344.   page_screen_output = save_val;
  345. endfunction
  346.  
  347.