MaTXによるレスラー方程式の求解と描画 石川将人さんが「MaTX軟弱化計画」 http://www.cyb.mei.titech.ac.jp/~ishikawa/matx/nanjaku.html で公開されている Tkによるお絵描きライブラリ "tincas" を 私が改変して作った tincas2 を用いて, カオスが生じる有名な系である レスラーの微分方程式 (Roessler's Equation) の解を計算しながら表示します。 パラメータの値を変更しながら,定常状態を随時確認し, 分岐点を記録するのに便利です。 このディレクトリにある全てのファイル Makefile : make が用いる README (or Readme.txt) : このファイル mk-prmout.pl : 大域変数表示の関数 rem_prm_output を自動生成 ros2.mm : main() のあるファイル ros2_f.mm : 微分方程式の定義 ros2_inc.mm : 大域変数などの宣言 ros2_tincasfunc.mm : キーボード操作の定義など tincas2 : 改変した tincas tincas2_inc.mm : tincas2 の変数,関数の宣言 tincas2_lib.mm : 改変した tincas_lib.mm をダウンロードして, make; ros2 で実行できます。何らかの理由で matx で動かしたい場合は make ros2x で実行します。 動作確認は Vine Linux 2.1 (i386) + MaTX 5.2.2 で行いました。 使いかたは ros2 を実行して ? を押すとヘルプが出るので だいたい分かると思います。 # あっさりしすぎか? (^^;; 主な機能としては ・ テンキーによって2つのパラメータを増減できる。 ・ 'A' を押すと,画面の x,y range の自動調整。 ・ 'm','n' で現在のパラメータの値をファイルに追加して ソート後,プロットする。 ・ 'l' で状態変数値をファイルから読み込む。 ・ 大域変数の値を出力する関数 rem_prm_output の自動生成。 汎用性のある部分は,なるべくまとめてあるので, 別のシステムのシミュレーションをしたい場合でも ros2.mm と ros2_*.mm を書き直すだけでシミュレータが作れると思います。 tincas, tincas_lib.mm -> tincas2, tincas2_lib.mm, tincas2_inc.mm の主な改変箇所は以下の通りです。 ----------------------------------------------------------------------- open_canvas()では、wish を呼び出すようにしたので、 tincas2 は カレントディレクトリか、パスの通ったディレクトリのいずれかに あればよい。 # . にパスを通さなくてよい。 ----------------------------------------------------------------------- 分割コンパイルできるように 変数,関数の宣言を tincas2_inc.mm に分けた。 ----------------------------------------------------------------------- 以下の関数や変数の追加。 void set_canvas_xyrange(); Matrix get_canvas_xyrange(); Matrix adjust_xyrange(); void clear_canvas(); void set_tincas_title(); void set_tincas_update_interval(); Matrix gxy(); void use_mouse(); Matrix _canvas_size, _xyrange, _mes_xyrange; Integer auto_clear_interval; ----------------------------------------------------------------------- 速度改善のため --- tincas ---- # # スタンバイ状態 # while {1} { gets stdin cmd if {$cmd=="."} break eval $cmd update } --------------- を --- tincas2 --- update set count 0 set update_interval 1 # # スタンバイ状態 # while {1} { gets stdin cmd if {$cmd=="."} break eval $cmd incr count if {$count >= $update_interval} { update set count 0 } } ----------------- に変更。 要するに,画面の update を行う頻度を update_interval で調節できるように するということ。 mmファイルの中で update_intervalを 変更するには, set_tincas_update_interval(pid,200); などとします。 シミュレーション中に 'u' を押しても変更できます。( kbd_event()で定義。) ---------------------------------------------------------------------------- canvas を一定時間間隔で(auto_clear_interval 個の点を描く毎に) 自動的にクリア( clear_canvas() )する。 auto_clear を 1 に設定すると行われる。 auto_clear_interval の値は,デフォルトでは 5000。 シミュレーション中に 'S' を押して,auto_clear が有効になる時に auto_clear_interval の値を変更できます。( kbd_event()で定義してある。) ---------------------------------------------------------------------------- このディレクトリにあるファイルの無断改変、再配布を許します。 改変後に再配布する場合は、原作者名のクレジットは残し, できれば変更箇所を明示して下さい。 〒860-8555(専用番号) 熊本大学 工 電気システム 助手 喜多敏博 (KITA Toshihiro, tel,fax: 096-342-3613) t-kita@eecs.kumamoto-u.ac.jp Web page : http://www.eecs.kumamoto-u.ac.jp/~t-kita/ or http://www.t-kita.net/