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

simulink上のある2つのブロック(グラフを出力します)について、1つのブロックの計算をもう片方のブロックよりも速く終わらせ、グラフを重ねあわせる方法はありませんでしょうか。
2つのブロックには外部から任意の値が入力され(どんな値が入力されるかは、その時刻にならなければ分からないようになっています。)、ブロック内の関数とその値を基にグラフを出力します。
具体的には添付させて頂いた資料の手法が知りたいです。
よろしくお願いいたします。

2 commentaires

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

Connectez-vous pour commenter.

 Réponse acceptée

Atsushi Ueno
Atsushi Ueno le 6 Juil 2022

0 votes

>特定のブロックを他のブロックよりも先に計算する方法はあるでしょうか。
⇒特定のブロック(例えばサブシステム)を一塊のブロックと同じ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 commentaires

M M
M M le 6 Juil 2022
Atsushi Uenoさん
いつも直ぐに回答して頂きありがとうございます。
これから頂いたコメントをよく読んで、プログラムを作成しようと思います。
当初方法が全然わかっておらず、Uenoさんのアドバイスのお陰で光明が見えました。ありがとうございます。
ちなみにドラゴンボールについてあまり詳しくはないのですが、精神と時の間については存じております。(そのシーンだけアニメで見たことがあります。)
今までの他の質問も含め、回答ありがとうございます。
M M
M M le 7 Juil 2022
Atsushi Uenoさん
簡単な具体例で分かりやすい説明ありがとうございます。
一つ質問させて頂いてもよろしいでしょうか。
Uenoさんのコメント下から7行目から9行目にかけての文章です。
「またモデルから見るとWhile Iterator Subsystemの入力信号In1 は一瞬だけ単発でONになるインパルス信号ですが、While Iterator Subsystem内ではそのインパルス信号がずっとONになり続けている事になります。」
この文について私は以下ように解釈させて頂きました。
真ん中のグラフの縦値を試行回数とみなすと、
真ん中のグラフは0.01秒間に試行回数が1なのに対し、下のグラフは試行回数が10万回となる。
(つまり精神と時の間で考えると、現実世界(真ん中のグラフ)0.01秒間に1回しかトレーニングしていないのに対し、時の間では10万回トレーニング出来る。。。)
ということでしょうか。
的外れな質問でしたらすみません。
目を通して頂きありがとうございます。
よろしくお願いいたします。
Atsushi Ueno
Atsushi Ueno le 8 Juil 2022
仰る通りです。Atomicサブシステム内部でどんなに複雑で長いトレーニング。。。もといシミュレーション等の演算を行っても、その外部では1サンプル時間しか過ぎていないのです。
勿論現実には有り得ません。実際にPCでプログラムを動かすと、複雑で長い演算にはそれなりの時間が掛かります。しかし、Simulinkで定義する時間軸においては「1サンプル時間」になります。
余談:「インパルス」の正確な定義は「幅が無限小・値が無限大」ですが、私の意図「幅が1サンプル時間のパルス信号である」という事は伝わってると思います。
M M
M M le 9 Juil 2022
Uenoさん
コメントありがとうございます。
Uenoさんから頂いたヒントを基にプログラムの作成に取り掛かります。
ありがとうございます!
M M
M M le 11 Juil 2022
Ueno Atsushi さん
いつもアドバイスありがとうございます。
新たにプログラムを考ていたのですが分からなくなってしまいました。
何度もすみません。
新たに質問させて頂いてもよろしいでしょうか。。
質問は
「時間軸を変更することは出来るのでしょうか」
です。
再び長文失礼致します。
前回Uenoさんに解答して頂いた直後に私は、
①「t0までのグラフの時間軸は同じにして、t0以降の時間軸を変えれば良い。
(シミュレーションエリア(緑線内)の時間軸をt0以降、出力用ブロックとは別のものに変えれば良いということです..)」
②「時間軸はclockで決めているから、単純にシミュレーションエリアに入力するclockの速度を何倍かにすればできるかな..?(この考えは間違っていますが、ひとまず書かせていただきます...)」
と考えプログラムを書き直しました。
ですが②の発想は間違いで、当たり前ですが想定した動作にはなりませんでした。
以下の添付図はプログラムの簡易モデルです。
上はシミュレーションエリアのブロックを簡単に模しており、
下は装置に対する出力ブロックを模しています。
この時のグラフは以下の図のようになります。(グラフは全く同じで、グラフ生成にはif文を使用しています)
また今回のプログラムでは、
想定される停止動作開始時間t0を1[s]とし、t0より前の外部からの入力は簡単のため直線としています
ここで私はシミュレーションエリアへのclock出力を変更しました。
1[s]までは比例の関係になるよう出力し、1[s]以降の出力速さを5倍にしました。
そして実行した結果は下図のようになります。
シミュレーションエリアのグラフは途中で横ばいのグラフに代わっているのが確認できるかと思います。
プログラムを実行してから気づきましたが、clockの出力速さを途中で大きくしてもシミュレーションエリアから出力されるグラフの減速時間が短くなるだけです(当然のことですが..)。時間軸は全く変わっていません。
ここまで目を通して頂きありがとうございます。
ここでもう一度私の考えをpdf資料と共に整理しました。
(見て頂けると幸いです。)
(P.2) simulink上のグラフ生成の流れは図のようになっており、計算自体は一瞬で終わると認識しています。
(P.3)ここでグラフ1について、t0以降の処理スピードを青線のよう速くし、
(または下グラフのオレンジ線速さを遅くする←オレンジ線速さは元々一瞬で、青線を速くすることは難しいと思うので、こちらの方が現実的かもしれません。。) 
グラフ2よりも速くすることは出来ますでしょうか。
(イメージとしましては、針の速さが異なる時計を二つ用意しt0で時計を変える(←すなわち時間軸を変える)ということです..)
やはり少し複雑なプログラムを書かなければ要件を満たすことは出来ないのでしょうか。
長い説明と質問失礼いたしました。
これまでに丁寧な解説と、質問を読んでいただきありがとうございます。
何かアドバイスがありましたらご助言して頂けると助かります。
よろしくお願いいたします。
Atsushi Ueno
Atsushi Ueno le 11 Juil 2022
>「時間軸を変更することは出来るのでしょうか」
⇒定義により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 le 11 Juil 2022
Atsushi Uenoさん
質問を読んで頂き、重ねてお礼申しあげます。
度々のご回答及びわかりやすい説明ありがとうございます。
for文で動作を倍にすることが可能なのですね。ありがとうございます。もっとsimulinkが使いこなせるように勉強します.. (界王拳は技の名前かと思ってました。。 パワーアップにはスーパーサイヤ人のようなモードチェンジしかないと思ってたので知らなかったです。💦)
早速プログラムの修整に取り掛かります。
今までの回答を含めありがとうございました。

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur 一般分野への適用 dans Centre d'aide et File Exchange

Produits

Version

R2018b

Community Treasure Hunt

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

Start Hunting!