Main Content

lpvss

線形パラメーター変動状態空間モデル

R2023a 以降

    説明

    lpvss は、時間依存パラメーターの関数としてダイナミクスが変動する線形状態空間モデルを表すために使用します。"線形パラメーター変動" (LPV) モデルは、非線形システムの複雑度が低い局所的な線形近似を取得するのに役立ちます。特にパラメーターが内部状態に依存する場合 (準 LPV) など、LTI モデルよりもはるかに高度な動作をモデル化できます。そのため、lpvss モデルを使用すると、ゲイン スケジュール制御などの設計法を非線形モデルに効率的に適用できます。

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

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

    ここで、p は時間依存の外生パラメーターのベクトル、δ0(t,p)、x0(t,p)、u0(t,p)、y0(t,p) はそれぞれ可変の微分、状態、入力、出力のオフセットです。

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

    E(k,pk)xk+1=δ0(k,pk)+A(k,pk)(xkx0(k,pk))+B(k,pk)(uku0(k,pk))yk=y0(k,pk)+C(k,pk)(xkx0(k,pk))+D(k,pk)(uku0(k,pk))

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

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

    lpvss は、ダイナミクスが MATLAB® 関数 ("データ関数") で記述される LPV モデルを作成する場合に使用します。線形化された LTI ダイナミクスを操作条件のグリッドで内挿する LPV モデルを作成する場合は ssInterpolant を使用します。lpvss オブジェクトでは、LPV モデルとスケジューリング マップ p(t) = h(t,x,u) で構成される準 LPV モデルは表現できませんが、パラメーターの軌跡を時間 t、状態 x、および入力 u の関数として指定して準 LPV モデルをシミュレートできます。lpvss オブジェクトに適用できる関数と演算については、LPV モデルと LTV モデルを参照してください。

    作成

    説明

    lpvSys = lpvss(ParamNames,DataFcn) は、連続時間 LPV モデルを作成します。ParamNames で、パラメーター ベクトル p の各要素の名前を指定します。DataFcn は、"データ関数" の名前またはハンドルです。これは、与えられた (t,p) の値 (離散時間の場合は (k,p) の値) について行列とオフセットを計算するユーザー定義の MATLAB 関数です。

    lpvSys = lpvss(ParamNames,DataFcn,ts) は、サンプル時間 ts の離散時間 LPV モデルを作成します。

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

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

    入力引数

    すべて展開する

    パラメーターの名前。Np 行 1 列の文字ベクトルの cell 配列として指定します。ここで、Np はスカラー パラメーターの数、つまりパラメーター ベクトル p の要素の数です。この入力はプロパティ ParameterName の値を設定します。

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

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

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

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

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

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

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

    時間のテスト値。スカラーとして指定します。オブジェクトでは DataFcn を (tcheck,pcheck) で評価し、状態、入力、および出力の数を特定します。既定では、lpvss は (tcheck,pcheck) = (0,0) を使用します。

    パラメーターのテスト値。スカラーまたは長さ Np のベクトルとして指定します。オブジェクトでは DataFcn を (tcheck,pcheck) で評価し、状態、入力、および出力の数を特定します。既定では、lpvss は (tcheck,pcheck) = (0,0) を使用します。

    プロパティ

    すべて展開する

    LPV モデルのパラメーターの名前。文字ベクトルの cell 配列として指定します。パラメーター ベクトル p の長さと等しい長さの cell 配列を指定します。

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

    • 連続時間

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

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

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

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

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

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

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

    • 文字ベクトル — '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 線形パラメーター変動モデルを作成します。

    この例では、dataFcnMaglev.m で磁気浮上システムの行列とオフセットを定義します。ボールに対する磁力を発生させるコイル電流を使用して、磁気浮上で浮遊するボールの高さを制御します。

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

    LPV モデルを作成します。

    lpvsys = lpvss('p',@dataFcnMaglev)
    Continuous-time state-space LPV model with 1 outputs, 1 inputs, 2 states, and 1 parameters.
    Model Properties
    

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

    type dataFcnMaglev.m
    function [A,B,C,D,E,dx0,x0,u0,y0,Delays] = dataFcnMaglev(~,p)
    % MAGLEV example:
    % x = [h ; dh/dt]
    % p=hbar (equilibrium height)
    mb = 0.02; % kg
    g = 9.81;
    alpha = 2.4832e-5;
    A = [0 1;2*g/p 0];
    B = [0 ; -2*sqrt(g*alpha/mb)/p];
    C = [1 0];  % h
    D = 0;
    E = [];
    dx0 = [];
    x0 = [p;0];
    u0 = sqrt(mb*g/alpha)*p;  % ibar
    y0 = p;                   % y = h = hbar + (h-hbar)
    Delays = [];
    

    離散時間線形パラメーター変動モデルを作成します。

    行列とオフセットは次によって与えられます。

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

    y0=0.1sin(k).

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

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

    Ts = 0.01;
    ParamNames = 'p';
    DataFcn = @lpvFcnDiscrete;
    lpvSys = lpvss(ParamNames,DataFcn,Ts)
    Discrete-time state-space LPV model with 1 outputs, 1 inputs, 1 states, and 1 parameters.
    

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

    type lpvFcnDiscrete.m
    function [A,B,C,D,E,dx0,x0,u0,y0,Delays] = lpvFcnDiscrete(k,p)
    A = sin(0.1*p);
    B = 1;
    C = 1;
    D = 0;
    E = [];
    dx0 = [];
    x0 = [];
    u0 = [];
    y0 = 0.1*sin(k);
    Delays = [];
    

    この例では、dataFcnMaglev.m で磁気浮上システムの行列とオフセットを定義します。ボールに対する磁力を発生させるコイル電流を使用して、磁気浮上で浮遊するボールの高さを制御します。この例では、開ループでモデルをシミュレートします。

    LPV モデルを作成します。

    lpvSys = lpvss('h',@dataFcnMaglev)
    Continuous-time state-space LPV model with 1 outputs, 1 inputs, 2 states, and 1 parameters.
    Model Properties
    

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

    lpvSys.StateName = {'h','hdot'};
    lpvSys.InputName = 'current';
    lpvSys.InputName = 'height';

    このモデルの任意の正弦波入力電流に対する応答をシミュレートします。

    h0 = 1;
    [~,~,~,~,~,~,x0,u0,~] = dataFcnMaglev([],h0);
    t = 0:1e-3:1;
    u = u0*(1+0.1*sin(10*t));
    y = lsim(lpvSys,u,t,x0,@(t,x,u) x(1));

    応答をプロットします。

    plot(t,y,t,u/u0)
    legend('height','current')

    Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent height, current.

    電流が最初に増加した時点でボールが磁石に引き寄せられます (h が減少します)。その後の電流の減少は、元に戻るほど十分なものではありません。

    このモデルの特異点は h = 0、つまりボールが磁石に当たるときです。LPV モデルは、この時点で有効ではなくなります。

    LPV モデルのダイナミクスを (t,p) の値の点またはグリッドでサンプリングし、特定の時間またはパラメーターの値におけるアフィン ダイナミクスを取得できます。

    この例では、dataFcnMaglev.m で磁気浮上システムの行列とオフセットを定義します。ボールに対する磁力を発生させるコイル電流を使用して、磁気浮上で浮遊するボールの高さを制御します。

    LPV モデルを作成します。

    lpvSys = lpvss('h',@dataFcnMaglev)
    Continuous-time state-space LPV model with 1 outputs, 1 inputs, 2 states, and 1 parameters.
    

    LPV ダイナミクスを 3 つの h 値でサンプリングして局所的な LTI モデルを取得します。

    hmin = 0.05;
    hmax = 0.25;
    hcd = linspace(hmin,hmax,3);
    ssArray = psample(lpvSys,[],hcd);
    size(ssArray)
    1x3 array of state-space models.
    Each model has 1 outputs, 1 inputs, and 2 states.
    

    関数により、モデルのオフセットが配列の Offsets プロパティに格納されます。

    ssArray.Offsets
    ans=1×3 struct array with fields:
        dx
        x
        u
        y
    
    

    ボード応答をプロットします。

    bodemag(ssArray)

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

    type dataFcnMaglev.m
    function [A,B,C,D,E,dx0,x0,u0,y0,Delays] = dataFcnMaglev(~,p)
    % MAGLEV example:
    % x = [h ; dh/dt]
    % p=hbar (equilibrium height)
    mb = 0.02; % kg
    g = 9.81;
    alpha = 2.4832e-5;
    A = [0 1;2*g/p 0];
    B = [0 ; -2*sqrt(g*alpha/mb)/p];
    C = [1 0];  % h
    D = 0;
    E = [];
    dx0 = [];
    x0 = [p;0];
    u0 = sqrt(mb*g/alpha)*p;  % ibar
    y0 = p;                   % y = h = hbar + (h-hbar)
    Delays = [];
    

    R2024a 以降

    この例は、可変の遅延を含む線形パラメーター変動モデルを作成する方法を示しています。この例では、出力遅延を含むコントローラーで閉ループ プラントをシミュレートし、コントローラー応答の遅延による効果も確認します。

    この例では、dataFcnMaglev.m で磁気浮上システムの行列とオフセットを定義します。ボールに対する磁力を発生させるコイル電流を使用して、磁気浮上で浮遊するボールの高さを制御します。

    LPV モデルを作成します。

    h0 = 1;  % Note: Singular for h=0
    G = lpvss("h",@dataFcnMaglev,0,0,h0);

    この例では、磁気浮上プラントのゲイン スケジュール PD コントローラーを定義するデータ関数 maglevPD.m も用意されています。このコントローラーには時間依存の出力遅延が含まれています。この遅延は時間と共に減少します。

    PD = lpvss("h",@maglevPD,0,0,h0);

    閉ループ応答を作成します。

    CL = feedback(G*PD,1);

    最初の状態である実際の軌跡 p(t)=h(t) に対する応答をシミュレートします。

    xinit = [h0;0;0];  % init: h=1
    t = 0:1e-2:10;
    href = h0+0.5*sin(t);  % desired height
    pFcn = @(t,x,u) x(1);
    [y1,~,x1,p1] = lsim(CL,href,t,xinit,pFcn);

    シミュレーション結果をプロットし、基準の高さと比較します。

    plot(t,href,t,y1,'r--')
    legend("Height reference","LPV simulation")

    Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Height reference, LPV simulation.

    コントローラーの動作に含まれる遅延により、基準入力に正確に追従する出力信号の応答にも遅延が生じます。時間と共に遅延が減少すると、LPV シミュレーションが基準と一致します。

    データ関数

    type dataFcnMaglev.m
    function [A,B,C,D,E,dx0,x0,u0,y0,Delays] = dataFcnMaglev(~,p)
    % MAGLEV example:
    % x = [h ; dh/dt]
    % p=hbar (equilibrium height)
    mb = 0.02; % kg
    g = 9.81;
    alpha = 2.4832e-5;
    A = [0 1;2*g/p 0];
    B = [0 ; -2*sqrt(g*alpha/mb)/p];
    C = [1 0];  % h
    D = 0;
    E = [];
    dx0 = [];
    x0 = [p;0];
    u0 = sqrt(mb*g/alpha)*p;  % ibar
    y0 = p;                   % y = h = hbar + (h-hbar)
    Delays = [];
    
    type maglevPD.m
    function [A,B,C,D,E,dx0,x0,u0,y0,Delays] = maglevPD(t,p)
    % Gain-scheduled PD for MAGLEV example:
    %    dz = A(p) z + B(p) e
    %     u = u0 + C(p) z + D(p) e
    % p=h (equilibrium height)
    mb = 0.02; % kg
    g = 9.81;
    alpha = 2.4832e-5;
    a0 = 2*g/p;
    b0 = -2*sqrt(g*alpha/mb)/p;
    wn = 10;
    zeta = 0.7;
    Kp = (a0+wn^2)/b0;
    Kd = 2*zeta*wn/b0;  % linear in p
    % Kp = (2*zeta*wn-a0)/b0;
    % Kd = wn^2/b0;
    wf = 100;
    A = -wf;
    B = wf;
    C = -wf*Kd;
    D = Kp+wf*Kd;
    E = [];
    dx0 = [];
    x0 = [];
    u0 = [];
    y0 = sqrt(mb*g/alpha)*p;     % ibar, feedforward term
    Delays.Output = 0.1/(1+t);  % decreasing delay
    Delays.Input = NaN;
    end
    

    バージョン履歴

    R2023a で導入

    すべて展開する