# rlc.py - frequentiekarakteristiek van de serie-RLC-kring van de proef
import numpy as np

L, C = 10e-3, 100e-9                  # spoel (H) en condensator (F)
R_L, R_m, R_g = 25.0, 10.0, 50.0      # weerstand van de spoel, meetweerstand, uitgang van de generator (ohm)
U_g = 2.0                             # amplitude van de generator zonder last (V)
R = R_L + R_m + R_g


def Z(f):
    """Impedantie van de hele kring (ohm) bij frequentie f (Hz)."""
    w = 2 * np.pi * f
    return R + 1j * w * L + 1 / (1j * w * C)


f = np.logspace(2, 5, 30001)          # 100 Hz tot 100 kHz
I = U_g / np.abs(Z(f))                # amplitude van de stroom (A)
k = np.argmax(I)
f0 = f[k]
band = f[I >= I[k] / np.sqrt(2)]      # halfvermogenpunten
Q = np.sqrt(L / C) / R
print(f"f0 = {f0:.0f} Hz (theorie {1 / (2 * np.pi * np.sqrt(L * C)):.0f} Hz), Q = {Q:.2f}")
print(f"bandbreedte {band[-1] - band[0]:.0f} Hz, van {band[0]:.0f} tot {band[-1]:.0f} Hz (f0/Q = {f0 / Q:.0f} Hz)")
print(f"bij f0: I = {1000 * I[k]:.1f} mA, U_R = {1000 * I[k] * R_m:.0f} mV, U_C = {I[k] / (2 * np.pi * f0 * C):.2f} V")
for fx in (1000, 3000, 5000, 7000, 20000):
    z = Z(fx)
    print(f"{fx:6d} Hz: |Z| = {abs(z):6.0f} ohm, fase {np.degrees(np.angle(z)):+6.1f} graden")
