MATLAB Answers

モデルの質量分析

1 view (last 30 days)
taichi muto
taichi muto on 22 Jul 2020
Commented: taichi muto on 22 Sep 2020
Simulinkにて作成したモデル全体の質量を求めることは可能でしょうか。

  4 Comments

Show 1 older comment
taichi muto
taichi muto on 22 Sep 2020
返信が遅れてしまい申し訳ありません。
"モデル全体の質量"とは個々の要素を組み合わせて作成したモデル全体の質量です。つまりモデル内のブロックの個数にあたるものです。
Simulinkモデルが持っているパラメータに質量に相当するものが無いということなので,要素それぞれで定義した体積と密度から質量を求めることにします。
お返事いただきありがとうございます。
stozaki
stozaki on 22 Sep 2020
taichi muto様
モデル内のブロックの個数をカウントする方法は回答致しました。ご所望の処理であればAcceptください。
もし差し支えなければ、ブロックの個数を "質量" と換算している意味をご教示頂けますか? ブロック数を "質量" と換算しているユースケースは初めてお見受けしたので、私の回答が的を得ているか否かが心配なためです。
宜しくお願いいたします。
stozaki
taichi muto
taichi muto on 22 Sep 2020
一つのブロックの質量が求まった上で個数が分かれば、(質量)×(個数)で全体の質量に換算できるという意味で用いていました。 私の説明不足で複雑になってしまい申し訳ありません。 具体例を用いた詳しいご回答ありがとうございます。

Sign in to comment.

Accepted Answer

stozaki
stozaki on 22 Sep 2020
Edited: stozaki on 22 Sep 2020
taichi muto様
ご返信ありがとうございます。
モデル内のブロックの個数をカウントする方法ですが、幾つかの方法があります。
最も簡単にブロック数をカウント出来るのは次の関数をご利用ください。
sldiagnostics(bdroot(gcs),'CountBlocks')
% 例1
>> f14
>> sldiagnostics(bdroot(gcs),'CountBlocks')
ans =
''f14' 内のブロックのカウントが完了しました。
63 個のブロックが見つかりました。
メモ:ブロック タイプの横の "M" は、そのブロック タイプがマスクされた SubSystem または S-function であり、SubSystem と S-function のブロック合計として表示された総ブロック数に既に算入されていることを示しています。MATLAB Function ブロック、Truth Table、Stateflow の各ブロックは、SubSystem と S-function の合計から差し引かれますが、隠れたサポート ブロックは差し引かれません。
f14 Total blocks : 63
Constant : 1
Derivative : 2
Gain : 14
Inport : 9
Outport : 9
Product : 1
RandomNumber : 1
Scope : 3
SignalGenerator : 1
SubSystem : 5
Sum : 8
TransferFcn : 9
M Band-Limited White Noise. : 1
'
ただし、注意頂きたいのは対象モデル内に、Modelブロック (モデル参照) が含まれる場合、その内部のブロック数は上記関数で一度にカウント出来ないので、find_mdlrefs関数を使って、モデル内に含まれるModelブロックをリスト化し、Modelブロック毎にsldiagnostics関数を実行してください。
allModels = find_mdlrefs(bdroot(gcs));
-------------------------------------------------------------------------------------------------------------------------------------------------------
また、sldiagnostics関数の返り値は、コマンドウィンドウに表示される文字列情報なので、モデル内のブロックの個数を数値情報として取得して、別のプログラムで何かしらの処理を行いたい場合には向いていません。
その場合は、次のコマンドでブロックパス数を取得し、length関数で個数を判定できます。
blkLists = find_system(bdroot(gcs),'FollowLinks','on','LookUnderMasks','on');
% 例2
>> f14
>> blkLists = find_system(bdroot(gcs),'FollowLinks','on','LookUnderMasks','on');
>> length(blkLists)
ans =
64
ここで、最初の例では全ブロック数が63に対して、本例では64となっています。これは、find_systemの返り値に "モデル自身" もリストされるためです。従って、実質は63となります。
他にも方法はありますが、代表的な2例を挙げましたので、用途に応じて使い分けてください。
stozaki

  1 Comment

taichi muto
taichi muto on 22 Sep 2020
私の要望に沿ったご回答ありがとうございます。 また、説明文も付け加えていただき感謝致します。

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!