パラメーター値の範囲に対するラピッド シミュレーションの実行
この例では、RSim システム ターゲット ファイルを使用してパラメーター値の範囲に対するシミュレーションを実行する方法を説明します。ファン デル ポール振動子を例として使用し、初期状態値の範囲にわたってパラメーター スィープを実行して非線形システムの位相図を取得します。
この例の作成に使用された MATLAB® スクリプトを変更すれば、この例を自分のアプリケーション用にカスタマイズできます。MATLAB スクリプトを編集するには、このページの左上隅のリンクをクリックしてください。MATLAB からこの例を実行するには、右上隅のリンクをクリックしてください。書き込み可能な場所から例を実行します。この例で作成したファイルは、後で調査できます。
たとえば、モデル コンフィギュレーション パラメーター [既定のパラメーター動作] を Inlined
に設定します。この例では、Simulink.Parameter
オブジェクトを調整可能なパラメーターとして作成します。[既定のパラメーター動作] を Tunable
に設定して RSim を使用し、調整可能なパラメーターを明示的に宣言しない場合は、生成コードを再コンパイルしないバッチ シミュレーションの実行を参照してください。
Simulink® 環境で複数のシミュレーションを実行するには、RSim の代わりにラピッド アクセラレータの使用を検討してください。ラピッド アクセラレータの詳細については、アクセラレーションとはを参照してください。パラメーター値のスイープについては、ブロック パラメーター値の最適化、推定およびスイープを参照してください。
準備モデル
現在のフォルダーが書き込み可能であることを確認します。例ではファイルを作成します。
[stat, fa] = fileattrib(pwd); if ~fa.UserWrite disp('This script must be run in a writable directory'); return end
モデルを開きます。次に、[Simulink Coder] アプリを開きます。モデル コンフィギュレーション パラメーター [システム ターゲット ファイル] を rsim.tlc
に設定します。
操作のグラフィカルな説明および他の RSim ターゲット関連オプションの詳細については、システム ターゲット ファイルの構成を参照してください。
mdlName = 'rtwdemo_rsim_vdp'; open_system(mdlName); cs = getActiveConfigSet(mdlName); cs.switchTarget('rsim.tlc',[]);
変数 INIT_X1
(状態 x1 の初期条件)、INIT_X2
(状態 x2
の初期条件)、および MU
(ゲイン値) を調整可能として指定します。調整可能なパラメーターを作成するには、変数を Simulink.Parameter
オブジェクトに変換し、このオブジェクトを Auto
以外のストレージ クラスを使用するように設定します。この例では、モデル上の異なる開始値である状態 x1
および状態 x2
から状態軌跡がどのように展開されるかについて調べます。
INIT_X1 = Simulink.Parameter(INIT_X1); INIT_X1.StorageClass = 'Model default'; INIT_X2 = Simulink.Parameter(INIT_X2); INIT_X2.StorageClass = 'Model default'; MU = Simulink.Parameter(MU); MU.StorageClass = 'Model default';
作成されるファイルの名前を定義します。
prmFileName = [mdlName, '_prm_sets.mat']; logFileName = [mdlName, '_run_scr.log']; batFileName = [mdlName, '_run_scr']; exeFileName = mdlName; if ispc exeFileName = [exeFileName, '.exe']; batFileName = [batFileName, '.bat']; end aggDataFile = [mdlName, '_results']; startTime = cputime;
モデルの作成
モデルの RSim 実行可能プログラムをビルドします。ビルド プロセスの間、モデルについて構造的なチェックサムが計算され、生成された実行可能プログラムに組み込まれます。このチェックサムを使用して、実行可能プログラムに渡されたパラメーター セットとプログラムに互換性があることを確認します。
slbuild(mdlName);
### Starting build procedure for: rtwdemo_rsim_vdp ### Successful completion of build procedure for: rtwdemo_rsim_vdp Build Summary Top model targets built: Model Action Rebuild Reason ================================================================================================= rtwdemo_rsim_vdp Code generated and compiled Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 37.492s
モデルの既定のパラメーター セットの取得
モデルの既定の rtP
構造体 (パラメーター セット) を取得します。rtP
構造体の modelChecksum
フィールドは、モデルの構造的なチェックサムです。これは、RSim 実行可能プログラムに組み込まれるチェックサムと一致していなければなりません。2 つのチェックサムが一致しない場合は、実行可能プログラムでエラーが発生します。rsimgetrtp
により、モデル内の指定された調整可能な変数 INIT_X1
、INIT_X2
および MU
のエントリをもつ rtP
構造体が生成されます。
rtp = rsimgetrtp(mdlName)
rtp = struct with fields: modelChecksum: [410569968 1.5914e+09 3.4411e+09 … ] parameters: [1×1 struct] globalParameterInfo: [1×1 struct] collapsedBaseWorkspaceVariables: [] nonTunableVariables: [1×0 struct]
パラメーター セットの作成
rtp
構造体を使用して、モデル内の調整可能な変数に異なる値を使用した構造体配列を作成します。前述のように、この例では、モデル上の異なる開始値である状態 x1
および状態 x2
から状態軌跡がどのように展開されるかについて調べます。これを行うには、INIT_X1
と INIT_X2
のさまざまな値でさまざまなパラメーター セットを生成し、調整可能な変数 MU
は既定値に設定されたままにしておきます。
INIT_X1_vals = -5:1:5; INIT_X2_vals = -5:1:5; MU_vals = 1; nPrmSets = length(INIT_X1_vals)*length(INIT_X2_vals)*length(MU_vals)
nPrmSets = 121
この例には、nPrmSets
パラメーター セットがあります。多くのシミュレーションを実行する必要があります。パラメーター セットと対応する結果を保持する構造体配列である aggData
を初期化します。
aggData = struct('tout', [], 'yout', [], ... 'prms', struct('INIT_X1',[],'INIT_X2',[], 'MU', [])) aggData = repmat(aggData, nPrmSets, 1);
aggData = struct with fields: tout: [] yout: [] prms: [1×1 struct]
ユーティリティ関数 rsimsetrtpparam
は、パラメーター値が異なるパラメーター セットを同時に追加することによって rtP
構造体を作成します。
idx = 1; for iX1 = INIT_X1_vals for iX2 = INIT_X2_vals for iMU = MU_vals rtp = rsimsetrtpparam(rtp,idx,'INIT_X1',iX1,'INIT_X2',iX2,'MU',iMU); aggData(idx).prms.INIT_X1 = iX1; aggData(idx).prms.INIT_X2 = iX2; aggData(idx).prms.MU = iMU; idx = idx + 1; end end end
パラメーター セットをもつ構造体配列 rtP
を MAT ファイルに保存します。
save(prmFileName,'rtp');
バッチ ファイルの作成
パラメーター セットに対して RSim 実行可能プログラムを実行するバッチ スクリプト ファイルを作成します。各実行はパラメーター MAT ファイルから指定されたパラメーター セットを読み取り、指定された出力 MAT ファイルに結果を書き込みます。タイムアウト オプションを使用して、実行がハングアップする場合 (たとえば、モデル内で特定のパラメーター セットに特異性があるため)、指定された時間制限を超過すると実行を中止して、次の実行に進むようにします。
たとえば、このコマンド (Windows® 上) は、prm.mat
の rtP
構造体の 3 番目のパラメーター セットを使用し、結果を run3.mat
に書き込み、実行が 3600 秒 (CPU 時間) を超えた場合に実行を中止することを指定しています。実行中に、スクリプトは model.exe
から run.log
にメッセージをパイプ処理します。これは、問題のデバッグに使用できます。
model.exe -p prm.mat@3 -o run3.mat -L 3600 2>&1>> run.log
fid = fopen(batFileName, 'w'); idx = 1; for iX1 = INIT_X1_vals for iX2 = INIT_X2_vals for iMU = MU_vals outMatFile = [mdlName, '_run',num2str(idx),'.mat']; cmd = [exeFileName, ... ' -p ', prmFileName, '@', int2str(idx), ... ' -o ', outMatFile, ... ' -L 3600']; if ispc cmd = [cmd, ' 2>&1>> ', logFileName]; else % (unix) cmd = ['.' filesep cmd, ' 1> ', logFileName, ' 2>&1']; end fprintf(fid, ['echo "', cmd, '"\n']); fprintf(fid, [cmd, '\n']); idx = idx + 1; end end end if isunix, system(['touch ', logFileName]); system(['chmod +x ', batFileName]); end fclose(fid);
シミュレーション実行のためのバッチ/スクリプト ファイルを作成すると、シミュレーション実行に対する (さらに MATLAB 外部のバッチ スクリプトの実行に対しても) システム コマンドを一度に呼び出すことができます。これにより、システム コマンドが重大なオーバーヘッドをもつため、パフォーマンスは向上します。
シミュレーション実行のためのバッチ ファイルの実行
各パラメーター セットに対して一度に RSim 実行可能プログラムを実行し、そのたびに異なる MAT ファイルに結果を保存する、バッチ/スクリプト ファイルを実行します。MATLAB 外部からバッチ ファイルを実行できます。
[stat, res] = system(['.' filesep batFileName]); if stat ~= 0 error(['Error running batch file ''', batFileName, ''' :', res]); end
この例では、n
パラメーター セットに対して n
シミュレーションを順に実行するバッチ ファイルを実行するときに、シミュレーション実行結果のログを 1 つのバッチ ファイルに記録します。複数のバッチ ファイルを生成し、それらを複数のコンピューターに配布することで並行実行するようにスクリプトを編集できます。また、MATLAB を起動せずにバッチ ファイルを実行できます。
出力 MAT ファイルの読み込みと結果の照合
シミュレーション結果を出力 MAT ファイルから収集し、aggData
構造体にまとめます。特定の実行に対応する出力 MAT ファイルが見つからない場合、その分の結果を (数値ではなく) NaN
に設定します。特定のパラメーター セットによるシミュレーションの実行についてモデル内に特異性がある場合、このような状態が発生します。
idx = 1; for iX1 = INIT_X1_vals for iX2 = INIT_X2_vals for iMU = MU_vals outMatFile = [mdlName, '_run',num2str(idx),'.mat']; if exist(outMatFile,'file') load(outMatFile); aggData(idx).tout = rt_tout; aggData(idx).yout = rt_yout; else aggData(idx).tout = nan; aggData(idx).yout = nan; end idx = idx + 1; end end end
aggData
構造体を結果の MAT ファイルに保存します。aggData
データ構造体には、入力データ (パラメーター セット) および出力データ (シミュレーション結果) が含まれるため、この時点で他の MAT ファイルを削除できます。
save(aggDataFile,'aggData'); disp(['Took ', num2str(cputime-startTime), ... ' seconds to generate results from ', ... num2str(nPrmSets), ' simulation runs (Steps 2 to 7).']);
Took 29.0781 seconds to generate results from 121 simulation runs (Steps 2 to 7).
シミュレーション結果の分析
異なる開始値である X1
および X2
を使用し、位相図 (X2
対 X1
) にプロットします。この図は、初期条件に関係なく、ファン・デル・ポール振動子が自然な振動子モードに収束することを示します。
colors = {'b','g','r','c','m','y','k'}; nColors = length(colors); for idx = 1:nPrmSets col = colors{idx - nColors*floor(idx/nColors) + 1}; plot(aggData(idx).prms.INIT_X1, aggData(idx).prms.INIT_X2, [col,'x'], ... aggData(idx).yout(:,1), aggData(idx).yout(:,2),col); hold on end grid on xlabel('X1'); ylabel('X2'); axis('square'); title('Phase diagram for Van der Pol equation');