MATLAB Function 次元について

Simulink内でMATLAB Function ブロック使用して演算しています。
画像のようにMATLAB Functionに入力すると
エラー内容
インデックスが行列の次元を超えています。配列 z は空であるため有効なインデックスを持ちません。
のようにエラーが発生しシミュレーションが実行できません。
次に、コメントアウトされている方(薄く表示されているA)の数値を使用すると、シミュレーションが実行されます。
この違いの原因が分かりません。どちらも出力されるデータ型はdouble型でした。20200106.PNG

댓글 수: 9

Toshinobu Shintai
Toshinobu Shintai 2020년 1월 7일
入力した信号線の次元とMATLAB Function内でそれに対応した変数の次元が一致してないのではないでしょうか。以下を参考に確認してみてください。
また、モデルを添付してくださると答えやすくなります。
Shoumei
Shoumei 2020년 1월 7일
zはMATLAB Function内の変数ですよね?
入力uの値には0.15かmが入ると思いますが、これらの値からMATLAB Function内で算出される値がzの配列サイズを超えているのでは?と推測します。
MATLAB Function内のコードを見ないと何とも判断できませんね。
s
s 2020년 1월 7일
モデルを添付したいのですが、別のソフトウェアと関連づけているため難しい状況です。
Simulink内で信号次元の表示をしましたが、どちらも次元は無表示でしたので1だと思います。
s
s 2020년 1월 7일
편집: s 2020년 1월 7일
コードを添付したいのですが、公開することが難しい部分もあるので少し時間が必要です。
現在分かっていることは、
  • uの入力は1×1です。
  • MATLAB Function のレポートを見たところ、Zの配列は1×2001でした。
  • Simulnkのサンプリング時間は0.001(関連づけているソフトウェアの仕様に合わせる必要があるため)
シミュレーションは60秒~70秒ほど実行する必要があります。
追記:zはMATLAB Function内の変数です。
s
s 2020년 1월 7일
コードはこのようになっています。
どなたか解決策をお願いいたします。
function [aaa,aa,a,a_] = fcn(u, g, xx, time, dd, veppd)
amx=g*u;
xppd = -20:0.01:0;
yyt = 1:0.25:4;
nny =length(yyt);
dt_tppd=zeros(nny,1);
dt_tcr=zeros(nny,1);
dt_xppd=zeros(nny,1);
dt_yppd=zeros(nny,1);
dt_vecr=zeros(nny,1);
dt_yt=zeros(nny,1);
yppd_z1=zeros(1,length(xppd));
t_ppd=zeros(1,length(xppd));
vecr=zeros(1,length(xppd));
t_cr=zeros(1,length(xppd));
for k=1:nny
y2 = yyt(1,k);
yppd_z1 = -y2*xppd./(xx-xppd)-dd/2;
t_ppd= yppd_z1/veppd;
vecr = amx*(-time+(time.^2+(-4*xppd)/(2*amx)).^0.5);
t_cr = -xppd./vecr;
z = find(t_ppd>t_cr);
dt_tppd(k,1) = t_ppd(1,z(1,1));
dt_tcr(k,1) = t_cr(1,z(1,1));
dt_xppd(k,1) = xppd(1,z(1,1));
dt_yppd(k,1) = yppd_z1(1,z(1,1));
dt_vecr(k,1) = vecr(1,z(1,1))*3.6;
dt_yt(k,1) = y2-dd/2;
end
hn=2;
pfuvecr = polyfit(dt_yt,dt_vecr,hn);
qu_vecr = polyval(pfuvecr,dt_yt);
hn=3;
pfuxppd = polyfit(dt_yt,dt_xppd,hn);
qu_xppd = polyval(pfuxppd,dt_yt);
aaa = pfuxppd(1);
aa = pfuxppd(2);
a = pfuxppd(3);
a_ = pfuxppd(4);
y = u;
Shoumei
Shoumei 2020년 1월 7일
z = find(t_ppd>t_cr);
で解が見つからず、zが空行列になっているのだと思います。
MATLAB Functionにブレークポイントを張って、zが意図した値になっているかどうかデバッグしてみてください。
s
s 2020년 1월 8일
zが意図した値になっているかを確認するにはどうすれば良いでしょうか?
ブレークポイントを実行すると問題の部分で止まることは確認しました。
Etsuo Maeda
Etsuo Maeda 2020년 1월 9일
z = find(t_ppd>t_cr);
の一行前にブレークポイントを置いて
t_ppd>t_cr
の出力をコマンドウィンドウで確認してみてはどうでしょうか?
HTH
stozaki
stozaki 2020년 1월 25일
MATLAB Functionの入力引数は6つあります。一方、ブロックの入力ポートは1つなので、5つはパラメータという認識で宜しいでしょうか?
その場合、5つのパラメータはどの様な属性を設定されているのでしょうか? コードのデバッグを行う前に、前提として変数、パラメータの属性を明らかにして頂く必要があると思います。
もし、未定義のままですと、既定の属性設定のままなので、意図された動作と異なる可能性もあります。

댓글을 달려면 로그인하십시오.

답변 (0개)

카테고리

도움말 센터File Exchange에서 Matrix Indexing에 대해 자세히 알아보기

질문:

s
s
2020년 1월 6일

댓글:

2020년 1월 25일

Community Treasure Hunt

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

Start Hunting!