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

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

 Respuesta aceptada

MathWorks Support Team
MathWorks Support Team el 25 de Oct. de 2013

0 votos

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つからご利用用途に合わせてシミュレーションモードを選択してください。

Más respuestas (0)

Productos

Versión

R2010a

Etiquetas

Aún no se han introducido etiquetas.

Community Treasure Hunt

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

Start Hunting!