· 

ahkab(python)で回路シミュレーション(1)

ahkabとかいうライブラリで回路シミュレーションができるらしいのでやってみます。

 

まずはインストール

 

pip install ahkab --proxy=ほにゃらら

 

ってすると、

 

numpy, mpmath, tabulate, sympy, scipy, ahkab

 

がインストールされる。 

ここを参考に 

こんな回路を計算してみる。

 

ちなみに最近の環境では参考ページ通りではエラーが出る。

 

ahkabがmatplotlibの設定を変えてしまうらしいので、

matplotlib.use('TkAgg') 

が必要になる。伴い

import matplotlib

が必要になる。

 

matplotlibがhold命令がなくなったようで、コメントアウト。

 

ahkab.runで得られるオブジェクトの周波数の辞書名は"w"ではなく"f"になっているようなので変更。

 

で、こちら。

import matplotlib
import matplotlib.pyplot as plt
import numpy as np

import ahkab
from ahkab import circuit, printing, time_functions
mycircuit = circuit.Circuit(title="Butterworth Example circuit")

gnd = mycircuit.get_ground_node()

mycircuit.add_resistor("R1", n1="n1", n2="n2", value=600)
mycircuit.add_inductor("L1", n1="n2", n2="n3", value=15.24e-3)
mycircuit.add_capacitor("C1", n1="n3", n2=gnd, value=119.37e-9)
mycircuit.add_inductor("L2", n1="n3", n2="n4", value=61.86e-3)
mycircuit.add_capacitor("C2", n1="n4", n2=gnd, value=155.12e-9)
mycircuit.add_resistor("R2", n1="n4", n2=gnd, value=1.2e3)

voltage_step = time_functions.pulse(v1=0, v2=1, td=500e-9, tr=1e-12, pw=1, tf=1e-12, per=2)
mycircuit.add_vsource("V1", n1="n1", n2=gnd, dc_value=5, ac_value=1, function=voltage_step)

print(mycircuit)

op_analysis = ahkab.new_op()
ac_analysis = ahkab.new_ac(start=1e3, stop=1e5, points=100)
tran_analysis = ahkab.new_tran(tstart=0, tstop=1.2e-3, tstep=1e-6, x0=None)

r = ahkab.run(mycircuit, an_list=[op_analysis, ac_analysis, tran_analysis])

matplotlib.use('TkAgg') 

fig = plt.figure()
plt.title(mycircuit.title + " - TRAN Simulation")
plt.plot(r['tran']['T'], r['tran']['VN1'], label="Input voltage")
#plt.hold(True)
plt.plot(r['tran']['T'], r['tran']['VN4'], label="output voltage")
plt.legend()
#plt.hold(False)
plt.grid(True)
plt.ylim([0,1.2])
plt.ylabel('Step response')
plt.xlabel('Time [s]')
fig.savefig('tran_plot.png')

fig = plt.figure()
plt.subplot(211)
plt.semilogx(r['ac']['f'], np.abs(r['ac']['Vn4']), 'o-')
plt.ylabel('abs(V(n4)) [V]')
plt.title(mycircuit.title + " - AC Simulation")
plt.subplot(212)
plt.grid(True)
plt.semilogx(r['ac']['f'], np.angle(r['ac']['Vn4']), 'o-')
plt.xlabel('Angular frequency [rad/s]')
plt.ylabel('arg(V(n4)) [rad]')
fig.savefig('ac_plot.png')
plt.show()

回路網の記述方法はふつーです(scikit_rfは奇特だったけど)。

で、結果は、

ちなみにTina-TIでac解析した結果はこちら。

表現が違うのであってるのかどうなのかはわからない。なんとなくいけてそうな、、、じゃなくて検証しろって、、、いや、ホビーなので許してください。