C24 スイッチング関数(2)

スイッチング関数(2)

[1] 状態方程式とスイッチング関数は次の標準形をとるように座標変換されていると仮定します。

\displaystyle{(1)\quad \underbrace{ \left[\begin{array}{c} \dot x_1(t)\\ \dot x_2(t) \end{array}\right] }_{\dot x(t)} = \underbrace{ \left[\begin{array}{cc} A_{11} & A_{12} \\ A_{21} & A_{22} \\ \end{array}\right] }_{A} \underbrace{ \left[\begin{array}{c} x_1(t)\\ x_2(t) \end{array}\right] }_{x(t)} + \underbrace{ \left[\begin{array}{c} 0\\ B_2 \end{array}\right] }_{B} u(t) }

\displaystyle{(2)\quad s(t)= \underbrace{ \left[\begin{array}{cc} S_1 & S_2 \\ \end{array}\right] }_{S} \underbrace{ \left[\begin{array}{c} x_1(t)\\ x_2(t) \end{array}\right] }_{x(t)} = \underbrace{S_2 \left[\begin{array}{cc} M & I \\ \end{array}\right] }_{S} \underbrace{ \left[\begin{array}{c} x_1(t)\\ x_2(t) \end{array}\right] }_{x(t)} \ (M=S_2^{-1}S_1) }

このとき、等価制御

\displaystyle{(3)\quad u_{eq}(t)=-(SB)^{-1}SAx(t) }

による閉ループ系は次式で表されました。

\displaystyle{(4)\quad \dot{x}(t)=\underbrace{(I_n-B(SB)^{-1}S)A}_{A_{eq}}x(t)\quad(t\ge t_s) }

ここでABSは、(1)と(2)で与えられるとすると

\displaystyle{(5)\quad \begin{array}{l} A_{eq}= \underbrace{ \left[\begin{array}{cc} I & 0 \\ -M & 0 \\ \end{array}\right] }_{I_n-B(SB)^{-1}S} \left[\begin{array}{cc} A_{11} & A_{12} \\ A_{21} & A_{22} \\ \end{array}\right]= \left[\begin{array}{cc} A_{11} & A_{12} \\ -MA_{11} & -MA_{12} \\ \end{array}\right]\\ = \left[\begin{array}{cc} I & 0 \\ -M & I \\ \end{array}\right] \left[\begin{array}{cc} \bar{A}_{11} & A_{12} \\ 0 & 0 \\ \end{array}\right] \left[\begin{array}{cc} I & 0 \\ -M & I \\ \end{array}\right]^{-1} \end{array} }

となって、\bar{A}_{11}が安定行列なので、A_{eq}m個の零固有値を持ちます。一方、A_{eq}の非零固有値\lambda_i\ (i=1,\cdots,n-m)に対応する固有ベクトルをv_iとすると、

\displaystyle{(6)\quad SA_{eq}=0\Rightarrow SA_{eq}v_i=0\Rightarrow \lambda_iSv_i=0 \Rightarrow Sv_i=0 }

すなわち

\displaystyle{(7)\quad { S[v_1\cdots v_{n-m}]=0 % \Rightarrow  [v_1\cdots v_{n-m}]^TS^T=0} }

が成り立ちます。したがって、まず等価制御による閉ループ系のA_{eq}が望ましい固有値・固有ベクトルをもつように設計して、(7)からSを決定することが考えられます。

1入力系の場合は固有ベクトル設定の自由度はありませんが、多入力系の場合は固有ベクトルの向きを設定する必要があり、これは元の状態方程式(状態変数の並び)に対して与えます。そこで(7)が元の状態方程式ではどう変わるかを調べておきます。

元の状態方程式

\displaystyle{(8)\quad \begin{array}{l} \dot{x}(t)=Ax(t)+Bu(t)+f(t,x,u)\\ (x(t)\in{\rm\bf R}^n, u(t)\in{\rm\bf R}^m, f(t,x,u)\in{\rm\bf R}^n) \end{array} }

に対する標準形(1)は、適当な直交行列T_r座標による座標変換

\displaystyle{(9)\quad x_{r}(t)=T_rx(t) \Leftrightarrow x(t)=T_r^Tx_r(t) }

を行って(T_r^{-1}=T_r^Tに注意)

\displaystyle{(10)\quad \begin{array}{l} \underbrace{ \left[\begin{array}{c} \dot{x}_{r1}(t)\\ \dot{x}_{r2}(t) \end{array}\right] }_{\dot{x}_r(t)} = \underbrace{ \left[\begin{array}{cc} A_{r11} & A_{r12} \\ A_{r21} & A_{r22} \\ \end{array}\right] }_{A_r=T_rAT_r^T} \underbrace{ \left[\begin{array}{c} x_{r1}(t)\\ x_{r2}(t) \end{array}\right] }_{x_r(t)} + \underbrace{ \left[\begin{array}{c} 0\\ \Sigma_1V^T \end{array}\right] }_{B_r=T_rB} u(t)\\ + \underbrace{ \left[\begin{array}{l} f_{ru}(t,x)\\ f_{rm}(t,x,u) \end{array}\right] }_{f_r(t,x,u)=T_rf(t,x,u)} \end{array} }

のように得られたものでした。また(2)は次式に

\displaystyle{(11)\quad s(t)= \underbrace{ \left[\begin{array}{cc} S_{r1} & S_{r2} \\ \end{array}\right] }_{S_r=ST_r^T} \underbrace{ \left[\begin{array}{c} x_{r1}(t)\\ x_{r2}(t) \end{array}\right] }_{x_r(t)=T_rx(t)} }

に、(7)は次式に相当します。

\displaystyle{(12)\quad S_r[v_{r1}\cdots v_{r,n-m}]=0  }

いま、元の状態空間での固有ベクトルv_1\cdots v_{n-m}は、座標変換後には

\displaystyle{(13)\quad  Av_i=\lambda_iv_i\Rightarrow T_rAT_r^TT_rv_i=\lambda_iT_rv_i\Rightarrow v_{ri}=T_rv_i }

に変わることに注意します。(12)から

\displaystyle{(14)\quad S_rT_rT_r^T[v_{r1}\cdots v_{r,n-m}]=S[v_1\cdots v_{n-m}]=0  }

を得ます。これから元の状態方程式に対するスイッチング関数と固有ベクトルについても、(12)と同様の関係が成り立つと言えます。すなわち固有ベクトルv_1\cdots v_{n-m}は元の状態空間で与えておいて、(14)からSを決定してよいことがわかります。

演習…Flipped Classroom

図1 台車駆動型倒立振子

\displaystyle{(4)\quad { u(t)=\underbrace{u_\ell(t)}_{linear\ control}+\underbrace{u_n(t)}_{switching\ component}} }

\displaystyle{(5)\quad { u_\ell(t)=-\underbrace{(SB)^{-1}(SA-\Phi S)}_{L=L_{eq}+L_{phi}}x(t)} }

\displaystyle{(6)\quad { u_n(t)=-\underbrace{(SB)^{-1}\rho(t,x)}_{L_n}\frac{P_2s(t)}{||P_2s(t)||}} }

MATLAB
%cCIP_smc2.m
%-----
 clear all, close all
 global mc m ell g th0
 mc=1; m=0.1; ell=0.2; g=9.8;
 ths=0; %input('ths   = <0,180> ')/180*pi;
 th0=3/180*pi; %input('th(0) = <0,180> ')/180*pi;
%-----
 A=[zeros(2,2) eye(2);zeros(2,4)];
 A(3,1)=0; 
 A(3,2)=-3*m*g/(m+4*mc); 
 A(4,1)=0; 
 A(4,2)=3*(m+mc)*g/((m+4*mc)*ell);  
 B=zeros(4,1);
 B(3)=4/(m+4*mc);
 B(4)=-3/((m+4*mc)*ell); 
 C=diag([100 180/pi])*eye(2,4); 
%-----
 lambda=[-0.8 0.5 -3];
 nocomp=1;
 specpos=rand(4,3)
 specent=rand(4,3)
 S=swfvpl(A,B,lambda,nocomp,specpos,specent)
%-----
 Phi=-0.1;
 P2=0.5*inv(-Phi);
 Check=P2*Phi+Phi*P2
 P2S=P2*S;
 Leq=inv(S*B)*S*A;
 LPhi=-inv(S*B)*Phi*S;
 L=Leq+LPhi;
 rho=0.6;
 Ln=inv(S*B)*rho;
%-----
 x0=[0;th0;0;0];
 sim('CIP_smc_2015a.mdl')
%-----
%eof
SCILAB

Note 2 スイッチング関数決定プログラム2
Edwards and Spurgeon によって、(26)から、スイッチング関数の行列Sを求めるプログラムswfvplが開発されています。

MATLAB
%swfvpl.m
%-----
function S=swfvpl(A,B,lambda,nocomp,specpos,specent)
%lambda:n-m個の固有値
%nocomp:複素固有値の数
%specpos:固有ベクトルの非零要素の位置 (1:指定、0:指定せず)
%specent:固有ベクトルの要素の値 (0:零、1:非零指定、-1:非零任意)
 [nn,mm]=size(B);
 for i=1:nocomp
  glambda1=[lambda(2*i-1)*eye(nn)-A lambda(2*i)*eye(nn) B];
  [u,v,w]=svd(glambda1);
  nlambda1=w(1:nn,nn+1:2*nn+mm);
  plambda1=w(nn+1:2*nn,nn+1:2*nn+mm);
  alpha=[nlambda1; -plambda1]';
  beta= [plambda1;  nlambda1]';
  [u1,v1,w1]=svd(alpha);
  [u2,v2,w2]=svd(beta);
  gamma=[w1(:,nn+mm+1:2*nn)'; w2(:,nn+mm+1:2*nn)'];
  [u3,v3,w3]=svd(gamma);
  kgamma=w3(:,2*nn-2*mm+1:2*nn);
  despos=find(specpos(:,2*i-1));
  numspecr=length(despos);
  n1=[]; desent=[];
  for j=1:numspecr,
   n1(j,:)=kgamma(despos(j),:);
   desent(j)=specent(despos(j),2*i-1);
  end
  despos=find(specpos(:,2*i));
  numspecc=length(despos);
  for j=1:numspecc,
   n1(j+numspecr,:)=kgamma(despos(j)+nn,:);
   desent(j+numspecr)=specent(despos(j),2*i);
  end
  delta=n1\desent';
  vector=kgamma*delta;
  V(1:nn,2*i-1)=vector(1:nn);
  V(1:nn,2*i)=vector(nn+1:2*nn);
 end
%-----
 for i=2*nocomp+1:nn-mm,
  glambda=[lambda(i)*eye(nn)-A B];
  [u,v,w]=svd(glambda);
  nlambda=w(1:nn,nn+1:nn+mm);
  despos=find(specpos(:,i));
  numspec=length(despos);
  n2=[]; desent2=[];
  for j=1:numspec,
   n2(j,:)=nlambda(despos(j),:);
   desent2(j)=specent(despos(j),i);
  end
  delta=n2\desent2';
  V(:,i)=nlambda*delta;
 end
%-----
 [u,v,w]=svd(V);
 S=u(:,nn-mm+1:nn)';
end
%-----
%eof
SCILAB
MATLAB
%test_swfvpl.m
%-----
 clear all, close all
 A=[0 1 0;
    0 0 1;
    0 0 0];
 B=[0;
    0;
    1];
%-----
 lambda=[-2 -3];
 nocomp=0;
%固有ベクトルの要素の指定の有無 (1:指定、0:任意)
 specpos=rand(3,3)
%固有ベクトルの要素の値 (0:零指定、1:非零指定、-1:非零任意)       
 specent=rand(3,3) 
 S=swfvpl(A,B,lambda,nocomp,specpos,specent) 
 Leq=inv(S*B)*S*A;
 [V,pl]=eig(A-B*Leq) 
%-----
 lambda=[-1 1];
 nocomp=1;
%固有ベクトルの要素の指定の有無 (1:指定、0:任意)
 specpos=rand(3,3)
%固有ベクトルの要素の値 (0:零指定、1:非零指定、-1:非零任意)       
 specent=rand(3,3) 
 S=swfvpl(A,B,lambda,nocomp,specpos,specent) 
 Leq=inv(S*B)*S*A;
 [V,pl]=eig(A-B*Leq) 
%-----
%eof
SCILAB