ラピッドアクセラレー​タモードで分割シミュ​レーションはできます​か?

Simulinkのモデルをコマンドで分割シミュレーションを行っています。ノーマルモードではエラーなく動作するものが、ラピッドアクセラレータモードでは、下記のエラーが発生します。
??? エラー ==> succeed_sim_error at 17
'SolverType' is variable-step のとき、パラメーター 'FixedStep' は無視されます.
上記エラーは、下記”関連ソリューション”のDCDC_Buck.mdlと'succeed_sim_error.m'をダウンロードし、モデルを開いた状態でMATLAB-ファイルを実行することで、再現します。
ラピッドアクセラレータモードで、分割シミュレーションする方法があれば教えて下さい。

 采纳的回答

0 个投票

DCDC_Buck.mdlは、コマンドから分割シミュレーションできます。ただし、ラピッドアクセラレータを使用して分割シミュレーションを行うには、スクリプトsucceed_sim_error.m を修正する必要があります。修正したファイルが、下記関連ドキュメントのsucceed_sim_config.mです。
エラーが発生していた原因は、SIMSET 関数やSIMGET 関数を使用してSIM 関数のオプション設定を変更していた点にあります。ノーマルモードではプロパティが正しく解釈されて問題なく動きましたが、アクセラレータモードではプロパティが正しく解釈されず、エラーが発生しています。
SIM 関数のオプション設定について、正式にはコンフィギュレーションパラメータで設定されているプロパティを指定するため、このプロパティを使用してオプションを設定することで、エラーなくシミュレーションできます。下記にsucceed_sim_config.mのコードを記述します。
%%%継続シミュレーションの例題:succeeded_sim_config.m
%%%総シミュレーション時間を5分割し、一括して求めた結果と比較する。
clear all
clc
% 変数定義
t_start = 0; t_stop = 0.01; % 開始時間・終了時間
N = 5; t_div = (t_stop-t_start)/N; % 分割数・分割時間
%%一括シミュレーション
% (ポイント)コンフィギュレーションパラメータで設定する内容を、構造体で定義
paramNameValStruct1.SimulationMode = 'rapid'; % シミュレーションモード 'normal':ノーマルモード, 'accelerator':アクセラレータモード
paramNameValStruct1.StartTime = num2str(t_start); % 開始時間の設定
paramNameValStruct1.StopTime = num2str(t_stop); % 終了時間の設定
simOut1 = sim('DCDCBuck',paramNameValStruct1); % 0~10秒間のシミュレーション
t1 = simOut1.find('tout'); % simOut1で得られた時間信号をベクトル信号に変換
y1 = simOut1.find('yout'); % simOut1で得られた出力信号をベクトル信号に変換
%%分割シミュレーション
t_total = []; y_total = []; % シミュレーション結果格納用変数
tic % 分割シミュレーションの実行時間を計測
for n = 1:N
t_start_div = t_start+(n-1)*t_div; % 分割シミュレーションの開始時間
t_stop_div = t_start + n*t_div; % 分割シミュレーションの終了時間
% コンフィギュレーションパラメータで設定する内容を、構造体で定義
paramNameValStruct2.SimulationMode = 'rapid'; % シミュレーションモード 'normal':ノーマルモード, 'accelerator':アクセラレータモード
paramNameValStruct2.StartTime = num2str(t_start_div); % 開始時間の設定
paramNameValStruct2.StopTime = num2str(t_stop_div); % 終了時間の設定
Simulink.BlockDiagram.buildRapidAcceleratorTarget('DCDCBuck'); % 毎回繰り返しごとにリビルド
simOut2 = sim('DCDCBuck',paramNameValStruct2); % 分割シミュレーション
t2 = simOut2.find('tout'); % simOut2で得られた時間信号をベクトル信号に変換
y2 = simOut2.find('yout'); % simOut2で得られた出力信号をベクトル信号に変換
xInitial = simOut2.find('xFinal'); % 初期状態を最終状態値に設定
paramNameValStruct2.LoadInitialState = 'On'; % 初期状態を設定するチェックボックスをONに設定
paramNameValStruct2.InitialState = 'xInitial'; % 初期状態の変数を定義
if n ~= N
t2(end) = []; y2(end) = []; % 重複点の削除
end
t_total = [t_total;t2]; y_total = [y_total;y2]; % シミュレーション結果の結合
end
toc
hold on % 上書き処理開始
stairs(t1,y1), stairs(t_total,y_total,'r') % シミュレーション結果の階段プロット表示
hold off % 上書き処理終了
legend('一括','分割',2), grid on % 凡例 & 目盛り追加
なお、ラピッドシミュレーションで分割実行を行う場合、分割実行ごとにシミュレーションの開始時刻と終了時刻が変わるため、毎回モデルがビルドされます。例えばシミュレーションを5分割した場合は、5回ビルドされます。シミュレーションを早く求めるためにラピッドシミュレーションを選択したにも関わらず、ノーマルモードやアクセラレータモードよりも遅くなる可能性があります。実際、DCDC_buck.mdl で実行したところ、ノーマルモードやアクセラレータモードと比べて、シミュレーションに時間がかかっています。
なお、添付のスクリプトを実行して得られる経過時間を目安に、ノーマルモード、アクセラレータモード、ラピッドアクセラレータモードの3つからご利用用途に合わせてシミュレーションモードを選択してください。

更多回答(0 个)

类别

产品

版本

R2010a

标签

尚未输入任何标签。

Community Treasure Hunt

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

Start Hunting!