ブロック パラメーター値の最適化、推定およびスイープ
1 つ以上のパラメーターを "スイープ" するときは、シミュレーションの実行ごとにそれらの値を変更し、各実行の出力信号データを比較および解析します。パラメーターのスイープを使用して制御パラメーターを調整し、未知のモデル パラメーターを推定して、実際のシステムにおける不確かさを考慮に入れながら制御アルゴリズムのロバスト性をテストします。
ブロック パラメーター値またはそのパラメーター値の設定に使用するワークスペース変数の値をスイープできます。モデル データ エディター ([モデル化] タブで [モデル データ エディター] をクリック) の [パラメーター] タブ、プロパティ インスペクター ([モデル化] タブの [設計] の下で、[プロパティ インスペクター] をクリック)、コマンド プロンプト、またはスクリプトを使用して、シミュレーションの実行間でパラメーター値を変更します。
ブロック パラメーターの値を繰り返し変更する場合は、変数をワークスペースに作成することを検討してくささい。モデル内でブロックの位置を特定したりブロックを識別したりする代わりに、モデル エクスプローラーまたはプログラムのコマンドを使用して変数の値を変更することができます。また、パラメーターの最適化、推定およびスイープを支援する機能や製品の中には、ワークスペース変数の作成によるブロック パラメーター値の設定が必要になるものもあります。
モデルを反復的に作成するプロセスでパラメーター値を操作する方法の詳細については、ブロック パラメーター値の調整と試行を参照してください。
モデル設計時のブロック パラメーター値へのアクセスと設定の基本的な情報については、ブロック パラメーター値の設定を参照してください。スクリプトを使用するなどしたモデルのプログラムによるシミュレーションの基本的な情報については、プログラムによるシミュレーションの実行を参照してください。
パラメーター値のスイープとシミュレーション結果の検査
この例では、プログラムによる複数のシミュレーション実行間でブロック パラメーターの値を変更する方法を示します。この手法を使用して、各実行の出力信号データを比較し、最適なパラメーター値を決定します。
モデル例 ex_sldemo_absbrake
では、Constant ブロックを使用してアンチロック ブレーキ システムのスリップ設定点を指定します。モデルを 2 つの異なるスリップ設定点値 0.24 および 0.25 でシミュレーションし、各シミュレーション実行の出力ホイール速度を比較します。
設定点値を保存するために、ベース ワークスペースに変数を作成します。この手法を使用すると、値にわかりやすい名前を割り当てることができます。
モデル例を開きます。
open_system('ex_sldemo_absbrake');
[モデル化] タブで [モデル データ エディター] をクリックします。
モデル データ エディターで、[信号] タブを選択します。
[ビューの変更] ドロップダウン リストを Instrumentation
に設定します。[ログ データ] 列は、信号 yout
(バーチャル バス) と slp
が記録用に構成されていることを示します。モデルのシミュレーションを実行する際に、シミュレーション データ インスペクターを使ってこれらの信号の値を収集し、後から値を検査できます。
モデル データ エディターで、[パラメーター] タブを選択します。[ビューの変更] を Design
に設定します。
モデルで、Desired relative slip
というラベルの付いた Constant ブロックを選択します。モデル データ エディターでは、ブロックの [Constant] パラメーターに対応する行が強調表示されます。
[値] 列を使用して、パラメーター値を relSlip
に設定します。
値の編集中は、relSlip
の隣にあるアクション ボタン (3 つの垂直のドット付き) をクリックし、[作成] を選択します。
[新規データの作成] ダイアログ ボックスで、[値] を 0.2
に設定して [作成] をクリックします。値が 0.2
の変数がベース ワークスペースに表示されます。モデルでは、相対的なスリップ設定点がこの変数から取得されます。
あるいは、コマンド プロンプトでこれらのコマンドを使用して、次のように変数を作成してブロックを設定します。
relSlip = 0.2; set_param('ex_sldemo_absbrake/Desired relative slip','Value','relSlip')
コマンド プロンプトで、相対的なスリップ設定点の 2 つの実験値 0.24
および 0.25
を格納する配列を作成します。
relSlip_vals = [0.24 0.25];
実行するシミュレーションごとに Simulink.SimulationInput
オブジェクトを作成します (この場合は 2 つ)。オブジェクトを単一の配列変数 simIn
に格納します。各オブジェクトの setVariable
メソッドを使用して、2 つの実験値をそれぞれ識別します。
for i = 1:length(relSlip_vals) simIn(i) = Simulink.SimulationInput('ex_sldemo_absbrake'); simIn(i) = setVariable(simIn(i),'relSlip',relSlip_vals(i)); end
関数 sim
を使用してモデルをシミュレーションします。オプションで、出力を simOutputs
という名前の変数に格納します。
simOutputs = sim(simIn);
[20-Jul-2024 19:13:08] Running simulations... [20-Jul-2024 19:13:10] Completed 1 of 2 simulation runs [20-Jul-2024 19:13:11] Completed 2 of 2 simulation runs
モデルは、ログに記録した信号 yout
と slp
をシミュレーション データ インスペクターにストリーミングします。シミュレーション データ インスペクターで信号データを表示できます。
最新の 2 回のシミュレーション実行の出力データを比較します。
runIDs = Simulink.sdi.getAllRunIDs(); runResult = Simulink.sdi.compareRuns(runIDs(end-1), runIDs(end));
結果のインデックス 1
を指定して、Ww
信号 (バーチャル バス信号 yout
の要素) の値の違いをプロットします。
signalResult = getResultByIndex(runResult,1); plot(signalResult.Diff);
Simulink.SimulationInput
オブジェクトへのスイープ値の格納
多数のシミュレーションを実行するスクリプトを作成する場合は、Simulink.SimulationInput
オブジェクトの配列 (実行するシミュレーションごとに 1 つのオブジェクト) を作成します。各オブジェクトの関数 setVariable
と関数 setBlockParameter
を使用して、対応するシミュレーションの実行に使用するパラメーター値を識別します。この手法を使用すると、シミュレーションの実行ごとに関数 set_param
を使用してブロック パラメーター値を変更したり代入コマンドを使用してワークスペース変数値を変更したりする必要がなくなります。
Simulink.SimulationInput
オブジェクトを使用した複数のシミュレーションの実行の詳細については、sim
を参照してください。
非スカラー、構造体およびパラメーター オブジェクトのスイープ
非スカラー変数、構造体変数または Simulink.Parameter
オブジェクトを使用してブロック パラメーター値を設定する場合は、各 Simulink.SimulationInput
オブジェクトの関数 setVariable
を使用します。表の例を参照してください。
シナリオ | 例 |
---|---|
値が配列である MATLAB® 変数 myArray 。配列の 3 番目の要素を設定します (1 ベースのインデックスを想定)。 | simIn = setVariable(simIn,'myArray(3)',15.23) |
field1 という名前のフィールドをもつ MATLAB 変数 myStruct 。 | simIn = setVariable(simIn,'myStruct.field1',15.23) |
Value プロパティがスカラーであるパラメーター オブジェクト myParam 。 | simIn = setVariable(simIn,'myParam.Value',15.23) |
Value プロパティが配列であるパラメーター オブジェクト myArrayParam 。配列の 3 番目の要素を設定します。 | simIn = setVariable(simIn,'myArrayParam.Value(3)',15.23) |
Value プロパティが構造体であるパラメーター オブジェクト myStructParam 。構造体には field1 という名前のフィールドがあります。 | simIn = setVariable(simIn,'myStructParam.Value.field1',15.23) |
モデル ワークスペース内の変数のスイープ値
モデル ワークスペースを使用して変数を保存する場合に、Simulink.SimulationInput
オブジェクトの関数 setVariable
を使用して変数値を変更するときは、Workspace
ペア引数を使用して保存モデルを識別します。
simIn = setVariable(simIn,'myVar',15.23,'Workspace','myModel')
シミュレーション結果の取得と可視化
パラメーター スイープ中のシミュレーションの実行ごとに、Outport ブロックの信号値やログ信号の信号値などの出力が生成されます。
これらの出力を変数およびオブジェクトに取得し、後で解析することができます。詳細については、シミュレーション データの保存を参照してください。
シミュレーション出力データを可視化して、各パラメーター値の影響を比較できるようにするには、シミュレーション データの可視化方法の決定を参照してください。
シミュレーション速度の向上
それぞれ異なるパラメーター値を使用する多数のシミュレーションを実行するには、アクセラレータ シミュレーション モードを使用します。大規模モデルの場合、アクセラレータ シミュレーションを使用すると、ノーマル シミュレーションよりも実行時間が短縮されます。Parallel Computing Toolbox™ もある場合は、プロセッサの複数のコアを使用してシミュレーションを同時実行できます。関数 sim
および parsim
の引数を使用します。
アクセラレータ シミュレーションやその他の手法を使用してモデルのシミュレーション速度を上げるには、パフォーマンスの最適化を参照してください。例と詳細については、Running Multiple Simulationsを参照してください。
パラメーター値のスイープによるシステムのテストと検証
Simulink® Test™ がある場合は、使用するパラメーター値を変更してもモデルが要件を満たすことを確認できます。パラメーターのオーバーライドとテストの反復により、テスト ケースごとに異なるパラメーター値を設定できます。詳細については、Parameter Overrides (Simulink Test)およびテスト反復 (Simulink Test)を参照してください。
モデル パラメーターの推定とキャリブレーション
Simulink Design Optimization™ がある場合は、シミュレーションの出力が、実際に測定するデータをよく近似するように、モデル パラメーター値を推定できます。この手法は、値を直接測定できない場合に、実際のシステムのダイナミクスを表す "プラント モデル" でパラメーターの実際値を推定するために使用します。この推定により、プラント モデルの精度が向上します。詳細については、Estimate Parameters from Measured Data (Simulink Design Optimization)を参照してください。
PID パラメーターおよびコントローラー パラメーターの調整と最適化
Simulink Control Design™ がある場合は、PID 調整器を使用して PID Controller ブロックのパラメーターを調整できます。詳細については、Simulink での PID コントローラーの調整 (Simulink Control Design)を参照してください。
Simulink Design Optimization がある場合は、シミュレーションの出力が指定の応答の要件を満たすように、制御パラメーター値を最適化できます。詳細については、Design Optimization to Meet Step Response Requirements (GUI) (Simulink Design Optimization)を参照してください。