「シミュレーション」の版間の差分

編集の要約なし
編集の要約なし
編集の要約なし
578行目: 578行目:
次に,状態空間表現された線形システムのシミュレーションをlsode関数を用いて行うスクリプト例を示します.システムが,次のような状態方程式と出力方程式で表されているとします.
次に,状態空間表現された線形システムのシミュレーションをlsode関数を用いて行うスクリプト例を示します.システムが,次のような状態方程式と出力方程式で表されているとします.


#math(\begin{array}{l l l}\frac{d \boldsymbol{x}(t)}{dt} &=& \boldsymbol{A} \boldsymbol{x}(t) + \boldsymbol{B} \boldsymbol{u}(t) \\\boldsymbol{y}(t) &=& \boldsymbol{C} \boldsymbol{x}(t) + \boldsymbol{D} \boldsymbol{u}(t)\end{array})
<math>\begin{array}{l l l}\frac{d \boldsymbol{x}(t)}{dt} &=& \boldsymbol{A} \boldsymbol{x}(t) + \boldsymbol{B} \boldsymbol{u}(t) \\\boldsymbol{y}(t) &=& \boldsymbol{C} \boldsymbol{x}(t) + \boldsymbol{D} \boldsymbol{u}(t)\end{array}</math>


lsode関数で計算するのは状態方程式のほうだけです.その結果得られた状態変数ベクトル&math(\boldsymbol{x});を用いて出力方程式に基づいて出力ベクトル&math(\boldsymbol{y});を計算します.
lsode関数で計算するのは状態方程式のほうだけです.その結果得られた状態変数ベクトル<math>\boldsymbol{x}</math>を用いて出力方程式に基づいて出力ベクトル&math(\boldsymbol{y});を計算します.


ここでは前述の慣性・粘性・弾性系の強制振動をlsode関数を用いてシミュレーションするスクリプト例を示します.このスクリプトで注意すべきなのは,入力&math(u(t));の取り扱いです.&math(u(t));はlsodeの内部では変数tの代数式として記述しますが,lsodeで得られた状態ベクトルを用いて出力yを計算する際には時間軸ベクトルtに対応したベクトルuとして必要になります.Octaveではsin関数などが引数にベクトルを受けると,要素ごとに関数をかけて同じサイズのベクトルを返しますのでそれを利用しています.&math(u(t));の内容によっては,要素ごとの積算 .* や要素ごとの除算 ./ といった演算子が必要になるので注意です.
ここでは前述の慣性・粘性・弾性系の強制振動をlsode関数を用いてシミュレーションするスクリプト例を示します.このスクリプトで注意すべきなのは,入力<math>u(t)</math>の取り扱いです.<math>u(t)</math>はlsodeの内部では変数tの代数式として記述しますが,lsodeで得られた状態ベクトルを用いて出力yを計算する際には時間軸ベクトルtに対応したベクトルuとして必要になります.Octaveではsin関数などが引数にベクトルを受けると,要素ごとに関数をかけて同じサイズのベクトルを返しますのでそれを利用しています.<math>u(t)</math>の内容によっては,要素ごとの積算 .* や要素ごとの除算 ./ といった演算子が必要になるので注意です.


*lsode関数を使った慣性・粘性・弾性系のシミュレーション
*lsode関数を使った慣性・粘性・弾性系のシミュレーション
626行目: 626行目:
前述の状態空間表現された線形連続時間システムの入力側にサンプラと零次ホールドをつけ,出力をサンプルしたシステムは,次のように離散時間システムとして表すことができます.
前述の状態空間表現された線形連続時間システムの入力側にサンプラと零次ホールドをつけ,出力をサンプルしたシステムは,次のように離散時間システムとして表すことができます.


#math(\begin{array}{l l l}\boldsymbol{x}_{k+1} &=& \boldsymbol{\Phi} \boldsymbol{x}_k + \boldsymbol{\Gamma} \boldsymbol{u}_k \\\boldsymbol{y}_k &=& \boldsymbol{C} \boldsymbol{x}_k + \boldsymbol{D} \boldsymbol{u}_k\end{array})
<math>\begin{array}{l l l}\boldsymbol{x}_{k+1} &=& \boldsymbol{\Phi} \boldsymbol{x}_k + \boldsymbol{\Gamma} \boldsymbol{u}_k \\\boldsymbol{y}_k &=& \boldsymbol{C} \boldsymbol{x}_k + \boldsymbol{D} \boldsymbol{u}_k\end{array}</math>


ここで,
ここで,


#math(\begin{array}{l l l}\boldsymbol{\Phi} &=&  e^{\boldsymbol{A} \Delta t} \\\boldsymbol{\Gamma} &=& \int_0 ^{\Delta t} e^{\boldsymbol{A} \tau}\boldsymbol{B} d\tau\end{array})
<math>\begin{array}{l l l}\boldsymbol{\Phi} &=&  e^{\boldsymbol{A} \Delta t} \\\boldsymbol{\Gamma} &=& \int_0 ^{\Delta t} e^{\boldsymbol{A} \tau}\boldsymbol{B} d\tau\end{array}</math>


です.
です.


ここで,&math(\boldsymbol{\Phi});と&math(\boldsymbol{\Gamma});が求まれば,離散時間システムの式を直接演算するだけで行えるので簡単です.
ここで,<math>\boldsymbol{\Phi});と&math(\boldsymbol{\Gamma}</math>が求まれば,離散時間システムの式を直接演算するだけで行えるので簡単です.


連続時間システムから離散時間システムへの変換には,Octaveに用意されているc2d関数が利用できます.この関数はサンプル・ホールド付きのz変換か双一次変換のいずれかで離散化することができます(デフォルトはサンプル・ホールド).シミュレーションにはサンプル・ホールド付きのz変換を使います.
連続時間システムから離散時間システムへの変換には,Octaveに用意されているc2d関数が利用できます.この関数はサンプル・ホールド付きのz変換か双一次変換のいずれかで離散化することができます(デフォルトはサンプル・ホールド).シミュレーションにはサンプル・ホールド付きのz変換を使います.