· 

PySpice使ってみる(2)

 

ngspiceってのがある。結果の表示をPySpiceってやつでもちっとうまいことでるんやないか。って試み。

前回、シミュレーションすることができた。ついに(ってほどじゃないやろ)、値を変更しながらのシミュレーションで結果を重ね書きってのをやる。で、

  1. import math
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. import PySpice.Logging.Logging as Logging
  5. logger = Logging.setup_logging()
  6. from PySpice.Plot.BodeDiagram import bode_diagram
  7. from PySpice.Spice.Netlist import Circuit
  8. def ngspice_simulation(cvalue):
  9.     circuit = Circuit('Low-Pass RC Filter')
  10.     circuit.SinusoidalVoltageSource('input', 'vin', circuit.gnd, amplitude=1)
  11.     R1 = circuit.R(1, 'vin', 'vout', 1e3)
  12.     C1 = circuit.C(1, 'vout', circuit.gnd, cvalue)
  13.     break_frequency = 1 / (2 * math.pi * float(R1.resistance * C1.capacitance))
  14.     print("Break frequency = {:.1f} Hz".format(break_frequency))
  15.     simulator = circuit.simulator(temperature=25, nominal_temperature=25)
  16.     analysis = simulator.ac(start_frequency=1, stop_frequency=1e6, number_of_points=10, variation='dec')
  17.     freqs=np.array(analysis.frequency)
  18.     vout=np.array(analysis.vout)
  19.     return freqs,vout
  20. freqs,vout1=ngspice_simulation(1e-6)
  21. freqs,vout2=ngspice_simulation(0.1e-6)
  22. freqs,vout3=ngspice_simulation(0.01e-6)
  23. fig = plt.figure()
  24. ax1=plt.subplot(2,1,1)
  25. ax1.grid(True)
  26. ax1.plot(freqs,20*np.log10(np.absolute(vout1)), 'b-')
  27. ax1.plot(freqs,20*np.log10(np.absolute(vout2)), 'g-')
  28. ax1.plot(freqs,20*np.log10(np.absolute(vout3)), 'r-')
  29. ax1.set_ylabel('Amplitude [dB]')
  30. plt.xscale('log')
  31. ax2=plt.subplot(2,1,2)
  32. ax2.grid(True)
  33. ax2.plot(freqs,np.angle(vout1), 'b-')
  34. ax2.plot(freqs,np.angle(vout2), 'g-')
  35. ax2.plot(freqs,np.angle(vout3), 'r-')
  36. ax2.set_xlabel('frequency [Hz]')
  37. ax2.set_ylabel('Phase [rad.]')
  38. plt.xscale('log')
  39. fig.tight_layout()
  40. plt.show()
まぁいつものいきなりなやつでこうなる。
シミュレーション部分を関数化しているけど、どういう感じで関数化するのかはセンスが問われるところ。引数とか、戻り値とか。今回は必要な分だけ対象にしている(最も手抜きシンプル)。
で、結果、
はい。うまくいった。

ngspiceの機能を補うとともにpythonでの特殊な計算の実装の可能性もあるpyspice。まぁまぁいいね。(pythonではahkabって回路シミュレーターも選択肢なんだけど、ahkabは非線形素子の計算がゲロクソ遅いとか問題がある。状況に応じて使い分けるのが良いと思われる。)