Simlinkモデルをsim関数とwhile loopを用いて実行​した結果をメッシュあ​るいはサーフグラフに​したときに、数値誤差​が発生する。

5 views (last 30 days)
質問です。
あるシステムにおけるパラメータの影響を調べるため、各パラメータの値ごとにsim関数をループさせてメッシュデータにまとめようとしています。
例えば以下のようなシステムのパラメータa0_hat, a1_hatを変化させて41*41回程度のsimlinkモデルを用いたシミュレーションをシミュレーション時間1-100[s]で行い、その最終値を用いてメッシュデータを作成した場合、得られたメッシュデータがそのパラメータ地点でのみシミュレーションを行った場合の値と明らかに異なります。
これを解決してsim関数をwhile文中でも操作することは可能でしょうか?
対象としているシステムは実際はより複雑なものであり、また条件を組み換えによって変更しながら特性を観察しているため、コードによる表現でなくsimulink上での実行でないと難しい状態です。
しばらく、試行錯誤してみたのですが解決できませんでした。
よろしくおねがいします。
clear;
close;
set(groot,'defaultAxesTickLabelInterpreter','latex');
set(groot,'defaulttextinterpreter','latex');
set(groot,'defaultLegendInterpreter','latex');
%%% Range %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Axis_a0 = [-0.2:0.01:0.2];
Axis_a1 = [-0.2:0.01:0.2];
%%% Mesh Size %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
xx = Axis_a0;
yy = Axis_a1;
n = length(xx);
m = length(yy);
[XX, YY] = meshgrid(xx, yy);
Count1 = 1;
Count2 = 1;
MeshCounter = zeros(n, m);
size(MeshCounter);
%%% Simulation Carrying %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
while Count1 < n + 1
Count2 = 1;
while Count2 < m + 1
a0_hat = xx(Count1);
a1_hat = yy(Count2);
GetSim = sim('Text.slx');
a = GetSim.Testing(end);
MeshCounter(Count1, Count2) = a;
Count2 = Count2 + 1;
end
Count1 = Count1 + 1;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Mesh Graph Generate %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
surf(XX, YY, MeshCounter); grid on; axis square;
xlabel('$\hat{a}_{0}(0)$',FontSize=20);
ylabel('$\hat{a}_{1}(0)$',FontSize=20);
zlabel('Last value of a system',FontSize=13);
strtitle = ['How last value affected by ' ...
'Parameter $\hat{a}_{0}(0)$ and $\hat{a}_{1}(0)$.'];
title(strtitle);
上記のスクリプ卜を実行した後にコマンドラインからグラフに示されているポイントの条件を用いてシミュレーションを個別に実行すると
%%% From Command line %%%%
%%%%%%%%%%%%%
>> a0_hat = -0.19
a0_hat =
-0.1900
>> a1_hat = -0.02
a1_hat =
-0.0200
>> GetSim = sim('Text.slx');
>> a = GetSim.Testing(end)
a =
-3.9833
となり、結果が変わってしまう現象です。グラフのZ軸の値が異なってしまう現象です。

Accepted Answer

Toshinobu Shintai
Toshinobu Shintai on 5 Feb 2022
私の環境では a = -3.8212 となっており、Kotaro Ushijima様の実行結果と異なっていますが、それはさておき、while文の中で実行した結果とコマンドウィンドウで実行した結果は一致していました。
a0_hat = -0.19、a1_hat = -0.02 の計算結果は MeshCounter の2行19列に格納されており、
グラフの以下の位置の値になります。
X軸、Y軸の取り方が違っているのではないかと思います。
  1 Comment
Kotaro Ushijima
Kotaro Ushijima on 7 Feb 2022
Toshinobu Shintai様、回答ありがとうございます。
返事が遅くなってしまい申し訳ありません。
ご回答頂いたようにmesh関数の処理の順番を誤解しておりました。
列インデックスがx軸で行インデックスがy軸にあたるとのことなので、上記の
while Count2 < m + 1
a0_hat = xx(Count1);
a1_hat = yy(Count2);
GetSim = sim('Text.slx');
a = GetSim.Testing(end);
MeshCounter(Count1, Count2) = a;
Count2 = Count2 + 1;
end
においてMeshCounter(Count1, Count2) = a;をMeshCounter(Count2, Count1) = a;
それに合わせてMeshCounterの宣言もMeshCounterA=zeros(m, n);
にすることで解決できました。
ドキュメンテーションのグラフの例がx軸y軸を区別していないものだったので早とちりしてしまったようです。
お恥ずかしい。
重ねて御礼申し上げます。

Sign in to comment.

More Answers (0)

Products


Release

R2021b

Community Treasure Hunt

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

Start Hunting!