シミュレーションを分​割実行するには、どう​すれば良いですか?

조회 수: 12 (최근 30일)
MathWorks Support Team
MathWorks Support Team 2013년 10월 18일
편집: MathWorks Support Team 2016년 11월 2일
Simulinkで分割シミュレーションする方法を教えてください。

채택된 답변

MathWorks Support Team
MathWorks Support Team 2016년 11월 1일
편집: MathWorks Support Team 2016년 11월 2일
Simulink7.3 (R2009a)以降のバージョンでは、分割シミュレーションに利用できるSimState 機能が搭載されています。
SimState にはStateflow のチャートブロックの状態やTransport Delay ブロックの遅延情報も保存されているので、R2008b以前のバージョンよりも簡単に分割シミュレーションができます。
以下の二つの方法を紹介します。
1. コンフィギュレーションパラメータによる方法
2. コマンドによる方法
1. コンフィギュレーションパラメータによる方法
mymodel_r2009b.mdlを用いて、シミュレーション時間を0~5秒、5~10秒の2回に分けて継続シミュレーションします。
mymodel_r2009b.mdl は、下部のリンクよりダウンロードできます。
1-1) 1回目のシミュレーション(0~5秒)
はじめに、各ブロックに設定された初期条件の下でシミュレーションします。ここで、時間、信号、および最終状態を出力するように設定しておきます。
[シミュレーション] -> [コンフィギュレーションパラメータ] を選択し、以下のように設定します(以下、Ts = 0.5 とします)。
・[ソルバ]
・[データのインポート/エクスポート]
 
SimStateを使用するには、上図のように、'最終状態のすべてのSimStateを保存'にチェックを入れます。
シミュレーションを実行すると、tout1、yout1に1回目のシミュレーション結果が出力されます。また、最終状態量が xFinal1 に出力されます。
1-2) 2回目のシミュレーション(5~10秒)
1 回目のシミュレーションで得られた最終状態を2 回目のシミュレーションの初期状態として用いることで、継続シミュレーションができます。
シミュレーションパラメータを次のように変更します。
・[ソルバ]
・[データのインポート/エクスポート]
シミュレーションを実行すると、tout2、yout2に2回目のシミュレーション結果が出力されます。
1-3) 結果の結合
1 回目のシミュレーションの最終要素(最終ステップの値)と 2 回目のシミュレーション結果の最初の要素(初期ステップの値)は等しいので、この重複部分を削除してからデータを結合します。結合データをプロットすると、シミュレーション時間を 0~10 秒に設定したときと同じ結果が得られていることを確認できます。
 
tout1(end) = []; yout1(end) = [];
t_total = [tout1;tout2]; y_total = [yout1;yout2];
stairs(t_total,y_total), grid on
以上の方法で、総シミュレーション時間を分割した逐次シミュレーションが可能となります。
この方法は、シミュレーション時間が非常に長くかかるモデルに対して有効です。
2. コマンドによる方法
SIM 関数を利用すると、シミュレーション時間の分割・最終状態を効率的に継続できます。
以下に示す MATLAB プログラム suceeded_sim.m は、mymodel.mdl に対して総シミュレーション時間を 5 分割する例です。
分割シミュレーションの結果は、総シミュレーション時間をそのまま用いた一括シミュレーションと同じであることが確認できます。
suceeded_sim.m は、下部のリンクからダウンロードできます。
% 継続シミュレーションの例題:succeeded_sim_r2009b.m
% 総シミュレーション時間を5分割し、一括して求めた結果と比較する。
% ワークスペースのクリア
clear variables
clc
% モデル名の定義
mdl = 'mymodel_r2009b';
open(mdl)
% 変数定義
Ts = 0.5; % ブロックパラメータ
t_start = 0; t_stop = 10; % 開始時間・終了時間
N = 5; t_div = (t_stop-t_start)/5; % 分割数・分割時間
% 一括シミュレーション
tspan1 = [t_start t_stop];
[t1,x1,y1] = sim(mdl,tspan1); % 0~10秒間のシミュレーション
% 分割シミュレーション
t_total = []; y_total = []; % シミュレーション結果格納用変数
opts = simget(mdl); % シミュレーションパラメータの取得
opts = simset(opts,'OutputVariables','txy'); % 出力変数(時間・状態・出力)の設定
set_param(mdl, 'SaveFinalState', 'on', 'FinalStateName', [mdl '_SimState'],'SaveCompleteFinalSimState', 'on')
for n = 1:N
tspan2 = t_start + [(n-1)*t_div n*t_div];
[t2,x2,y2] = sim(mdl, tspan2(2),opts); % 分割シミュレーション。Simstateの場合、”シミュレーション終了時間”を設定
set_param(mdl, 'LoadInitialState', 'on', 'InitialState',[mdl '_SimState']);
if n ~= N
t2(end) = []; y2(end) = []; % 重複点の削除
end
t_total = [t_total;t2]; y_total = [y_total;y2]; % シミュレーション結果の結合
end
hold on % 上書き処理開始
stairs(t1,y1), stairs(t_total,y_total,'r') % シミュレーション結果の階段プロット表示
hold off % 上書き処理終了
legend('一括','分割'), grid on % 凡例 & 目盛り追加

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 個々のシミュレーションの実行에 대해 자세히 알아보기

태그

제품


릴리스

R2009a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!