版(バージョン)。

相変わらず、Matlab + Simulink に苦戦中である。やはりブロック線図に慣れていないせいなのか、それともやろうとしている事が、Simulink に馴染まないからなのか。勘所、コツがなかなかつかめない。最近はモデルが複雑になるに連れて、段々実行開始までの時間がかかるようになり、ついには無限ループに突入して、シミュレーションが終わらなくなくなってしまった。

Unit Delayブロック'***/Delay Input1'のレート遷移が不正です。遷移レートに対してこのブロックを 使う場合、入力は遅いサンプル時間に接続し、出力は早いサンプル時間に 接続されていなければなりません。Unit Delayは遅いサンプル時間に等しい サンプル時間をもち、遅いサンプル時間は早いサンプル時間の倍数でなければなりません。 また、すべてのdestinationブロックは同じ値でなければなりません

なんて、いきなりエラーを出されても該当するブロック周辺は全然触っていないのだが、と困惑する。エラー回避のために専用のレート遷移変換用のユーティリティブロックを入れると今度は上記の通り、初期化の段階で無限ループである。タスクマネージャーをみると、matlab が CPU リソースを100%近く占有し、メモリ使用量も微増しつづけている。
Simulink の FAQ をみると代数ループ(これも Matlab/SImulink 特有の概念らしい)が発生するとフリーズする可能性高しとあったので、検知を試してみるも結果は変らず。判定すら出来ず、無限ループである。以前、所属している mixi のコミュニティで、「あるプログラムが無限ループに陥るかどうかを判定するのは、不可能である。なぜなら判定プログラムも無限ループに落ちる可能性はどうあがいても論理的に 0 に成らないからだ。」そんな事を教えてもらった。これを「停止性の呪い」と言うらしいが、無限ループへ至る可能性の判定を行うオプションを実行したら、いきなり「停止性の呪い」に引っかかったようだ。*1 何事も身をもって学ぶというのは、学習する上で大切な事なのだが、時には少し待って欲しい時もある。

結局、諦めて別のアプローチで向かおうと思うが、困った。バージョンがかなり混乱している。一応、CVS で管理はしているが、如何せんバイナリファイルである。Java のソースならテキストファイルなので、emacs 上の CVS のフロントエンドから diff ツールで履歴ごとの変化の様子をトレースして、どの辺が諸悪の根源なのかめぼしを付けたりするのだが、Simulink ではそうは行かない。*2

やはり、図的にプログラムを表現するというのは、視覚的な分かりやすさの代償として、ファイルの構造が複雑になってしまう。そう言えば、Simulink でシステム組んでいるときって、

  • ブロックコメントの有無
  • 矢印の大きさ
  • 配線の流れ
  • ブロックの位置、
  • I/O の順番、

など実現したい機能の部分とは本質的に関係ない、装飾的な所に結構、気を使っているような気がする。テキストエディタでプログラムを組むときも確かにコーディングルールに則ってなるべく綺麗なコード、分かりやすいコメントは常々気をつけている。しかし、図の配置などのトポロジーな部分が加わる部分で、やはり Simulink の方が本質から外れたところに注意を向けない時間が多いと思うし、より疲れてしまう。単に装飾の都合上変更を掛けたのか、機能を変えるために変えたのか。バージョン管理を行う場合、その区分けは結構大変だと思う。

最近は MDA(Model Dirven Architechture)とか言って、UML ベースのモデルから直に実行可能なプログラムを作成しようと言う事が流行らしいが、慣れてしまえば、ソースコードを書いてプログラムするの方が楽なような気はするのだが。どうなんだろう。生成されるソースの判定で「停止性の呪い」とか引っかからないのかな。バージョン管理とかどうしているんだろうか。

*1:そこをパスしても結局実行時に無限ループに陥るのだけど。

*2:Matlab の m ファイルならまだ可能だけど