slLinearizer インターフェイスを使用した操作点の変化と複数の伝達関数の取得
この例では、slLinearizer インターフェイスを使用して Simulink® モデルをバッチ線形化する方法を説明します。複数の操作点でモデルを線形化して、モデルから複数の開ループと閉ループの伝達関数を取得します。
linearize コマンドを使用して、同じ解析を実行できます。ただし、複数の開ループと閉ループの伝達関数を取得する場合、特にコンパイルを繰り返すには計算量が多すぎるモデルの場合は、slLinearizer の方がより効率的となることがあります。
モデル用の slLinearizer インターフェイスの作成
モデルを開きます。
mdl = 'watertank';
open_system(mdl)

slLinearizer コマンドを使用してインターフェイスを作成します。
sllin = slLinearizer(mdl)
slLinearizer linearization interface for "watertank":
No analysis points. Use the addPoint command to add new points.
No permanent openings. Use the addOpening command to add new permanent openings.
Properties with dot notation get/set access:
Parameters : []
OperatingPoints : [] (model initial condition will be used.)
BlockSubstitutions : []
Options : [1x1 linearize.LinearizeOptions]
コマンド ウィンドウの表示には、slLinearizer インターフェイスについての情報が示されます。このインターフェイスでは、OperatingPoints プロパティ表示に、操作点が指定されていないことが示されています。
線形化に用いる複数の操作点の指定
平衡化された操作点、モデルの初期条件またはシミュレーションのスナップショット時間を使用してモデルを線形化できます。この例では、得られた平衡点を使用して水位の基準の高さを変化させます。
opspec = operspec(mdl); opspec.States(2).Known = 1; opts = findopOptions('DisplayReport','off'); h = [10 15 20]; for ct = 1:numel(h) opspec.States(2).x = h(ct); Href = h(ct); ops(ct) = findop(mdl,opspec,opts); end sllin.OperatingPoints = ops;
ここで、h はいくつか異なった水位を指定します。ops は、操作点オブジェクトの 1 行 3 列の配列です。ops の各エントリは、対応する水位でのモデルの操作点です。ops で sllin の OperatingPoints プロパティを設定します。これで、関数 getIOTransfer、getLoopTransfer、getSensitivity、および getCompSensitivity を使用して sllin から伝達関数を取得すると、指定した各操作点について線形化が返されるようになります。
それぞれの平衡点は、Desired Water Level ブロックの Href パラメーターで表される、対応する基準の高さに対してのみ有効です。そのため、このパラメーターが適宜変化するように sllin を設定します。
param.Name = 'Href';
param.Value = h;
sllin.Parameters = param;
プラント伝達関数の解析
watertank モデルにおいて、Water-Tank System ブロックはプラントを表します。プラント伝達関数を取得するには、Water-Tank System ブロックの入出力信号を sllin の解析ポイントとして追加します。
addPoint(sllin,{'watertank/PID Controller','watertank/Water-Tank System'})
sllin
slLinearizer linearization interface for "watertank":
2 Analysis points:
--------------------------
Point 1:
- Block: watertank/PID Controller
- Port: 1
Point 2:
- Block: watertank/Water-Tank System
- Port: 1
No permanent openings. Use the addOpening command to add new permanent openings.
Properties with dot notation get/set access:
Parameters : [1x1 struct], 1 parameters with sampling grid of size 1x3
"Href", varying between 10 and 20.
OperatingPoints : [1x3 opcond.OperatingPoint]
BlockSubstitutions : []
Options : [1x1 linearize.LinearizeOptions]
最初の解析ポイントは、PID Controller ブロックの出力端子が発信元となる、Water-Tank System ブロックへの入力になります。2 番目の解析ポイントは、Water-Tank System ブロックの出力です。
Water-Tank System ブロックの入力からブロック出力へのプラント伝達関数を取得します。フィードバック ループの影響を取り除くには、ブロック出力を一時的なループ開始点として指定します。
G = getIOTransfer(sllin,'PID','Tank','Tank');
getIOTransfer の呼び出しにおいて、ブロック名 'watertank/PID Controller' の一部である 'PID' は、最初の解析ポイントを伝達関数の入力として指定します。同様に、ブロック名 'watertank/Water-Tank System' の一部である 'Tank' は、2 番目の解析ポイントを参照します。この解析ポイントは、伝達関数の出力 (3 番目の入力引数) および一時的なループ開始点 (4 番目の入力引数) として指定します。
出力 G は、連続時間状態空間モデルの 1 行 3 列の配列です。
G のステップ応答をプロットします。
stepplot(G);

プラント モデルのステップ応答は、操作点が異なると大幅に変動します。
閉ループ伝達関数の解析
この閉ループ伝達関数は、Desired Water Level ブロックを発信元とする基準入力からプラント出力への伝達関数と同じです。
基準入力信号を sllin の解析ポイントとして追加します。
addPoint(sllin,'watertank/Desired Water Level');
閉ループ伝達関数を取得します。
T = getIOTransfer(sllin,'Desired','Tank');
出力 T は、連続時間状態空間モデルの 1 行 3 列の配列です。
T のステップ応答をプロットします。
stepplot(T);

3 つの平衡化された操作点でプラント伝達関数のステップ応答は大きく変動しますが、コントローラーは、3 つの操作点すべてにおいて閉ループ応答を互いにかなり近づけます。
プラント出力での感度の解析
S = getSensitivity(sllin,'Tank');
ソフトウェアは、外乱信号を挿入し、プラント出力で出力を測定します。S は、連続時間状態空間モデルの 1 行 3 列の配列です。
S のステップ応答をプロットします。
stepplot(S);

このプロットは、両方のモデルが 40 秒以内にプラント出力でステップ外乱を抑制できることを示します。
参考
slLinearizer | addPoint | addOpening | getIOTransfer | getLoopTransfer | getSensitivity | getCompSensitivity | linearize