本現象は、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;