MyEnigma

とある自律移動システムエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

制御初心者のための線形・非線形, 連続・離散システム入門

目次

はじめに

個人的な感覚ですが、

制御技術を学んでいると、

線形・非線形、連続・離散というのは、

なんとなく理解できますが、

実際に制御システムを設計したい時に、

具体的にどのようにすればいいかというのは、

わかりにくいと感じていました。

 

今回、

実際に制御システムを設計する上で必要な、

線形、非線形、連続・離散システム関連の

基礎的な内容をまとめておきたいと思います。

 

非線形システムの線形化

下記のような非線形システムがあった時、

f:id:meison_amsl:20161124165814p:plain

f:id:meison_amsl:20161124165824p:plain

制御のために、ある\bar{x}と\bar{u}を中心として、

線形化したい場合は、テイラー展開の一次展開

f:id:meison_amsl:20161124170527p:plain

より、先程の式は下記の線形システムの式で線形近似することができます。

f:id:meison_amsl:20161124170821p:plain

f:id:meison_amsl:20161124170804p:plain

 

連続システムから離散システムへの変換

一般的に、制御対象は、

物理ルールによって挙動するので、

連続系で数式化されます。

しかし、制御システムはコンピュータ上で実装されるので、

その連続系の式を使って、制御を実施する場合、

連続系のシステムを離散系のシステムに変換する必要があります。

 

目的としては、下記のような線形連続システムの行列Ac,Bc,Cc,Dcから、

 

下記のように、線形離散システムの行列Ad,Bd,Cd,Ddを計算したいと思います。

 

ちなみにCc=Cd, Dc=Dcなので、

AとBの行列変換のみの方法を説明します。

 

線形の連続系のシステムを、線形の離散系システムに変換方法としては、

大きくわけて2つ方法があります。

オイラー法

オイラー法は微分の定義式より、

下記の式で状態ベクトルが推移すると近似する方法です。

Tsはサンプリングタイム、g_cは非線形モデルです。

この方法は、非線形モデルでも対応できます。

 

この方法を線形システムに適用すると、

下記のように、離散系のシステム行列を計算できます。

Zero-Order Hold: ZOH法

ZOH法は、サンプリング時間の間、

入力uは一定だと仮定しますが、

状態ベクトルxの推移は常微分方程式の解を使って、

xの推移精密に近似します。

 

ZOH法での線形離散システム行列は下記のようになります。

一つ注意点として、A_cが逆行列が計算できるものでなくては、

ZOH法で近似することができません。

 

Pythonによる連続システムから離散システム変換関数

MATLABには、c2dという関数を使うと、

線形連続システムの行列から、

線形離散システムの行列を計算できます。

 

こちらの関数を真似て、

pythonにてc2d関数を実装してみました。

オイラー法とZOH法を選択して、

離散時間の行列を計算することができます。

def c2d(Ac, Bc, Ts, method="ZOH"):
    u"""
    Get system matrix of discrete system from continious system

    input:
        Ac:system matrix of continious system on dx=Ac x+Bc u
        Bc:system matrix of continious system on dx=Ac x+Bc u
        method:
            - Euler: Euler discretization method
            - ZOH: Zero order hold method
    output:
        Ad: system matrix of discrete system xt+1=Ad xt + Bd u
        Bd: system matrix of discrete system xt+1=Ad xt + Bd u

        see: https://en.wikipedia.org/wiki/Discretization
    """

    if method == "Euler":
        # Euler Method
        A = np.eye(Ac.shape[0]) + Ts * Ac
        B = Ts * Bc
    elif method == "ZOH":
        # ZOH Discretization
        A = splinalg.expm(Ac * Ts)
        B = np.linalg.inv(Ac) * (A - np.eye(Ac.shape[0])) * Bc
    else:
        print("Error:Unknown method")
        print(method)

    return A, B

 

システムの安定性

線形システムの安定性

システムの安定性とは、

下記の式のように、任意の初期値x(0)に対して、

時間を∞に進めた時に

状態ベクトルが0に収束することを指します。

 

線形システムにおいて、

そのシステムが安定かどうかは、

上記のシステム行列のAで決まります。

常微分方程式形式のシステム行列の場合、

安定性の条件は、Aの固有値λの実部が負になります。

 

下記のような遷移方程式形式の場合、

安定性の条件は、Aの固有値λiの絶対値が1以下になります。

 

非線形システムの安定性

上記のように、線形システムの場合、

安定性の証明は比較的簡単に判断できますが、

非線形システムの場合は、複雑になります。

 

非線形システムの安定性の判定方法は

いくつかありますが、

一番有名なのは、リアプノフの安定論だと思います。

 

リアプノフの安定論における安定とは、

下記のような非線形システムにおいて、

f(x)=0となるx、(つまりxの微分が0になる点)

を平衡点(xe)とした時に、

下記の図のように、すべての時刻において、

平衡点からの距離δ以下に

xが留まるシステムを安定と定義しています。

f:id:meison_amsl:20161128155627p:plain

またδ以下に留まるだけでなく、

T→∞にした時に、平衡点に漸近的に近づく場合(x(T)→∞)、

そのシステムを漸近安定と呼びます。

 

このリアプノフの安定の評価には、

リアプノフ関数という関数を使います。

 

参考資料

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com