Main Content

ltvss

線形時変状態空間モデル

R2023a 以降

説明

ltvss は、時間と共にダイナミクスが変動する線形状態空間モデルを表すために使用します。

ltvss を使用して連続時間または離散時間の線形時変状態空間モデルを作成できます。連続時間の場合、ltvss モデルは次の状態空間方程式で記述されます。

E(t)x˙=δ0(t)+A(t)(xx0(t))+B(t)(uu0(t))y(t)=y0(t)+C(t)(xx0(t))+D(t)(uu0(t))

ここで、A(t)、B(t)、C(t)、D(t)、E(t) は時変状態空間行列、δ0(t)、x0(t)、u0(t)、y0(t) はそれぞれ時間依存の微分、状態、入力、出力のオフセットです。

離散時間の場合、ltvss モデルは次の状態空間方程式で記述されます。

Ekxk+1=δ0k+Ak(xkx0k)+Bk(uku0k)yk=y0k+Ck(xkx0k)+Dk(uku0k)

ここで、整数インデックス k はサンプリング周期 Ts の数をカウントします。

ltvss オブジェクトを使用して以下をモデル化できます。

  • 係数が時間によって変化する線形システム。

  • 特定の軌跡に沿って動作する非線形システム。例については、2 リンク ロボットの LTV モデルを参照してください。

  • 時間によって変化する定常状態条件の近くで動作する非線形システム。

ltvss は、ダイナミクスが MATLAB® 関数 ("データ関数") で記述される LTV モデルを作成する場合に使用します。LTI のスナップショットを時間の関数として内挿する LTV モデルを作成する場合は ssInterpolant を使用します。ltvss オブジェクトに適用できる関数と演算については、LPV モデルと LTV モデルを参照してください。

作成

説明

ltvSys = ltvss(DataFcn) は、連続時間 LTV モデルを作成します。DataFcn は、"データ関数" の名前またはハンドルです。これは、与えられた t または k の値について行列とオフセットを計算するユーザー定義の MATLAB 関数です。

ltvSys = ltvss(DataFcn,ts) は、サンプル時間 ts の離散時間 LTV モデルを作成します。

ltvSys = ltvss(DataFcn,ts,tcheck) は、DataFcntcheck で評価し、状態、入力、および出力の数を特定します。既定では、ltvsstcheck = 0 を使用します。

ltvSys = ltvss(___,Name=Value) は、1 つ以上の名前と値のペアの引数を使用して線形時変モデルのプロパティを設定します。この構文は、前述の任意の入力引数の組み合わせで使用します。

入力引数

すべて展開する

行列とオフセットを計算するユーザー定義の MATLAB 関数。関数名 (文字ベクトルまたは string) または関数ハンドルとして指定します。データ関数は次の形式でなければなりません。

  • 連続時間 — [A,B,C,D,E,δ0,x0,u0,y0,Delays]=f(t)

  • 離散時間 — [A,B,C,D,E,δ0,x0,u0,y0,Delays]=f(k)

Delay 引数は、それぞれ入力チャネルと出力チャネルの遅延を指定する InputOutput のフィールドをもつ構造体です。 (R2024a 以降)

データ関数の定義の詳細については、データ関数を参照してください。

この入力はプロパティ DataFunction の値を設定します。

スカラーとして指定されたサンプル時間。詳細については、Ts プロパティを参照してください。

時間のテスト値。スカラーとして指定します。オブジェクトでは DataFcntcheck で評価して有効であるかどうかを確認し、状態、入力、および出力の数を取得します。既定では、ltvsstcheck = 0 を使用します。

プロパティ

すべて展開する

モデルのデータを計算するデータ関数。関数ハンドルとして指定します。データ関数は次の形式でなければなりません。

  • 連続時間

    [A,B,C,D,E,dx0,x0,u0,y0,Delay] = DataFcn(t)
  • 離散時間

    [A,B,C,D,E,dx0,x0,u0,y0,Delay] = DataFcn(k)

    ここで、入力 k はサンプリング周期 Ts の数をカウントする整数インデックスです。絶対時間は t = k*Ts で与えられます。

追加の入力引数を渡すには、次のように無名関数を使用します。

DataFcn = @(t) myFunction(t,arg1,arg2,...)

ABCD 以外の出力引数については、t の値にない場合、いずれも [] に設定できます。

詳細については、データ関数を参照してください。

状態名。次のいずれかとして指定します。

  • 文字ベクトル — 'velocity' などの 1 次モデルの場合。

  • 文字ベクトルの cell 配列 — 2 つ以上の状態をもつモデルの場合。

StateName は、既定ではすべての状態について空 ' ' です。

線形化で状態ブロック パスを管理しやすくするための状態パス。次のいずれかとして指定します。

  • 文字ベクトル — 1 次モデルの場合

  • 文字ベクトルの cell 配列 — 2 つ以上の状態をもつモデルの場合

StatePath は、既定ではすべての状態について空 ' ' です。

状態単位。以下のいずれかとして指定します。

  • 文字ベクトル — 'm/s' などの 1 次モデルの場合

  • 文字ベクトルの cell 配列 — 2 つ以上の状態をもつモデルの場合

StateUnit を使用して、各状態の単位を追跡します。StateUnit はシステムの動作に影響しません。StateUnit は、既定ではすべての状態について空 ' ' です。

サンプル時間。以下として指定します。

  • 0 (連続時間システムの場合)。

  • 離散時間システムのサンプリング周期を表す正のスカラー。TsTimeUnit プロパティによって指定される時間単位で指定します。

  • -1 (サンプル時間が指定されていない離散時間システムの場合)。

メモ

Ts を変更してもモデルの離散化やリサンプリングは行われません。連続時間表現と離散時間表現の間の変換を行うには、c2dd2c を使用します。離散時間システムのサンプル時間を変更するには、d2d を使用します。

時間変数の単位。次のいずれかとして指定します。

  • 'nanoseconds'

  • 'microseconds'

  • 'milliseconds'

  • 'seconds'

  • 'minutes'

  • 'hours'

  • 'days'

  • 'weeks'

  • 'months'

  • 'years'

TimeUnit の変更は他のプロパティには影響しませんが、システム全体の動作が変わります。chgTimeUnit を使用して、システム動作を変更せずに時間単位を変換します。

入力チャネル名。以下のいずれかとして指定します。

  • 文字ベクトル (単入力モデルの場合)。

  • 文字ベクトルの cell 配列 (多入力モデルの場合)。

  • '' (いずれの入力チャネルにも名前を指定しない場合)。

あるいは、自動的なベクトル拡張を使用して多入力モデルの入力名を割り当てることもできます。たとえば、sys が 2 入力モデルである場合は、以下のように入力します。

sys.InputName = 'controls';

入力名は自動的に {'controls(1)';'controls(2)'} へと拡張されます。

省略形表記 u を使用して、InputName プロパティを参照できます。たとえば、sys.usys.InputName と同じです。

InputName の使用目的は次のとおりです。

  • モデル表示とプロット上のチャネルの識別

  • MIMO システムのサブシステムの抽出

  • モデル相互接続時における接続点の指定

入力チャネル単位。以下のいずれかとして指定します。

  • 文字ベクトル (単入力モデルの場合)。

  • 文字ベクトルの cell 配列 (多入力モデルの場合)。

  • '' (いずれの入力チャネルにも単位を指定しない場合)。

InputUnit を使用して入力信号の単位を指定します。InputUnit はシステムの動作に影響しません。

入力チャネル グループ。構造体として指定します。InputGroup プロパティを使用して、MIMO システムの入力チャネルをグループに割り当て、各グループを名前で参照します。InputGroup のフィールド名はグループ名であり、フィールドの値は各グループの入力チャネルです。たとえば、入力チャネル 12、および 35 をそれぞれ含む、controls および noise という名前の入力グループを作成するには、次のように入力します。

sys.InputGroup.controls = [1 2];
sys.InputGroup.noise = [3 5];

その後、以下を使用して controls 入力からすべての出力にサブシステムを抽出できます。

sys(:,'controls')

既定では、InputGroup はフィールドのない構造体です。

出力チャネル名。次のいずれかとして指定されます。

  • 文字ベクトル (単出力モデルの場合)。

  • 文字ベクトルの cell 配列 (多出力モデルの場合)。

  • '' (いずれの出力チャネルにも名前を指定しない場合)。

あるいは、自動的なベクトル拡張を使用して多出力モデルの出力名を割り当てることもできます。たとえば、sys が 2 出力モデルである場合は、以下のように入力します。

sys.OutputName = 'measurements';

出力名は自動的に {'measurements(1)';'measurements(2)'} へと拡張されます。

省略形表記 y を使用して OutputName プロパティを参照することもできます。たとえば、sys.ysys.OutputName と同じです。

OutputName の使用目的は次のとおりです。

  • モデル表示とプロット上のチャネルの識別

  • MIMO システムのサブシステムの抽出

  • モデル相互接続時における接続点の指定

出力チャネル単位。次のいずれかとして指定されます。

  • 文字ベクトル (単出力モデルの場合)。

  • 文字ベクトルの cell 配列 (多出力モデルの場合)。

  • '' (いずれの出力チャネルにも単位を指定しない場合)。

OutputUnit を使用して出力信号の単位を指定します。OutputUnit はシステムの動作に影響しません。

出力チャネル グループ。構造体として指定します。OutputGroup プロパティを使用して、MIMO システムの出力チャネルをグループに割り当て、各グループを名前で参照します。OutputGroup のフィールド名はグループ名であり、フィールドの値は各グループの出力チャネルです。たとえば、出力チャネル 1、および 35 をそれぞれ含む、temperature および measurement という名前の出力グループを作成します。

sys.OutputGroup.temperature = [1];
sys.OutputGroup.measurement = [3 5];

その後、以下を使用してすべての入力から measurement 出力にサブシステムを抽出できます。

sys('measurement',:)

既定では、OutputGroup はフィールドのない構造体です。

システム名。文字ベクトルとして指定します。たとえば、'system_1' とします。

システムに関連付けるユーザー指定のテキスト。文字ベクトルまたは文字ベクトルの cell 配列として指定します。たとえば、'System is MIMO' とします。

システムに関連付けるユーザー指定のデータ。任意の MATLAB データ型として指定します。

オブジェクト関数

すべて展開する

sample(非推奨) 線形パラメーター変動または線形時変のダイナミクスをサンプリング
ssInterpolant状態空間データからグリッド付きの LTV モデルまたは LPV モデルを作成
step動的システムのステップ応答
impulse動的システムのインパルス応答プロット、インパルス応答データ
lsim動的システムの任意の入力へのシミュレーションされた時間応答をプロットする。シミュレーションされた応答データ
initial状態空間モデルの初期状態に対するシステム応答
feedback複数のモデルのフィードバック接続
connect動的システムのブロック線図相互接続
series2 つのモデルの直列接続
parallel2 つのモデルの並列接続
lft2 つのモデルの一般化されたフィードバック相互接続 (Redheffer スター積)
c2d連続時間から離散時間へモデルを変換
d2c離散時間から連続時間へモデルを変換
d2d離散時間モデルのリサンプリング
xperm 状態空間モデルの状態を並べ替える
sminreal構造的に接続されていない状態、遅延、ブロックを除去

すべて折りたたむ

連続時間 SISO 線形時変モデルを作成します。

この例では 1 次モデルを使用します。行列とオフセットは次によって与えられます。

A=-(1+0.5sin(t)), B=1, C=1, D=0,

y0=0.1sin(5t).

これらの行列とオフセットは、この例で用意されているデータ関数 ltvssDataFcn.m で定義されています。

LTV モデルを作成します。

ltvSys = ltvss(@ltvssDataFcn)
Continuous-time state-space LTV model with 1 outputs, 1 inputs, and 1 states.

データ関数を表示します。

type ltvssDataFcn.m
function [A,B,C,D,E,dx0,x0,u0,y0,Delays] = ltvssDataFcn(t)
% SISO, first order
A = -(1+0.5*sin(t));
B = 1;
C = 1;
D = 0;
E = [];
dx0 = [];
x0 = [];
u0 = [];
y0 = 0.1*sin(5*t);
Delays = [];

離散時間線形時変モデルを作成します。

この例では、行列とオフセットが次のように定義されたモデルを使用します。

A=sin(0.1k),B=1,C=1,D=0

y0=0.1sin(k)

これらの行列とオフセットは、この例で用意されているデータ関数 ltvFcnDiscrete.m で定義されています。

プロパティを指定し、LTV モデルを作成します。

Ts = 0.01;
DataFcn = @ltvFcnDiscrete;
ltvSys = ltvss(DataFcn,Ts)
Discrete-time state-space LTV model with 1 outputs, 1 inputs, and 1 states.

ドット表記を使用してモデルの追加のプロパティを設定できます。

ltvSys.InputName = 'u';
ltvSys.OutputName = 'y';

データ関数を表示します。

type ltvFcnDiscrete.m
function [A,B,C,D,E,dx0,x0,u0,y0,Delays] = ltvFcnDiscrete(k)

A = sin(0.1*k);
B = 1;
C = 1;
D = 0;
E = [];
dx0 = [];
x0 = [];
u0 = [];
y0 = 0.1*sin(k);
Delays = [];

この例では、ltvssDataFcn.m により、MIMO システムの行列とオフセットを定義します。

LTV モデルを作成します。

ltvSys = ltvss(@ltvssDataFcn);

t = 0 秒から t = 10 秒まで、任意の入力に対するこのモデルの応答をシミュレートします。

t = (0:.01:10)';
u = sin(0.2*t);
x0 = 2;

応答をシミュレートしてプロットします。

[y,~,x] = lsim(ltvSys,u,t,x0);
plot(t,y)

次に、モデルのステップ応答とインパルス応答をシミュレートします。

RespConfig を使用してオプション セットを作成し、初期オフセットと状態値を指定します。

respOpt = RespConfig(InitialState=x0,Delay=1);

ステップ応答を計算します。

step(ltvSys,t,respOpt)

インパルス応答を計算します。

impulse(ltvSys,t,respOpt)

データ関数を表示します。

type ltvssDataFcn.m
function [A,B,C,D,E,dx0,x0,u0,y0,Delays] = ltvssDataFcn(t)
% SISO, first order
A = -(1+0.5*sin(t));
B = 1;
C = 1;
D = 0;
E = [];
dx0 = [];
x0 = [];
u0 = [];
y0 = 0.1*sin(5*t);
Delays = [];

R2024a 以降

この例は、固定と可変の入力遅延と出力遅延を含む線形時変モデルを作成する方法を示しています。

この例では、行列、オフセット、および遅延が次のデータ関数で定義されたモデルを使用します。

function [A,B,C,D,E,dx0,x0,u0,y0,Delays] = ltvDataFcnDelay(t)
    A = [-2 1;1 -0.5*(2+sin(10*t))];
    B = [1 cos(t);sin(5*t) 0];
    C = [1,2*cos(3*t);-1 3;sqrt(t) 0];
    D = [0 0;-1 1;0 0.5*sin(t)];
    E = [];
    dx0 = [cos(10*t)/(1+0.1*t);0];
    x0 = [0;sqrt(t)/(1+0.1*t)];
    u0 = [sin(10*t);1];
    y0 = [1/(1+t);-1;cos(3*t)];
    Delays.Input = [NaN;abs(cos(0.3*t))];
    Delays.Output = [1.7;NaN;abs(sin(0.5*t))];
end

遅延の引数は、それぞれ入力チャネルと出力チャネルに対応する遅延を指定する InputOutput のフィールドをもつ構造体です。このデータ関数では、遅延が次のように定義されます。

  • 1 番目の入力チャネルは常に遅延なし、2 番目の入力チャネルは cos(0.3t) 秒の可変の遅延。

  • 1 番目の出力チャネルは 1.7 秒の固定の遅延、2 番目の出力チャネルは遅延なし、3 番目の出力チャネルは sin(0.5t) 秒の可変の遅延。

LTV モデルを作成します。

ltvsysD = ltvss(@ltvDataFcnDelay)
Continuous-time state-space LTV model with 3 outputs, 2 inputs, and 2 states.
Model Properties

指定した遅延はソフトウェアで管理され、サンプリングなどの操作を実行するときに伝播されます。

モデルを 2 つの時間の値でサンプリングします。

t = [3,5];
sys = psample(ltvsysD,t)
sys(:,:,1,1) [Time=3] =
 
  A = 
           x1      x2
   x1      -2       1
   x2       1  -0.506
 
  B = 
           u1      u2
   x1       1   -0.99
   x2  0.6503       0
 
  C = 
           x1      x2
   y1       1  -1.822
   y2      -1       3
   y3   1.732       0
 
  D = 
            u1       u2
   y1        0        0
   y2       -1        1
   y3        0  0.07056
 
  Input delays (seconds): 0  0.622 
  Output delays (seconds): 1.7  0  0.997 
 

sys(:,:,1,2) [Time=5] =
 
  A = 
            x1       x2
   x1       -2        1
   x2        1  -0.8688
 
  B = 
            u1       u2
   x1        1   0.2837
   x2  -0.1324        0
 
  C = 
           x1      x2
   y1       1  -1.519
   y2      -1       3
   y3   2.236       0
 
  D = 
            u1       u2
   y1        0        0
   y2       -1        1
   y3        0  -0.4795
 
  Input delays (seconds): 0  0.0707 
  Output delays (seconds): 1.7  0  0.598 
 
1x2 array of continuous-time state-space models.
Model Properties

サンプリングした LTV モデルに、データ関数で定義された固定の遅延と時間と共に変化する遅延が含まれています。

バージョン履歴

R2023a で導入

すべて展開する