読み書きプログラミング

日常のプログラミングで気づいたことを綴っています

Maximaで回路解析

スイッチング電源は、LとCとRのネットワークをFETやダイオードで切り替えることによって動作する回路で、回路トポロジーが変わらない限り、線形で容易に解くことができる回路になります。FETやダイオードの状態が変わると回路が変わるので、そこまでの値を初期条件に別の回路を解くことになる。制御条件が元に戻るまでこれを繰り返すと、ある条件から一周した時の状態がわかるので、漸化式を得ます。その漸化式の安定性と特性を把握すればどんな回路かわかるわけですから、これほど数式処理が適したアプリケーションも珍しい。にも関わらず、世間は数値計算シミュレーションがお好きなようです。
回路解析ツールの初めの一歩として、ネットリストを取り込んでグラフデータにするスクリプトMaximaで書きました。
85行に半日かけてしまいましたが、思ったことができて満足です。
Maximaということで、関数型プログラミングしようかと思ったのですが、全然ダメでした。繰り返し部がファイルI/O絡みなのですが、再帰を使うとファイルを全部読み込んでから処理することになってしまう感じでやめました。
Maximaは、ライブラリ化のために手続きを関数にする時、block文で書くことになり、式の終端が、コマンドライン(;)と変わります(,)。「ええい、うっとうしい」と思っていたのですが、言語設計者の気持ちとしては、関数型なのだからblock文なんてそんなに使わんといてということなのでしょうね。
グラフパッケージのおかげで回路のグラフ化も思った以上に速くできたし、グラフから微分方程式生成するのも同じくらいの手間だろうから、まさに「巨人の肩に乗」ってお手軽に結構すごいものが作れそうです。