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解析した結果はこちら。
表現が違うのであってるのかどうなのかはわからない。なんとなくいけてそうな、、、じゃなくて検証しろって、、、いや、ホビーなので許してください。
コメントをお書きください