From Workspace ブロックからのデータの一部に遅延が発生してしまうのはなぜですか?
6 ビュー (過去 30 日間)
古いコメントを表示
MathWorks Support Team
2023 年 12 月 4 日
回答済み: MathWorks Support Team
2023 年 12 月 4 日
Mファイル上で、入力データ(a)と時間データ(time)を作成し、それを組み合わせ timeseries のデータ(sample)を作成し、それを From Workspace ブロックから Simulink へ入れると、一部の時間にて、時間データ(time)で決めた時間の通りにデータが出力されず、0.001sほど遅延が伴って出力されてしまいます(0.3sで出力されるはずの値が0.301sで出力されます)。
この事象の原因は何でしょうか? どのようにすればこの事象の発生を防げるのでしょうか?
シュミレーション環境は以下の通りです。
・ソルバー :固定ステップ、ode8
・シュミレーション時間 :mファイル上で定義(1s)
・サンプル時間 :mファイル上で定義(0.001s)
採用された回答
MathWorks Support Team
2023 年 12 月 4 日
本現象は、MATLAB で作成した時間ベクトルと、Simulink ソルバの時間刻み間に、浮動小数点レベルの誤差が現れているために生じています。また、Simulink は時間ベクトルを指定した信号を取り込む際、ステップ刻みが時間ベクトルと一致しない場合、最後に更新された値を取得します。 そのため、Frome Workspaceの値とTo Workspace の値が異なる現象が生じています。
特別にデータタイプなどを指定していない場合、Simulink では倍精度浮動小数点データとして取り扱います。倍精度浮動小数点データでは、たとえば、0.001 のつぎに表現できる数値は、0.001 + eps(0.001) であり、この数値分解能以上に計算精度を上げることができません。
このことは、結果の変数の時間データ(ex. out)を sprintf を使用して、たとえば、小数点以下 32 桁まで表示させると、各時間ステップ間が 0.001 ではなく誤差が生じていることから分かります。
t = out.Time;
sprintf('%1.32f\n',t)
上記現象の回避方法として、時間ベクトルを含まない構造体変数を指定する方法が考えられます。
具体的な作成例と説明がドキュメントの下記ページに説明されています。
・離散アルゴリズムをテストするデータの読み込み
web(fullfile(docroot, 'simulink/ug/import-data-to-test-a-discrete-algorithm.html'))
https://www.mathworks.com/help/releases/R2021a/simulink/ug/import-data-to-test-a-discrete-algorithm.html
たとえば、下記のように構造体変数を作成し、From Workspcae ブロックのデータを var に変更し、[サンプル時間] を sample_time に変更すると、遅延が発生しません。
a = [1;2;3;4;5;6;7;8;9];
b=repmat(a,1,100);
c=b';
d=reshape(c,900,1);
var.time=[];
var.signals.values=d;
var.signals.dimention=1;
0 件のコメント
その他の回答 (0 件)
参考
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!