はじめに
Pythonを勉強していくうちに、複素数の計算が簡単にできそうということが分かったので、試しに電気工学で使われるオームの法則をPythonで本当に簡単に実装できるのかやってみました。
オームの法則(直流)
電気工学では最も重要な法則のうちの一つで、一番初めに習う公式です。
V = IR
※ $V$:電圧、$I$:電流、$R$:抵抗
上記、オームの法則をPythonで記述します。
$V$、$I$、$R$のうち、空で入力したパラメータに関して計算するように組みます。
# V = IR for DC circuit
print('Empty a parameter to calculate')
V = float(input('Input V : ') or 0)
I = float(input('Input I : ') or 0)
R = float(input('Input R : ') or 0)
if not V:
V = R * I
elif not I:
I = V / R
elif not R:
R = V / I
else:
print('Empty a parameter to calculate')
print('V =', V, '[V]')
print('I =', I, '[A]')
print('R =', R, '[Ω]')
最初の入力部分ですが、空で入力させたパラメータを計算する想定です。
そのため、以下のように入力をそのまま変換させると、空入力のパラメータで変換時にエラーが発生します。
V = float(input('Input V : '))
そのため、一旦str型で入力させてから、入力が空でない場合のみ変換するように記述しました。
本当はもうちょっと簡単な記法ができたらいいな...
inputの初期値とか設定できないものか調べましたが、そういった引数は見つかりませんでしたorz
2019/11/10追記
以下のような記法ができることをコメントで教えていただきました。
こうするとif文なしで数値に変換できました。これはすごい!
V = float(input('Input V : ') or 0)
or演算子というのは、実は左側の値を真偽判定して結果を返すそうです。深い、なるほど...
https://docs.python.org/ja/3/library/stdtypes.html#boolean-operations-and-or-not
結果は以下のように出力されます。
Empty a parameter to calculate
Input V : 100
Input I :
Input R : 50
V = 100.0 [V]
I = 2.0 [A]
R = 50.0 [Ω]
オームの法則(交流)
ここからが今回の本題です。
直流では複素数を全く使いませんでしたが、交流ではインピーダンス(Z)を加えた複素数を計算する必要が出てきます。
v = iz
※ $v$:電圧、$i$:電流、$z$:インピーダンス
z = \sqrt{(r^2+x^2)}
※ $r$:抵抗、$x$:リアクタンス
直流と違うところはパラメータに**$x$(リアクタンス)**が追加されています。
このリアクタンスが交流回路での虚数成分を表します。
それでは交流回路でのオームの法則をPythonで記述します。
$v$、$i$、$r$、$x$のうち、空で入力したパラメータに関して計算するようにします。
# v = iz for AC circuit
print('Empty a parameter to calculate')
v = complex(input('Input v[V] : ') or 0)
i = complex(input('Input i[A] : ') or 0)
r = complex(input('Input r[Ω] : ') or 0)
x = complex(input('Input x[jΩ] : ') or 0)*1j
if not v:
z = (r ** 2 + (x / 1j) ** 2) ** (1/2)
v = z * i
elif not i:
z = (r ** 2 + (x / 1j) ** 2) ** (1/2)
i = v / z
elif not r:
z = v / i
r = (z ** 2 - (x / 1j) ** 2) ** (1/2)
elif not x:
z = v / i
x = (z ** 2 - r ** 2) ** (1/2) *1j
else:
print('Empty a parameter to calculate')
print('v =', v, '[V]')
print('i =', i, '[A]')
print('r =', r, '[Ω]')
print('x =', x, '[jΩ]')
print('z =', z, '[Ω]')
意外と詰まったのは入力は実数で入力させて、内部では実数から複素数に変換しなければいけないところが難しかったです。
「*1j」で実数→虚数へ変換できることさえ分かれば簡単です。
結果は以下のように出力されます。
Empty a parameter to calculate
Input v[V] : 10
Input i[A] : 2
Input r[Ω] : 3
Input x[jΩ] :
v = (10+0j) [V]
i = (2+0j) [A]
r = (3+0j) [Ω]
x = 4j [jΩ]
z = (5+0j) [Ω]
複素数を使っても間違いなくオームの法則が計算できました。
入出力の部分とか、実数から複素数への変換方法など、時々つまずくところはあったものの、Pythonでの虚数の書き方さえ分かれば、あとは素直に計算式さえ書けば動作してくれるのでほとんど問題ありませんでした。
本当に簡単にできてしまったと思う。
やはり君はすごいぞ!Pythonくん!