Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

lsim

動的システムの任意の入力へのシミュレーションされた時間応答をプロットする。シミュレーションされた応答データ

説明

応答プロット

lsim(sys,u,t) は、入力履歴 (tu) に対する動的システム モデル sys のシミュレーションされた時間応答をプロットします。ベクトル t は、シミュレーションの時間サンプルを指定します。単入力システムの場合、入力信号 u は、t と同じ長さのベクトルです。多入力システムの場合、u は、時間サンプル (length(t)) と同じ行数および sys に対する入力と同じ列数をもつ配列です。

lsim(sys,u,t,x0) はさらに初期状態値のベクトル x0 を指定します。このとき、sys は状態空間モデルになります。

lsim(sys,u,t,x0,method)lsim によるサンプル間の入力値の内挿法を指定します。このとき、sys は連続時間モデルになります。

lsim(sys1,sys2,...,sysN,u,t,___) は複数の動的システム モデルの応答を同じ入力履歴でシミュレートし、これらの応答を 1 つの図にプロットします。すべてのシステムは入力数と出力数が同じでなければなりません。複数のモデルの応答を計算する場合は、入力引数 x0 および method も使用できます。

lsim(sys1,LineSpec1,...,sysN,LineSpecN,___) はプロット内の各システムの色、ライン スタイルおよびマーカーを指定します。追加のプロット カスタマイズ オプションが必要な場合は、代わりに lsimplot を使用します。

応答データ

y = lsim(sys,u,t) は、入力と同じ時間 t にサンプリングされたシステム応答 y を返します。単出力システムの場合、yt と同じ長さのベクトルです。多出力システムの場合、y は時間サンプル (length(t)) と同じ行数および sys の出力と同じ列数をもつ配列です。この構文は、プロットを作成しません。

y = lsim(sys,u,t,x0) はさらに初期状態値のベクトル x0 を指定します。このとき、sys は状態空間モデルになります。

y = lsim(sys,u,t,x0,method)lsim によるサンプル間の入力値の内挿法を指定します。このとき、sys は連続時間モデルになります。

[y,tOut,x] = lsim(___) は、状態軌跡 x を返します。このとき、sys は状態空間モデルになります。x は時間サンプルと同じ行数および sys の状態と同じ列数をもつ配列です。この構文は、tOut のシミュレーションに使用される時間サンプルを返します。

線形シミュレーション ツール

lsim(sys) は線形シミュレーション ツールを開きます。線形解析にこのツールを使用する方法の詳細については、線形シミュレーション ツールの使用を参照してください。

すべて折りたたむ

次の伝達関数について考えます。

sys = tf(3,[1 2 3])
sys =
 
        3
  -------------
  s^2 + 2 s + 3
 
Continuous-time transfer function.

任意の入力信号に対するこのシステムの応答を計算するには、応答を計算する時間 t のベクトルと、対応する信号値を含むベクトル u を使用して lsim を指定します。たとえば、時間 t = 0 に 0 で開始され、t = 1 の 0 から t = 2 の 1 まで上昇した後、1 で状態を保つ、ランプ ステップ信号に対するシステム応答をプロットします。t を定義し、u の値を計算します。

t = 0:0.04:8;  % 201 points
u = max(0,min(t-1,1));

出力引数を指定せずに lsim を使用して、信号に対するシステム応答をプロットします。

lsim(sys,u,t)
grid on

プロットには、適用された入力 (u,t) がグレー、システム応答が青で示されています。

出力引数を指定した lsim を使用して、シミュレーションされた応答データを取得します。

y = lsim(sys,u,t);
size(y)
ans = 1×2

   201     1

ベクトル y には、t の対応する時間におけるシミュレーションされた応答が含まれます。

lsim で使用する正弦波や矩形波などの周期入力信号を作成するには、gensigを使用します。次の SISO 状態空間モデルの矩形波に対する応答をシミュレーションします。

A = [-3 -1.5; 5 0];
B = [1; 0];
C = [0.5 1.5];
D = 0;
sys = ss(A,B,C,D);

この例では、10 秒の周期と 20 秒の持続期間を指定して矩形波を作成します。

[u,t] = gensig("square",10,20);

gensig は、タイム ステップのベクトル t と、入力信号の対応する値を含むベクトル u を返します (t のサンプル時間を指定しない場合、gensig は 1 周期あたり 64 サンプル生成します)。lsim でこれらを使用して、システム応答をプロットします。

lsim(sys,u,t)
grid on

プロットには、適用された矩形波がグレー、システム応答が青で表示されています。出力引数を指定した lsim を呼び出して、t の各ポイントにおける応答値を取得します。

[y,~] = lsim(sys,u,t);

離散時間システムの応答をシミュレーションする場合、ベクトル tTi:dT:Tf の形式にしなければなりません。この dT はモデルのサンプル時間です。ランプ ステップ入力に対する次の離散時間伝達関数の応答をシミュレートします。

sys = tf([0.06 0.05],[1 -1.56 0.67],0.05);

この伝達関数のサンプル時間は 0.05 秒です。同じサンプル時間を使用して、時間ベクトル t とランプ ステップ信号 u を生成します。

t = 0:0.05:4;  
u = max(0,min(t-1,1));

システム応答をプロットします。

lsim(sys,u,t)

周期入力信号に対する離散時間システムの応答をシミュレートするには、gensig で同じサンプル時間を使用して入力を生成します。たとえば、周期 1 秒および期間 4 秒の正弦波に対するシステム応答をシミュレーションします。

[u,t] = gensig("sine",1,4,0.05);

システム応答をプロットします。

lsim(sys,u,t)

lsim を使用して、複数の動的システムのシミュレーションされた応答を同じ軸にプロットできます。たとえば、PI コントローラーと PID コントローラーでシステムの閉ループ応答を比較します。システムの伝達関数を作成し、コントローラーを調整します。

H = tf(4,[1 10 25]);
C1 = pidtune(H,'PI');
C2 = pidtune(H,'PID');

閉ループ システムを作成します。

sys1 = feedback(H*C1,1);
sys2 = feedback(H*C2,1);

周期 4 秒の矩形波に対する両方のシステムの応答をプロットします。

[u,t] = gensig("square",4,12);
lsim(sys1,sys2,u,t)
grid on
legend("PI","PID")

既定では、lsim は、プロットするシステムごとに異なる色を選択します。入力引数 LineSpec を使用して色とライン スタイルを指定できます。

 lsim(sys1,"r--",sys2,"b",u,t)
 grid on
 legend("PI","PID")

最初の LineSpec "r--" では、PI コントローラーでの応答を表す赤い破線を指定します。2 番目の LineSpec "b" では、PID コントローラーでの応答を表す青い実線を指定します。凡例に、指定された色とライン スタイルが反映されます。プロットをさらにカスタマイズするには、lsimplot を使用します。

MIMO システムでは、各タイム ステップ t において、入力 u(t) は、長さが入力数を表すベクトルです。lsim を使用するには、u を次元 NtNu 列の行列として指定します。ここで、Nu はシステム入力の数、Ntt の長さです。つまり、u の各列は、対応するシステム入力に適用される入力信号になります。たとえば、201 のタイム ステップの 4 つの入力でシステムをシミュレーションするには、u を 4 つ列および 201 行の行列として指定します。ここで、各行 u(i,:)i 番目のタイム ステップにおける入力値のベクトル、各列 u(:,j)j 番目の入力に適用された信号です。

同様に、lsim で計算された出力 y(t) は、列が各システム出力での信号を表す行列になります。lsim を使用してシミュレーションされた応答をプロットすると、lsim では出力ごとに異なる座標軸を示し、すべての入力で適用された入力 u(t) への各出力チャネルでシステム応答を表します。

次の状態空間行列を使用する 2 入力、3 出力の状態空間モデルを考えてみます。

A = [-1.5  -0.2   1.0;
     -0.2  -1.7   0.6;
      1.0   0.6  -1.4];
  
B = [ 1.5  0.6;
     -1.8  1.0;
      0    0  ];

C = [ 0    -0.5 -0.1;
      0.35 -0.1 -0.15
      0.65  0    0.6];
  
D = [ 0.5  0;
      0.05 0.75
      0    0];

sys = ss(A,B,C,D);

最初の入力 sys に適用された周期 4 秒の矩形波と 3 秒おきに 2 番目の入力に適用されたパルスに対する sys の応答をプロットします。これを行うには、gensig を使用して矩形波とパルス信号を表す列ベクトルを作成します。次に、列を 1 つの入力行列にスタックします。2 つの信号のサンプル数を同じにするには、同じ終了時間とサンプル時間を指定します。

Tf = 10;
Ts = 0.1;
[uSq,t] = gensig("square",4,Tf,Ts);
[uP,~] = gensig("pulse",3,Tf,Ts);
u = [uSq uP];
lsim(sys,u,t)

各軸には、すべての入力で適用された信号 u に対する 3 つのシステム出力のいずれかの応答が示されます。各プロットには、すべての入力信号もグレーで表示されます。

既定では、lsim は、シミュレーションの開始時にすべての状態が 0 であると仮定して、モデルをシミュレーションします。状態空間モデルの応答をシミュレートする場合は、オプションの x0 入力引数を使用して、非ゼロの初期状態の値を指定します。次の 2 状態の SISO 状態空間モデルを考えてみます。

A = [-1.5 -3;
      3   -1];
B = [1.3; 0];
C = [1.15 2.3];
D = 0;
          
sys = ss(A,B,C,D);

2 秒の入力のない既知の初期状態のセットから展開して、単位ステップの変更を適用できるようにするとします。初期状態値のベクトル x0 を指定し、入力ベクトルを作成します。

x0 = [-0.2 0.3];
t = 0:0.05:8;
u = zeros(length(t),1);
u(t>=2) = 1;
lsim(sys,u,t,x0)
grid on

プロットの最初の半分には、初期状態値 [-0.2 0.3] からのシステムの最初の変化を示します。t = 2 でステップが入力に変わり、プロットにはその時点における状態値から始まるこの新しい信号に対するシステム応答が示されます。

出力引数を指定した lsim を使用すると、シミュレーションされた応答データが配列で返されます。SISO システムの場合、応答データは t と同じ長さの列ベクトルとして返されます。たとえば、矩形波に対する SISO システムの応答を抽出するとします。gensig を使用して矩形波を作成します。

sys = tf([2 5 1],[1 2 3]);
[u,t] = gensig("square",4,10,0.05);
[y,t] = lsim(sys,u,t);
size(y)
ans = 1×2

   201     1

ベクトル y には、t 各タイム ステップでシミュレートされた応答が含まれます (便宜上、lsim は時間ベクトル t を返します)。

MIMO システムの場合、応答データは次元 N x Ny x Nu の配列で返されます。NyNu は動的システムの出力および入力の数です。たとえば、2 つの入力と 3 つの出力をもつ 3 状態システムを表す、次の状態空間モデルを考えてみます。

A = [-1.5  -0.2   1.0;
     -0.2  -1.7   0.6;
      1.0   0.6  -1.4];
  
B = [ 1.5  0.6;
     -1.8  1.0;
      0    0  ];

C = [ 0   -0.1 -0.2;
      0.7 -0.2 -0.3
     -0.65 0   -0.6];
  
D = [ 0.1  0;
      0.1  1.5
      0    0];

sys = ss(A,B,C,D);

両方の入力で適用された矩形波に対する 3 つの出力チャネルの応答を抽出します。

uM = [u u];
[y,t] = lsim(sys,uM,t);
size(y)
ans = 1×2

   201     3

y(:,j) は、両方の入力に適用された矩形波に対する j 番目の出力における応答を含む列ベクトルです。つまり、y(i,:) は、i 番目のタイム ステップにおける出力値である 3 つの値のベクトルです。

sys は状態空間モデルであるため、入力信号に応じて状態値の時間発展を抽出できます。

[y,t,x] = lsim(sys,uM,t);
size(x)
ans = 1×2

   201     3

x の各行には、t の対応する時間における状態値 [x1,x2,x3] が含まれます。つまり、x(i,:) は、i 番目のタイム ステップにおける状態ベクトルです。状態値をプロットします。

plot(t,x)

「同じ入力に対する複数システムの応答のプロット」の例は、信号軸に複数の個々のシステムの応答をプロットする方法を示しています。モデル配列に複数の動的システムを配置すると、lsim はそのすべての応答を一度にプロットします。

モデル配列を作成します。この例では、固有振動数が異なる 2 次伝達関数の 1 次元配列を使用します。最初に、モデル配列のメモリを事前に割り当てます。次のコマンドで、零点とゲインの SISO 伝達関数からなる 1 行 5 列の行を作成します。最初の 2 つの次元は、モデルの出力と入力を表します。残りの次元は配列の次元です (モデル配列とそれらの作成方法の詳細については、モデル配列を参照してください)。

sys = tf(zeros(1,1,1,5));

配列を設定します。

w0 = 1.5:1:5.5;    % natural frequencies
zeta = 0.5;        % damping constant
for i = 1:length(w0)
   sys(:,:,1,i) = tf(w0(i)^2,[1 2*zeta*w0(i) w0(i)^2]);
end

矩形波入力に対する配列内のすべてのモデルの応答をプロットします。

[u,t] = gensig("square",5,15);
lsim(sys,u,t)

lsim は、配列内のすべてのエントリの応答に同じライン スタイルを使用します。エントリを区別する 1 つの方法は、動的システム モデルの SamplingGrid プロパティを使用して配列内の各エントリを対応する w0 値に関連付けることです。

sys.SamplingGrid = struct('frequency',w0);

次に、応答を MATLAB Figure ウィンドウにプロットする場合は、トレースをクリックして、対応する周波数値を確認できます。

モデルを推定する推定データを読み込みます。

load(fullfile(matlabroot,'toolbox','ident','iddemos','data','dcmotordata'));
z = iddata(y,u,0.1,'Name','DC-motor');

z は、サンプル時間 0.1 秒の 1 入力 2 出力推定データを格納する iddata オブジェクトです。

推定データ z を使用して次数 4 の状態空間モデルを推定します。

[sys,x0] = n4sid(z,4);

sys は推定されたモデル、x0 は推定された初期状態です。

推定に使用したものと同じ入力データと推定コマンドによって返された初期状態を使用して、sys の応答をシミュレートします。

[y,t,x] = lsim(sys,z.InputData,[],x0);

ここで、y はシステム応答、t はシミュレーションに使用される時間ベクトル、x は状態軌跡です。

両方の出力について、シミュレーションされた応答 y を測定した応答 z.OutputData と比較します。

subplot(211), plot(t,z.OutputData(:,1),'k',t,y(:,1),'r')
legend('Measured','Simulated')
subplot(212), plot(t,z.OutputData(:,2),'k',t,y(:,2),'r')
legend('Measured','Simulated')

サンプル時間の選択は、シミュレーション結果に大きく影響する場合があります。この理由を、次の 2 次モデルを使って考えてみます。

sys(s)=ω2s2+2s+ω2,ω=62.83.

周期を 1 秒とし、0.1 秒のサンプル時間を使用して、矩形波に対するこのモデルの応答をシミュレーションします。

w2 = 62.83^2;
sys = tf(w2,[1 2 w2]);

tau = 1;
Tf = 5;
Ts = 0.1;
[u,t] = gensig("square",tau,Tf,Ts);
lsim(sys,u,t)

lsim warning message: The input signal is undersampled.

lsim は、指定された入力信号を使用してモデルをシミュレーションしますが、入力信号がアンダーサンプルであること示す警告を表示します。lsim では、入力 u の 1 周期のサンプル数を少なくとも 64 個生成するサンプル時間が推奨されます。この推奨事項が重要である理由を確認するために、最大推奨値よりも小さいサンプル時間を使用して sys をもう一度シミュレーションします。

figure
Ts2 = 0.01;
[u2,t2] = gensig("square",tau,Tf,Ts2);
lsim(sys,u2,t2)

この応答は、アンダーサンプル バージョンに強い振動動作が隠れていることを示します。

入力引数

すべて折りたたむ

動的システム。SISO または MIMO 動的システム モデルか、動的システム モデルの配列として指定します。応答をシミュレーションできる動的システムは次のとおりです。

  • tfzpkss モデルなどの連続時間または離散時間の数値 LTI モデル。

  • genssuss モデルなどの一般化された、あるいは不確かさをもつ LTI モデル (不確かさをもつモデルを使用するには Robust Control Toolbox™ ソフトウェアが必要です)。

    • 調整可能な制御設計ブロックの場合、関数は応答データをプロットする処理と返す処理の両方においてモデルをその現在の値で評価します。

    • 不確かさをもつ制御設計ブロックの場合、関数はモデルのノミナル値とランダム サンプルをプロットします。出力引数を使用する場合、関数はノミナル モデルのみの応答データを返します。

  • sparss モデルや mechss モデルなどのスパース状態空間モデル。

  • idtfidssidproc モデルなどの同定された LTI モデル。同定されたモデルの場合は、sim (System Identification Toolbox) コマンドも使用します。このコマンドはシミュレーションされた応答と状態軌跡の標準偏差を計算できます。sim では、非ゼロ初期条件ですべてのタイプのモデルをシミュレーションし、非線形の同定されたモデルをシミュレーションすることもできます (同定されたモデルを使用するには、System Identification Toolbox™ ソフトウェアが必要です)。

lsim は、frdgenfrdidfrd モデルなど、周波数応答データ モデルをサポートしません。

sys がモデルの配列である場合、この関数は同じ座標軸上に配列のすべてのモデルの応答をプロットします。モデル配列でのシステムの応答を参照してください。

入力信号シミュレーション。単入力システムの場合はベクトル、多入力システムの場合は配列として指定します。

  • 単入力システムの場合、ut と同じ長さのベクトルです。

  • 多入力システムの場合、u は、時間サンプル (length(t)) と同じ行数および sys に対する入力と同じ列数をもつ配列です。つまり、各行 u(i,:) は、時間 t(i) における sys の入力に適用された値を表します。各列 u(:,j) は、sysj 番目の入力に適用された信号です。

応答を計算する時間サンプル。0:dT:Tf 形式のベクトルとして指定します。lsim コマンドでは、t はモデル sysTimeUnit プロパティで指定された単位を使用するものと解釈します。

連続時間 sys の場合、lsim コマンドはタイム ステップ dT を使用してモデルを離散化します。dT がシステム ダイナミクスに対して大きすぎる (アンダーサンプリング) 場合、lsim は、サンプリング時間の短縮を推奨する警告を出します。サンプリング時間がシミュレーションに与える影響の詳細については、シミュレーションに対するサンプル時間の影響を参照してください。

離散時間 sys の場合、タイム ステップ dTsys のサンプル時間と等しくなければなりません。または、t を省略するか、[] に設定できます。その場合、lsimt を、sys.Ts と同じタイム ステップで 0 から始まる u と同じ長さのベクトルに設定します。

状態空間モデルをシミュレーションするための初期状態値。sys の状態ごとに 1 つの値をもつベクトルとして指定します。この引数を省略すると、lsim はすべての状態を t = 0 の 0 に設定します。

連続時間モデルをサンプリングするための離散化手法。次のいずれかとして指定します。

  • 'zoh' — ゼロ次ホールド

  • 'foh' — 1 次ホールド

sys が連続時間モデルの場合、lsim は、t のタイム ステップ dT = t(2)-t(1) と等しいサンプル時間を使用してモデルを離散化することで、時間応答を計算します。離散化手法を指定しない場合、lsim は、信号 u の滑らかさに基づいて自動的に方式を選択します。離散化手法の詳細については、連続/離散の変換方法を参照してください。

ライン スタイル、マーカー、色。1、2、または 3 文字の string または文字ベクトルとして指定します。文字が表示される順序は任意です。3 つの特性 (ライン スタイル、マーカーおよび色) をすべて指定する必要はありません。たとえば、ライン スタイルを省略してマーカーを指定した場合、プロットはラインなしでマーカーのみを表示します。この引数の設定の詳細については、関数 plot の入力引数 LineSpec を参照してください。

例: 'r--' は赤い破線を指定します。

例: '*b' は青いアスタリスク マーカーを指定します。

例: 'y' は黄色いラインを指定します。

出力引数

すべて折りたたむ

シミュレーションされた応答データ。配列として返されます。

  • 単入力システムの場合、yt と同じ長さの列ベクトルです。

  • 多出力システムの場合、y は時間サンプル (length(t)) と同じ行数および sys の出力と同じ列数をもつ配列です。したがって、y の j 番目の列 (y(:,j)) には、すべての入力に適用された u に対する j 番目の出力の応答が含まれます。

シミュレーションに使用される時間ベクトル。列ベクトルとして返されます。0:dT:Tf 形式の入力時間ベクトル t を指定すると、tOut = t となります。t がほぼ等間隔でサンプリングされている場合、lsim はシミュレーションのサンプル時間を調整し、結果を tOut で返します。離散時間 sys の場合、t を省略するか、[] に設定できます。その場合、lsimt を、sys.Ts と同じタイム ステップで 0 から始まる u と同じ長さのベクトルに設定し、結果を tOut で返します。

状態軌跡。配列として返されます。sys が状態空間モデルの場合、x は入力に対する応答の sys の状態の発展が含まれます。x は、時間サンプル (length(t)) と同じ行数および sys の状態と同じ列数の配列です。

ヒント

  • 追加のプロット カスタマイズ オプションが必要な場合は、代わりに lsimplot を使用します。

アルゴリズム

離散時間の伝達関数の場合、

sys(z1)=a0+a1z1++anzn1+b1z1++bnzn,

lsim は、この伝達関数に関連付けられた再帰に基づいて入力をフィルター処理します。

y[k]=a0u[k]++anu[kn]b1y[k1]bn[kn].

離散時間 zpk モデルの場合、lsim は一連の 1 次セクションまたは 2 次セクションを通じて入力をフィルター処理します。この方法により、高次のモデルで数値的不安定性を引き起こす可能性がある、分子多項式と分母多項式は作成されません。

離散時間の状態空間モデルの場合、lsim は離散時間の状態空間方程式を伝播します。

x[n+1]=Ax[n]+Bu[n],y[n]=Cx[n]+Du[n].

連続時間システムの場合、lsim は最初に c2d を使用してシステムを離散化してから、結果の離散時間状態空間方程式を伝播します。入力引数 method を使用して前述の指定と異なる指定をしない限り、lsim は、入力信号が滑らかな場合は 1 次ホールド離散化手法を使用し、パルスや矩形波など入力信号が不連続の場合はゼロ次ホールドを使用します。離散化のサンプル時間は、t で指定した時間サンプル間の間隔 dT です。

R2006a より前に導入