ある特定のブロックの​​計算速度を速くし、​グ​ラフを出力するこ​とは​できますでしょ​うか。

3 ビュー (過去 30 日間)
M M
M M 2022 年 7 月 5 日
コメント済み: M M 2022 年 7 月 11 日
simulink上のある2つのブロック(グラフを出力します)について、1つのブロックの計算をもう片方のブロックよりも速く終わらせ、グラフを重ねあわせる方法はありませんでしょうか。
2つのブロックには外部から任意の値が入力され(どんな値が入力されるかは、その時刻にならなければ分からないようになっています。)、ブロック内の関数とその値を基にグラフを出力します。
具体的には添付させて頂いた資料の手法が知りたいです。
よろしくお願いいたします。
  2 件のコメント
Atsushi Ueno
Atsushi Ueno 2022 年 7 月 5 日
添付図も分かり易く、情報量としては問題無いのですが、どうも質問の本質が理解できません。
「ある特定のブロックの​​計算速度を速くする」という事がどういう事か考えました。
Simulinkは並べられた各ブロックを周期的に実行しますが、流れる時間は一定で、通常はサンプル時間毎に1回の処理が実行されます。ですがそれだけではなく、複数の処理の集合でも傍から見て一瞬で処理されたとみなす事が出来ます。(Simulink上のシミュレーション時間であって、実時間に間に合うかどうかは別の話です)
「ある特定のブロックの​​計算速度を速くする」を実現するには、1周期タスク内で時間の掛かる処理を纏めて実行すれば良いです。具体的にはループ処理を実行したりサブルーチン(Function-callサブシステムやAtomicサブシステム)を実行します。当然処理に実時間は掛かりますが、Simulink上の時間としては1サンプル時間で済ませた事になります。
この事を説明する資料や動画があれば良いのですが...
M M
M M 2022 年 7 月 6 日
Atsushi Uenoさん
度々のご助言ありがとうございます。
お忙しいところすぐに回答して頂きとても助かります。
サブルーチンの使い方、勉強させて頂きます。ありがとうございます。
一度返信させて頂いたのですが、いままでの質問が主題とずれていると感じ、改めて返信させて頂きました。
私は今まで、計算処理速度を上げる方法という題目で質問させて頂きましたが、「特定のブロックを他のブロックより先に計算する方法」と書いた方が正しいと考えました。
すみません。
資料の内容を更に具体的にし、もう少し自分の考えを整理しました。
よろしければ新たに添付した資料を見て頂くことはできますでしょうか。
これから先、長文失礼致します。
(P.1枚目)私のやりたいことのモデルとして、中に球が入った車を想定しました。
この車をリモコンにより動かし、ある時刻t0で停止動作を開始させます。
F(t)により求めた指令を加え、車を停止させます。(F(t)によるグラフはある条件を満たすために計算された指令です。)
当然、車が停止した後も球は動いています。
(P.2)私が目標としていることは、新たに黄色線の指令を加えることで、車停止と同時に球も停止させるということです。
黄指令はどう求めるかというと、
車動作停止後の球の動きをシミュレーションし、そのシミュレーション値から求めることが可能です。(具体的な手法は割愛させて頂きます。)
(P.3)しかし今の私のプログラムは青指令の後に黄指令が加わるようになっています。
黄指令は、車停止後の球のシミュレーションにより求まるためです。
(P.4)私の目的は、Δtの間に予め球のシミュレーション(車停止後の動作)を行い、黄指令を作るということです。
そうすることで、青と黄指令をほぼ同時に出力できます。
(P.5)特定のブロックを他のブロックよりも先に計算する方法はあるでしょうか。
(一番初めにイメージしていたことは、特定のブロック内のクロック動作を早くするようなことです。(そんな機能はクロックにはありませんが..))
また新たに何か気づいた点があれば教えていただけると幸いです。
目を通して頂きありがとうございます。

サインインしてコメントする。

採用された回答

Atsushi Ueno
Atsushi Ueno 2022 年 7 月 6 日
>特定のブロックを他のブロックよりも先に計算する方法はあるでしょうか。
⇒特定のブロック(例えばサブシステム)を一塊のブロックと同じAtomicサブシステムと定義する方法があります。
すると、どんなに処理数の多いサブシステムでもモデルの1サンプル時間内に実行させる事が出来ます。条件付きで実行開始するには、TriggeredサブシステムやFunction-callサブシステムなどの形にします。サブシステム全体を繰り返し処理とするには各種反復サブシステムを選んで使う事が出来ます。Subsystemの他にはコードを収めたS-functionブロックMATLAB Function ブロックを使う事も出来ます。
質問の例で言うと、ブレーキ指令がONになった時の車や球の初期条件から、例えば球が車の内壁に衝突する迄の動きをモデル全体とは別次元の時間軸でシミュレーション実行する事ができます。その時のシミュレーション時間は「精神と時の部屋(部屋の中の1年が外界の1日に相当する)」のように、外界(モデル)とは別次元の時間が流れるとイメージすると分かり易いかと思います。(ドラゴンボール世代ではないですねはいすいません)
【具体的な事例】
上記モデル(実行周期は0.01[s])で実行した事は下記の通りです。
  • 1[Hz]のパルス信号を作成(Scope画面の1番上)
  • 上記信号の立下りエッジで1周期だけONになるパルス信号を作成(Scope画面の2番目)
  • 上記信号を入力とし空処理を10万回繰り返す反復サブシステムを作成
注目すべきはScope画面の1番下に表示した「反復サブシステムの繰り返し回数」が階段状に増加していくのではなく、1サンプル時間の間に1[回]からいきなり10万[回]に飛んでいる事です。またモデルから見るとWhile Iterator Subsystemの入力信号In1 は一瞬だけ単発でONになるインパルス信号ですが、While Iterator Subsystem内ではそのインパルス信号がずっとONになり続けている事になります。つまり10万回の繰り返し処理はSimulinkモデルから見ると1サンプル時間(実行周期の0.01[s])で完了したとみなされているのです。別の言葉で表現すると「上記反復システム10万回の繰り返し処理に掛かる時間は考慮しない」「10万回繰り返す反復サブシステムも、その外から見るとブロックを1回実行しているのと同じ」「精神と時の部屋(部屋の中の1年が外界の1日に相当する)(<しつこい)」という事です。
  7 件のコメント
Atsushi Ueno
Atsushi Ueno 2022 年 7 月 11 日
>「時間軸を変更することは出来るのでしょうか」
⇒定義によりYES/NOのどちらとも言えますが、ここではNOと回答すべきでしょう。Simulinkモデルの時刻(サンプル時間)は唯一です。時刻を信号として取り出すのがClockブロックです。
Clockブロックの出力を5倍する事は可能で、提示モデルのMATLAB Functionの出力は期待通りの出力になります。しかしながら、Simulinkモデルの実行を部分的に5倍速くする事は出来ません。提示モデルにおいては積分する値は5倍になった時刻に従い出力されますが、肝心の積分ブロックが5倍の速さで実行されないのです。
>やはり少し複雑なプログラムを書かなければ要件を満たすことは出来ないのでしょうか。
複雑な事はありません。回答内容を実際に適用しました。下記の例では2倍(2回繰返実行)です。界王拳5倍は体に無理が...もとい表示の都合です。
  • 速く実行する方をFor Iterator Subsystemで包んで指定回数繰り返す
  • クロック信号を同サブシステムに引っ張りこんで倍数を掛ける
  • MATLAB Functionの出力は繰り返し回数分加算(積分)しておく
  • あとは提示のモデルと同じ動き
グラフに表示された通り、2倍の動作になっている事が確認できます。モデル内の各ブロックが1回実行される間に、For Iterator Subsystemの内部だけ2回繰り返し実行されているのです。あくまでもサンプリング時間は元のまま(提示モデルでは0.01秒)で変わっていません。
※可変サンプル時間では分かり難いので、固定サンプル時間に設定して理解する事をお勧めします。
M M
M M 2022 年 7 月 11 日
Atsushi Uenoさん
質問を読んで頂き、重ねてお礼申しあげます。
度々のご回答及びわかりやすい説明ありがとうございます。
for文で動作を倍にすることが可能なのですね。ありがとうございます。もっとsimulinkが使いこなせるように勉強します.. (界王拳は技の名前かと思ってました。。 パワーアップにはスーパーサイヤ人のようなモードチェンジしかないと思ってたので知らなかったです。💦)
早速プログラムの修整に取り掛かります。
今までの回答を含めありがとうございました。

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File Exchangeグラフィックス パフォーマンス についてさらに検索

製品


リリース

R2018b

Community Treasure Hunt

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

Start Hunting!