Tartalomjegyzék

Isidori_reldegree_coord_trafo

Teljes Matlab script kiegészítő függvényekkel.

File: Isidori_reldegree_coord_trafo.m
Directory: 4_gyujtemegy/11_CCS/_2_nonlin-pannon/2018
Author: Peter Polcz (ppolcz@gmail.com)
Created on 2018. July 29.

Isidori I., Example 4.1.4

syms u v real
eval(pcz_generateSymStateVector(3, 'x'));
eval(pcz_generateSymStateVector(3, 'z'));

d = @(g) jacobian(g,x);
Lie = @(f,g) d(g)*f;
br = @(f,g) d(g)*f - d(f)*g;

f = [ -x1 ; x1*x2 ; x2 ];
g = [ exp(x2) ; 1 ; 0 ];
h = x3;

Phi = [
    h
    Lie(f,h)
    1 + x1 + exp(x2)
    ];
\begin{align}\Phi(x) = \left(\begin{array}{c} x_{3}\\ x_{2}\\ x_{1}+{\mathrm{e}}^{x_{2}}+1 \end{array}\right)\end{align}

$\phi_3$-at Isidori hasraütés szerűen adta meg, de jól látható, hogy az tényleg jó megoldás és a Mathematica-val is ki lehet számolni.

Phi_inv = struct2cell(solve(z-Phi, x_cell{:}));
Phi_inv = [ Phi_inv{:} ]';
\begin{align}\Phi^{-1}(z) = \left(\begin{array}{c} z_{3}-{\mathrm{e}}^{z_{2}}-1\\ z_{2}\\ z_{1} \end{array}\right)\end{align}

Coordinate transformation

\begin{align}\dot z = \left(\begin{array}{c} z_{2}\\ u-z_{2}\,\left({\mathrm{e}}^{z_{2}}-z_{3}+1\right)\\ -\left(z_{2}\,{\mathrm{e}}^{z_{2}}-1\right)\,\left({\mathrm{e}}^{z_{2}}-z_{3}+1\right) \end{array}\right)\end{align}

Linearizing feedback design

u_fdb = a \ (-b + v);
\begin{align}u = v+z_{2}\,\left({\mathrm{e}}^{z_{2}}-z_{3}+1\right)\end{align}

Closed loop

dz_fdb = simplify(subs(dz, u, u_fdb));
\begin{align}\dot z = \left(\begin{array}{c} z_{2}\\ v\\ -\left(z_{2}\,{\mathrm{e}}^{z_{2}}-1\right)\,\left({\mathrm{e}}^{z_{2}}-z_{3}+1\right) \end{array}\right)\end{align}

Zero dynamics

Zero_dynamics = simplify(subs(dz_fdb, [z1 z2 v], [0 0 0]));
\begin{align}\dot z_3 = \left(\begin{array}{c} 0\\ 0\\ 2-z_{3} \end{array}\right)\end{align}

Isidori I., Example 4.1.5

% clear all
n = 4;
x0 = zeros(n,1);

syms u v real
eval(pcz_generateSymStateVector(n, 'x'));
eval(pcz_generateSymStateVector(n, 'z'));

d = @(g) jacobian(g,x);
Lie = @(f,g) d(g)*f;
br = @(f,g) d(g)*f - d(f)*g;

f = [ x1*x2-x1^3 ; x1 ; -x3 ; x1^2+x2 ];
g = [ 0 ; 2+2*x3 ; 1 ; 0 ];
h = x4;

A = subs(jacobian(f, x), x, x0);
eig_A = eig(A)'
fx0_Is_an_equilibrium_point = subs(f,x,x0)

h
Lie_gh = Lie(g, h)
Lie_gfh = Lie(g, Lie(f,h))

Phi = [
    h
    Lie(f,h)
    x1
    x3
    ]

dPhi = jacobian(Phi, x);

Phi_inv = struct2cell(solve(z-Phi, x_cell{:}));
Phi_inv = [ Phi_inv{:} ]'

b = subs(  Lie(f, Lie(f,h))  , x, Phi_inv);
a = subs(  Lie(g, Lie(f,h))  , x, Phi_inv);
q3 = subs(  Lie(f, Phi(3)) + Lie(g, Phi(3))*u  , x, Phi_inv);
q4 = subs(  Lie(f, Phi(4)) + Lie(g, Phi(4))*u  , x, Phi_inv);

dz = simplify([ z2 ; b+a*u ; q3 ; q4 ])
y = z1

dz_Ell = simplify([
    z2
    z4 + 2*z4*(z4*(z2 - z4^2)- z4^3) + (2 + 2*z3)*u
    -z3 + u
    z4*(-2*z4^2 + z2)
    ])

% calculate zero dynamics

u_fdb = a \ (-b + v)

dz_fdb = simplify(subs(dz, u, u_fdb))
Zero_dynamics = simplify(subs(dz_fdb, [z1 z2 v], [0 0 0]))
Output:
eig_A =
[ -1, 0, 0, 0]
fx0_Is_an_equilibrium_point =
 0
 0
 0
 0
h =
x4
Lie_gh =
0
Lie_gfh =
2*x3 + 2
Phi =
        x4
 x1^2 + x2
        x1
        x3
Phi_inv =
          z3
 - z3^2 + z2
          z4
          z1
dz =
                                       z2
 - 4*z3^4 + 2*z2*z3^2 + z3 + 2*u + 2*u*z4
                       z3*(- 2*z3^2 + z2)
                                   u - z4
y =
z1
dz_Ell =
                                       z2
 - 4*z4^4 + 2*z2*z4^2 + z4 + 2*u + 2*u*z3
                                   u - z3
                       z4*(- 2*z4^2 + z2)
u_fdb =
(v - z3 + 2*z3*(z3^3 - z3*(- z3^2 + z2)))/(2*z4 + 2)
dz_fdb =
                                                        z2
                                                         v
                                        z3*(- 2*z3^2 + z2)
 (v - z3 + 2*z3*(z3^3 - z3*(- z3^2 + z2)))/(2*z4 + 2) - z4
Zero_dynamics =
                                 0
                                 0
                           -2*z3^3
 - z4 - (- 4*z3^4 + z3)/(2*z4 + 2)