スケジュール エディター API による、モデルのランダムなスケジュールの作成と解析
この例では、スケジュール エディター API を使用して、スケジュールの操作を実行します。その後、関数を使用してランダムなスケジュールを生成し、シミュレーション データ インスペクターでそれを解析します。
モデルを開いてスケジュール オブジェクトを取得
スロットル位置制御システムのモデルを開いて、get_param を使用して simulink.schedule.OrderedSchedule
オブジェクトを取得します。このオブジェクトには現在のスケジュールが含まれています。
model = 'ScheduleEditorAPIWithSubsystemPartitions'; open_system(model); schedule = get_param(model, 'Schedule')
schedule = OrderedSchedule with properties: Order: [9x3 table] RateSections: [3x1 simulink.schedule.RateSection] Events: [0x1 simulink.schedule.Event] Description: ''
スケジュール オブジェクトの調査
このスケジュール オブジェクトには Order
プロパティがあり、それにはモデル内の分割の実行順序が含まれています。Order
プロパティは、分割名、インデックス、タイプ、そのトリガーを含むテーブルを表示します。
schedule.Order
ans = 9x3 table Index Type Trigger _____ ________ _______ Cont 1 Periodic "0" TPSSecondaryRun5ms 2 Periodic "0.005" MonitorRun5ms 3 Periodic "0.005" ControllerRun5ms 4 Periodic "0.005" ActuatorRun5ms 5 Periodic "0.005" D2 6 Periodic "0.005" D3 7 Periodic "0.01" APPSnsrRun 8 Periodic "0.01" TPSPrimaryRun10ms 9 Periodic "0.01"
Order
テーブルのインデックス変数を使用して、モデルの実行順序を変更します。
schedule.Order.Index('ActuatorRun5ms') = 2;
schedule.Order
ans = 9x3 table Index Type Trigger _____ ________ _______ Cont 1 Periodic "0" ActuatorRun5ms 2 Periodic "0.005" TPSSecondaryRun5ms 3 Periodic "0.005" MonitorRun5ms 4 Periodic "0.005" ControllerRun5ms 5 Periodic "0.005" D2 6 Periodic "0.005" D3 7 Periodic "0.01" APPSnsrRun 8 Periodic "0.01" TPSPrimaryRun10ms 9 Periodic "0.01"
スケジュールを変更するために行われた Order
プロパティ内のすべての移動は、有効なスケジュールになります。スケジュールの変更と有効な移動の実行を簡単にするため、各分割は RateSections
プロパティで同じレートをもつ分割とグループ化されています。RateSection
プロパティの各要素に、レートが同じ分割を含む順序テーブルがあります。
schedule.RateSections(2) schedule.RateSections(2).Order
ans = RateSection with properties: Rate: "0.005" Order: [5x3 table] ans = 5x3 table Index Type Trigger _____ ________ _______ ActuatorRun5ms 2 Periodic "0.005" TPSSecondaryRun5ms 3 Periodic "0.005" MonitorRun5ms 4 Periodic "0.005" ControllerRun5ms 5 Periodic "0.005" D2 6 Periodic "0.005"
インデックス変数を使用して、RateSections
内で分割を移動します。
schedule.RateSections(2).Order.Index('ActuatorRun5ms') = 5;
schedule.Order
ans = 9x3 table Index Type Trigger _____ ________ _______ Cont 1 Periodic "0" TPSSecondaryRun5ms 2 Periodic "0.005" MonitorRun5ms 3 Periodic "0.005" ControllerRun5ms 4 Periodic "0.005" ActuatorRun5ms 5 Periodic "0.005" D2 6 Periodic "0.005" D3 7 Periodic "0.01" APPSnsrRun 8 Periodic "0.01" TPSPrimaryRun10ms 9 Periodic "0.01"
ランダムなスケジュールを生成する関数の作成
この節では、randomSchedule
、generateSimulationInputs
、simulateRandomSchedules
の 3 つの異なる関数を作成します。
関数 randomSchedule
は、schedule
オブジェクトのインデックス変更のランダム置換によってランダムなスケジュールを作成するために使用されます。schedule
オブジェクトの Order
プロパティと RateSections
プロパティを使用して、スケジュール内の分割が、異なるランダムな組み合わせで移動されます。これらのランダムに作成されたスケジュールを使用してモデルをシミュレートして比較し、異なるスケジュールがシミュレーションに与える影響を調べます。関数 randomSchedule
において、入力はモデル名です。次に、get_param
を使用してモデルの simulink.schedule.OrderedSchedule
オブジェクトを取得します。この schedule
オブジェクトとそのプロパティは、スケジュールを変更してランダム化するために使用されます。モデルの最初のレートのセクションに対して変数 firstExecutionOrder
を作成します。コード行 rateSections(1).ExecutionOrder = [firstExecutionOrder(1,:); reSchedule(firstExecutionOrder(2:end,:))]
は、インデックスのランダム置換を作成する関数 reSchedule
を呼び出します。
type randomSchedule
function schedule = randomSchedule(model) % schedule = randomSchedule(model) Produces a % simulink.schedule.OrderedSchedule that has a randomized permutation % of the model's original execution order schedule arguments model char = bdroot end schedule = get_param(model, 'Schedule'); rateSections = schedule.RateSections; firstOrder = rateSections(1).Order; % This assumes that the slowest discrete rate is at index 1. This may % not be the case for all models (ex. JMAAB-B). rateSections(1).Order = [firstOrder(1,:); reSchedule(firstOrder(2:end,:))]; for i=2:length(rateSections) rateSections(i).Order = reSchedule(rateSections(i).Order); end schedule.RateSections = rateSections; end function out = reSchedule(in) numPartitions = height(in); in.Index = in.Index(randperm(numPartitions)); out = in; end
異なるスケジュールがモデルに与える影響を解析するため、さまざまなスケジュールでモデルをシミュレートします。この関数では、Simulink.SimulationInput
オブジェクトの配列を作成します。Simulink.SimulationInput
オブジェクトのこの配列を通して、Simulink.SimulationInput
オブジェクトの setModelParameters
メソッドを使用して、モデルにスケジュールを適用できます。
type generateSimulationInputs
function in = generateSimulationInputs(model, numSimulations) % in = generateSimulationInputs(model, numSimulations) Generates % numSimulations Simulink.SimulationInput objects each containing a % different, randomized execution order schedule arguments model char = bdroot numSimulations double = 10 end in(numSimulations) = Simulink.SimulationInput(); in = in.setModelName(model); for idx = 1:numSimulations in(idx) = in(idx).setModelParameter('Schedule', randomSchedule(model)); end end
最後の関数では、Simulink.SimulationInput
オブジェクトの配列を使用して複数のシミュレーションを実行します。シミュレーションが完了したら、シミュレーション データ インスペクターにすべてのシミュレーションの出力をプロットできます。
type simulateRandomSchedules
function out = simulateRandomSchedules(model, numSimulations) % out = simulateRandomSchedules(model, numSimulations) Simulates a % model numSimulations number of times. Each simulation has a % randomized execution order schedule. arguments model char = bdroot numSimulations double = 10 end in = generateSimulationInputs(model, numSimulations); out = sim(in); plot(out); end
関数の実行
今度は、ScheduleEditorAPIWithSubsystemPartitions
モデルで上記の関数を実行します。まず、関数 randomSchedule
を使用してランダムに生成されたスケジュールを作成します。次に、関数 generateSimulationInputs
を使用して Simulink.SimulationInput
オブジェクトの配列を生成します。さらに、関数 simulateRandomSchedule
を使用して異なるスケジュールでモデルをシミュレートし、比較のためにその結果をプロットします。それでは、15 個のランダムに生成されたスケジュールでシミュレーションを実行しましょう。
simulateRandomSchedules(model,15)
[13-Feb-2024 00:34:41] Running simulations... [13-Feb-2024 00:34:50] Completed 1 of 15 simulation runs [13-Feb-2024 00:34:51] Completed 2 of 15 simulation runs [13-Feb-2024 00:34:53] Completed 3 of 15 simulation runs [13-Feb-2024 00:34:54] Completed 4 of 15 simulation runs [13-Feb-2024 00:34:55] Completed 5 of 15 simulation runs [13-Feb-2024 00:34:56] Completed 6 of 15 simulation runs [13-Feb-2024 00:34:56] Completed 7 of 15 simulation runs [13-Feb-2024 00:34:57] Completed 8 of 15 simulation runs [13-Feb-2024 00:34:58] Completed 9 of 15 simulation runs [13-Feb-2024 00:34:59] Completed 10 of 15 simulation runs [13-Feb-2024 00:34:59] Completed 11 of 15 simulation runs [13-Feb-2024 00:35:00] Completed 12 of 15 simulation runs [13-Feb-2024 00:35:01] Completed 13 of 15 simulation runs [13-Feb-2024 00:35:02] Completed 14 of 15 simulation runs [13-Feb-2024 00:35:03] Completed 15 of 15 simulation runs ans = 1x15 Simulink.SimulationOutput array