AT's Blog

趣味のプログラミング、ギター、音楽とかとか

Sympyで回路方程式を解いて伝達関数を求める

代数演算をソフトウェアにやらせるというと、MathematicaMaximaが思い浮かびますが、今回はPythonのSympyを使ってみました。

SymPy

SympyはAnacondaに収録されています。また、Jupyter notebook上で利用すると快適です。

qiita.com

2段オペアンプを想定した、下図のような小信号等価回路から回路方程式を立てて、伝達関数を導出させます。

f:id:necophys:20180414191028p:plain

なお、回路図はフリーのWebアプリdraw.ioで描きました。

Flowchart Maker & Online Diagram Software

JupyterでSympyを利用する上で、まずモジュールをすべてインポートし、数式描画のための初期化メソッドinit_printing()を実行します。

from sympy import *
init_printing()

symbols()で変数記号を定義し、キルヒホッフの電流則に基いてV1ノードとVoutノードでそれぞれ方程式を立てます。

s, Gm1, Gm2, Gds1, Gds2, C1, C2, Cc, Vin, Vout, V1 = symbols('s, Gm1, Gm2, Gds1, Gds2, C1, C2, Cc, Vin, Vout, V1')
eq1 = Gm1*Vin + Gds1*V1 + s*C1*V1 + s*Cc*(V1-Vout)
eq2 = Gm2*V1 + Gds2*Vout + s*C2*Vout + s*Cc*(Vout-V1)

solve()でeq1とeq2を連立させて、VoutとV1を求めます。solveは辞書形式で解を返すので、Voutを取り出してVinで割ることで、伝達関数の形にしています。ここでは、expand()で複素数sについて展開、simplify()で整形、collect()でsについて式を整理するところまで、一行で処理しています。

simplify(expand(solve([eq1, eq2], [Vout, V1])[Vout]/Vin, s)).collect(s)

Jupyter notebook上で、下図のようにきれいに整理された伝達関数が求まりました。

f:id:necophys:20180414185945p:plain