· 

PySpice使ってみる(1)

 

ngspiceってのがある。世の中はPSpiceとかLTSpiceとかが好き。でも個人的にはテキストだけで記述する方が好き。がngspiceの回路記述だけじゃどうにもならん(?)こともある(特に結果の表示とか保存)のでPySpiceってやつで何とかならんか考える。

ngspiceはこちら(https://ngspice.sourceforge.io/index.html)。Linuxでは最新版はソースコードからビルドするしかないが、マニュアル通りやればいい。この辺の情報はググれば見つかるんだけど、いざ細かいことをしようとすると、PSpiceやらLTSpiceやらに駆逐されていて情報が見つからない。

PySpiceはこちら(https://pyspice.fabrice-salvaire.fr/releases/v1.4/index.html#)。まぁpipでいける。

今回何をしたいのかというと、パラメータを変えながらシミュレーションして結果の重ね書きのグラフを作成するってこと。そんなのngspiceの回路記述のalterparamでできるじゃん(?)って思うんだけど、これがうまくいかない。alterparamした後はresetせんといかんのだけど、前のシミュレーション結果も忘れてしまうっぽくて、後で重ね書きしようとすると、そんなベクタは知らんって怒られる。

では、使ってみる。
こちら(https://pyspice.fabrice-salvaire.fr/releases/v1.4/examples/filter/low-pass-rc-filter.html)の例を試してみる。が、単位の書き方がうざい。"@u_"を付けることで、技術者が見慣れた単位を付けることができるんだけど、いや、むしろうざいから。そして、このまま実行しても色々怒られる。"in"はPythonの予約語だから使うんじゃねーっとか、その他意味わからんものがいろいろ。
で、色々いじくった結果、これでいけた。

  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. circuit = Circuit('Low-Pass RC Filter')
  9. circuit.SinusoidalVoltageSource('input', 'vin', circuit.gnd, amplitude=1)
  10. R1 = circuit.R(1, 'vin', 'vout', 1e3)
  11. C1 = circuit.C(1, 'vout', circuit.gnd, 1e-6)
  12. break_frequency = 1 / (2 * math.pi * float(R1.resistance * C1.capacitance))
  13. print("Break frequency = {:.1f} Hz".format(break_frequency))
  14. simulator = circuit.simulator(temperature=25, nominal_temperature=25)
  15. analysis = simulator.ac(start_frequency=1, stop_frequency=1e6, number_of_points=10, variation='dec')
  16. freqs=np.array(analysis.frequency)
  17. vout=np.array(analysis.vout)
  18. fig = plt.figure()
  19. ax1=plt.subplot(2,1,1)
  20. ax1.grid(True)
  21. ax1.plot(freqs,20*np.log10(np.absolute(vout)), '-')
  22. ax1.set_ylabel('Amplitude [dB]')
  23. plt.xscale('log')
  24. ax2=plt.subplot(2,1,2)
  25. ax2.grid(True)
  26. ax2.plot(freqs,np.angle(vout), 'r-')
  27. ax2.set_xlabel('frequency [Hz]')
  28. ax2.set_ylabel('Phase [rad.]')
  29. plt.xscale('log')
  30. fig.tight_layout()
  31. plt.show()
まぁ、できた。
しかし、WARNINGがでるんよねー
 - WARNING - Unsupported Ngspice version 42
もちっと具体的に教えてくれんもんかね、、、まぁ結果オーライで^^

低賃金長時間労働への抗議のためパジャマで通勤するってのが隣の超大国で起こっているらしい。労働法によって労働時間や賃金についてそんなに無茶なことはできんはずだけど、抗議したくなるほどってことなんやろうなー、、、ちなみに日本も25年前は○○ムカー○”打刻してから○フ。○に戻って深夜まで○事するってのは普通だった。そのころの日本(または今の隣の超大国)と今の日本を表向きの生産性で比較したらいかんよね、、、