Open tetsushiwahaha opened 1 year ago
すみません,私が要点を理解できていない気がするので伺わせてください.
先日の議論で @aw02m と共通の認識を持ったのが,一度書いたらその後2度とタッチしないもの(力学系の定義相当)は,静的なファイルとして扱い,初期値やパラメタ,グラフ描画の設定など,都度調整したいものは動的なファイルとして扱う,という点だったと記憶しています.上記棲み分けを徹底するなら,動的なファイルは JSON,静的なファイルは Python で分けてしまうのが見通しが良いのではと考えるところです.
最初の問いの後者が真であれば,棲み分けも徹底した書きようがあります.例えば JSON ファイルの中に「"system": "duffing"
」などと入れ込んで,自分で作った duffing.py
を読ませる方法が考えられます.
むしろ,静的なファイルは一つにしたい,というところかな.
なるほどです. つまりは,力学系をあらかじめ静的に定義して使い回すのではなく,ファイル生成の都度,動的に(JSON ファイルごとに)数式で指定したい,というところになりましょうかね.
ディレクトリ単位に一つの力学系,というのであれば現状でいいかも.みなさんがどうやったら「散らからない」状況になるかにもよると思いますが,JSONにすると完璧かというとそうでもない(多分パラメータを k, B0, などとは表現できなくなるのでは).多数決にしますか? :-P
ディレクトリ単位に一つの力学系,も美しい気もする…すると pp.py本体は bin かどこか別の触らないところに行ってほしい気もする
ディレクトリ構造検討してみます. 実行コマンドとしては
python pp.py in.json
としたい,という前提で良かったでしょうか?
すみません,あもうはJSONに力学系を書き込むのは反対です. ・エディタ上のフォーマット機能が使用できない ・ハイブリッドシステムや記述の長い系に拡張する際に非常に書きにくい が主な理由です. 計算する系は頻繁に変わらないですし,系ごとにPythonスクリプトとして書き出しておくのが良いのではないでしょうか. とりあえず私もディレクトリ構造に関して検討してみます.
ひとまず2パターン,考えてみました.他にもなにか考えられないか思案してみます...
現状の延長案です.
力学系の追加は ode_collection.py
にて行い,その後の初期値や細かい設定は JSON 内に全て含める方式です.
ディレクトリ構造と呼べるものは動的な JSON ファイルのみにしかなく,静的なソースは散らかっています...
https://github.com/Yuu-Miino-NUE/python-nonlinear-dynamics/tree/feature/dir_pattern_m01/src
力学系をディレクトリごとに分け,pp
もモジュールにする案です.
力学系の追加は各ディレクトリの system.py
にて行い,その後の初期値や細かい設定は JSON 内に全て含める方式です.
この構造を読者側で作ってもらうためには,モジュールやパッケージとはなんぞやというところから,自作モジュールについての理解まで必要になります.
https://github.com/Yuu-Miino-NUE/python-nonlinear-dynamics/tree/feature/dir_pattern_m02/src
どちらがおすすめ? ディレクトリ単位に一つの力学系,ということで管理すれば確かに食わせるJSONはどの力学系の?って困ることは無いですね.ウエタの実装ではJSONで力学系が分かる反面,あもうさんの指摘はもっともかと思います.ところで何らかの出力ファイルを put するときに,なんのJSONの結果なのかを付記できませんかね.ま,それはどういうフォーマットにするかに依存しますかね.
個人的には,前者がオススメではあります.力学系を増やしてもあるファイル(今の例では ode_collection.py
)に追記するのみで,ディレクトリ構造は変わらないためです.また,初学者にも優しいように思います.
それがかえってわかりにくい,ということであれば,目的に応じてどちらをとっても良いようには思います.(もっと他にいい案があるかもしれません...)
出力ファイルに put するときには,実行コマンド列(argv
) をそのまま出力ファイルのヘッダに吐き出しておけば良いのではと思います.
あ,食わせる JSON はどの力学系?というのがファイルの外から見て分かる枠組みとしては,どちらの案であっても JSON を仕分けるディレクトリ(延長案の場合,json/duffing
など)があれば問題なしかと思います.
ただし,モジュール化案については,各ディレクトリの system.py
をコマンド引数(argv
)を元にして読ませている関係で,サブディレクトリでの整理まで実現しようとするとコードがやや煩雑化します.
すなわち,例えば,接線分岐の固定点や周期倍分岐の固定点,などでディレクトリを分けたい場合には,延長案の方が簡便です.
上記に関連して少しディレクトリ構造を変更しました. https://github.com/Yuu-Miino-NUE/python-nonlinear-dynamics/tree/feature/dir_pattern_m01/src
しつこいんですが,eval使ってでも,nonlinear_systems.py はJSONになんないだろか?試してもらっていいと思いますが,eval によるオーバーヘッドは殆どないです,私が昔試した限り.それよりは遥かにsolve_ivpが遅い :D