Contents

MORLAB Demo: Partial Stabilization

This demo script contains the application of the MORLAB partial stabilzation routines.

%
% This program is free software: you can redistribute it and/or modify
% it under the terms of the GNU Affero General Public License as published
% by the Free Software Foundation, either version 3 of the License, or
% (at your option) any later version.
%
% This program 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 Affero General Public License for more details.
%
% You should have received a copy of the GNU Affero General Public License
% along with this program.  If not, see <http://www.gnu.org/licenses/>.
%
% Copyright (C) 2006-2019 Peter Benner, Steffen W. R. Werner
%

Standard System Case

The MORLAB toolbox implements partial stabilization methods for first-order system types, e.g., considering the control system

x'(t) = A*x(t) + B*u(t),

with the matrix A having possible stable and anti-stable eigenvalues. In partial stabilization, a feedback matrix K is constructed such that the matrix A-B*K has only stable eigenvalues, while the original stable eigenvalues stay uneffected by the matrix K.

For demonstration reasons we load a prepared data file containing an unstable standard system:

if exist('OCTAVE_VERSION', 'builtin')
    orig_warn = warning('off', 'Octave:data-file-in-path');
    load morlab_data_std_unstab.mat;
    warning(orig_warn);
else
    load morlab_data_std_unstab.mat;
end

The matrix A has 90 stable and 10 anti-stable eigenvalues. The construction of the matrix K is done by calling the appropriate MORLAB routine.

[K, info] = ml_ct_ss_partstab(A, B);

The struct info contains information, collected about the stabilization process.

disp(info);
     infoSTABMETH: [1x1 struct]
    infoSTABSIGNM: [1x1 struct]
           Method: 'cabe'
               Ns: 90
               Nu: 10

We see that the method found the 90 stable and 10 anti-stable eigenvalues. Also it shows that the algebraic Bernoulli equation was used for the stabilization, i.e., the anti-stable eigenvalues have been mirrored into the left open halfplane. We take a look on the spectrum of A-B*K and see that now all eigenvalues lie in the open left half-plane.

x = eig(A - B * K);
disp(all(real(x) < 0));
   1

Descriptor System Case

The partial stabilization is working a bit differently in case of descriptor control systems, e.g.,

E*x'(t) = A*x(t) + B*u(t),

with the matrix pencil s*E-A having possible stable, anti-stable and infinite eigenvalues. The feedback matrix K is now constructed such that the new pencil s*E-(A-B*K) has only stable and infinite eigenvalues, while the original stable and infinite eigenvalues stay uneffected by the matrix K.

For demonstration reasons we load a prepared data file containing an unstable descriptor system:

if exist('OCTAVE_VERSION', 'builtin')
    orig_warn = warning('off', 'Octave:data-file-in-path');
    load morlab_data_desc_infunstab.mat;
    warning(orig_warn);
else
    load morlab_data_desc_infunstab.mat;
end

The pencil s*E-A has 80 stable, 10 anti-stable and 10 infinite eigenvalues. The construction of the matrix K is done by calling the appropriate MORLAB routine.

[K, info] = ml_ct_dss_partstab(A, B, E);

The struct info contains information, collected about the stabilization process.

disp(info);
      infoINFDISK: [1x1 struct]
     infoSTABMETH: [1x1 struct]
    infoSTABSIGNM: [1x1 struct]
           Method: 'cabe'
             Ninf: 10
               Ns: 80
               Nu: 10

We see that the method found the 80 stable, 10 anti-stable and 10 infinite eigenvalues could be found. Also it shows that the algebraic Bernoulli equation was used for the stabilization, i.e., the anti-stable eigenvalues have been mirrored into the left open halfplane. We take a look on the spectrum of s*E-(A-B*K).

x = eig(A - B * K, E);
x = x(abs(x) < 1.0e+05);

After sorting out the numerically infinite eigenvalues, we see that all eigenvalues stored in x lie in the left open half-plane.

disp(all(real(x) < 0));
   1

Remarks

See Also

ml_ct_dss_partstab | ml_ct_ss_partstab | ml_dt_dss_partstab | ml_dt_ss_partstab