Pythonで理解する電気回路

メモ代わりに使っていきます。

https://youtube.com/playlist?list=PLesZcHaq4h7T-Lnm4hp1PeBgymNGC1q-o&si=4FpXDmHSsyxjCYdu


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/16b7f78b-ec73-83d1-512f-4e70054a2412.png)

https://www2-kawakami.ct.osakafu-u.ac.jp/lecture/
キャパシタとコイルの式
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/bf8b642f-9cbb-30e4-e057-cc094a031525.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/a0d27ce5-af71-4070-10c7-297bf2612f71.png)

コイルの式
L’i(t)=V(t)
電流(t)をtで微分した後にLをかけるとV(t)となる

```py
import numpy as np
import matplotlib.pyplot as plt

# 定数定義
ω = 2*np.pi  # 角周波数
L = 1        # インダクタンス

# 時間の範囲を定義
t = np.linspace(0, 2*np.pi, 1000)

# 入力電流
i_t = np.sin(ω*t)

# 出力電圧
V_t = L * np.gradient(i_t, t)

# プロット
plt.figure(figsize=(10, 5))

plt.subplot(2, 1, 1)
plt.plot(t, i_t, label='Input Current (i(t))', color='blue')
plt.xlabel('Time')
plt.ylabel('Current')
plt.title('Input Current')
plt.legend()

plt.subplot(2, 1, 2)
plt.plot(t, V_t, label='Output Voltage (V(t))', color='red')
plt.xlabel('Time')
plt.ylabel('Voltage')
plt.title('Output Voltage')
plt.legend()

plt.tight_layout()
plt.show()


```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/b068cfbb-e43e-013c-07ee-4e39b86b14f0.png)

キャパシタの式
CV’(t)=I(t)
電圧(t)をtで微分した後にCをかけるとI(t)となる


```py
import numpy as np
import matplotlib.pyplot as plt

# パラメータ
C = 1e-6  # キャパシタンス（1μF）
L = 1     # インダクタンス（1H）
omega = 2*np.pi  # 角周波数

# 時間配列
t = np.linspace(0, 2*np.pi, 1000)

# 入力電流
i_t = np.sin(omega * t)

# 出力電圧
V_t = L * np.gradient(i_t, t)

# プロット
plt.figure(figsize=(10, 5))

plt.subplot(2, 1, 1)
plt.plot(t, i_t, label='Input Current (i(t))')
plt.xlabel('Time')
plt.ylabel('Current')
plt.title('Input Current (i(t))')
plt.grid(True)
plt.legend()

plt.subplot(2, 1, 2)
plt.plot(t, V_t, label='Output Voltage (V(t))')
plt.xlabel('Time')
plt.ylabel('Voltage')
plt.title('Output Voltage (V(t))')
plt.grid(True)
plt.legend()

plt.tight_layout()
plt.show()


```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/b56cd44f-1652-0072-d122-119fb3c7f3ed.png)

https://www.orixrentec.jp/helpful_info/detail.html?id=31

https://www.youtube.com/watch?v=Jc-oKY3ctQA


P(R2)=((V/(R1+R2))^2)×R2
R1を入力側抵抗、R2を出力側抵抗
R1=50Ω

```py
import numpy as np
import matplotlib.pyplot as plt

# Given values
R1 = 50  # 入力側抵抗

# 関数定義
def calculate_P_R2(V, R2):
    return ((V / (R1 + R2)) ** 2) * R2

# パラメータ設定
V = 10  # 仮の電圧

# R2の値を範囲内で変化させる
R2_values = np.linspace(0, 100, 100)  # 範囲は必要に応じて変更可能

# P(R2)を計算
P_R2_values = calculate_P_R2(V, R2_values)

# プロット
plt.plot(R2_values, P_R2_values)
plt.xlabel('R2 (Ω)')
plt.ylabel('P(R2)')
plt.title('Power vs R2')
plt.grid(True)
plt.show()

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/0830dda6-52c5-54b6-0c2a-d1bcda22f72c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/f5332f42-d6f2-9c99-9d14-104378a8f143.png)


```py
import numpy as np

# 与えられた値
R1 = 1
R2 = 2
R3 = 3
E1 = 10
E2 = 20

# 係数行列を作成
A = np.array([[R1+R3, R3], [R3, R2+R3]])
# 定数項を作成
B = np.array([E1, E2])

# 行列方程式を解く
Ia, Ib = np.linalg.solve(A, B)

print("Ia =", Ia)
print("Ib =", Ib)

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/4442a68f-ca78-4864-619f-42a0198f3368.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/537011e5-cbbd-2b82-ce8a-e0eb3a3a3198.png)





```py

import numpy as np

# 係数行列 A を定義
A = np.array([[R1 + R2 + R3, -R3, -R2],
              [-R3, R3 + R4 + R5, -R4],
              [-R2, -R4, R2 + R4 + R6]])

# 右辺のベクトル b を定義
b = np.array([E1, E2, 0])

# 逆行列を計算
A_inv = np.linalg.inv(A)

# 解を計算
x = np.dot(A_inv, b)

# 解を表示
print("解 (i1, i2, i3):", x)


```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/8643095c-38b5-53f3-cd53-5fc1c069bd7b.png)




```py
import numpy as np
import matplotlib.pyplot as plt

# パラメータの設定
N = 1  # 巻数
omega = 1  # 角周波数

# 時間の範囲を設定
t = np.linspace(0, 2*np.pi, 1000)

# 磁束と起電力の計算
flux = np.sin(omega * t)
induced_voltage = -N * omega * np.cos(omega * t)

# プロット
plt.figure(figsize=(10, 5))

# 磁束のプロット
plt.subplot(2, 1, 1)
plt.plot(t, flux, label='Φ(t) = sin(ωt)', color='blue')
plt.title('Flux (Φ) vs. Time')
plt.xlabel('Time')
plt.ylabel('Flux')
plt.legend()

# 起電力のプロット
plt.subplot(2, 1, 2)
plt.plot(t, induced_voltage, label='E(t) = -NΦ’(t)', color='red')
plt.title('Induced Voltage (E) vs. Time')
plt.xlabel('Time')
plt.ylabel('Induced Voltage')
plt.legend()

plt.tight_layout()
plt.show()

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/2042ed38-6dd4-b239-e826-10cb81e22d60.png)




共振
```


import numpy as np

# インピーダンスの計算
def calculate_impedance(R, L, C, omega):
    XL = omega * L  # インダクタンスのリアクタンス
    XC = 1 / (omega * C)  # キャパシタンスのリアクタンス
    impedance = np.sqrt(R**2 + (XL - XC)**2)
    return impedance

# 共振周波数の計算
def calculate_resonant_frequency(L, C):
    return 1 / (2 * np.pi * np.sqrt(L * C))

# Qの計算
def calculate_quality_factor(L, C, resonant_frequency, bandwidth):
    return resonant_frequency / bandwidth

# パラメータの設定
R = 100  # 抵抗（単位: オーム）
L = 0.1  # インダクタンス（単位: ヘンリー）
C = 1e-6  # キャパシタンス（単位: ファラド）
omega = 2 * np.pi * 1000  # 角周波数（単位: ラジアン/秒）
bandwidth = 1000  # 帯域幅（単位: Hz）

# インピーダンスの計算
impedance = calculate_impedance(R, L, C, omega)
print("Impedance:", impedance, "ohms")

# 共振周波数の計算
resonant_frequency = calculate_resonant_frequency(L, C)
print("Resonant Frequency:", resonant_frequency, "Hz")

# Qの計算
quality_factor = calculate_quality_factor(L, C, resonant_frequency, bandwidth)
print("Quality Factor:", quality_factor)

```


波

```py
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 定数の設定
A = 5  # 振幅
T = 1  # 時間周期
w = 2 * np.pi / T  # 角周波数
lmbda = 1  # 波長

# 空間と時間の範囲を設定
x = np.linspace(-10, 10, 100)
t = np.linspace(0, 10, 100)

# 空間と時間の格子を生成
X, T = np.meshgrid(x, t)

# 波動関数の計算
Y = A * np.sin(w * T - (X / lmbda))

# 三次元プロット
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, T, Y, cmap='viridis')

# 軸ラベルの設定
ax.set_xlabel('x')
ax.set_ylabel('t')
ax.set_zlabel('y')

# グラフを表示
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/eace3761-7df0-b303-4ae8-df868ecf658d.png)


```py
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

def y(t, theta, A, omega):
    return A * np.sin(omega * t + theta)

# tとθの範囲を設定
t = np.linspace(0, 10, 100)  # tの範囲と点の数を設定
theta = np.linspace(0, 2 * np.pi, 100)  # θの範囲と点の数を設定
T, Theta = np.meshgrid(t, theta)  # 2次元のメッシュグリッドを作成

# 振幅と角周波数を設定
A = 1
omega = 1

# yの値を計算
Y = y(T, Theta, A, omega)

# 3Dプロット
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(T, Theta, Y, cmap='viridis')

# 軸ラベル
ax.set_xlabel('t')
ax.set_ylabel('θ')
ax.set_zlabel('y')

```



https://www.youtube.com/watch?v=v10OMFcb0Tg&ab_channel=DigiKey%E6%97%A5%E6%9C%AC%E5%85%AC%E5%BC%8F%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB


```py
import numpy as np
import matplotlib.pyplot as plt

# ωの値を設定します
ω = 2 * np.pi

# tの範囲を設定します
t = np.linspace(0, 2*np.pi, 1000)

# exp(jωt)とその微分、積分を計算します
exp_jωt = np.exp(1j * ω * t)
diff_exp_jωt = 1j * ω * exp_jωt
int_exp_jωt = (1 / (1j * ω)) * exp_jωt

# プロットします
plt.figure(figsize=(10, 6))

plt.subplot(3, 1, 1)
plt.plot(t, np.real(exp_jωt), label='Re{exp(jωt)}')
plt.plot(t, np.imag(exp_jωt), label='Im{exp(jωt)}')
plt.xlabel('t')
plt.ylabel('exp(jωt)')
plt.legend()

plt.subplot(3, 1, 2)
plt.plot(t, np.real(diff_exp_jωt), label='Re{d/dt(exp(jωt))}')
plt.plot(t, np.imag(diff_exp_jωt), label='Im{d/dt(exp(jωt))}')
plt.xlabel('t')
plt.ylabel('d/dt(exp(jωt))')
plt.legend()

plt.subplot(3, 1, 3)
plt.plot(t, np.real(int_exp_jωt), label='Re{∫exp(jωt)dt}')
plt.plot(t, np.imag(int_exp_jωt), label='Im{∫exp(jωt)dt}')
plt.xlabel('t')
plt.ylabel('∫exp(jωt)dt')
plt.legend()

plt.tight_layout()
plt.show()

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/bfbdf024-3dfd-f96c-1be3-c32f468f52ae.png)


i(s)×R=V(s)
i(s)×(sL)=V(s)
i(s)×(1/(sC))=V(s)

伝達関数について、抵抗はR、コイルは(sL)、キャパシタは(1/(Cs))とする


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/e50ff7d3-a724-aa42-9d43-badcc386b1e4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/f04fc15f-8b38-9f22-e984-97ae7b18ce44.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/3083a0cb-7f05-7189-ecb4-3cee6b7bc8c9.png)

抵抗はRとコイルは(sL)とキャパシタは(1/(Cs))で周波数応答をみる

https://controlabo.com/bode-diagram/
                                                                        
ボード線図
```py
import numpy as np
import matplotlib.pyplot as plt

# 抵抗の周波数応答
def resistor_response(freq, R):
    return np.ones_like(freq) * R

# コイルの周波数応答
def inductor_response(freq, L):
    return 1j * 2 * np.pi * freq * L

# キャパシタの周波数応答
def capacitor_response(freq, C):
    return 1 / (1j * 2 * np.pi * freq * C)

# 周波数範囲の設定
freq = np.logspace(0, 6, 1000)  # 1 Hz から 1 MHz まで

# 抵抗の周波数応答をプロット
R = 10  # 抵抗値
resistor_impedance = resistor_response(freq, R)
plt.loglog(freq, np.abs(resistor_impedance), label='Resistor (R = {} ohm)'.format(R))

# コイルの周波数応答をプロット
L = 0.01  # ヘンリー（H）
inductor_impedance = inductor_response(freq, L)
plt.loglog(freq, np.abs(inductor_impedance), label='Inductor (L = {} H)'.format(L))

# キャパシタの周波数応答をプロット
C = 0.00001  # ファラド（F）
capacitor_impedance = capacitor_response(freq, C)
plt.loglog(freq, np.abs(capacitor_impedance), label='Capacitor (C = {} F)'.format(C))

# プロットの設定
plt.xlabel('Frequency (Hz)')
plt.ylabel('Impedance (ohm)')
plt.title('Frequency Response')
plt.legend()
plt.grid(True)
plt.show()

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/d7dc5b36-6258-9ef4-1f66-425d9eb53ef8.png)

RCL直列回路

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/11e020aa-69da-55f3-c0f7-8b57b1d00755.png)




```py
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal

# 伝達関数の係数を定義
R = 1
L = 0.2  # Lの値を変更
C = 0.00001  # Cの値を変更
s = signal.TransferFunction([1], [C*L, R*L, 1])

# 周波数応答を計算
w, mag, phase = signal.bode(s)

# Bodeプロットを描画
plt.figure()
plt.subplot(2, 1, 1)
plt.semilogx(w, mag)  # 振幅プロット
plt.title('Bode Plot - Amplitude')
plt.ylabel('Magnitude [dB]')
plt.grid(True)

plt.subplot(2, 1, 2)
plt.semilogx(w, phase)  # 位相プロット
plt.title('Bode Plot - Phase')
plt.xlabel('Frequency [rad/s]')
plt.ylabel('Phase [deg]')
plt.grid(True)
plt.show()

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/8eec8df8-e35c-f68e-1e53-0f23eb124db1.png)


RC積分回路
伝達関数=(1/(sC))/(R+1/(sC))

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/3c5f8475-4bab-83bf-eb69-40f262f731e2.png)

https://t-design-free.com/rc-circuit/


```py
import numpy as np
import matplotlib.pyplot as plt

# パラメータの設定
R = 1
C = 0.000001

# 角周波数の範囲を設定
omega = np.logspace(-1, 2, 400)

# 伝達関数の計算
s = 1j * omega
H = (1/(s*C)) / (R + 1/(s*C))

# 大きさと位相の計算
magnitude = np.abs(H)
phase = np.angle(H, deg=True)

# ボード線図のプロット
plt.figure(figsize=(10, 5))
plt.subplot(2, 1, 1)
plt.semilogx(omega, 20 * np.log10(magnitude))
plt.title('Bode Diagram')
plt.ylabel('Magnitude (dB)')
plt.grid(True)

plt.subplot(2, 1, 2)
plt.semilogx(omega, phase)
plt.xlabel('Frequency (rad/s)')
plt.ylabel('Phase (degrees)')
plt.grid(True)

plt.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/04d99c14-7436-beb2-fd7a-5b92e322a352.png)

CR微分回路
伝達関数=(R)/(R+1/(sC))
https://t-design-free.com/cr-circuit/
```py
import numpy as np
import matplotlib.pyplot as plt

# 伝達関数の定義
R = 1
C = 0.00001
def transfer_function(omega):
    s = 1j * omega
    return R / (R + 1 / (s * C))

# 大きさと位相を計算する関数
def magnitude_phase(omega):
    tf = transfer_function(omega)
    magnitude = np.abs(tf)
    phase = np.angle(tf, deg=True) # 引数deg=Trueで位相を度数法で取得
    return magnitude, phase

# 周波数の範囲を設定
omega = np.logspace(0, 2, 100) # 1から100までの対数スケールの周波数配列

# 大きさと位相の配列を計算
magnitude, phase = magnitude_phase(omega)

# ボード線図をプロット
plt.figure(figsize=(10, 6))

plt.subplot(2, 1, 1)
plt.semilogx(omega, 20 * np.log10(magnitude))
plt.title('Bode Plot')
plt.ylabel('Magnitude (dB)')
plt.grid()

plt.subplot(2, 1, 2)
plt.semilogx(omega, phase)
plt.xlabel('Frequency (rad/s)')
plt.ylabel('Phase (degrees)')
plt.grid()

plt.show()


```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/126af529-72df-2e25-43ae-0f736b7066e4.png)

ベクトルオペレーター
https://jeea.or.jp/course/contents/01153/

```py
import numpy as np
import matplotlib.pyplot as plt

# 角度（ラジアン）を定義
angles = np.array([2*np.pi/3, 4*np.pi/3, 6*np.pi/3])

# 指数関数を計算
exponential_values = np.exp(1j * angles)

# 実部と虚部を取得
real_part = np.real(exponential_values)
imaginary_part = np.imag(exponential_values)

# プロット
plt.figure(figsize=(6, 6))
plt.scatter(real_part, imaginary_part, color='red')
plt.axhline(0, color='black',linewidth=0.5)
plt.axvline(0, color='black',linewidth=0.5)
plt.grid(color = 'gray', linestyle = '--', linewidth = 0.5)
plt.xlabel('Real')
plt.ylabel('Imaginary')
plt.title('Complex Exponential Values')
plt.axis('equal')
plt.show()

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/ef776054-863c-ede2-71be-8735bc90aa7a.png)

分布定数回路
http://asaseno.aki.gs/tech/bunpu01.html


http://asaseno.aki.gs/tech/index.html

https://zawa2.com/ZZsim/index.html#h2_S%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%B7%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3

伝搬定数

https://www2-kawakami.ct.osakafu-u.ac.jp/omu-content/uploads/sites/1161/Lecture_Data/Electric_Circuit_II/01_Lecture/09_lecture_electric_circuit_II.pdf

```
import numpy as np
import matplotlib.pyplot as plt

# 定義されていない変数を設定
R = 10
L = 0.5
G = 0.01
C = 0.01
omega = np.linspace(0, 100, 1000)  # 0から100までの1000点でomegaを定義

# gammaとZの計算
gamma = np.sqrt((R + 1j * omega * L) * (G + 1j * omega * C))
Z = np.sqrt((R + 1j * omega * L) / (G + 1j * omega * C))

# プロット
plt.figure()
plt.plot(omega, np.real(gamma), label='Real part of gamma')
plt.plot(omega, np.imag(gamma), label='Imaginary part of gamma')
plt.xlabel('Frequency (omega)')
plt.ylabel('Propagation Constant (gamma)')
plt.legend()
plt.title('Propagation Constant vs Frequency')
plt.grid(True)

plt.figure()
plt.plot(omega, np.real(Z), label='Real part of Z')
plt.plot(omega, np.imag(Z), label='Imaginary part of Z')
plt.xlabel('Frequency (omega)')
plt.ylabel('Characteristic Impedance (Z)')
plt.legend()
plt.title('Characteristic Impedance vs Frequency')
plt.grid(True)

plt.show()

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/7c67a083-ff68-f7b2-b614-8778543ab8d4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759109/dfa2be96-9c4a-abd2-e247-00e8d82e331d.png)


RL回路の過渡現象

```py
import numpy as np
import matplotlib.pyplot as plt
# パラメータ設定
E = 10  # 電圧
R = 2   # 抵抗
L = 5   # インダクタンス

# 時間軸の設定
t = np.linspace(0, 10, 400)

# 電流 I(t) の定義
I_t = (E / R) * (1 - np.exp(-R * t / L))

# 電圧 L * I'(t) の定義
V_t = E * np.exp(-R * t / L)

# プロット
plt.figure()
plt.plot(t, I_t, label='I(t)')
plt.plot(t, V_t, label="L * I'(t)")
plt.xlabel('Time t')
plt.ylabel('Current/Voltage')
plt.title('RL Circuit Transient Response')
plt.legend()
plt.grid(True)
plt.show()

```

RC回路の過渡現象

```py
import numpy as np
import matplotlib.pyplot as plt
# パラメータ設定
C = 1   # キャパシタンス
R = 2   # 抵抗
E = 10  # 電圧

# 電荷 q(t) の定義
q_t = C * E * (1 - np.exp(-t / (R * C)))

# 電流 q'(t) の定義
I_t = (E / R) * np.exp(-t / (R * C))

# プロット
plt.figure()
plt.plot(t, q_t, label='q(t)')
plt.plot(t, I_t, label="q'(t)")
plt.xlabel('Time t')
plt.ylabel('Charge/Current')
plt.title('RC Circuit Transient Response')
plt.legend()
plt.grid(True)
plt.show()


```


LC回路の過渡現象

```py

import numpy as np
import matplotlib.pyplot as plt
# パラメータ設定
C = 1   # キャパシタンス
L = 5   # インダクタンス
E = 10  # 電圧

# 電荷 q(t) の定義
q_t = C * E * (1 - np.cos(t / np.sqrt(L * C)))

# 電流 q'(t) の定義
I_t = (E / np.sqrt(L / C)) * np.sin(t / np.sqrt(L * C))

# プロット
plt.figure()
plt.plot(t, q_t, label='q(t)')
plt.plot(t, I_t, label="q'(t)")
plt.xlabel('Time t')
plt.ylabel('Charge/Current')
plt.title('LC Circuit Transient Response')
plt.legend()
plt.grid(True)
plt.show()



```