MIMO Mass-Damper-Spring System
![]()
●Step 1
![]()
![]()
![]()
![]()
![]()
![]()
![]()
●Step 2
![]()

![]()

![]()
![]()
with Actuator Dynamics

●Step 3
![]()
![]()

![]()

![]()
![]()
MIMO Backstepping of Robots
![]()
●Step 1
![]()
![]()
![]()
![]()
![]()
![]()
![]()
●Step 2
![]()

![]()

![]()

MIMO Mass-Damper-Spring System
![]()
●Step 1
![]()
![]()
![]()
![]()
![]()
![]()
![]()
●Step 2
![]()

![]()

![]()
![]()
with Actuator Dynamics

●Step 3
![]()
![]()

![]()

![]()
![]()
MIMO Backstepping of Robots
![]()
●Step 1
![]()
![]()
![]()
![]()
![]()
![]()
![]()
●Step 2
![]()

![]()

![]()

予備的考察
BackSteppingの邦訳は、読み方のバックステッピング以外には適切なものがないようですが、非線形系に対する一つの制御方式を表しています。そこで、以下ではBackSteppingをBS制御と呼ぶことにします。
BS制御の基本的なアイデアを、次の例を用いて説明します。

ここで、(1.1)が非線形動作を、(1.2)がアクチュエータ動作を、(1.3)が観測式を表しています。したがって、制御対象は状態変数
をもつ2次元の非線形系です。
制御目的は状態変数
を速やかに零(平衡状態)に戻すこととします。
状態変数は
の2つなので、BS制御系設計のために2回の変数変換を行います。
以下では、変数変換後の状態変数
について2次安定性(したがって漸近安定性)を示し、逆変換により、元の状態変数
についての漸近安定性を示します。
●Step 1
まず第1番目の変数変換として、次を考えます。
![]()
また
に対する仮想的な操作変数
を導入して、第2番目の変数変換
![]()
を考えます。このとき(1.1)は次式で表されます。
![]()
このフィードバック線形化を行うために
![]()
と定義すると、
の状態方程式として
![]()
を得ます。これに対するリャプノフ関数
![]()
に対して、次式を得ます。
![]()
●Step 2
の状態方程式として、(1.2)を用いて
![]()
を得ます。これに対するリャプノフ関数を
![]()
と定義すると、次式を得ます。

ここで、操作入力を
![]()
と選ぶと次式を得ます。
![]()
●以上の変数変換とその逆変換は、次式のように表すことができます。


変数変換後の閉ループ系は次式で表されます。
![]()
すなわち
![Rendered by QuickLaTeX.com \displaystyle{(15)\quad \underbrace{ \left[\begin{array}{l} \dot{z}_1\\ \dot{z}_2 \end{array}\right]}_{\dot z}=- \underbrace{ \left[\begin{array}{cc} k_1 & 0\\ 0 & k_2 \end{array}\right]}_{K} \underbrace{ \left[\begin{array}{l} z_1\\ z_2 \end{array}\right]}_{z}+ \underbrace{ \left[\begin{array}{cc} 0 & 1\\ -1 & 0 \end{array}\right]}_{S} \underbrace{ \left[\begin{array}{l} z_1\\ z_2 \end{array}\right]}_{z} }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-5ba0b9891c7ccb17dde0e6f7efa61211_l3.png)
このとき、2次安定性
![]()
が示されており
![]()
が成り立ち、(13)から制御目的が達成されていることが分かります。
●フィードバック線形化(5)の実施においては、非線形関数
を正確にモデリングしておく必要がありますが、実際にはこれは一般には困難です。たとえば次の例を考えます。
![]()
ここで、
は未知とします。第1項と第3項は線形の減衰項とみなせますが、第2項は非線形の減衰力で打ち消す必要があります。たとえば、
に注意して
![]()
と選ぶとき、次式が成り立ちます。

このとき、(6)の下で、次式を得ます。
![]()
また、(9)の下で
![]()
ここで、(11)のように
と選択すると
![]()
ここで、恒等式

において、
とおけば、次式を得ます。

したがって、
と選べば、
を達成できます。すなわち、制御則(19)と(11)は、未知の
を使わないので、BS制御はロバストであると言えます。
Mass-Damper-Spring System
次のMDS(マス・ダンパ・バネ)系を考えます。

ここで、
は位置を、
は速度を、
は質量を、
は非線形の減衰係数を、
は非線形のバネ係数を表しています。(1.1)と(1.2)が状態変数
をもつ非線形状態方程式、(1.3)が観測方程式です。
制御目的は、目標軌道
に対する追従誤差
![]()
を速やかに零とし目標軌道に乗せることです。基礎式は次のようにまとめられます。

ここで、第1式が非線形動作を、第2式が追従誤差の振舞い(積分動作とは異なる)を表しています。
状態変数は
、
の2つなので、BS制御系設計のために2回の変数変換を行います。
以下では、変数変換後の状態変数
について2次安定性(したがって漸近安定性)を示し、逆変換により、元の状態変数
についての漸近安定性を示します。
●Step 1
まず第1番目の変数変換として、次式を考えます。
![]()
に対する仮想的な操作変数
を導入して、第2番目の変数変換
![]()
を考えます。このとき
の状態方程式
![]()
を得ます。このフィードバック線形化を行うために
![]()
と定義すると、次式を得ます。
![]()
これに対するリャプノフ関数
![]()
に対して、次式を得ます。
![]()
●Step 2
の状態方程式として、(5)から
![]()
(3)を用いて次式を得ます。
![]()
これに対するリャプノフ関数を
![]()
と定義すると、次式を得ます。
![]()
ここで、操作入力を
![]()
と選ぶと次式を得ます。
![]()
●以上の変数変換とその逆変換は、次式のように表すことができます。


変数変換後の閉ループ系は次式で表されます。

すなわち
![Rendered by QuickLaTeX.com \displaystyle{(18)\quad \begin{array}{l} \underbrace{ \left[\begin{array}{cc} 1 & 0\\ 0 & m \end{array}\right]}_{M} \underbrace{ \left[\begin{array}{l} \dot{z}_1\\ \dot{z}_2 \end{array}\right]}_{\dot z}=- \underbrace{ \left[\begin{array}{cc} k_1+n_1(z_1) & 0\\ 0 & k_2+n_2(z_2) \end{array}\right]}_{K} \underbrace{ \left[\begin{array}{l} z_1\\ z_2 \end{array}\right]}_{z}\\ + \underbrace{ \left[\begin{array}{cc} 0 & 1\\ -1 & 0 \end{array}\right]}_{S} \underbrace{ \left[\begin{array}{l} z_1\\ z_2 \end{array}\right]}_{z} \end{array} }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-7e30d4583990442c75248537bb56d2b1_l3.png)
このとき、2次安定性
![]()
が示されており

が成り立ち、制御目的が達成されていることが分かります。
●平衡状態の安定化問題は、次のように目標軌道が一定の特別な場合と考えられます。
![]()
簡単のため、
、
とすると
![]()
となり、次式を得ます。
![]()
これは、次のような非線形のPD制御とみなすことができます。
![]()
実際、(4)より
、
、(5)より
に注意して

以下では積分動作を導入するための2つのアプローチを示します。
Integrator Augmentation
外乱の影響を受ける次のMDS(マス・ダンパ・バネ)系を考えます。

ここで、
は外乱を表しています。
制御目的は、外乱に抗して、目標軌道
に対する追従誤差
![]()
を速やかに零とし目標軌道に乗せることです。
積分動作を入れて状態方程式を拡大した基礎式は次のようにまとめられます。

ここで、第1式が非線形動作を、第2式が追従誤差の振舞いを、第3式が積分動作を表しています。
状態変数は
、
、
の3つなので、BS制御系設計のために3回の変数変換を行います。
以下では、変数変換後の状態変数
について2次安定性(したがって漸近安定性)を示し、逆変換により、元の状態変数
についての漸近安定性を示します。
●Step 1
まず第1番目の変数変換として、次式を考えます。
![]()
に対する仮想的な操作変数
を導入して、第2番目の変数変換
![]()
を考えます。このとき
の状態方程式
![]()
を得ます。いま
![]()
と定義すると
![]()
これに対するリャプノフ関数
![]()
に対して、次式を得ます。
![]()
●Step 2
の状態方程式として、(5)から
![]()
に対する仮想的な操作変数
を導入して、第3番目の変数変換
![]()
を考えます。このとき
の状態方程式
![]()
を得ます。これに対するリャプノフ関数を
![]()
と定義すると、次式を得ます。
![]()
ここで
![]()
と定義すると、次式を得ます。
![]()
これから、次式を得ます。
![]()
●Step 3
の状態方程式として、(11)から
![]()
を得ます。このとき

これに対するリャプノフ関数
![]()
に対して、次式を得ます。

ここで、操作入力を
![]()
と選ぶと、次式を得ます。
![]()
●以上の変数変換とその逆変換は、次式のように表すことができます。


閉ループ系は次式で表されます。

すなわち
![Rendered by QuickLaTeX.com \displaystyle{(21)\quad \begin{array}{l} \underbrace{ \left[\begin{array}{ccc} 1 & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 & m \end{array}\right]}_{M} \underbrace{ \left[\begin{array}{l} \dot{z}_1\\ \dot{z}_2\\ \dot{z}_3 \end{array}\right]}_{\dot z}=- \underbrace{ \left[\begin{array}{ccc} k_1 & 0 & 0\\ 0 & k_2 & 0\\ 0 & 0 & d(v)+k_3 \end{array}\right]}_{K} \underbrace{ \left[\begin{array}{l} z_1\\ z_2\\ z_3 \end{array}\right]}_{z}\\+ \underbrace{ \left[\begin{array}{ccc} 0 & 1 & 0\\ -1 & 0 & 1\\ 0 & -1 & 0 \end{array}\right]}_{S} \underbrace{ \left[\begin{array}{l} z_1\\ z_2\\ z_3 \end{array}\right]}_{z} \end{array} }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-e4c27a02e87a8a58ef7fe31f40061a45_l3.png)
このとき、2次安定性
![]()
が示されており

が成り立ち、制御目的が達成されていることが分かります。
Integral Action by Constant Parameter Adaptation
次の定値外乱の影響を受けるMDS(マス・ダンパ・バネ)系を考えます。

ここで、
は位置を、
は速度を、
は定値外乱を、
は質量を、
は非線形の減衰係数を、
は非線形のバネ係数を表しています。
制御目的は、定値外乱に抗して、目標軌道
に対する追従誤差
![]()
を速やかに零とし目標軌道に乗せることです。基礎式は次のようにまとめられます。

ここで、第1式が定値外乱下の非線形動作を、第2式が追従誤差の振舞いを表しています。
●Step 1
まず第1番目の変数変換として、次式を考えます。
![]()
に対する仮想的な操作変数
を導入して、第2番目の変数変換
![]()
を考えます。このとき
の状態方程式
![]()
を得ます。このフィードバック線形化を行うために
![]()
と定義すると、次式を得ます。
![]()
これに対するリャプノフ関数

に対して、次式を得ます。

●Step 2
の状態方程式として、(5)と(7)から
![]()
よって、(3)から次式を得ます。
![]()
これに対するリャプノフ関数を
![]()
と定義すると、次式を得ます。

ここで、操作入力を
![]()
と選ぶと次式を得ます。
![]()
ここで、外乱の予測式を
![]()
と選べばよいことが分かります。
●閉ループ系は次式で表されます。

すなわち
![Rendered by QuickLaTeX.com \displaystyle{(17)\quad \underbrace{ \left[\begin{array}{cc} 1 & 0\\ 0 & m \end{array}\right]}_{M} \underbrace{ \left[\begin{array}{l} \dot{z}_1\\ \dot{z}_2 \end{array}\right]}_{\dot z}=- \underbrace{ \left[\begin{array}{cc} k_1 & 1\\ -1 & -k_2-d(v) \end{array}\right]}_{A} \underbrace{ \left[\begin{array}{l} z_1\\ z_2 \end{array}\right]}_{z}+ \underbrace{ \left[\begin{array}{c} 0 \\ -1 \end{array}\right]}_{b} (\hat{w}-w) }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-da7a835f971ce5dac2d1a21c12164a35_l3.png)
![Rendered by QuickLaTeX.com \displaystyle{(18)\quad \dot{\hat{w}}=-p \underbrace{ \left[\begin{array}{cc} 0 & -1 \end{array}\right]}_{b^T} \underbrace{ \left[\begin{array}{l} z_1\\ z_2 \end{array}\right]}_{z} }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-c15da6d97348e4f96dbe7ef9aee6bada_l3.png)
Case1:3次元モデルに基づくBS制御
●制御対象YMCPBのピッチに関する運動方程式として次式を考えます。
![]()
これは次の形をとると考えられます。
![]()
ここで、減衰係数
、復元係数
は、
、
の非線形関数、
は外乱やモデル化誤差を表しています。また、
は船外機の取付角で、その動作は操作変数
を用いて、次式で表されます。
![]()
(2)と(3)を合わせた制御対象全体の非線形状態方程式を線形化すると次式となります。
![Rendered by QuickLaTeX.com \displaystyle{(4)\quad \begin{array}{l} \underbrace{ \frac{d}{dt} \left[\begin{array}{c} \theta(t)-\theta^*\\ \dot{\theta}(t)\\ \theta_e(t)-\theta_e^* \end{array}\right] }_{\dot{x}(t)} = \underbrace{ \left[\begin{array}{ccc} 0 & 1 & 0\\ a_{63} & a_{66} & b_{62}\\ 0 & 0 & 0 \end{array}\right] }_{A} \underbrace{ \left[\begin{array}{c} \theta(t)-\theta^*\\ \dot{\theta}(t)\\ \theta_e(t)-\theta_e^* \end{array}\right] }_{x(t)} + \underbrace{ \left[\begin{array}{cc} 0 \\ 0 \\ \Omega_e \end{array}\right] }_{B} u_e(t)\\ +\underbrace{ \left[\begin{array}{cccc} 0 & 0 & 0 & 0 \\ a_{62} & a_{64} & a_{65} & b_{61}\\ 0 & 0 & 0 & 0 \end{array}\right] \left[\begin{array}{c} z(t)-z^*\\ \dot{x}(t)-V^*\\ \dot{z}(t)\\ T(t)-T^* \end{array}\right] }_{w(t)} \end{array} }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-44d46ce48189bf941958132e5f951657_l3.png)
ここで、
は平衡状態を表しています。
●以上から、制御対象は次式でモデル化されているとします。
制御目的は、まず船外機の取付角を
に移動させること、その上で外乱に抗して船体のピッチ角の振動を抑え、平衡状態を保持することです。そのために、制御則には誤差
による積分動作
を入れます。積分動作を入れて拡大した基礎式は次のようにまとめられます。
ここで、第1式と第2式が非線形動作を、第3式がアクチュエータの動作を、第4式が積分動作を表しています。以下では、簡単のため
とします。
状態変数は
、
、
、
の4つなので、BS制御系設計のために4回の変数変換を行います。
以下では、変数変換後の状態変数
について2次安定性(したがって漸近安定性)を示し、逆変換により、元の状態変数
についての漸近安定性を示します。
●Step 1
まず第1番目の変数変換として、次式を考えます。
![]()
また
に対する仮想的な操作変数
を導入して、第2番目の変数変換
![]()
を考えます。このとき
の状態方程式は
![]()
となります。いま
![]()
と定義すると
![]()
となります。これに対するリャプノフ関数
![]()
に対して、次式を得ます。
![]()
●Step 2
に対して仮想的な操作変数
を導入して、第3番目の変数変換
![]()
を考えます。このとき
の状態方程式として

を得ます。このフィードバック線形化を行うために
![]()
と定義すると、次式を得ます。
![]()
これに対するリャプノフ関数を
![]()
と定義すると、次式を得ます。

●Step 3
の状態方程式として
![]()
このフィードバック線形化を行うために
![]()
と定義すると、次式を得ます。

これに対するリャプノフ関数
![]()
に対して、次式を得ます。

●Step 4
に対して仮想的な操作変数
を導入して、第4番目の変数変換
![]()
を考えます。
の状態方程式は
![]()
いま
![]()
と定義すると
![]()
これに対するリャプノフ関数
![]()
に対して、次式を得ます。
![]()
●以上の変数変換とその逆変換は、次式のように表すことができます。


これまでのSM制御系の線形制御則は状態フィードバック型のものを設計してきました。そして、制御対象の3次元モデルを用いても十分な結果が得られることを確認しました。そこで、制御対象の5次元モデルに基づいて線形制御則として出力フィードバック型のものを設計してもうまく機能することが予想されます。これはヒーブを完全に無視するのではなく、間接的に考慮していることになることがメリットと考えられます。
Case1:5次元モデルに基づくOF-SM制御
| MATLAB |
|

図1 YMCPBに対する出力FB型SM制御のシミュレーション例
Case2:5次元モデルに基づくOF-SMI制御
●補償器を用いる方法
●SMオブザーバを用いる方法(m=p=1の制約)
ここでは、 LQI制御に倣って積分動作をもつスライディングモード制御(SMI2制御)系の設計について述べます。その評価は本来は非線形シミュレータ上で行うべきですが、ここでは6次元線形モデルに関して行います。
| Case | 設計モデル | 状態FB | 状態OB | 積分動作 | 注意点 |
| 1 | 5次 | 5次 | 未使用 | 要 | 「絵に描いた餅」 |
| 2 | 5次 | 3次 | 不要 | 要 | ヒーブのゲインを強制的に零 |
| 3 | 3次 | 3次 | 不要 | 要 | ヒーブからの連成を抑制できるか |
| 4 | 5次 | 5次 | 要 | 要 | コントローラが微分方程式 |
Case1:5次元モデルに基づくSMI制御
●LQI制御における偏差系(7)を、改めて次のように書きます。
![Rendered by QuickLaTeX.com \displaystyle{(1)\quad \begin{array}{l} \underbrace{ \left[\begin{array}{c} \dot x_1(t)\\ \dot x_2(t) \end{array}\right] }_{\dot{x}_{E3}(t)} = \underbrace{ \left[\begin{array}{cc} A & B \\ 0 & 0 \end{array}\right] }_{A_{E3}} \underbrace{ \left[\begin{array}{c} x_1(t)\\ x_2(t) \end{array}\right] }_{x_{E3}(t)} + \underbrace{ \left[\begin{array}{c} 0\\ I_m \end{array}\right] }_{B_{E3}} {\dot u}(t)\\ (x_1(t)=x(t)-x_\infty, x_2(t)=u(t)-u_\infty) \end{array} }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-287cdcd8e65d74ee36ec3b14429778da_l3.png)
スイッチング関数として、次式を考えます。
![Rendered by QuickLaTeX.com \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_{E3}(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_{E3}(t)} \ (M=S_2^{-1}S_1) }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-b29dc4a454912e8d6acde0686487f72b_l3.png)
(1)に対して、座標変換
![Rendered by QuickLaTeX.com \displaystyle{(3)\quad \underbrace{ \left[\begin{array}{c} x_1(t)\\ s(t) \end{array}\right] }_{x'_{E3}(t)} = \underbrace{ \left[\begin{array}{cc} I & 0 \\ S_1 & S_2 \\ \end{array}\right] }_{T_s} \underbrace{ \left[\begin{array}{c} x_1(t)\\ x_2(t) \end{array}\right] }_{x_{E3}(t)}\\ \Leftrightarrow \underbrace{ \left[\begin{array}{c} x_1(t)\\ x_2(t) \end{array}\right] }_{x_{E3}(t)} = \underbrace{ \left[\begin{array}{cc} I & 0 \\ -S_2^{-1}S_1 & S_2^{-1} \\ \end{array}\right] }_{T_s^{-1}} \underbrace{ \left[\begin{array}{c} x_1(t)\\ s(t) \end{array}\right] }_{x'_{E3}(t)} }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-1d43b39400a0f9614aa7f3662f3f8fc4_l3.png)
を行って、次式を得ます。
![Rendered by QuickLaTeX.com \displaystyle{(4)\quad \underbrace{ \left[\begin{array}{c} \dot x_1(t)\\ \dot s(t) \end{array}\right] }_{\dot{x}'_{E3}(t)} = \underbrace{ \left[\begin{array}{cc} \bar{A}_{11} & \bar{A}_{12} \\ \bar{A}_{21} & \bar{A}_{22} \\ \end{array}\right] }_{T_sA_{E3}T_s^{-1}} \underbrace{ \left[\begin{array}{c} x_1(t)\\ s(t) \end{array}\right] }_{x'_{E3}(t)} + \underbrace{ \left[\begin{array}{cc} 0\\ S_2 \end{array}\right] }_{T_sB_{E3}} {\dot u}(t) }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-ad4d0f30544fe9138bf4a06f0bbc0d3c_l3.png)

以下では、
が安定行列となるようにスイッチング関数が選ばれていると仮定します。
●偏差系E3に対するSM制御は次式で与えられます。
![]()
![Rendered by QuickLaTeX.com \displaystyle{(7)\quad {\dot u}_\ell(t)=-\underbrace{(SB_{E3})^{-1}(SA_{E3}-\Phi S)}_{K_{E3}=\left[\begin{array}{cc} K_1 & K_2 \end{array}\right]}}x_{E3}(t) }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-aa75a3fae556ffb1e063a6c3165e9f14_l3.png)
![]()
ここで、
は安定行列、
は
の解です。
これらを積分して、制御対象に対する積分動作をもつSM制御(SMI制御)を導出します。
![]()
まず(7)は次式のように書けます。
![Rendered by QuickLaTeX.com \displaystyle{(10)\quad {\dot u}_\ell(t)=- \boxed{\underbrace{ (SB_{E3})^{-1}(SA_{E3}-\Phi S)S_E^{-1} }_{\left[\begin{array}{cc} F & F_I \end{array}\right]}} \underbrace{ \left[\begin{array}{c} {\dot x}(t) \\ y(t)-r \end{array}\right] }_{x_{E2}(t)} }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-17dcffd80184d45c409aa1d4e2fd454e_l3.png)
これを積分して

次に(8)は次式のように書けます。
![Rendered by QuickLaTeX.com \displaystyle{(12)\quad {\dot u}_n(t) =-(SB_{E3})^{-1}\rho\, {\rm sgn}( \boxed{\underbrace{ P_2SS_E^{-1} }_{\left[\begin{array}{cc} G & G_I \end{array}\right]}} \underbrace{ \left[\begin{array}{c} {\dot x}(t) \\ y(t)-r \end{array}\right] }_{x_{E2}(t)}) }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-863369c4b058cffb357ac9501fed0507_l3.png)
これを積分すれば

●制御対象YMCPBに対するSMI制御系を設計するプログラムを次に示します。
| MATLAB |
|

図1 SMI2制御系シミュレーション
これを実行して次のシミュレーション結果を得ます。

図2 5次元モデルに基づくSMI2制御系と符号関数を通したSMI制御
Case1’:Case1でヒーブゲインを零とする場合

図3 ヒーブゲインを零とした場合のSMI2制御系と符号関数を通したSMI制御
Case2:3次元モデルに基づくSMI制御
●制御対象YMCPBに対するSMI制御系を設計するプログラムを次に示します。
| MATLAB |
|

図4 3次元モデルに基づくSMI2制御系と符号関数を通したSMI2制御
ここでは、次の4種類の積分動作をもつスライディングモード制御(SMI制御)系の設計について述べます。
| Case | 設計モデル | 状態FB | 状態OB | 積分動作 | 注意点 |
| 1 | 5次 | 5次 | 未使用 | 要 | 「絵に描いた餅」 |
| 2 | 5次 | 3次 | 不要 | 要 | ヒーブのゲインを強制的に零 |
| 3 | 3次 | 3次 | 不要 | 要 | ヒーブからの連成を抑制できるか |
| 4 | 5次 | 5次 | 要 | 要 | コントローラが微分方程式 |
Note e13に示すように、データセットNo.1について、id=128の場合を設計用モデルとして採用したとき、Case2とCase3のどちらを用いても制御性能に大きな差異が見られません。そこでこのコントローラがどれくらいのモデル変動をカバーできるかという意味のロバスト性をシミュレーションにより調べてみます。ここで、モデル変動としては、前進速度を変える場合と、重心位置を変える場合の2通りを考えます。そのために次の3組のデータセットを考えます。
| 艇 | 艇質量[kg] | 長手方向重心位置[m] | 備考 | |
| No3 | SPTM247 | 2845 | 1.937 | 2022/1/19重量重心測定結果より |
| No4 | SPTM247 | 2945 | 1.937 | No3重量に+100kg |
| No5 | SPTM247 | 2745 | 1.937 | No3重量に-100kg |
設計用モデルとして、データセットNo.3における船外機取付角-2[deg]のときのid=128の場合を採用し、Case 2とCase 3のLQIコントローラを設計します。そしてデータセットNo.3,4,5における船外機取付角-2[deg]のときのモデル(id=126~133)を安定化できるかを調べます。シミュレーション結果を次に示します。
⇒Case2:いくつかの動作点で不安定
⇒Case3:すべて安定
図1 データセットNo.3の場合、SMIコントローラのロバスト性
⇒Case2:いくつかの動作点で不安定
⇒Case3:すべて安定
図2 データセットNo.4の場合、SMIコントローラのロバスト性
⇒Case2:いくつかの動作点で不安定
⇒Case3:すべて安定
図3 データセットNo.5の場合、SMIコントローラのロバスト性
これらのシミュレーションは本来は非線形シミュレータ上で行うべきですが、ここでは6次元線形モデルを用いて簡易的に行っています。
第1の注意点は、6次元線形モデルの第4番目の状態変数
の係数を強制的に
としていることです。これは
となる場合があって、
が発散してしまうからです。
第2の注意点は、上のシミュレーションではCase 2のコントローラではすべてを安定化できていませんが、設計用モデルとして、データセットNo.1における船外機取付角-2[deg]のときのid=128の場合を採用すると、すべて安定化されることです。
これらの事情は、線形モデルが暫定版の非線形シミュレータから得られているので正確ではないためとも考えられます。いずれにしてもできるだけ実機のダイナミックスを反映した非線形シミュレータ上での再検討が必要になります。
| MATLAB |
|
| MATLAB |
|
Note e13 SMI制御系の設計
Case 1:5次元モデルに基づくSMI制御
●制御対象

の出力を、コマンド(次式の解)
![]()
に追従させることを考えます(
は安定行列)。そのために、積分動作
![]()
を導入し、次の拡大系を構成します。ここで、(1)はすでに標準形であるとしています。
![Rendered by QuickLaTeX.com \displaystyle{(4)\quad \begin{array}{l} \left[\begin{array}{c} \dot x_r(t)\\ \dot x(t) \end{array}\right] = \left[\begin{array}{c|cc} 0 & -C_1 & -C_2\\\hline 0 & A_{11} & A_{12} \\ 0 & A_{21} & A_{22} \end{array}\right] \left[\begin{array}{c} x_r(t)\\ x(t) \end{array}\right] + \left[\begin{array}{c} 0\\\hline 0\\ B_2 \end{array}\right] u(t) + \left[\begin{array}{c} I_m \\\hline 0 \\ 0 \end{array}\right] r(t)\\ (x_r(t)\in{\rm\bf R}^m, x(t)\in{\rm\bf R}^n) \end{array} }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-1ab4b378422eddd1bff475a2408082e2_l3.png)
これを、次のように分割し直しても標準形であることには変わりありません。
![Rendered by QuickLaTeX.com \displaystyle{(5a)\quad \begin{array}{l} \left[\begin{array}{c} \dot{x}_1(t)\\ \dot{x}_2(t) \end{array}\right] = \underbrace{ \left[\begin{array}{cc|c} 0 & -C_1 & -C_2\\ 0 & A_{11} & A_{12} \\\hline 0 & A_{21} & A_{22} \end{array}\right] }_{A_E} \left[\begin{array}{c} x_1(t)\\ x_2(t) \end{array}\right] + \underbrace{ \left[\begin{array}{c} 0\\ 0\\\hline B_2 \end{array}\right] }_{B_E} u(t) + \left[\begin{array}{c} I_m \\ 0 \\\hline 0 \end{array}\right] r(t)\\ (x_1(t)\in{\rm\bf R}^n, x_2(t)\in{\rm\bf R}^m) \end{array} }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-374491b693fbc08a0a4648abd3e610d2_l3.png)
ただし
![]()
●この積分器による拡大系を安定化できれば、積分器の値
は定値となり、被積分項
の値は零となり、
は
へ漸近します。そこで、SM制御によって拡大系を安定化し、追従制御系を構成することを考えます。この制御系は特別な
の場合を含みますので、まずスイッチング関数として、次式を考えます。
![Rendered by QuickLaTeX.com \displaystyle{(6)\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_m \\ \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) }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-01bb686061b94fbab2a0ff90e7d23f64_l3.png)
(5)に対して、座標変換
![Rendered by QuickLaTeX.com \displaystyle{(7)\quad \begin{array}{l} \left[\begin{array}{c} x_1(t)\\ s(t) \end{array}\right] = \underbrace{ \left[\begin{array}{cc} I_n & 0 \\ S_1 & S_2 \\ \end{array}\right] }_{T_s} \left[\begin{array}{c} x_1(t)\\ x_2(t) \end{array}\right]\\ \Leftrightarrow \left[\begin{array}{c} x_1(t)\\ x_2(t) \end{array}\right] = \underbrace{ \left[\begin{array}{cc} I_n & 0 \\ -S_2^{-1}S_1 & S_2^{-1} \\ \end{array}\right] }_{T_s^{-1}} \left[\begin{array}{c} x_1(t)\\ s(t) \end{array}\right] \end{array} }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-19e5643bcb296d8a517aba35bc4fe14e_l3.png)
を行って、次式を得ます。
![Rendered by QuickLaTeX.com \displaystyle{(8a)\quad \begin{array}{l} %\underbrace{ \left[\begin{array}{c} \dot x_1(t)\\ \dot s(t) \end{array}\right] %}_{\dot{x}'(t)} = \underbrace{ \left[\begin{array}{cc} \bar{A}_{11} & \bar{A}_{12} \\ S_2\bar{A}_{21} & S_2\bar{A}_{22}S_2^{-1} \\ \end{array}\right] }_{T_sA_ET_s^{-1}} %\underbrace{ \left[\begin{array}{c} x_1(t)\\ s(t) \end{array}\right] %}_{x'(t)} + \underbrace{ \left[\begin{array}{cc} 0\\ S_2B_2 \end{array}\right] }_{T_sB_E} u(t)\\ + \left[\begin{array}{cc} B_r \\ S_1B_r \end{array}\right] r(t) \end{array} }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-a23595fe93cd3fb99284c6e90f61bcf1_l3.png)
ただし
![Rendered by QuickLaTeX.com \displaystyle{(8b)\quad \left\{\begin{array}{l} \bar{A}_{11}= \left[\begin{array}{cc} 0 & -C_1 \\ 0 & A_{11} \end{array}\right] -\left[\begin{array}{c} -C_2\\ A_{12} \end{array}\right]M\\ \bar{A}_{12}= \left[\begin{array}{c} -C_2\\ A_{12} \end{array}\right]S_2^{-1}\\ \bar{A}_{21}=S_2(M\bar{A}_{11} + \left[\begin{array}{cc} 0 & A_{21} \end{array}\right] -A_{22}M)\\ \bar{A}_{22}=S_2(M \left[\begin{array}{c} -C_2\\ A_{12} \end{array}\right] +A_{22})S_2^{-1}\\ B_r=\left[\begin{array}{cc} I_m \\ 0 \end{array}\right] \end{array}\right. }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-24d62178408415d07b9cef2c8d0cfab3_l3.png)
ここで、
が安定行列となるように行列
が選ばれているとします。
●このときSM制御則は次式で与えられます。
![Rendered by QuickLaTeX.com \displaystyle{(9)\quad { \boxed{\begin{array}{l} u(t)=u_\ell(t)+u_n(t)\\ u_\ell(t)=-\underbrace{(SB_E)^{-1}(SA_E-\Phi S)}_{L=L_{eq}+L_\Phi}\left[\begin{array}{c} x_r(t)\\ x(t) \end{array}\right]\\ -\underbrace{(SB_E)^{-1}(\Phi S_r+S_1B_r)}_{L_r} r(t) +\underbrace{(SB_E)^{-1}S_r}_{L_{\dot r}} \dot{r}(t)\\ u_n(t)=-\underbrace{(SB_E)^{-1}\rho(t,x)}_{L_n}\frac{P_2(s(t)-S_rr(t))}{||P_2(s(t)-S_rr(t))||} \end{array}}} }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-c4cbe9f1729638135b91b41ee797a570_l3.png)
| MATLAB |
|

図1 SMI制御系シミュレーション

図2 5次元モデルに基づくSMI制御系と符号関数を通したSMI制御
Case 2:Case1でヒーブゲインを零とする場合

図3 ヒーブゲインを零とした場合のSMI制御系と符号関数を通したSMI制御
Case 3:3次元モデルに基づくSMI制御
●制御対象YMCPBに対するSMI制御系を設計するプログラムを次に示します。
| MATLAB |
|

図4 3次元モデルに基づくSMI制御系と符号関数を通したSMI制御
ここでは、次の4種類のLQI制御系設計について述べます。
| Case | 設計モデル | 状態FB | 状態OB | 積分動作 | 注意点 |
| 1 | 5次 | 5次 | 未使用 | 要 | 「絵に描いた餅」 |
| 2 | 5次 | 3次 | 不要 | 要 | ヒーブのゲインを強制的に零 |
| 3 | 3次 | 3次 | 不要 | 要 | ヒーブからの連成を抑制できるか |
| 4 | 5次 | 5次 | 要 | 要 | コントローラが微分方程式 |
Note e12に示すように、データセットNo.1について、id=128の場合を設計用モデルとして採用したとき、Case2とCase3のどちらを用いても制御性能に大きな差異が見られません。そこでこのコントローラがどれくらいのモデル変動をカバーできるかという意味のロバスト性をシミュレーションにより調べてみます。ここで、モデル変動としては、前進速度を変える場合と、重心位置を変える場合の2通りを考えます。そのために次の3組のデータセットを考えます。
| 艇 | 艇質量[kg] | 長手方向重心位置[m] | 備考 | |
| No3 | SPTM247 | 2845 | 1.937 | 2022/1/19重量重心測定結果より |
| No4 | SPTM247 | 2945 | 1.937 | No3重量に+100kg |
| No5 | SPTM247 | 2745 | 1.937 | No3重量に-100kg |
設計用モデルとして、データセットNo.3における船外機取付角-2[deg]のときのid=128の場合を採用し、Case 2とCase 3のLQIコントローラを設計します。そしてデータセットNo.3,4,5における船外機取付角-2[deg]のときのモデル(id=126~133)を安定化できるかを調べます。シミュレーション結果を次に示します。
⇒Case2:いくつかの動作点で不安定
⇒Case3:いくつかの動作点で不安定
図1 データセットNo.3の場合、LQIコントローラのロバスト性
⇒Case2:いくつかの動作点で不安定
⇒Case3:いくつかの動作点で不安定
図2 データセットNo.4の場合、LQIコントローラのロバスト性
⇒Case2:いくつかの動作点で不安定
⇒Case3:いくつかの動作点で不安定
図3 データセットNo.5の場合、LQIコントローラのロバスト性
これらのシミュレーションは本来は非線形シミュレータ上で行うべきですが、ここでは6次元線形モデルを用いて簡易的に行っています。
第1の注意点は、6次元線形モデルの第4番目の状態変数
の係数を強制的に
としていることです。これは
となる場合があって、
が発散してしまうからです。
第2の注意点は、上のシミュレーションでは各データセットのすべてのモデルを安定化できていませんが、設計用モデルとして、データセットNo.1における船外機取付角-2[deg]のときのid=128の場合を採用すると、各データセットのすべてのモデルは安定化されることです。
これらの事情は、線形モデルが暫定版の非線形シミュレータから得られているので正確ではないためとも考えられます。いずれにしてもできるだけ実機のダイナミックスを反映した非線形シミュレータ上での再検討が必要になります。
| MATLAB |
|
| MATLAB |
|
Note e12 LQI制御系の設計
Case 1:5次元モデルに基づくLQI制御
●LQI制御系を設計するために、次の5次元モデルを考えます。
![Rendered by QuickLaTeX.com \displaystyle{(1.1)\quad \begin{array}{l} \underbrace{ \frac{d}{dt} \left[\begin{array}{c} z(t)-z^*\\ \theta(t)-\theta^*\\ \dot{z}(t)\\ \dot{\theta}(t)\\ \theta_e(t)-\theta_e^* \end{array}\right] }_{\dot{x}(t)} = \underbrace{ \left[\begin{array}{ccccc} 0 & 0 & 1 & 0 & 0\\ 0 & 0 & 0 & 1 & 0\\ a_{52} & a_{53} & a_{55} & a_{56} & b_{52}\\ a_{62} & a_{63} & a_{65} & a_{66} & b_{62}\\ 0 & 0 & 0 & 0 & 0 \end{array}\right] }_{A} \underbrace{ \left[\begin{array}{c} z(t)-z^*\\ \theta(t)-\theta^*\\ \dot{z}(t)\\ \dot{\theta}(t)\\ \theta_e(t)-\theta_e^* \end{array}\right] }_{x(t)}\\ + \underbrace{ \left[\begin{array}{c} 0 \\ 0 \\ 0 \\ 0 \\ \omega_e \end{array}\right] }_{B} u(t) \end{array}}](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-2ab91f82b36ff6c479a3662543135546_l3.png)
![Rendered by QuickLaTeX.com \displaystyle{(1.2)\quad \begin{array}{l} \underbrace{ \left[\begin{array}{c} \theta(t)-\theta^*\\ \dot{\theta}(t)\\ \theta_e(t)-\theta_e^* \end{array}\right] }_{y(t)} = \underbrace{ \left[\begin{array}{ccccc} 0 & 1 & 0 & 0 & 0\\ 0 & 0 & 0 & 1 & 0\\ 0 & 0 & 0 & 0 & 1 \end{array}\right] }_{C_M} \underbrace{ \left[\begin{array}{c} z(t)-z^*\\ \theta(t)-\theta^*\\ \dot{z}(t)\\ \dot{\theta}(t)\\ \theta_e(t)-\theta_e^* \end{array}\right] }_{x(t)} \end{array}}](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-ab495fc33213399c94bb22d35ea16aa7_l3.png)
ここで操作入力は
ではなく
としていますが、制御系の評価の際に
![]()
とします。
●制御対象YMCPBに対する制御目的は、あるスラスト
と取付角
の下で、巡航速度
で走行するとき、一定の姿勢
を保つこととします。制御目的を達成する制御則として次式を考えます。
![]()
ここで、右辺第1項は状態フィードバック、第2項は船外機取付角をある収納状態
から所定の平衡入力値
に設定するための積分動作です。いま
![Rendered by QuickLaTeX.com \displaystyle{(4)\quad \begin{array}{l} \theta_e(t)-\theta_e^* = \underbrace{ \left[\begin{array}{ccccc} 0 & 0 & 0 & 0 & 1 \end{array}\right] }_{C} \underbrace{ \left[\begin{array}{c} z(t)-z^*\\ \theta(t)-\theta^*\\ \dot{z}(t)\\ \dot{\theta}(t)\\ \theta_e(t)-\theta_e^* \end{array}\right] }_{x(t)} \rightarrow \theta_e^c=0\quad(t\rightarrow\infty) \end{array}}](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-b608779184f29f7dfe7199146bb182ff_l3.png)
となって、船外機取付角を設定値
に維持できたとすると、次式が成り立つ必要があります。

すなわち
![Rendered by QuickLaTeX.com \displaystyle{(4')\quad \left[\begin{array}{c} 0 \\ 0 \\ 0 \\ 0 \\ 0 \\\hline \theta_e^c \\ \end{array}\right] = \underbrace{ \left[\begin{array}{ccccc|c} 0 & 0 & 1 & 0 & 0 & 0\\ 0 & 0 & 0 & 1 & 0 & 0\\ a_{52} & a_{53} & a_{55} & a_{56} & b_{52}& 0\\ a_{62} & a_{63} & a_{65} & a_{66} & b_{62}& 0\\ 0 & 0 & 0 & 0 & 0 & \omega_e\\\hline 0 & 0 & 0 & 0 & 1 & 0 \end{array}\right] }_{S= \left[\begin{array}{cc} A & B\\ C & 0 \end{array}\right] } \left[\begin{array}{c} z_\infty\\ \theta_\infty\\ 0\\ 0\\ \theta_e^c \\\hline 0 \end{array}\right] }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-c97de0b2e36403d71388140469e2d777_l3.png)
ここで、システム行列
は正則ですから、任意の平衡入力値
に対して、
をもたらす状態変数
と
が定まることが分かります。そこで次の偏差系E3を考えます。
![Rendered by QuickLaTeX.com \displaystyle{(5)\quad \begin{array}{l} \underbrace{ \frac{d}{dt} \left[\begin{array}{c} (z(t)-z^*)-z_\infty\\ (\theta(t)-\theta^*)-\theta_\infty\\ \dot{z}(t)\\ \dot{\theta}(t)\\ (\theta_e(t)-\theta_e^*)-\theta_e^c \\\hline u(t) \end{array}\right] }_{\dot{x}_E(t)} = \underbrace{ \left[\begin{array}{ccccc|c} 0 & 0 & 1 & 0 & 0 & 0\\ 0 & 0 & 0 & 1 & 0 & 0\\ a_{52} & a_{53} & a_{55} & a_{56} & b_{52}& 0\\ a_{62} & a_{63} & a_{65} & a_{66} & b_{62}& 0\\ 0 & 0 & 0 & 0 & 0 & \omega_e\\\hline 0 & 0 & 0 & 0 & 0 & 0 \end{array}\right] }_{A_E}\\ \times\underbrace{ \left[\begin{array}{c} (z(t)-z^*)-z_\infty\\ (\theta(t)-\theta^*)-\theta_\infty\\ \dot{z}(t)\\ \dot{\theta}(t)\\ (\theta_e(t)-\theta_e^*)-\theta_e^c \\\hline u(t) \end{array}\right] }_{x_E(t)} + \underbrace{ \left[\begin{array}{cccc} 0 \\ 0 \\ 0 \\ 0 \\ 0 \\\hline 1 \\ \end{array}\right] }_{B_E} \dot{u}(t) \end{array} }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-317e41c4ce1ea03263e1361d748dd7a7_l3.png)
これに対する状態フィードバック
![Rendered by QuickLaTeX.com \displaystyle{(6)\quad \dot{u}(t)=- \underbrace{ \left[\begin{array}{ccccc|c} k_{1} & k_{2} & k_{3} & k_{4} & k_{5} & k_{6} \end{array}\right] }_{K_E} \underbrace{ \left[\begin{array}{c} (z(t)-z^*)-z_\infty\\ (\theta(t)-\theta^*)-\theta_\infty\\ \dot{z}(t)\\ \dot{\theta}(t)\\ (\theta_e(t)-\theta_e^*)-\theta_e^c \\\hline u(t) \end{array}\right] }_{x_E(t)} }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-f5c8452e462ac8948c3cbf386db72361_l3.png)
を、二次形式評価関数

![]()
![]()
を最小化して求めます。(6)は
![Rendered by QuickLaTeX.com \displaystyle{(8)\quad \left[\begin{array}{c} \frac{d}{dt} \left[\begin{array}{c} z(t)-z^*\\ \theta(t)-\theta^*\\ \dot{z}(t)\\ \dot{\theta}(t)\\ \theta_e(t)-\theta_e^* \\\hline \end{array}\right]\\\hline (\theta_e(t)-\theta_e^*)-\theta_e^c \end{array}\right]=S \left[\begin{array}{c} (z(t)-z^*)-z_\infty\\ (\theta(t)-\theta^*)-\theta_\infty\\ \dot{z}(t)\\ \dot{\theta}(t)\\ (\theta_e(t)-\theta_e^*)-\theta_e^c \\\hline u(t) \end{array}\right] }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-e858ba1cacf6b5a3e9c783dfa8edd49b_l3.png)
に注意して
![Rendered by QuickLaTeX.com \displaystyle{(9)\quad \dot{u}(t)=- \underbrace{ \left[\begin{array}{ccccc|c} k_{1} & k_{2} & k_{3} & k_{4} & k_{5} & k_{6} \end{array}\right]S^{-1} }_{F_E} \left[\begin{array}{c} \frac{d}{dt} \left[\begin{array}{c} z(t)-z^*\\ \theta(t)-\theta^*\\ \dot{z}(t)\\ \dot{\theta}(t)\\ \theta_e(t)-\theta_e^* \\\hline \end{array}\right]\\\hline (\theta_e(t)-\theta_e^*)-\theta_e^c \end{array}\right] }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-5274f5d7994ac45f370c81c83619df1b_l3.png)
と書けるので、これを積分して次のLQI制御則を得ます。
![Rendered by QuickLaTeX.com \displaystyle{(10)\quad u(t) =- \underbrace{ \left[\begin{array}{ccccc} f_{1} & f_{2} & f_{3} & f_{4} & f_{5} \end{array}\right] }_{F} \underbrace{ \left[\begin{array}{c} z(t)-z^*\\ \theta(t)-\theta^*\\ \dot{z}(t)\\ \dot{\theta}(t)\\ \theta_e(t)-\theta_e^* \end{array}\right] }_{x(t)} +\underbrace{f_6}_{F_I}\int_0^t(\theta_e^c-(\theta_e(t)-\theta_e^*))dt} }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-81adf7686a5ac0ccc4cd2c19c241dac1_l3.png)
●制御対象YMCPBに対するLQI制御系を設計するプログラムを次に示します。
| MATLAB |
|

図1 LQI制御系シミュレーション
これを実行して次のシミュレーション結果を得ます。

図1 5次元モデルに基づくLQI制御系と符号関数を通したLQI制御
Case 2:Case1でヒーブゲインを零とする場合

図2 ヒーブゲインを零とした場合のLQI制御系と符号関数を通したLQI制御
Case 3:3次元モデルに基づくLQI制御
●制御対象YMCPBに対するLQI制御系を設計するプログラムを次に示します。
| MATLAB |
|

図3 3次元モデルに基づくLQI制御系と符号関数を通したLQI制御
Case 4:Case 1で状態オブザーバを用いる場合
いま、観測変数が状態変数の最初にくるように、状態方程式と観測方程式における状態変数の順番を変えておきます。
![Rendered by QuickLaTeX.com \displaystyle{(11)\quad \begin{array}{l} \underbrace{ \frac{d}{dt} \left[\begin{array}{c} \theta(t)-\theta^*\\ \dot{\theta}(t)\\ \theta_e(t)\\\hline z(t)-z^*\\ \dot{z}(t) \end{array}\right] }_{\dot{x}'(t)} = \underbrace{ \left[\begin{array}{ccc|cc} 0 & 1 & 0 & 0 & 0 \\ a_{63} & 0 & b_{62} & a_{62} & 0 \\ 0 & 0 & 0 & 0 & 0 \\\hline 0 & 0 & 0 & 0 & 1 \\ a_{53} & 0 & b_{52} & a_{52} & 0 \end{array}\right] }_{A'=\left[\begin{array}{cc} A'_{11} & A'_{12}\\ A'_{21} & A'_{22} \end{array}\right] } \underbrace{ \left[\begin{array}{c} \theta(t)-\theta^*\\ \dot{\theta}(t)\\ \theta_e(t)\\\hline z(t)-z^*\\ \dot{z}(t) \end{array}\right] }_{x'(t)}\\ + \underbrace{ \left[\begin{array}{c} 0 \\ 0 \\ \omega_e\\\hline 0 \\ 0 \end{array}\right] }_{B'=\left[\begin{array}{cc} B'_1 \\ B'_2 \end{array}\right] } u(t) \end{array}}](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-7fe85e46a1e1633fe91083e8fe93f2a6_l3.png)
![Rendered by QuickLaTeX.com \displaystyle{(12)\quad \begin{array}{l} \underbrace{ \left[\begin{array}{c} \theta(t)-\theta^*\\ \dot{\theta}(t)\\ \theta_e(t) \end{array}\right] }_{y(t)} = \underbrace{ \left[\begin{array}{ccc|cc} 1 & 0 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 & 0 \end{array}\right] }_{C'=[I_p\ 0]} \underbrace{ \left[\begin{array}{c} \theta(t)-\theta^*\\ \dot{\theta}(t)\\ \theta_e(t)\\\hline z(t)-z^*\\ \dot{z}(t) \end{array}\right] }_{x'(t)} \end{array}}](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-26aac13c924dceec92a99cbc241a9571_l3.png)
このとき、
を
![Rendered by QuickLaTeX.com \displaystyle{(13)\quad U= \underbrace{\left[\begin{array}{ccc|cc} -\ell_{11} & -\ell_{12} & -\ell_{13} & 1 & 0 \\ -\ell_{21} & -\ell_{22} & -\ell_{23} & 0 & 1 \end{array}\right]}_{[-L\ I_{n-p}]} }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-aa240c9d826b64c2ad7995e2b3c6a247_l3.png)
のように選んで、オブザーバのパラメータを次のように求めることができます。
![]()
![Rendered by QuickLaTeX.com \displaystyle{(15)\quad \begin{array}{l} \left[\begin{array}{cc} \hat{A} & \hat{B} \end{array}\right]=UA' \left[\begin{array}{cc} U\\ C' \end{array}\right]^{-1}= \left[\begin{array}{cc} -L & I_{n-p} \end{array}\right] \left[\begin{array}{cc} A'_{11} & A'_{12}\\ A'_{21} & A'_{22} \end{array}\right] \left[\begin{array}{cc} 0 & I_p\\ I_{n-p}& L \end{array}\right]\\ =\left[\begin{array}{cc} A'_{22}-LA'_{12} & A'_{21}-LA'_{11}+\hat{A}L \end{array}\right] \end{array} }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-6668ff8720ac61955f63a1c860c85b76_l3.png)
![]()
ここで、設計パラメータはサイズ
の行列
で
![Rendered by QuickLaTeX.com \displaystyle{(17)\quad \hat{A} = \underbrace{\left[\begin{array}{ccc} 0 & 1 \\ a_{52} & 0 \end{array}\right]}_{A'_{22}}- \underbrace{\left[\begin{array}{ccc} \ell_{11} & \ell_{12} & \ell_{13} \\ \ell_{21} & \ell_{22} & \ell_{23} \end{array}\right]}_{L} \underbrace{\left[\begin{array}{ccc} 0 & 0 \\ a_{62} & 0 \\ 0 & 0 \end{array}\right]}_{A'_{12}} }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-1f96c4d67fd044922c91fa9e1e1b2e71_l3.png)
を安定行列とするように選びます。そのためには、仮想システムに対する状態フィードバックによる安定化問題
![Rendered by QuickLaTeX.com \displaystyle{ \begin{array}{cl} (18.1) &\left[\begin{array}{c} \dot{w}_1 \\ \dot{w}_2 \end{array}\right] = \underbrace{\left[\begin{array}{ccc} 0 & a_{52} \\ 1 & 0 \end{array}\right]}_{A'_{22}^T} \left[\begin{array}{c} w_1 \\ w_2 \end{array}\right]+ \underbrace{\left[\begin{array}{ccc} 0 & a_{62} & 0 \\ 0 & 0 & 0 \end{array}\right]}_{A'_{12}^T} \left[\begin{array}{c} v_1 \\ v_2 \\ v_3 \end{array}\right]\\ (18.2) &\left[\begin{array}{c} v_1 \\ v_2 \\ v_3 \end{array}\right]=- \underbrace{\left[\begin{array}{ccc} \ell_{11} & \ell_{21} \\ \ell_{12} & \ell_{22} \\ \ell_{13} & \ell_{23} \end{array}\right]}_{L^T} \left[\begin{array}{c} w_1 \\ w_2 \end{array}\right] \end{array} }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-0966560b08e71e8b9d05e93d3d1a2b46_l3.png)
すなわち
![Rendered by QuickLaTeX.com \displaystyle{ \begin{array}{cl} (19.1) &\left[\begin{array}{c} \dot{w}_1 \\ \dot{w}_2 \end{array}\right] = \left[\begin{array}{ccc} 0 & a_{52} \\ 1 & 0 \end{array}\right] \left[\begin{array}{c} w_1 \\ w_2 \end{array}\right]+ \left[\begin{array}{c} a_{62} \\ 0 \end{array}\right]v_2\\ (19.2) &v_2=- \left[\begin{array}{ccc} \ell_{12} & \ell_{22} \end{array}\right] \left[\begin{array}{c} w_1 \\ w_2 \end{array}\right] \end{array} }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-2207f89283b711b6a3dac5da3343613c_l3.png)
を解けばよいと言えます(
、
)。
YMCPBの線形モデル
●制御対象YMCPBの運動方程式として次式を考えます。

すなわち
![Rendered by QuickLaTeX.com \displaystyle{(1')\quad \begin{array}{l} \left[\begin{array}{ccc} M+M_x & 0 & 0 \\ 0 & M+M_z & 0\\ 0 & 0 & I_y+J_y \end{array}\right] \left[\begin{array}{c} \ddot{x}\\ \ddot{z}\\ \ddot{\theta} \end{array}\right]= \left[\begin{array}{ccc} 0 & 0 & 0 \\ 0 & c_{zz} & c_{z\theta}\\ 0 & c_{\theta z} & c_{\theta\theta} \end{array}\right] \left[\begin{array}{c} \dot{x}\\ \dot{z}\\ \dot{\theta} \end{array}\right]\\ +\left[\begin{array}{c} D_b\cos\theta+(T+D_e)\cos(\theta+\theta_e)\\ -D_b\sin\theta-(T+D_e)\sin(\theta+\theta_e)\\ D_b(H_{CG}-H_D)+T(H_T-H_{De}+H_e)+D_eH_e \end{array}\right]\\ +\left[\begin{array}{c} N_L\sin\theta+N_e\sin(\theta+\theta_e)\\ N_L\cos\theta+N_e\cos(\theta+\theta_e)\\ N_LL_L+N_eL_e \end{array}\right] + \left[\begin{array}{c} 0 \\ N_B+Mg\\ N_B(L_{CG}\cos\theta-L_B) \end{array}\right] \end{array} }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-5fcbf114446e6f6006a4add51667c0b6_l3.png)
ここで、
はそれぞれサージ、ヒーブ、ピッチを、
はそれぞれスラスト、船外機取付角を表しています。その他の物理パラメータの説明はここでは省略します。
●いま状態変数ベクトルと操作変数ベクトルをそれぞれ
![Rendered by QuickLaTeX.com \displaystyle{(2)\quad \xi=\left[\begin{array}{c} x\\ z\\ \theta\\\hline \dot{x}\\ \dot{z}\\ \dot{\theta} \end{array}\right],\ \zeta=\left[\begin{array}{c} T\\ \theta_e \end{array}\right] }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-289b718cdf08a7268cfcc44b2dd308bb_l3.png)
ととると、次の非線形状態方程式を得ます。
![Rendered by QuickLaTeX.com \displaystyle{(3.1)\quad \underbrace{\frac{d}{dt}\left[\begin{array}{c} x\\ z\\ \theta\\\hline \dot{x}\\ \dot{z}\\ \dot{\theta} \end{array}\right]}_{\dot{\xi}}= \underbrace{ \left[\begin{array}{c} f_1(x,z,\theta,\dot{x},\dot{z},\dot{\theta},T,\theta_e)\\ f_2(x,z,\theta,\dot{x},\dot{z},\dot{\theta},T,\theta_e)\\ f_3(x,z,\theta,\dot{x},\dot{z},\dot{\theta},T,\theta_e)\\\hline f_4(x,z,\theta,\dot{x},\dot{z},\dot{\theta},T,\theta_e)\\ f_5(x,z,\theta,\dot{x},\dot{z},\dot{\theta},T,\theta_e)\\ f_6(x,z,\theta,\dot{x},\dot{z},\dot{\theta},T,\theta_e) \end{array}\right]}_{f(\xi,\zeta)} }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-986df1fe9bf874b3902a899fdb7379ed_l3.png)
ただし

●制御対象YMCPBに対する制御目的は、あるスラスト
と取付角
の下で、巡航速度
で走行するとき、一定の姿勢
を保つこととします。これは、次の平衡状態
を、次の平衡入力
によって保持することとみなすことができます。
![Rendered by QuickLaTeX.com \displaystyle{(4)\quad \xi^*=\left[\begin{array}{c} V^*t\\ z^*\\ \theta^*\\\hline V^*\\ 0\\ 0 \end{array}\right],\ \zeta^*=\left[\begin{array}{c} T^*\\ \theta_e^* \end{array}\right] }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-5f6437de0791e355b2bdc371e694f78d_l3.png)
この平衡状態と平衡入力を定めるためには、
と
を所与として、残りの
を次の非線形連立方程式を解いて求めます。

したがって、次式が成り立つことに注意します。
![Rendered by QuickLaTeX.com \displaystyle{(6)\quad f(\xi^*,\zeta^*)= \left[\begin{array}{c} V^*\\ 0\\ 0\\\hline 0\\ 0\\ 0 \end{array}\right]=\frac{d}{dt}\xi^* }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-7f31cdd4dd69a9639cb450150aaf8339_l3.png)
●この平衡状態
と平衡入力
の回りで、非線形状態方程式
を線形近似します。

ここで(6)に注意して、線形状態方程式

すなわち
![Rendered by QuickLaTeX.com \displaystyle{(9)\quad \begin{array}{c} \underbrace{ \frac{d}{dt} \left[\begin{array}{c} x(t)-V^*t\\ z(t)-z^*\\ \theta(t)-\theta^*\\\hline \dot{x}(t)-V^*\\ \dot{z}(t)\\ \dot{\theta}(t) \end{array}\right] }_{\dot{x}(t)} = \underbrace{ \left[\begin{array}{ccc|ccc} 0 & 0 & 0 & 1 & 0 & 0\\ 0 & 0 & 0 & 0 & 1 & 0\\ 0 & 0 & 0 & 0 & 0 & 1\\\hline 0 & a_{42} & a_{43} & a_{44} & a_{45} & a_{46} \\ 0 & a_{52} & a_{53} & a_{54} & a_{55} & a_{56} \\ 0 & a_{62} & a_{63} & a_{64} & a_{65} & a_{66} \end{array}\right] }_{A} \underbrace{ \left[\begin{array}{c} x(t)-V^*t\\ z(t)-z^*\\ \theta(t)-\theta^*\\\hline \dot{x}(t)-V^*\\ \dot{z}(t)\\ \dot{\theta}(t) \end{array}\right] }_{x(t)}\\ + \underbrace{ \left[\begin{array}{cc} 0 & 0 \\ 0 & 0 \\ 0 & 0 \\\hline b_{41} & b_{42} \\ b_{51} & b_{52} \\ b_{61} & b_{62} \end{array}\right] }_{B} \underbrace{ \left[\begin{array}{c} T(t)-T^*\\ \theta_e(t)-\theta_e^*\\ \end{array}\right] }_{u(t)} \end{array}}](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-9015be8df754f0e7d33ca667c6ed948c_l3.png)
を得ます。
●次の5組のデータセットが与えられています。
| 艇 | 艇質量[kg] | 長手方向重心位置[m] | 備考 | |
| No1 | SPTM247 | 2709 | 1.9756 | INM抵抗試験レポートC2620-07CT18-RAP01による |
| No2 | SPTM247 | 2813 | 1.925 | 2021/8/2重量重心測定結果より |
| No3 | SPTM247 | 2845 | 1.937 | 2022/1/19重量重心測定結果より |
| No4 | SPTM247 | 2945 | 1.937 | No3重量に+100kg |
| No5 | SPTM247 | 2745 | 1.937 | No3重量に-100kg |
各データセットは、133個(
)の平衡状態と平衡入力と
行列を含みます(
行列と
行列は固定)。これらは、たとえば、データセットNo1に対しては図1のようにグラフ化されます。

図1 データセットNo1における平衡状態
ここで、赤い〇の平衡状態は、制御系の設計および評価のために選ばれた、次表に示す39点です。
の場合の平衡状態回りの線形モデルについてコントローラを設計します。
| run | k | ||
| -4 deg | run1 | 8,9,10,11,12,13,14 | |
| 0 deg | run1 | 36,37,38,39,40,41,42,43 | |
| 4 deg | run1 | 66,67,68,69,70,71,72,73 | |
| 8 deg | run1 | 96,97,98,99,100,101,102,103 | |
| 2 deg | run1 | 126,127,128,129,130,131,132,133 |
またデータセットNo1に対する行列
の固有値は図2のようにグラフ化されます。

図2 データセットNo1における行列
の固有値
各線形モデルに対して複素固有値が2対、実固有値が2個(うち1個は零)あることがわかります。不安定な複素固有値はピッチの振舞いに、安定な複素固有値はヒーブの振舞いに、非零実固有値は速度変動に関係しています。速度変動が発散する場合があることが気になるところです。
制御系設計用線形モデル
●制御系設計用線形モデルを得るために、まずアクチュエータについては、船外機の取付角を操作するためにレバーを引いた期間だけ一定の角速度
で回転するものとします。これを次式で表します。
![]()
ここで、
は操作入力
が正のとき
、負のとき
の値をとるものとします。すなわち
![]()
したがって、制御対象の状態方程式(9)とアクチュエータ(10)を合わせて、次式を得ます。
![Rendered by QuickLaTeX.com \displaystyle{(12)\quad \begin{array}{c} \underbrace{ \frac{d}{dt} \left[\begin{array}{c} x(t)-V^*t\\ z(t)-z^*\\ \theta(t)-\theta^*\\\hline \dot{x}(t)-V^*\\ \dot{z}(t)\\ \dot{\theta}(t)\\\hline \theta_e(t)-\theta_e^* \end{array}\right] }_{\dot{x}_a(t)} = \underbrace{ \left[\begin{array}{ccc|ccc|c} 0 & 0 & 0 & 1 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 1 & 0 & 0\\ 0 & 0 & 0 & 0 & 0 & 1 & 0\\\hline 0 & a_{42} & a_{43} & a_{44} & a_{45} & a_{46} & b_{42}\\ 0 & a_{52} & a_{53} & a_{54} & a_{55} & a_{56} & b_{52}\\ 0 & a_{62} & a_{63} & a_{64} & a_{65} & a_{66} & b_{62}\\\hline 0 & 0 & 0 & 0 & 0 & 0 & 0 \end{array}\right] }_{A_a} \underbrace{ \left[\begin{array}{c} x(t)-V^*t\\ z(t)-z^*\\ \theta(t)-\theta^*\\\hline \dot{x}(t)-V^*\\ \dot{z}(t)\\ \dot{\theta}(t)\\\hline \theta_e(t)-\theta_e^* \end{array}\right] }_{x_a(t)}\\ + \underbrace{ \left[\begin{array}{c} 0 \\ 0 \\ 0 \\\hline 0 \\ 0 \\ 0 \\\hline \omega_e \end{array}\right] }_{B_a}u_e(t) + \left[\begin{array}{c} 0 \\ 0 \\ 0 \\\hline b_{41} \\ b_{51} \\ b_{61} \\\hline 0 \end{array}\right]\underbrace{(T(t)-T^*)}_{0} \end{array}}](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-d60d11235671d929a5e705c533a692dc_l3.png)
また状態変数のうち、
、
、
が計測できるものとします。このとき、状態方程式(12)に対する観測方程式は次式で表されます。
![Rendered by QuickLaTeX.com \displaystyle{(13)\quad \begin{array}{l} \underbrace{ \left[\begin{array}{c} \theta(t)-\theta^*\\ \dot{\theta}(t)\\ \theta_e(t)-\theta_e^* \end{array}\right] }_{y(t)} = \underbrace{ \left[\begin{array}{ccc|ccc|c} 0 & 0 & 1 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 & 0 & 1 & 0\\ 0 & 0 & 0 & 0 & 0 & 0 & 1 \end{array}\right] }_{C} \underbrace{ \left[\begin{array}{c} x(t)-V^*t\\ z(t)-z^*\\ \theta(t)-\theta^*\\\hline \dot{x}(t)-V^*\\ \dot{z}(t)\\ \dot{\theta}(t)\\\hline \theta_e(t)-\theta_e^* \end{array}\right] }_{x(t)} \end{array}}](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-19a5fd67356f5063740009700e8d5cd0_l3.png)
●制御対象YMCPBに対する制御目的は、あるスラスト
と取付角
の下で、巡航速度
で走行するとき、一定の姿勢
を保つこととします。この制御目的に照らして、サージ方向の状態変数は省いてよく、また操作変数も船外機取付角に限定することができます。ヒーブ方向の状態変数を残すか省くかによって、次の2種類の線形モデルが考えられます。
5次元モデル
![Rendered by QuickLaTeX.com \displaystyle{(14.1)\quad \begin{array}{l} \underbrace{ \frac{d}{dt} \left[\begin{array}{c} z(t)-z^*\\ \theta(t)-\theta^*\\ \dot{z}(t)\\ \dot{\theta}(t)\\ \theta_e(t)-\theta_e^* \end{array}\right] }_{\dot{x}(t)} = \underbrace{ \left[\begin{array}{ccccc} 0 & 0 & 1 & 0 & 0\\ 0 & 0 & 0 & 1 & 0\\ a_{52} & a_{53} & a_{55} & a_{56} & b_{52}\\ a_{62} & a_{63} & a_{65} & a_{66} & b_{62}\\ 0 & 0 & 0 & 0 & 0 \end{array}\right] }_{A} \underbrace{ \left[\begin{array}{c} z(t)-z^*\\ \theta(t)-\theta^*\\ \dot{z}(t)\\ \dot{\theta}(t)\\ \theta_e(t)-\theta_e^* \end{array}\right] }_{x(t)}\\ + \underbrace{ \left[\begin{array}{c} 0 \\ 0 \\ 0 \\ 0 \\ \omega_e \end{array}\right] }_{B} u_e(t) + \left[\begin{array}{c} 0 \\ 0 \\ a_{54} \\ a_{64} \\ 0 \end{array}\right] \underbrace{(\dot{x}(t)-V^*)}_{0} + \left[\begin{array}{c} 0 \\ 0 \\ b_{51} \\ b_{61} \\ 0 \end{array}\right]\underbrace{(T(t)-T^*)}_{0} \end{array}}](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-b66229e291e6a7c831c272149ccfd762_l3.png)
![Rendered by QuickLaTeX.com \displaystyle{(14.2)\quad \begin{array}{l} \underbrace{ \left[\begin{array}{c} \theta(t)-\theta^*\\ \dot{\theta}(t)\\ \theta_e(t)-\theta_e^* \end{array}\right] }_{y(t)} = \underbrace{ \left[\begin{array}{ccccc} 0 & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 0 & 1 \end{array}\right] }_{C} \underbrace{ \left[\begin{array}{c} z(t)-z^*\\ \theta(t)-\theta^*\\ \dot{z}(t)\\ \dot{\theta}(t)\\ \theta_e(t)-\theta_e^* \end{array}\right] }_{x(t)} \end{array}}](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-64265721f5befad0ff0fa09174416663_l3.png)
データセットNo1に対する行列
の固有値は図3のようにグラフ化されます。ここで、安定な固有値はヒーブの振舞いに、不安定な固有値はピッチの振舞いに関係しています。

図3 データセットNo1を用いた5次元モデルの行列
の固有値
3次元モデル
![Rendered by QuickLaTeX.com \displaystyle{(15.1)\quad \begin{array}{l} \underbrace{ \frac{d}{dt} \left[\begin{array}{c} \theta(t)-\theta^*\\ \dot{\theta}(t)\\ \theta_e(t)-\theta_e^* \end{array}\right] }_{\dot{x}(t)} = \underbrace{ \left[\begin{array}{ccc} 0 & 1 & 0\\ a_{63} & a_{66} & b_{62}\\ 0 & 0 & 0 \end{array}\right] }_{A} \underbrace{ \left[\begin{array}{c} \theta(t)-\theta^*\\ \dot{\theta}(t)\\ \theta_e(t)-\theta_e^* \end{array}\right] }_{x(t)} + \underbrace{ \left[\begin{array}{c} 0 \\ 0 \\ \omega_e \end{array}\right] }_{B} u_e(t)\\ + \underbrace{\left[\begin{array}{cc} 0 & 0 \\ a_{62} & a_{65} \\ 0 & 0 \end{array}\right] \left[\begin{array}{c} z(t)-z^*\\ \dot{z}(t) \end{array}\right]}_{w(t)} + \left[\begin{array}{cc} 0 & 0 \\ a_{64} & b_{61} \\ 0 & 0 \end{array}\right] \underbrace{\left[\begin{array}{c} \dot{x}(t)-V^* \\ T(t)-T^* \end{array}\right]}_{0} \end{array}}](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-bf87259f32e1c8fdd86639d65f233881_l3.png)
![Rendered by QuickLaTeX.com \displaystyle{(15.2)\quad \begin{array}{l} \underbrace{ \left[\begin{array}{c} \theta(t)-\theta^*\\ \dot{\theta}(t)\\ \theta_e(t)-\theta_e^* \end{array}\right] }_{y(t)} = \underbrace{ \left[\begin{array}{ccccc} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{array}\right] }_{C} \underbrace{ \left[\begin{array}{c} \theta(t)-\theta^*\\ \dot{\theta}(t)\\ \theta_e(t)-\theta_e^* \end{array}\right] }_{x(t)} \end{array}}](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-2a21e890f7313ffc080ff529f06666fc_l3.png)
データセットNo1に対する行列
の固有値は図4のようにグラフ化されます。これからピッチに対応する固有値は不安定であることが分かります。

図4 データセットNo1を用いた3次元モデルの行列
の固有値
●制御目的を達成する制御系を設計する立場から、2つのモデルを比較してみます。まず制御則として次式を考えます。
![]()
ここで、右辺第1項は状態フィードバック、第2項は船外機取付角をある収納状態
から所定の平衡入力値
に設定するための積分動作です。
5次元モデル(14.1)の場合は、ヒーブに関する状態変数を計測できないので、状態オブザーバを用いてこれらを推定して、状態フィードバックを実施することになります。
一方3次元モデル(15.1)の場合は、状態フィードバックは実施できますが、ヒーブの振舞いの影響が外乱
として現れますので、これを抑制する必要があります。そのヒーブの振舞いは次式で表されます。
![Rendered by QuickLaTeX.com \displaystyle{(17)\quad \begin{array}{l} \underbrace{ \frac{d}{dt} \left[\begin{array}{c} z(t)-z^*\\ \dot{z}(t) \end{array}\right] }_{\dot{x}'(t)} = \underbrace{ \left[\begin{array}{ccccc} 0 & 1 \\ a_{52} & a_{55} \end{array}\right] }_{A'} \underbrace{ \left[\begin{array}{c} z(t)-z^*\\ \dot{z}(t)\\ \end{array}\right] }_{x'(t)}\\ + \underbrace{ \left[\begin{array}{ccccc} 0 & 1 & 0\\ a_{53} & a_{56} & b_{52} \end{array}\right] }_{B'} \underbrace{ \left[\begin{array}{c} \theta(t)-\theta^*\\ \dot{\theta}(t)\\ \theta_e(t)-\theta_e^* \end{array}\right] }_{y(t)}\\ + \left[\begin{array}{c} 0 \\ a_{54} \end{array}\right] \underbrace{(\dot{x}(t)-V^*)}_{0} + \left[\begin{array}{c} 0 \\ b_{51} \end{array}\right]\underbrace{(T(t)-T^*)}_{0} \end{array}}](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-d470e645c52cb94809030f2a1033637f_l3.png)
これからヒーブの振舞いには操作入力
は直接影響を及ぼさず、ピッチを通して間接的に影響すること分かります。ただ、これは漸近安定(
は安定行列)なので、ピッチの安定化を速やかにできれば(
が零に収束すれば)、(17)は考慮しなくともよいことになります。しかしながら、3次元モデルに対する状態フィードバックを5次元モデルに適用して、閉ループ系が漸近安定かどうかを調べておくことが考えられます。
制御系設計に3次元モデルを用いる場合は、状態オブザーバが不要となる利点がありますが、ヒーブの振舞いの影響が抑制されていることを確かめるために、5次元モデルに対する閉ループシミュレ-ションを行うことが重要になります。
●以上の結果を、
の場合の平衡状態回りの線形モデルについて数値で確認しておきます。
まず元の線形モデル(12)の行列
とその固有値は次のようになります。
![Rendered by QuickLaTeX.com \displaystyle{(18.1)\quad A= \left[\begin{array}{cccccc} 0 & 0 & 0 & 1.0000 & 0 & 0\\ 0 & 0 & 0 & 0 & 1.0000 & 0\\ 0 & 0 & 0 & 0 & 0 & 1.0000\\ 0 & 8.3458 & -6.9684 & -0.2549 & 0 & 0\\ 0 & -58.4515 & 67.9416 & 0.4686 & -0.7383 & -0.0369\\ 0 & 0.4559 & -30.3422 & -0.1922 & -0.0117 & 0.1175 \end{array}\right] }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-4b36eb6e0cb7156f03d9bf7681c55879_l3.png)

5次元モデル(14.1)における行列
とその固有値は次のようになります。
![Rendered by QuickLaTeX.com \displaystyle{(19.1)\quad A= \left[\begin{array}{ccccc} 0 & 0 & 1.0000 & 0 & 0\\ 0 & 0 & 0 & 1.0000 & 0\\ -58.4515 & 67.9416 & -0.7383 & -0.0369 & -0.0797\\ 0.4559 & -30.3422 & -0.0117 & 0.1175 & -2.7873\\ 0 & 0 & 0 & 0 & 0 \end{array}\right] }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-385eb5461b75f3eab0188fc4a0c28dcf_l3.png)

これからサージに関わる状態変数を除いた場合、ヒーブとピッチに関わる固有値
がほぼ引き継がれることが分かります。
一方3次元モデル(15.1)における行列
とその固有値は次のようになります。
![Rendered by QuickLaTeX.com \displaystyle{(20.1)\quad A= \left[\begin{array}{ccc} 0 & 1.0000 & 0\\ -30.3422 & 0.1175 & -2.7873\\ 0 & 0 & 0 \end{array}\right] }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-df1140cc4fabe39af15eb5dede652c01_l3.png)

これからさらにヒーブに関わる状態変数を除いた場合、ピッチに関わる固有値
がほぼ引き継がれることが分かります。
●ヒーブとピッチに関わる固有値
の可制御性と可観測性を、5次元モデルを用いて調べてみます。
![Rendered by QuickLaTeX.com \displaystyle{(21)\quad \left\{\begin{array}{l} \underline{\sigma}(\left[\begin{array}{cc} B & A-\lambda_1^{(5)} I_5 \end{array}\right])=0.0048^{*}\\ \underline{\sigma}(\left[\begin{array}{cc} B & A-\lambda_2^{(5)} I_5 \end{array}\right])=0.0048^{*}\\ \underline{\sigma}(\left[\begin{array}{cc} B & A-\lambda_3^{(5)} I_5 \end{array}\right])=0.0106\\ \underline{\sigma}(\left[\begin{array}{cc} B & A-\lambda_4^{(5)} I_5 \end{array}\right])=0.0106\\ \underline{\sigma}(\left[\begin{array}{cc} B & A-\lambda_5^{(5)} I_5 \end{array}\right])=0.1140\\ \end{array}\right. }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-a7e4cf96c547aedfac2c36a38d07ed50_l3.png)
![Rendered by QuickLaTeX.com \displaystyle{(22)\quad \left\{\begin{array}{l} \underline{\sigma}(\left[\begin{array}{cc} C^T & A^T-\lambda_1^{(5)} I_5 \end{array}\right])=0.0146^{*}\\ \underline{\sigma}(\left[\begin{array}{cc} C^T & A^T-\lambda_2^{(5)} I_5 \end{array}\right])=0.0146^{*}\\ \underline{\sigma}(\left[\begin{array}{cc} C^T & A^T-\lambda_3^{(5)} I_5 \end{array}\right])=0.3129\\ \underline{\sigma}(\left[\begin{array}{cc} C^T & A^T-\lambda_4^{(5)} I_5 \end{array}\right])=0.3129\\ \underline{\sigma}(\left[\begin{array}{cc} C^T & A^T-\lambda_5^{(5)} I_5 \end{array}\right])=0.9940\\ \end{array}\right. }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-9da4f1036a5ce1b33a3e76163bc55f97_l3.png)
(21)から、すべての固有値について行列
の最小特異値は正ですから、形式的には可制御性は成り立つと判定できます。ただ、*印の値が示すように、ヒーブはピッチに比べて相対的に可制御性の程度が弱く、状態フィードバックによる固有値の変更が難しいと言えます。したがって、制御対象は可制御でなく、むしろ可安定と判定することが考えられます。
一方、(22)から、形式的には可観測性は成り立つと判定できます。ただ、*印の値が示すように、ヒーブはピッチに比べて相対的に可観測性の程度が弱く、状態オブザーバによる推定が難しいと言えます。
●操作入力(取付角)により、まずピッチが制御され、それがヒーブに影響を与えるという連成の仕組みを調べるために、(15.1)と(17)を数値で確かめてみます。
まず(15.1)は
![Rendered by QuickLaTeX.com \displaystyle{(15.1')\quad \begin{array}{l} \underbrace{ \frac{d}{dt} \left[\begin{array}{c} \theta(t)-\theta^*\\ \dot{\theta}(t)\\ \theta_e(t)-\theta_e^* \end{array}\right] }_{\dot{x}(t)} = \underbrace{ \left[\begin{array}{ccc} 0 & 1 & 0\\ %a_{63} & a_{66} & b_{62}\\ -30.3422 & 0.1175 & -2.7873\\ 0 & 0 & 0 \end{array}\right] }_{A} \underbrace{ \left[\begin{array}{c} \theta(t)-\theta^*\\ \dot{\theta}(t)\\ \theta_e(t)-\theta_e^* \end{array}\right] }_{x(t)}\\ + \underbrace{ \left[\begin{array}{c} 0 \\ 0 \\ \omega_e \end{array}\right] }_{B} u_e(t) + \underbrace{\left[\begin{array}{cc} 0 & 0 \\ %a_{62} & a_{65} \\ 0.4559 & -0.0117 \\ 0 & 0 \end{array}\right] \left[\begin{array}{c} z(t)-z^*\\ \dot{z}(t) \end{array}\right]}_{w(t)} \end{array}}](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-6f7ec1b0d02eac3e57d854255ed386a7_l3.png)
となり、ヒーブのピッチへの影響を表す
に関わる係数
の値がそれほど大きくなく、3次元モデルにおいても固有値が継承されることに注意します。
一方(17)は
![Rendered by QuickLaTeX.com \displaystyle{(17')\quad \begin{array}{l} \underbrace{ \frac{d}{dt} \left[\begin{array}{c} z(t)-z^*\\ \dot{z}(t) \end{array}\right] }_{\dot{x}'(t)} = \underbrace{ \left[\begin{array}{ccccc} 0 & 1 \\ %a_{52} & a_{55} -58.4515 & -0.7383 \end{array}\right] }_{A'} \underbrace{ \left[\begin{array}{c} z(t)-z^*\\ \dot{z}(t)\\ \end{array}\right] }_{x'(t)}\\ + \underbrace{ \left[\begin{array}{ccccc} 0 & 1 & 0\\ %a_{53} & a_{56} & b_{52} 67.9416 & -0.0369 & -0.0797 \end{array}\right] }_{B'} \underbrace{ \left[\begin{array}{c} \theta(t)-\theta^*\\ \dot{\theta}(t)\\ \theta_e(t)-\theta_e^* \end{array}\right] }_{y(t)} \end{array}}](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-dd41b1e619c39ebfa6602dc14ea3d00c_l3.png)
となります。これは漸近安定なので、ピッチの安定化が速やかに行えれば問題ないとと言えます。
●最後に、取付角からの伝達特性を調べておきます。

図5 取付角からヒーブまで(左図)とピッチまで(右図)の伝達特性
左図は2つの共振特性をもちますが、右図は(2つ目がほとんど消えていて)1つだけの共振特性をもちます。これから、ヒーブのピッチへの連成影響はほとんどないことがわかります。
●以上の数値例の結果を得るためのプログラムを以下に示します。
| MATLAB |
|
参考:漸近安定性
|
【漸近安定性の定義とその等価な条件】 定義DA: 条件A1: |
漸近安定性とは、定義DAより、平衡状態が乱されたとき復帰できるかどうかにかかわる概念で、条件A1より、
行列の固有値がすべて複素左半面にあることを調べて判定されます。
参考:可制御性・可安定性
|
【可安定性の定義とその等価な条件】 定義DS: 状態フィードバックにより安定化可能 条件S1: 【可制御性の定義とその等価な条件】 |
可安定性は、定義DSより、状態フィードバックにより安定化可能であることを意味し、条件S1が判定条件として知られています。一方、可制御性については、条件C4が判定条件として知られています。両者の相違は、すでに左半平面にある安定な固有値について関与(再配置)するかどうかにあります。可安定性の判定では不安定な固有値のみで条件S1を判定しますが、可制御性の判定ではすべて固有値について条件C4を判定します。
それでは、
に対して、条件S1と条件C4に出てくる行列
![]()
の階数をどのようにして計算するかですが、これは
の非零特異値の数で決定します。したがって、条件S1と条件C4は、最小特異値が正かどうかで判定します。
参考:可観測性・可検出性
|
【可検出性の定義とその等価な条件】 定義DD: 状態オブザーバを構成可能 条件D1: 【可観測性の定義とその等価な条件】 |
可検出性は、定義DDより、状態オブザーバを構成可能であることを意味し、条件D1が判定条件として知られています。状態オブザーバの
行列は
と表され、オブザーバゲイン
は、仮想システム
に対する状態FB
による閉ループ系
を安定化して決定します。したがって、可検出性は
の可安定性を意味します。一方、可観測性については、条件O4が判定条件として知られています。可検出性との相違は、すでに左半平面にある安定な
の固有値について
で再配置するかどうかにあります。可検出性の判定では不安定な固有値のみで条件D1を判定しますが、可観測性の判定ではすべて固有値について条件O4を判定します。
それでは、
に対して、条件D1と条件O4に出てくる行列
![]()
の階数をどのようにして計算するかですが、これは
の非零特異値の数で決定します。したがって、条件D1と条件O4は、最小特異値が正かどうかで判定します。
参考:状態オブザーバ
●通常の状態オブザーバは
![]()
で表され
![]()
のように漸近的に元の状態を推定するものです。行列
はオブザーバゲインと呼ばれ、
は安定行列とするように選ばれます。

によって表される漸近安定なシステムで、この出力が
に漸近するように構成するものです。そのためには、あるサイズ
の行列
に対して次式を満足させることが必要十分となります。

参考:最小実現
一般に,不可制御かつ不可観測な状態空間表現は適当な座標変換により,つぎの正準構造をもつように変換できることが知られています。
![Rendered by QuickLaTeX.com \displaystyle{(1)\quad \left[\begin{array}{c|c} TAT^{-1} & TB \\\hline CT^{-1} & D \end{array}\right] = \left[\begin{array}{cccc|c} A_1 & 0 & X_{13} & 0 & B_1 \\ X_{21} & A_2 & X_{23} & X_{24} & B_2 \\ 0 & 0 & A_3 & 0 & 0 \\ 0 & 0 & X_{43} & A_4 & 0 \\\hline C_1 & 0 & C_3 & 0 & 0 \end{array}\right] }](https://cacsd1.sakura.ne.jp/wp/wp-content/ql-cache/quicklatex.com-4b2e92c732c0f76c1c7685becd70b05c_l3.png)
ここで,正方行列
,
,
,
の次数は一意に定まり,
は可制御対,
は可観測対です。この正準構造のブロック線図を図1に示します。

図1 正準構造のブロック線図
さて,つぎが成り立ちます。
![]()
すなわち,可制御かつ可観測な部分系が入力から出力までの伝達特性を表しています。
これを得るプログラムを、本資料では次のように分割して示しています。
プログラムIII ************************ 再計画 ************************
・プログラムIII-1 リソース(場所)の定義
・プログラムIII-2 リソース(作業員)の定義
・プログラムIII-3 再計画アクティビティ(仕掛作業、未着手作業)の定義
未着手作業の先行制約の設定
・プログラムIII-4 モードの設定
仕掛作業のモード継承
未着手作業の資源制約(配員)
未着手作業の資源制約(作業場所)
・プログラムIII-5 RCPSP求解
プログラム:Part III
#プログラムIII-1.0
from optseq import *
import math
#=======================================================================
print("")
print(' ************************ リスケ on rdate **********************')
import dill
dill.load_session('usukiR040510b.pkl')
#=======================================================================
usuki3=Model()
CS=["CS","CC","SS","SC"]
プログラムIII-1
#プログラムIII-1
#=======================================================================
#リソースの定義(場所)
#=======================================================================
#-----メッシュの使用可否
resPL={}
for id in R:
resPL[id]=0
if not id in [4,5,6,13]:
for i in range(0,R[id][1]):
for j in range(0,R[id][2]):
resPL[id,i,j] =usuki3.addResource(R[id][0]+"[{0:02d}_{1:02d}]".format(i,j), capacity={(0,"inf"):1})
if id==4:
for i in range(0,R[id][1]):
for j in range(0,R[id][2]):
if i in range(0,11) and j in range(0,12):
resPL[id,i,j] =usuki3.addResource(R[id][0]+"[{0:02d}_{1:02d}]".format(i,j), capacity={(0,"inf"):0})
else:
resPL[id,i,j] =usuki3.addResource(R[id][0]+"[{0:02d}_{1:02d}]".format(i,j), capacity={(0,"inf"):1})
if id==5:
for i in range(0,R[id][1]):
for j in range(0,R[id][2]):
if i in range(0,7) and j in range(0,10):
resPL[id,i,j] =usuki3.addResource(R[id][0]+"[{0:02d}_{1:02d}]".format(i,j), capacity={(0,"inf"):0})
else:
resPL[id,i,j] =usuki3.addResource(R[id][0]+"[{0:02d}_{1:02d}]".format(i,j), capacity={(0,"inf"):1})
if id==6:
for i in range(0,R[id][1]):
for j in range(0,R[id][2]):
if i in [0,22,23,24,25,26,27,28,29,30,31,32,33,34,35] and j in range(0,13):
resPL[id,i,j] =usuki3.addResource(R[id][0]+"[{0:02d}_{1:02d}]".format(i,j), capacity={(0,"inf"):0})
elif i in range(1,17) and j in range(0,1):
resPL[id,i,j] =usuki3.addResource(R[id][0]+"[{0:02d}_{1:02d}]".format(i,j), capacity={(0,"inf"):0})
else:
resPL[id,i,j] =usuki3.addResource(R[id][0]+"[{0:02d}_{1:02d}]".format(i,j), capacity={(0,"inf"):1})
if id==13:
for i in range(0,R[id][1]):
for j in range(0,R[id][2]):
if i in [31,32,33,34,35,36,37,63,64,65,66,67,68,69,70,71] and j in range(0,24):
resPL[id,i,j] =usuki3.addResource(R[id][0]+"[{0:02d}_{1:02d}]".format(i,j), capacity={(0,"inf"):0})
else:
resPL[id,i,j] =usuki3.addResource(R[id][0]+"[{0:02d}_{1:02d}]".format(i,j), capacity={(0,"inf"):1})
プログラムIII-2
#プログラムIII-2
#=======================================================================
#リソースの定義(作業員)
#=======================================================================
eps1=1.25
resWH={} #取付28人
r=math.floor(28*4*eps1);
resWH=usuki3.addResource("R[WH]", capacity={(0,"inf"):r})
#-----
resWW={} #溶接43人
r=math.floor(43*4*eps1);
resWW=usuki3.addResource("R[WW]", capacity={(0,"inf"):r})
#-----
eps2=1.25
resWF1={} #鉄艤5人
r=math.floor(5*4*eps2);
resWF1=usuki3.addResource("R[WF1]", capacity={(0,"inf"):r})
#-----
resWF2={} #甲配7人
r=math.floor(7*4*eps2);
resWF2=usuki3.addResource("R[WF2]", capacity={(0,"inf"):r})
#-----
resWF3={} #機配5人⇒10人
r=math.floor(10*4*eps2);
resWF3=usuki3.addResource("R[WF3]", capacity={(0,"inf"):r})
#-----
resWP={} #塗装内4人⇒8人
r=math.floor(8*4*eps2);
resWP=usuki3.addResource("R[WP]", capacity={(0,"inf"):r})
#-----
resWP2={} #塗装外8人
r=math.floor(8*4*eps2);
resWP2=usuki3.addResource("R[WP2]", capacity={(0,"inf"):r})
プログラムIII-3
#プログラムIII-3.1
#=======================================================================
#再計画 アクティビティ idata3
#=======================================================================
rdate=179
w1=[]; w2=[]; w3=[];
idata12=idata1.union(idata2)
for i in idata12:
if data[i][3]+data[i][2] < rdate: w1.append(i)
if data[i][3] <= rdate and rdate <= data[i][3]+data[i][2]: w2.append(i)
if rdate < data[i][3]: w3.append(i)
idata3a=w2; #仕掛かり中のアクティビティ
idata3b=w3; #仕掛かっていないアクティビティ
idata3=w2+w3; #リスケすべきアクティビティ
print(idata3)
#プログラムIII-3.2
#=======================================================================
#再計画 作業の定義
#=======================================================================
act3={}
for i in idata3:
j=i
while data[j][1]!=0:
j=data[j][4][0]
act3[i]=usuki3.addActivity(data[i][0], duedate=data[j][3]+data[j][2], \
backward=True)
#プログラムIII-3.3
#=======================================================================
#再計画 先行制約
#=======================================================================
for i in idata3b:
if data[i][1] in ACT_gisou+ACT_kumitate:
for iw in[0,1,2,3,4]:
if data[i][4][iw] in idata3:
usuki3.addTemporal(act3[i],act3[data[i][4][iw]],\
tempType=CS[data[i][5][iw][0]], delay= int(data[i][5][iw][1]*2))
if data[i][1] in ["A02010","A02610","A03010","A03210","A04310",\
"A09210"] and data[i][5][iw][0]==0:
usuki3.addTemporal(act3[data[i][4][iw]],act3[i],\
tempType=CS[3], delay=-int(data[i][5][iw][1]*2))
#-----
for i in idata3b:
if data[i][1] in PL_gisou+PL_kumitate:
for iw in [0]:
if data[i][4][iw] in idata3b:
ii=data[i][4][iw]
usuki3.addTemporal(act3[i],act3[ii],tempType="CS")
usuki3.addTemporal(act3[ii],act3[i],tempType="SC")
for jj in idata3b:
for iw in [0]:
if data[i][4][iw] in idata3b:
if data[jj][4][iw]==i:
usuki3.addTemporal(act3[jj],act3[i],tempType="CS")
usuki3.addTemporal(act3[i],act3[jj],tempType="SC")
#-----開始日の制約
for i in idata3a:
usuki3.addTemporal("source",act3[i],tempType="SS",delay= int(data[i][3]))
usuki3.addTemporal(act3[i],"source",tempType="SS",delay=-int(data[i][3]))
#-----
for i in idata3b:
usuki3.addTemporal("source",act3[i],tempType="SS",delay= rdate)
プログラムIII-4
#プログラムIII-4.1
#=======================================================================
#仕掛作業 資源制約(配員、場所)
#=======================================================================
mode3={}
for i in idata3a:
if data[i][1] in ACT_gisou:
mode3[i]=mode1[i]
mode3[i].name='mode3['+i+']'
act3[i].addModes(mode3[i])
#-----
if data[i][1] in [11,1,2,3,4,5,6,12,13,14,15,36,37,38]: #ACT_kumitate.remove(16):
mode3[i]=mode2[i]
mode3[i].name='mode3['+i+']'
act3[i].addModes(mode3[i])
#-----
if data[i][1] in PL_gisou:
mode3[i]=mode1[i]
s=mode1[i].name
mode3[i].name=s[:4]+"3"+s[6:]
act3[i].addModes(mode3[i])
#-----
if data[i][1] in PL_kumitate:
mode3[i]=mode2[i]
s=mode2[i].name
mode3[i].name=s[:4]+"3"+s[6:]
act3[i].addModes(mode3[i])
#プログラムIII-4.2
#=======================================================================
#再計画 資源制約(配員)
#=======================================================================
for i in idata3b:
if data[i][1] in ACT_gisou+ACT_kumitate:
#-----
#1F #2W #3C #4CC #20ブラスト #31鉄艤 #32甲配 #33機配 #34PA #39_甲配 #40_機配
if data[i][1] in [1,2,3,4,20,31,32,33,34,39,40]:
n=math.ceil(data[i][9][0][0]/5) #1人で何日かかるか
if data[i][1] in [1,3]: #取付
mode3[i]=Mode("mode3["+i+"]",duration=n)
mode3[i].addBreak(0,0)
mode3[i].addResource(resWH,{(0,n):5})
mode3[i].addParallel(1,n,28)
if data[i][1] in [2,4]: #溶接
mode3[i]=Mode("mode3["+i+"]",duration=n)
mode3[i].addBreak(0,0)
mode3[i].addResource(resWW,{(0,n):5})
mode3[i].addParallel(1,n,43)
if data[i][1] in [31]: #鉄艤装
mode3[i]=Mode("mode3["+i+"]",duration=n)
mode3[i].addBreak(0,0)
mode3[i].addResource(resWF1,{(0,n):5})
mode3[i].addParallel(1,n,5)
if data[i][1] in [32,39]: #甲板配管
mode3[i]=Mode("mode3["+i+"]",duration=n)
mode3[i].addBreak(0,0)
mode3[i].addResource(resWF2,{(0,n):5})
mode3[i].addParallel(1,n,7)
if data[i][1] in [33,40]: #機関配管
mode3[i]=Mode("mode3["+i+"]",duration=n)
mode3[i].addBreak(0,0)
mode3[i].addResource(resWF3,{(0,n):5})
mode3[i].addParallel(1,n,10)
if data[i][1]==20: #塗装内
mode3[i]=Mode("mode3["+i+"]",duration=n)
mode3[i].addBreak(0,0)
mode3[i].addResource(resWP, {(0,n):5})
mode3[i].addParallel(1,n,8)
if data[i][1]==34: #塗装外
mode3[i]=Mode("mode3["+i+"]",duration=n)
mode3[i].addBreak(0,0)
mode3[i].addResource(resWP2,{(0,n):5})
mode3[i].addParallel(1,n,8)
act3[i].addModes(mode3[i])
#-----
#10:入荷 #7:社0 #8:検0 #9:W0 #16:運 #17:運0 #18:運2 #19:合体 #21:運ブ #25:運ブ2 #35:AT #0:搭載
elif data[i][1] in [10,7,8,9,16,17,18,19,21,25,35,0]:
mode3[i]=Mode("mode3["+i+"]",duration=data[i][2])
act3[i].addModes(mode3[i])
#-----
#11:開始 #5:社 #6:検 #12:正 #13:反 #14:積み #15:一体 #36:磨き #37:O/P #38:_鉄艤 #16:運
elif data[i][1] in [11,5,6,12,13,14,15,36,37,38,16]:
mode3[i]=Mode("mode3["+i+"]",duration=data[i][2])
act3[i].addModes(mode3[i])
#プログラムIII-4.3
#=======================================================================
#再計画 資源制約(作業場所)
#=======================================================================
for i in idata3b:
if data[i][1] in PL_gisou+PL_kumitate:
#-----
if data[i][1] in [22,23,24,70,71,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87]: #PL_gisou.remove(72): #72:D5_AH
if data[i][1] in [22,23,24]: data[i][6]=AB
for no in range(len(data[i][6])):
no1=data[i][6][no][0];
L=R[no1][1]; B=R[no1][2];
L1=data[i][6][no][1]; L2=data[i][6][no][2];
B1=data[i][6][no][3]; B2=data[i][6][no][4];
skipL=math.floor(L/8); skipL=1
skipB=math.floor(B/2);
l=math.floor(data[i][8][0]); b=math.floor(data[i][8][1]);
if data[i][1] in [22,23,24]: l=19; b=16;
for j in range(L1,L2-l+1,skipL):
for k in range(B1,B2-b+1,skipB):
mode3[i]=Mode("mode3["+i+"]_R[{0:03d}][{1:03d}_{2:03d}][{3:03d}_{4:03d}]".format(no1,j,k,l,b))
for s in range(0,l):
for t in range(0,b):
mode3[i].addBreak(0,0)
mode3[i].addResource(resPL[no1,j+s,k+t],1,"break")
act3[i].addModes(mode3[i])
#-----
elif data[i][1] in [51,53,54,55,56,57,58,59,60,61,62,63,64]: #PL_kumitate.remove(65): #65:K4_1AS1
for no in range(len(data[i][6])):
no1=data[i][6][no][0];
L=R[no1][1]; B=R[no1][2];
L1=data[i][6][no][1]; L2=data[i][6][no][2];
B1=data[i][6][no][3]; B2=data[i][6][no][4];
skipL=math.floor(L/8); skipL=1
skipB=math.floor(B/2);
l=math.floor(data[i][8][0]); b=math.floor(data[i][8][1]);
if data[i][1] in [22,23,24]: l=19; b=16;
for j in range(L1,L2-l+1,skipL):
for k in range(B1,B2-b+1,skipB):
mode3[i]=Mode("mode3["+i+"]_R[{0:03d}][{1:03d}_{2:03d}][{3:03d}_{4:03d}]".format(no1,j,k,l,b))
for s in range(0,l):
for t in range(0,b):
mode3[i].addBreak(0,0)
mode3[i].addResource(resPL[no1,j+s,k+t],1,"break")
act3[i].addModes(mode1[i])
#-----
elif i in {"A01431","A11701","A11711","A11721"}: #場所と期間が固定されている場合
if data[i][6]!=0:
for no in range(len(data[i][6])):
no1=data[i][6][no][0];
L=R[no1][1]; B=R[no1][2];
L1=data[i][6][no][1]; L2=data[i][6][no][2];
B1=data[i][6][no][3]; B2=data[i][6][no][4];
skipL=math.floor(L/4); skipL=2;
skipB=math.floor(B/2); # skipB=1;
l=math.floor(data[i][8][0]); b=math.floor(data[i][8][1]);
for j in range(L1,L2-l+1,skipL):
for k in range(B1,B2-b+1,skipB):
mode3[i]=Mode("mode3["+i+"]_R[{0:03d}][{1:03d}_{2:03d}][{3:03d}_{4:03d}]".format(no1,j,k,l,b),duration=int(data[i][2]))
for s in range(0,l):
for t in range(0,b):
mode3[i].addResource(resPL[no1,j+s,k+t],1)
act3[i].addModes(mode1[i,no1,j,k])
プログラムIII-5
#プログラムIII-5
#=======================================================================
#再計画 問題の規模
#=======================================================================
N=len(usuki3.act)
print("アクティビティ総数(含待機数):",N)
M=[]
for a in usuki3.act: M.append(len(a.modes))
print("モード数:",M)
print("平均モード数:",round(sum(M)/N))
P=math.ceil(math.log10(round(sum(M)/N)**N))
print("問題の規模: 10**",P)
#=======================================================================
#組立工程計画 問題求解
#=======================================================================
#usuki3.Params.Makespan=True
usuki3.Params.Initial=False
usuki3.Params.TimeLimit=600
usuki3.Params.Neighborhood=20
usuki3.Params.OutputFlag=False
usuki3.optimize()
プログラムIII-6
#プログラムIII-6
#=======================================================================
#データセットの更新
#=======================================================================
print("")
for a in usuki3.act:
for i in idata3b:
if a.name==data[i][0]:
if len(a.modes)==1: nam=a.selected.name
else: nam=a.selected
#print("_"+a.name,len(a.modes),nam,a.start,a.completion)
data[i][3]=a.start
data[i][2]=a.completion-a.start
if len(nam)>15:
r=int(nam[16:19])
x=int(nam[21:24])
y=int(nam[25:28])
l=int(nam[30:33])
b=int(nam[34:37])
place=[[ r, x, x+l, y, y+b]]
data[i][6]=place
print(data[i][0:8])
#========================================================================
filename="usu_S1777_resche_R040510c.csv"
print("writing "+filename)
usuki3.writeExcel(filename)
import dill
dill.dump_session('usukiR040510c.pkl')
#------
#eof