【回路×Python】線形回路解析パッケージLcapyを使えるようにする方法

# Lcapyとは？
Lcapyは線形回路を解析するためのPythonパッケージで、記号解析にsympyを利用しています。

公式ドキュメント：[Welcome to Lcapy’s documentation!](http://lcapy.elec.canterbury.ac.nz/overview.html)

Lcapyは回路の数値解析と記号解析が行えます。数値解析はSPICE系シミュレータが出力する結果のように、解析結果が数値で表されるものです。記号解析は回路の伝達関数やインピーダンスを記号（数式）で表すというものです。この機能を使うことで、面倒な回路方程式を解く作業をコンピュータにやらせることが出来ます。

Lcapyには教科書品質の回路図をコマンドベースで描くといった機能もあります[^1]。

Lcapyに関する情報は2020/10/31/時点でQiitaでは0件でした。Googleで調べてみても、日本語圏はおろか、英語圏でも情報がほとんどヒットしませんでした。

Lcapyで何が出来るのか？は[公式ドキュメントのoverview](http://lcapy.elec.canterbury.ac.nz/overview.html)を読んでいただくのが良いかと思います。Lcapyに関する私の記事を最後に紹介しますが、Lcapyの機能を知るのに役立つかもしれません。

この記事ではLcapy使えるようにする方法を説明します。Lcapyユーザーが増え、有益な情報交換が出来るようになれば幸いです。


# 使い方
[公式ドキュメントのInstallation](http://lcapy.elec.canterbury.ac.nz/install.html)によると以下のpythonパッケージが必要とありますので、これらをpipを使ってインストールしましょう。
lcapy, sympy, numpy, matplotlib, networkx

回路図を作成する機能（schematic drawing）を使わないのであれば、インストールはこれで終わりです。

### 動かしてみる
インストールが終わったらJupyter-notebook上で動作確認をしてみましょう。
Lcapyでは様々な方法で回路の伝達関数を求めることが出来ますが、その一例を以下に示します。

伝達関数を求める回路：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697728/4f9de10f-9121-65cf-e3b6-6882f2d6bf71.png)


```Python:伝達関数を記号的に求める
from lcapy import Circuit, s
cct = Circuit("""
Vi 1 0 
R 1 2 RF
C 2 0 CF
""")

H = (cct.C.V(s) / cct.Vi.V(s)).simplify()
H
```
実行結果は以下の通りで、回路の伝達関数を記号的に解析することが出来ました。
$$\frac{1}{C_{F} R_{F} s + 1}$$


# 回路図を作成できるようにする

回路図の作成機能（schematic drawing）を使いたい場合はTeXをインストールする必要があります。

[公式ドキュメントのInstallation](http://lcapy.elec.canterbury.ac.nz/install.html)によると、pdflatex、circuitikz、ghostscriptが必要とあります。調べたところpdflatexはW32TeXで配布されており[^2]、circuitikzパッケージもそのW32TeXには標準でインストールされているようです[^3]。[W32TeXインストーラ](http://w32tex.org/index-ja.html)を使えばghostscriptもついでにインストールできるようです。つまりW32TeXだけインストールすれば必要なものが全て揃います。
W32TeXは[TeXインストーラ 3](https://www.ms.u-tokyo.ac.jp/~abenori/soft/abtexinst.html)を利用することで簡単にインストールできます。

### 動かしてみる

```Python:回路図を描く
from lcapy import Circuit
cct = Circuit("""
Vi 1 0_1 step; down
R 1 2; right, size=1.5
C 2 0; down
W 0_1 0; right
W 0 0_2; right, size=0.5
P1 2_2 0_2; down
W 2 2_2;right, size=0.5""")

cct.draw()
```
実行結果は以下の通りで、綺麗な回路図が描画されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697728/02166901-e2cc-c6d6-2122-bd1798bf7692.png)

なお、上記コードは以下から引用しました：
https://github.com/mph-/lcapy/tree/master/doc/examples/notebooks



# 回路の記号解析について

数年間ほど回路設計関連の業務に携わってきましたが、回路の記号解析が出来るツールの存在を最近まで知りませんでした。

回路解析の種類とツールについては以下の博士論文が参考になります。
[電気回路の振る舞いの数理とそのシンボリック計算について](https://miyazaki-u.repo.nii.ac.jp/?action=pages_view_main&active_action=repository_view_main_item_detail&item_id=5154&item_no=1&page_id=13&block_id=21)

論文の表１．１では回路の記号解析ツールとして、[SAPWIN](http://www.prodid.it/Sapwin4/)、[SCAM](https://jp.mathworks.com/matlabcentral/fileexchange/3443-scam-a-tool-for-symbolically-solving-circuit-equations)、[WASABI](http://wasabi.matrix.jp/wp/)が紹介されていますが、これら以外にも[QSapecNG](http://qsapecng.sourceforge.net/)や[CircuitNAVI](https://circuitnav.pythonanywhere.com/)といったツールがあるようです。自分のやりたいことに合わせて最適なツールを選択するのが良いと思います。

私の場合、やりたいことは以下の通りでした
１）回路の伝達関数を記号的に解析する
２）得られた伝達関数を展開する（極を求めるなど）
３）得られた伝達関数を数値計算する
４）数値計算した結果を綺麗なグラフで表示する。
これらを行うためには、Python（Lcapy）が最適な選択でした。

Lcapyについては以下の記事を書いていますので、そちらも是非ご覧ください。
[【回路×Python】Lcapyを使って回路の伝達関数を求める方法](https://qiita.com/akikazu/items/31a6696e3462ebc214c1)
[【回路×Python】Lcapyを使って伝達関数を展開・計算する方法](https://qiita.com/akikazu/items/30ae789887e3411831b8)
[^1]: LcapyではダイオードやMOSといった非線形デバイスを解析することは出来ませんが、回路図として描くことは可能です。
[^2]: https://konoyonohana.blog.fc2.com/blog-entry-19.html
[^3]: https://konoyonohana.blog.fc2.com/blog-entry-479.html