📄 hinfdemo.m
字号:
## Copyright (C) 1996, 1998, 2000, 2004, 2005, 2007 Kai P. Mueller#### This file is part of Octave.#### Octave is free software; you can redistribute it and/or modify it## under the terms of the GNU General Public License as published by## the Free Software Foundation; either version 3 of the License, or (at## your option) any later version.#### Octave is distributed in the hope that it will be useful, but## WITHOUT ANY WARRANTY; without even the implied warranty of## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU## General Public License for more details.#### You should have received a copy of the GNU General Public License## along with Octave; see the file COPYING. If not, see## <http://www.gnu.org/licenses/>.## -*- texinfo -*-## @deftypefn {Function File} {} hinfdemo ()#### @iftex## @tex## $ { \cal H }_\infty $## @end tex## @end iftex## @ifinfo## H-infinity## @end ifinfo## design demos for continuous @acronym{SISO} and @acronym{MIMO} systems and a## discrete system. The @acronym{SISO} system is difficult to control because## it is non-minimum-phase and unstable. The second design example## controls the @command{jet707} plant, the linearized state space model of a## Boeing 707-321 aircraft at @var{v}=80 m/s ## @iftex## @tex## ($M = 0.26$, $G_{a0} = -3^{\circ}$, ${\alpha}_0 = 4^{\circ}$, ${\kappa}= 50^{\circ}$).## @end tex## @end iftex## @ifinfo## (@var{M} = 0.26, @var{Ga0} = -3 deg, @var{alpha0} = 4 deg, @var{kappa} = 50 deg).## @end ifinfo## Inputs: (1) thrust and (2) elevator angle## Outputs: (1) airspeed and (2) pitch angle. The discrete system is a## stable and second order.#### @table @asis## @item @acronym{SISO} plant:#### @iftex## @tex## $$ G(s) = { s-2 \over (s+2) (s-1) } $$## @end tex## @end iftex## @ifinfo## @example## @group## s - 2## G(s) = --------------## (s + 2)(s - 1)## @end group## @end example## @end ifinfo#### @smallexample## @group#### +----+## -------------------->| W1 |---> v1## z | +----+## ----|-------------+## | |## | +---+ v y +----+## u *--->| G |--->O--*-->| W2 |---> v2## | +---+ | +----+## | |## | +---+ |## -----| K |<-------## +---+## @end group## @end smallexample## ## @iftex## @tex## $$ { \rm min } \Vert T_{vz} \Vert _\infty $$## @end tex## @end iftex## @ifinfo## @example## min || T ||## vz infty## @end example## @end ifinfo#### @var{W1} und @var{W2} are the robustness and performance weighting## functions.#### @item @acronym{MIMO} plant:## The optimal controller minimizes the ## @iftex## @tex## $ { \cal H }_\infty $## @end tex## @end iftex## @ifinfo## H-infinity## @end ifinfo## norm of the## augmented plant @var{P} (mixed-sensitivity problem):## @smallexample## @group## w## 1 -----------+## | +----+## +---------------------->| W1 |----> z1## w | | +----+## 2 ------------------------+## | | |## | v +----+ v +----+## +--*-->o-->| G |-->o--*-->| W2 |---> z2## | +----+ | +----+## | |## ^ v## u y (to K)## (from controller K)## @end group## @end smallexample#### @iftex## @tex## $$ \left [ \matrix{ z_1 \cr## z_2 \cr## y } \right ] = ## P \left [ \matrix{ w_1 \cr## w_2 \cr## u } \right ] $$## @end tex## @end iftex## @ifinfo## @smallexample## @group## + + + +## | z | | w |## | 1 | | 1 |## | z | = [ P ] * | w |## | 2 | | 2 |## | y | | u |## + + + +## @end group## @end smallexample## @end ifinfo#### @item Discrete system:## This is not a true discrete design. The design is carried out## in continuous time while the effect of sampling is described by## a bilinear transformation of the sampled system.## This method works quite well if the sampling period is ``small''## compared to the plant time constants.#### @item The continuous plant:## @iftex## @tex## $$ G(s) = { 1 \over (s+2)(s+1) } $$## @end tex## @end iftex#### @ifinfo## @example## @group## 1## G (s) = --------------## k (s + 2)(s + 1)#### @end group## @end example## @end ifinfo#### is discretised with a @acronym{ZOH} (Sampling period = @var{Ts} = 1 second):## @iftex## @tex## $$ G(z) = { 0.199788z + 0.073498 \over (z - 0.36788) (z - 0.13534) } $$## @end tex## @end iftex## @ifinfo## @example## @group#### 0.199788z + 0.073498## G(z) = --------------------------## (z - 0.36788)(z - 0.13534)## @end group## @end example## @end ifinfo#### @smallexample## @group#### +----+## -------------------->| W1 |---> v1## z | +----+## ----|-------------+## | |## | +---+ v +----+## *--->| G |--->O--*-->| W2 |---> v2## | +---+ | +----+## | |## | +---+ |## -----| K |<-------## +---+## @end group## @end smallexample## @iftex## @tex## $$ { \rm min } \Vert T_{vz} \Vert _\infty $$## @end tex## @end iftex## @ifinfo## @example## min || T ||## vz infty## @end example## @end ifinfo## @var{W1} and @var{W2} are the robustness and performance weighting## functions.## @end table## @end deftypefn## Author: Kai P. Mueller <mueller@ifr.ing.tu-bs.de>## Created: April 30, 1998yn = [];while (length(yn) < 1) yn = input(" * [s]iso, [m]imo, or [d]iscrete design? [no default]: ","S");endwhileif ((yn(1) == "s") | (yn(1) == 'S')) sys_type = 1;elseif ((yn(1) == "m") | (yn(1) == 'M')) sys_type = 2;elseif ((yn(1) == "d") | (yn(1) == 'D')) sys_type = 3;else disp(" *** no system type specified, hinfdemo terminated."); return;endifecho offswitch (sys_type) case (1) ## siso disp(" "); disp(" ----------------------------------------------"); disp(" H_infinity optimal control for the SISO plant:"); disp(" "); disp(" s - 2"); disp(" G(s) = --------------"); disp(" (s + 2)(s - 1)"); disp(" "); disp(" ----------------------------------------------"); disp(" "); ## weighting on actuator u W1 = wgt1o(0.05, 100.0, 425.0); ## weighting on controlled variable y W2 = wgt1o(10.0, 0.05, 0.001); ## plant G = tf2sys([1 -2],[1 1 -2]); ## need One as the pseudo transfer function One = 1 One = ugain(1); disp(" o forming P..."); psys = buildssic([1 4;2 4;3 1],[3],[2 3 5],[3 4],G,W1,W2,One); disp(" "); disp(" o controller design..."); [K, gfin, GW]=hinfsyn(psys, 1, 1, 0.1, 10.0, 0.02); disp(" "); disp("-- OK ----------------------------------------------"); disp(" Closed loop poles:"); damp(GW); ## disp(" o Testing H_infinity norm: (hinfnorm does not work)"); ## hinfnorm(GW); disp(" "); yn = input(" * Plot closed loop step response? [n]: ","S"); if (length(yn) >= 1) if ((yn(1) == "y") || (yn(1) == 'Y')) disp(" o step responses of T and KS..."); GW = buildssic([1 2; 2 1], [], [1 2], [-2], G, K); figure(1); step(GW, 1, 10); endif endif case (2) ## mimo disp(" "); disp(" -----------------------------------------------"); disp(" H_inf optimal control for the jet707 plant"); disp(" -----------------------------------------------"); disp(" "); ## Weighting function on u (robustness weight) ww1 = wgt1o(0.01,5,0.9); ww2 = wgt1o(0.01,5,2.2); W1 = buildssic([1 0;2 0],[],[1 2],[1 2],ww1,ww2); ## Weighting function on y (performance weight) ww1 = wgt1o(250,0.1,0.0001); ww2 = wgt1o(250,0.1,0.0002); W2 = buildssic([1 0;2 0],[],[1 2],[1 2],ww1,ww2); ## plant (2 x 2 system) G = jet707; disp(" o forming P..."); One = ugain(2); Clst = [1 7; 2 8; 3 7; 4 8; 5 1; 6 2]; P = buildssic(Clst,[5 6],[3:6 9 10],[1 2 5:8],G,W1,W2,One); disp(" "); disp(" o controller design..."); K = hinfsyn(P, 2, 2, 0.25, 10.0, 0.005); disp(" "); yn = input(" * Plot closed loop step responses? [n]: ","S"); if (length(yn) >= 1) if ((yn(1) == "y") || (yn(1) == 'Y')) disp(" o step responses of T and KS..."); GW = buildssic([1 3;2 4;3 1;4 2],[],[1 2 3 4],[-3 -4],G,K); disp(" "); disp(" FIGURE 1: speed refence => 1, pitch angle ref. => 0"); disp(" ==================================================="); disp(" y1: speed (should be 1)"); disp(" y2: pitch angle (should remain 0)"); disp(" y3: thrust (should be a slow transient)"); disp(" y6: elevator (should be a faster transient)"); disp(" "); disp(" FIGURE 2: speed refence => 0, pitch angle ref. => 1"); disp(" ==================================================="); disp(" y1: speed (should remain 0)"); disp(" y2: pitch angle (should be 1)"); disp(" y3: thrust (should be a slow transient)"); disp(" y6: elevator (should be a faster transient)"); disp(" "); figure(1) step(GW); figure(2) step(GW,2); endif endif case (3) ## discrete disp(" "); disp(" --------------------------------------------------"); disp(" Discrete H_infinity optimal control for the plant:"); disp(" "); disp(" 0.199788z + 0.073498"); disp(" G(s) = --------------------------"); disp(" (z - 0.36788)(z - 0.13533)"); disp(" --------------------------------------------------"); disp(" "); ## sampling time Ts = 1.0; ## weighting on actuator value u W1 = wgt1o(0.1, 200.0, 50.0); ## weighting on controlled variable y W2 = wgt1o(350.0, 0.05, 0.0002); ## omega axis ww = logspace(-4.99, 3.99, 100); if (columns(ww) > 1); ww = ww'; endif ## continuous plant G = tf2sys(2,[1 3 2]); ## discrete plant with zoh Gd = c2d(G, Ts); ## w-plane (continuous representation of the sampled system) Gw = d2c(Gd, "bi"); disp(" "); disp(" o building P..."); ## need One as the pseudo transfer function One = 1 One = ugain(1); psys = buildssic([1 4;2 4;3 1],[3],[2 3 5],[3 4],Gw,W1,W2,One); disp(" o controller design..."); [K, gfin, GWC] = hinfsyn(psys, 1, 1, 0.1, 10.0, 0.02); disp(" "); fig_n = 1; yn = input(" * Plot magnitudes of W1KS and W2S? [n]: ","S"); if (length(yn) >= 1) if ((yn(1) == "y") || (yn(1) == 'Y')) disp(" o magnitudes of W1KS and W2S..."); gwx = sysprune(GWC, 1, 1); mag1 = bode(gwx, ww); if (columns(mag1) > 1); mag1 = mag1'; endif gwx = sysprune(GWC, 2, 1); mag2 = bode(gwx, ww); if (columns(mag2) > 1); mag2 = mag2'; endif figure(fig_n) fig_n = fig_n + 1; loglog(ww, [mag1 mag2]); grid ("on"); endif endif Kd = c2d(K, "bi", Ts); GG = buildssic([1 2; 2 1], [], [1 2], [-2], Gd, Kd); disp(" o closed loop poles..."); damp(GG); disp(" "); yn = input(" * Plot closed loop step responses? [n]: ","S"); if (length(yn) >= 1) if ((yn(1) == "y") || (yn(1) == 'Y')) disp(" o step responses of T and KS..."); figure(fig_n) step(GG, 1, 10); endif endifendswitchdisp(" o hinfdemo terminated successfully.");## KPM-hinfdemo/End
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -