ngspyceを使ってみる。実は、PySpiceでの相互誘導の記述方法がわからなかったので、ngspiceのdllを単に利用しているngspyceを使ってみる。
ngspyceは公式にPyPiに登録されていないようなので自力で入れる。
こちら(https://github.com/ignamv/ngspyce/tree/master)からCodeのボタンを押して、Download
ZIPを押して、適当なところに解凍する(Linuxの場合はパーミッションを設定できる場所じゃないといかん、すなわちsmbfs上とかはだめ)。
とりあえず、/home/hoge/tempにngspyce-masterフォルダをぶっこんだとすると、
cd /home/hoge/temp
pip install ./ngspyce-master/
ってすると、インストールしてくれる。
-
import ngspyce as ns
-
import numpy as np
-
import matplotlib.pyplot as plt
-
def ngspice_simulation(cvalue):
-
ns.circ(['.title Low-Pass RC Filter',
-
'R1 vin vout 1e3',
-
'C1 vout 0 1e-6',
-
'V1 vin 0 dc 0 ac 1',
-
'.end'])
-
ns.alter('C1',C=cvalue)
-
ac_results=ns.ac(mode='dec',npoints=10,fstart=1,fstop=1e6)
-
freqs=np.abs(ns.vector('frequency'))
-
vout=ns.vector('vout')
-
return freqs,vout
-
freqs,vout1=ngspice_simulation(1e-6)
-
freqs,vout2=ngspice_simulation(0.1e-6)
-
freqs,vout3=ngspice_simulation(0.01e-6)
-
fig = plt.figure()
-
ax1=plt.subplot(2,1,1)
-
ax1.grid(True)
-
ax1.plot(freqs,20*np.log10(np.absolute(vout1)), 'b-')
-
ax1.plot(freqs,20*np.log10(np.absolute(vout2)), 'g-')
-
ax1.plot(freqs,20*np.log10(np.absolute(vout3)), 'r-')
-
ax1.set_ylabel('Amplitude [dB]')
-
plt.xscale('log')
-
ax2=plt.subplot(2,1,2)
-
ax2.grid(True)
-
ax2.plot(freqs,np.angle(vout1), 'b-')
-
ax2.plot(freqs,np.angle(vout2), 'g-')
-
ax2.plot(freqs,np.angle(vout3), 'r-')
-
ax2.set_xlabel('frequency [Hz]')
-
ax2.set_ylabel('Phase [rad.]')
-
plt.xscale('log')
-
fig.tight_layout()
-
plt.show()
相変わらずのいきなりな感じでこうなる。
回路は一度に入れ切らないといけなくて、後から追加って記述はできないらしい(なぜかできると信じ込んでちょっと悩んだ)。
で、
ngspiceそのものの回路記述がすでにあるのなら、こっちのほうがラク。ていうか本当にngspiceのdllをwrapしているだけっぽい。それでも、自力でdllをcallする関数やら構造体やら記述するよりは全然助かる。
こういう小さいソフトが助かるんよ。何もかもやってくれる大規模なソフトは不要な機能まで理解する時間が必要になる(少なくともマニュアルを読み飛ばす時間が必要になる)のでムダが多い。
https://ja.wikipedia.org/wiki/UNIX%E5%93%B2%E5%AD%A6
コメントをお書きください