状態方程式から伝達関数を求める

 投稿者:山中和義  投稿日:2009年 3月 3日(火)10時36分9秒
 
!1入力1出力、状態変数がN個の1階の連立微分方程式
! 状態方程式 x'(t)=A*x(t)+b*u(t) ※A:N×N、b:N×1
! 出力方程式 y(t)=C*x(t) ※C:1×N
!から
! 伝達関数 G(s)=c*INV(s*I-A)*b=c*adj(s*I-A)*b/det(s*I-A)
!を求める


!行列関連
FUNCTION tr(A(,)) !行列Aのトレース
   LET t=0
   FOR i=1 TO N
      LET t=t+A(i,i)
   NEXT i
   LET tr=t
END FUNCTION

!多項式関連
SUB mono_disp(ak,k) !単項式を表示する Ak*X^k
   IF k<>0 THEN !x^nで
      IF ak=1 THEN !係数が1なら
      ELSEIF ak=-1 THEN !係数が-1なら
         PRINT "-";
      ELSE
         PRINT STR$(ak);"*";
      END IF
   END IF
   IF k=0 THEN !次数が0なら
      PRINT STR$(ak);
   ELSEIF k=1 THEN !次数が1なら
      PRINT "s";
   ELSE
      PRINT "s^";STR$(k);
   END IF
END SUB
!-------------------- ここまでがサブルーチン


!---------- ↓↓↓↓↓ ----------
LET N=3 !状態変数の数

DATA 0,0,-6 !A
DATA 1,0,-11
DATA 0,1,-6

DATA 1 !b
DATA 0
DATA 0

DATA 0,0,1 !c
!---------- ↑↑↑↑↑ ----------


DIM A(N,N),b(N,1),c(1,N)

MAT READ A
MAT READ b
MAT READ c


!Frame法、Leverrir-Faddeev法
! adj(s*I-A)=s^(n-1)*I+s^(n-2)*β1+ … +s*βn-2+βn-1
! det(s*I-A)=s^n+α1*s^(n-1)+ … + αn-1*s+αn
!のとき
! β0=I、k=1~nについて
!  Xk=A*βk-1
!  αk=-trace(Xk)/k
!  βk=Xk+αk*I
!の逐次計算でαk、βkが求まる。

DIM c1(N) !多項式 c(1)*X^(N-1)+c(2)*X^(N-2)+ … +c(N-1)*X+c(N) の係数
DIM c2(N) !多項式 X^N+c(1)*X^(N-1)+c(2)*X^(N-2)+ … +c(N-1)*X+c(N) の係数
DIM X(N,N),sE(N,N),T1(1,N),T2(1,1) !作業用

MAT X=IDN !adj(s*I-A)
FOR k=1 TO N
!!!MAT PRINT X; !debug
   MAT T1=c*X !c*adj(s*I-A)*b ※定数*多項式*定数
   MAT T2=T1*b
   LET c1(k)=T2(1,1)

   MAT X=A*X
   LET c2(k)=-tr(X)/k !det(s*I-A)
   MAT sE=(c2(k))*IDN
   MAT X=X+sE
NEXT k


!!!MAT PRINT c1; !debug
PRINT "分子= ";
FOR i=1 TO N !分子側の多項式を表示する
   LET w=c1(i)
   IF w>0 THEN PRINT "+";
   IF w<>0 THEN CALL mono_disp(w,N-i)
NEXT i
PRINT

!!!MAT PRINT c2; !debug
PRINT "分母= ";
CALL mono_disp(1,N) !分母側の多項式を表示する
FOR i=1 TO N
   LET w=c2(i)
   IF w>0 THEN PRINT "+";
   IF w<>0 THEN CALL mono_disp(w,N-i)
NEXT i


END
 

Re: 状態方程式から伝達関数を求める

 投稿者:山中和義  投稿日:2009年 3月10日(火)20時51分18秒
  > No.302[元記事へ]

大熊 正さんへのお返事です。


 状態方程式 x'(t)=A*x(t)+b*u(t)
 出力方程式 y(t)=C*x(t)
の意味は、

 系 u(入力)→ [ x'=A*x+b*u、y=c*x ] → y(出力)
を表します。

簡単な例をあげて算出方法を紹介します。

●RC回路の場合

  Vi─R1─┬─Vo
u →   x C1  → y
      │
      ≡

ここで、C1にかかる電圧をxとします。

状態方程式は、C1に流れる電流i=C1*dx/dt=C1*x'より、C1*x'=(Vi-Vo)/R1=(u-x)/R1
したがって、x'=-1/(C1*R1)*x+1/(C1*R1)*u

また、出力方程式は、y=Vo=x


行列(1×1)で表すと
[x']=[-1/(C1*R1)][x] + [1/(C1*R1)]*[u]
[y]=[x]

これより
 A=-1/(C1*R1)
 b=1/(C1*R1)
 c=1
となります。



●オペアンプ正帰還型ローパス・フィルタの場合
   ┌C1┬──┐
   │ └ - │
Vi─R1┴R2┬ + K┴─Vo
     C2
     │
     ≡

C1,C2にかかる電圧をx1,x2、電流をi1,i2とします。
R1,R2,C2経路、Vi=(i1+i2)*R1+i2*R2+x2 … (1)
R1,C1,Vo経路、Vi=(i1+i2)*R1+x1+Vo … (2)
電流、i1=C1*x1'、i2=C2*x2' … (3),(4)
オペアンプ、Vo=K*x2 … (5)

u=Vi=(1)=(2)、(4)より、x2'=(x1+(K-1)*x2)/(R2*C2) … (6)

(1)に(3),(4)を代入してi1,i2を消す。さらに(6)を代入してx2を消すと
x1'=-(R1+R2)/(R1*R2*C1)*x1 -{(K-1)*(R1+R2)+R2}/(R1*R2*C1)*x2 +(1/(R1*C1))*u … (7)

この(6),(7)が状態方程式を表します。

また、出力方程式は(5)より、y=Vo=K*x2 … (8)


サンプル ※元のプログラムではC1,C2が重複するため、係数の変数名を変更してあります。
!行列関連
FUNCTION tr(A(,)) !行列Aのトレース
   LET t=0
   FOR i=1 TO N
      LET t=t+A(i,i)
   NEXT i
   LET tr=t
END FUNCTION

!多項式関連
SUB mono_disp(ak,k) !単項式を表示する Ak*X^k
   IF k<>0 THEN !x^nで
      IF ak=1 THEN !係数が1なら
      ELSEIF ak=-1 THEN !係数が-1なら
         PRINT "-";
      ELSE
         PRINT STR$(ak);"*";
      END IF
   END IF
   IF k=0 THEN !次数が0なら
      PRINT STR$(ak);
   ELSEIF k=1 THEN !次数が1なら
      PRINT "s";
   ELSE
      PRINT "s^";STR$(k);
   END IF
END SUB
!-------------------- ここまでがサブルーチン


!系 u(入力)→ [ x'=A*x+b*u、y=c*x ] →y(出力)

!---------- ↓↓↓↓↓ ----------
LET N=2 !状態変数の数

DIM A(N,N),b(N,1),c(1,N)

LET R1=30e3 !30k[Ω]
LET R2=18e3 !18k[Ω]
LET C1=0.01e-6 !0.01μ[F]
LET C2=0.0047e-6 !0.0047μ[F]
LET K=1 !ボルテージ・フォロワより、アンプの増幅率は1

LET A(1,1)=-(R1+R2)/(R1*R2*C1)
LET A(1,2)=-((K-1)*(R1+R2)+R2)/(R1*R2*C1)
LET A(2,1)=1/(R2*C2)
LET A(2,2)=(K-1)/(R2*C2)

LET b(1,1)=1/(R1*C1)
LET b(2,1)=0

LET c(1,1)=0
LET c(1,2)=K
!---------- ↑↑↑↑↑ ----------


!Frame法、Leverrir-Faddeev法
! adj(s*I-A)=s^(n-1)*I+s^(n-2)*β1+ … +s*βn-2+βn-1
! det(s*I-A)=s^n+α1*s^(n-1)+ … + αn-1*s+αn
!のとき
! β0=I、k=1~nについて
!  Xk=A*βk-1
!  αk=-trace(Xk)/k
!  βk=Xk+αk*I
!の逐次計算でαk、βkが求まる。

DIM p1(N) !分子側の多項式 c(1)*X^(N-1)+c(2)*X^(N-2)+ … +c(N-1)*X+c(N) の係数
DIM p2(N) !分母側の多項式 X^N+c(1)*X^(N-1)+c(2)*X^(N-2)+ … +c(N-1)*X+c(N) の係数
DIM X(N,N),sE(N,N),T1(1,N),T2(1,1) !作業用

MAT X=IDN !adj(s*I-A)
FOR k=1 TO N
   MAT PRINT X; !debug
   MAT T1=c*X !c*adj(s*I-A)*b ※定数*多項式*定数
   MAT T2=T1*b
   LET p1(k)=T2(1,1)

   MAT X=A*X
   LET p2(k)=-tr(X)/k !det(s*I-A)
   MAT sE=(p2(k))*IDN
   MAT X=X+sE
NEXT k


!※既約分数でない

!!!MAT PRINT p1; !debug
PRINT "分子= ";
FOR i=1 TO N !分子側の多項式を表示する
   LET w=p1(i)
   IF w>0 THEN PRINT "+";
   IF w<>0 THEN CALL mono_disp(w,N-i)
NEXT i
PRINT

!!!MAT PRINT p2; !debug
PRINT "分母= ";
CALL mono_disp(1,N) !分母側の多項式を表示する
FOR i=1 TO N
   LET w=p2(i)
   IF w>0 THEN PRINT "+";
   IF w<>0 THEN CALL mono_disp(w,N-i)
NEXT i


END
 

Re: 状態方程式から伝達関数を求める

 投稿者:山中和義  投稿日:2009年 3月11日(水)11時42分34秒
  > No.304[元記事へ]

補足

●伝達関数を求める
状態方程式 (6),(7)
 [ x1' ] = [ -(R1+R2)/(R1*R2*C1)  -{(K-1)*(R1+R2)+R2}/(R1*R2*C1) ] [ x1 ] + [ 1/(R1*C1) ] [ u ]
 [ x2' ]  [ 1/(R2*C2)            (K-1)/(R2*C2)                  ] [ x2 ]   [ 0         ]
出力方程式 (8)
 [ y ] = [ 0  K ] [ x1 ]
          [ x2 ]
と行列で表される。

K=1とすると
A=[ -(R1+R2)/(R1*R2*C1)  -1/(R1*C1) ]
  [ 1/(R2*C2)            0          ]

c=[ 0  1 ]


伝達関数 G(s)
=c*INV(s*I-A)*b
=[ 0  1 ] [ s+(R1+R2)/(R1*R2*C1)  1/(R1*C1) ]-1 [ 1/(R1*C1) ]
          [ -1/(R2*C2)            s         ]   [ 0         ]

まず、(s*I-A)の逆行列は
 [a b]-1 = 1/(a*d-b*c)[d -b] より
 [c d]                [-c a]

INV(s*I-A)
=[ s+(R1+R2)/(R1*R2*C1)  1/(R1*C1) ]-1
 [ -1/(R2*C2)            s         ]
=1/{(s+(R1+R2)/(R1*R2*C1))*s + 1/(R1*R2*C1*C2)} * [ s          -1/(R1*C1)           ]
                                                  [ 1/(R2*C2)  s+(R1+R2)/(R1*R2*C1) ]
となる。この場合、係数部分の分母が伝達関数の分母になる。

また、行列部分は
[ 0  1 ] * 上記 * [ 1/(R1*C1) ]
                  [ 0         ]
=[ 1/(R2*C2)  s+(R1+R2)/(R1*R2*C1) ] [ 1/(R1*C1) ]
                                     [ 0         ]
=1/(R1*R2*C1*C2)
となる。こらが伝達関数の分子になる。

したがって
G(s)
=1/(R1*R2*C1*C2) * 1/{ (s+(R1+R2)/(R1*R2*C1))*s + 1/(R1*R2*C1*C2) }
={ 1/(R1*R2*C1*C2) } / { (s^2+{1/(R2*C1)+1/(R1*C1)}*s + 1/(R1*R2*C1*C2) }


●最近の投稿のネタです。
回路解析
 キルヒホッフの法則
  直流回路、交流回路
  定常状態、過渡状態

  連立方程式を解く(代数方程式による表現)
   枝路電流法
    ┌±1┐[i]=┌0┐
    └ Z ┘  └E┘
   網目解析
    網目(閉路)電流法(閉路方程式 Z*I=E)
   節点解析
    節点電位法(節点方程式 G*E=I)

   抵抗、電流、電圧の計算
   入力電圧と出力電圧の比
    周波数解析
     ボード線図(利得、位相)
     ナイキスト線図


  状態方程式と出力方程式を解く(連立1次常微分方程式による表現)
   ラプラス変換
    伝達関数
     有理式
      零点(分子側の多項式)
      極(分母側の多項式)
       特性方程式の根(固有値)
      代数方程式の根
       DKA法

     システムの応答
      周波数解析
       ボード線図(利得、位相)
       ナイキスト線図
      過渡解析
       逆ラプラス変換
        部分分数分解
         代数方程式の根、組立除法
        逆フーリエ変換

     安定判別
      特性方程式の根、係数
      根軌跡

   オイラー法、ルンゲクッタ法


  フィルタ回路
  増幅器(アペアンプ)
   負帰還、正帰還
   アクティブ・フィルタ回路
 

戻る