Sympyで回路方程式を解いて伝達関数を求める
代数演算をソフトウェアにやらせるというと、MathematicaやMaximaが思い浮かびますが、今回はPythonのSympyを使ってみました。
SympyはAnacondaに収録されています。また、Jupyter notebook上で利用すると快適です。
2段オペアンプを想定した、下図のような小信号等価回路から回路方程式を立てて、伝達関数を導出させます。
なお、回路図はフリーの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上で、下図のようにきれいに整理された伝達関数が求まりました。