Python で 電気回路の授業
電気回路の授業では、回路図を書いたり、計算をしたり、いろんなことをします。
今回は、電気回路の授業準備で使えそうな Python と Google コラボラトリー を使った方法をお伝えします!
まず、Google コラボラトリー
ブラウザで Python を実行できる開発環境です。
iPad でも使えたりするし、自分のデバイスの環境を汚さないあたりがいいですよね!
電気回路の作成手順です。
参考は、こちらのサイトです。
Google コラボラトリー でコードを入力するまでがわからない方はこちらから
まずは、このコードを実行します
!pip install schemdraw==0.14
次にこちらを実行します
%matplotlib inline
%config InlineBackend.figure_format = 'png'
ここで、
'png'
にしているのは、後で回路図をダウンロードするときに、png形式でダウロードしたいからです。
では、回路図を作ってみましょう!
import schemdraw
import schemdraw.logic as logic
import schemdraw.elements as elm
from google.colab import files
with schemdraw.Drawing() as d:
d += elm.SourceSin().up().label('10V') # 交流電源
d += elm.Line().up() # 縦の線
d += elm.Line().right() # 右に行く線
d += elm.ResistorIEC().down().label('10Ω') # 抵抗
d += elm.Inductor().down().label('10mH') # コイル
d += elm.Capacitor().down().label('10μF') # コンデンサ
d += elm.Line().left() # 左に行く線
d += elm.Line().up() # 縦の線
d.save('circuit.png')
# png 形式でダウンロード
#files.download('circuit.png')
こちらで作成できた回路はこんな感じ。
綺麗に作図できていますね!😆
作った回路図をダウンロードしたい場合は、
# png 形式でダウンロード
files.download('circuit.png')
上記のように、files の前についている # を消して実行してください。
# はコメントアウトする時に使い、今は無効化してありました。
では、二つの回路の直列はどんな感じになるでしょうか!?
import schemdraw
import schemdraw.logic as logic
import schemdraw.elements as elm
from google.colab import files
with schemdraw.Drawing() as d:
d += elm.SourceSin().up().label('10V') # 交流電源
d += elm.Line().right() # 右に行く線
d += elm.ResistorIEC().down().label('10Ω') # 抵抗
d += elm.Inductor().down().label('10mH') # コイル
d += elm.Line().left() # 左に行く線
d += elm.Line().up() # 縦の線
d.save('circuit.png')
こんな具合で回路を作ることができます!
d += elm.ResistorIEC().down().label('10Ω') # 抵抗
の ' ' で囲まれているところがラベルになります。
中身は文字列として認識してくれます。
並列はこんなコードになりました。
import schemdraw
import schemdraw.logic as logic
import schemdraw.elements as elm
from google.colab import files
with schemdraw.Drawing() as d:
d += elm.SourceSin().up().label('10V') # 交流電源
d += elm.Line().right() # 右に行く線
d += elm.Dot() # ドット
d.push() # この位置を記憶
d += elm.ResistorIEC().down().label('10Ω') # 抵抗
d.pop() # さっき記憶した位置に戻る
d += elm.Line().right() # 右に行く線
d += elm.Inductor().down().label('10mH') # コイル
d += elm.Line().left() # 左に行く線
d += elm.Dot() # ドット
d += elm.Line().left() # 左に行く線
d.save('circuit.png')
ここで、直列回路の時と違うのが、
d.push() # この位置を記憶
d.pop() # さっき記憶した位置に戻る
この二つを使っているところかなと思います。
回路を描いて行くときに、このライブラリでは左側から、右回りで回路をつなげて行くようになっています。
そして、回路の要素の右側や下から次の要素をつなげてくれるんです。
そのため、並列で先ほどの記憶させる動作をしないと….。
こんな感じになってしまうのです。
そのため、その位置を記憶させるコードと、記憶した位置に戻るコードを追加しながら回路を描いていきます。
さっきから、いきなり交流電源でやっていますけど、これを使う人は少ないですよね🤣笑
ということで、直流で素子が一つの場合。
import schemdraw
import schemdraw.logic as logic
import schemdraw.elements as elm
from google.colab import files
with schemdraw.Drawing() as d:
d.push()
d += elm.BatteryCell().label('5V') # 直流電源
d.pop()
d += elm.Line().up() # 縦の線
d += elm.ResistorIEC().right().label('5Ω') # 抵抗
d += elm.Line().down() # 縦の線
d.save('circuit.png')
ちょっと複雑にすると、
import schemdraw
import schemdraw.logic as logic
import schemdraw.elements as elm
from google.colab import files
with schemdraw.Drawing() as d:
d.push()
d += elm.BatteryCell().label('5V') # 直流電源
d.pop()
d += elm.Line().up() # 縦の線
d += elm.ResistorIEC().right().label('5Ω') # 抵抗
d.push()
d += elm.ResistorIEC().right().label('5Ω') # 抵抗
d.pop()
d += elm.Dot()
d += elm.Line().up() # 縦の線
d += elm.ResistorIEC().right().label('5Ω') # 抵抗
d += elm.Line().down() # 縦の線
d += elm.Dot()
d += elm.Line().down() # 縦の線
d += elm.Line().left() # 左に行くの線
d.save('circuit.png')
こんな感じです。
d += elm.Line().up() # 縦の線
d += elm.Line().down() # 縦の線
d += elm.Line().left() # 左に行くの線
d += elm.Line().light() # 右に行くの線
この辺り、解説して無いですけどいいですよね?😎笑
Line は線
up , down で縦の線
left , light で横の線
普通の英語だし。
他にもいろんな要素(LED や 論理回路)が用意されているので、ぜひ作図してみてください!
こちらで解説しています。
さて、次はベクトル図です。
交流回路を扱うということは、ベクトル図を描く必要もあるのです。
これが伝わる人は少ないですよね笑
すみません😆笑
こちらのサイトを参考にさせていただきました。
そもそも。
複素平面を描きたくて、いいツールないかなって探してたんです。
でも、
って思って、Python なら簡単に作れるのでは….と探していて見つけたのです!!😉
プログラム
こちらは、上記のサイトに使い方が載っているので、参考にしていただければ良いのですが、少しだけ改変しました。
import numpy as np
import matplotlib.pyplot as plt
from google.colab import files
import cmath
import math
# 5×5サイズのFigureを作成してAxesを追加
fig = plt.figure(figsize = (5, 5))
ax = fig.add_subplot(111)
# 格子点を表示
ax.grid()
# 軸範囲の設定
lim=[-40,40]
ax.set_xlim(lim)
ax.set_ylim(lim)
# x軸とy軸
# 実軸
plt.quiver(lim[0],0,lim[1]*2,0,angles='xy',scale_units='xy',scale=1)
plt.text(1.05*lim[1],0.02*lim[0], 'Re')
# 虚軸
plt.quiver(0,lim[0],0,lim[1]*2,angles='xy',scale_units='xy',scale=1)
plt.text(0.03*lim[0],1.05*lim[1], 'Im')
# 原点
plt.text(0.1*lim[0],0.1*lim[0], '$O$')
# 余分な目盛りを削除
xt=list(ax.get_xticks())
for i in [0,np.floor(lim[0]),np.ceil(lim[1])]:xt.remove(i)
ax.set_xticks(xt)
ax.set_yticks(xt)
# 虚軸の目盛りを変更
imlabel=[]
for yticks in ax.get_yticks():
if yticks < 0 :imlabel.append("- j "+str(yticks*(-1)))
else : imlabel.append("j "+str(yticks))
ax.set_yticklabels(imlabel)
# 軸を中央に移動
ax.spines['bottom'].set_position(('data',0))
ax.spines['left'].set_position(('data',0))
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
a = math.sqrt(48)
b = complex(-30,-a)
test = 10 + 20j
# 極座標に変換
r, rad = cmath.polar(b)
# 単位を度数(degree)に変換
deg = math.degrees(rad)
# 位相(rad)
phase = math.radians(deg)
# 直交座標に変換
ort = cmath.rect(r, phase)
# ベクトルを表示 quiver(始点x,始点y,成分x,成分y)
ax.quiver(0, 0, b.real, b.imag, color = 'red',angles = 'xy', scale_units = 'xy', scale = 1)
# ベクトルにテキストを添える
#ax.text( 0 , 0 , ' ' , color = 'red', size = 15)
print(b)
print(r)
print(deg)
print(rad)
print(ort)
plt.show()
#グラフをダウンロードするときは、plt.show() をコメントアウトして、下記の2つのコードを有効化する
#plt.savefig('grah.png')
#files.download('grah.png')
変わっているところは、
# 虚軸の目盛りを変更
imlabel=[]
for yticks in ax.get_yticks():
if yticks < 0 :imlabel.append("- j "+str(yticks*(-1)))
else : imlabel.append("j "+str(yticks))
ax.set_yticklabels(imlabel)
ここの部分です。
どうしても、y軸の j を数値の前に持ってきたくて。
これで作ったベクトル図はこんな感じ。
画像をダウンロードするときは、
#plt.show()
#グラフをダウンロードするときは、plt.show() をコメントアウトして、下記の2つのコードを有効化する
plt.savefig('grah.png')
files.download('grah.png')
このような状態にしてください。
#plt.show()
注意点は、上記のようにしないと、空白のベクトル図をダウンロードすることになります。
それぞれの要素ですが、
a = math.sqrt(48)
は、48の平方根(√48)を作るコードです。
b = complex(-30,-a)
では、-30 - j √45 という状態を作っています。
複素数を作っています。
test = 10 + 20j
この test という変数のような感じで複素数を設定することも可能です。
ただ、今回は√を使いたかったので、わざわざ、変数a に代入して、comlpex で複素数を作っています。
こちらは、コメントに書いてある通りです!
# 極座標に変換
r, rad = cmath.polar(b)
# 単位を度数(degree)に変換
deg = math.degrees(rad)
# 位相(rad)
phase = math.radians(deg)
# 直交座標に変換
ort = cmath.rect(r, phase)
続いて、ベクトルの設定
# ベクトルを表示 quiver(始点x,始点y,成分x,成分y)
ax.quiver(0, 0, b.real, b.imag, color = "red",angles = 'xy', scale_units = 'xy', scale = 1)
ここでベクトルを設定しているところなので、注意です。
b.real
では、変数 b の実部を取り出しています。
b.imag
では、変数 b の虚部を取り出しています。
よって、変数名が違うなら変える必要があります。
例えば、先ほどの test という変数に入っている複素数を表現したいのであれば、
# ベクトルを表示 quiver(始点x,始点y,成分x,成分y)
ax.quiver(0, 0, test.real, test.imag, color = "red",angles = 'xy', scale_units = 'xy', scale = 1)
のように、 .real , .img の前につける変数名を変えてください。
次に、ベクトル図に添えるテキスト(ラベル)の設定です。
# ベクトルにテキストを添える
#ax.text( 0 , 0 , ' ' , color = 'red', size = 15)
今、上記のようになっていますが、
お試しください。
他にも、color = 'red', size = 15 みたいなところがいろんなところにあります。
色と大きさの設定ですね。
この辺りは、色々変えてみてください。
なんとなくでもいける気がします笑
こちらを解説している動画です
ぜひご覧ください!
何かと0から1を作るのは大変だと思います。学校はどこも似たような問題課題に対応していると思います。それなのに、先生って自分だけで頑張ろうとするんですよね。ボクの資料やnoteが1になって、学校ごとの現状に合わせてカスタムしていただければと思います‼️