# diode.py - de karakteristiek van een siliciumdiode en haar werkpunt met een weerstand
import math

UT = 1.380649e-23 * 298.15 / 1.602176634e-19     # thermische spanning bij 25 graden C (V)
IS, N, RS = 7.02767e-9, 1.80803, 0.0341512        # rekenmodel van een 1N4007


def u_van_i(i):
    """Spanning over de diode (V) bij stroom i (A): Shockley plus serieweerstand."""
    return N * UT * math.log(i / IS + 1) + RS * i


def werkpunt(u_bron, r):
    """Zoek door halveren de stroom waarbij u_diode + r * i = u_bron (maaswet)."""
    laag, hoog = 0.0, u_bron / r
    for _ in range(60):
        midden = (laag + hoog) / 2
        if u_van_i(midden) + r * midden > u_bron:
            hoog = midden
        else:
            laag = midden
    return laag, u_van_i(laag)


print("  I (mA)   U (V)")
for i_ma in (0.1, 1, 10, 100, 1000):
    print(f"{i_ma:8.1f}  {u_van_i(i_ma / 1000):.3f}")

i, u = werkpunt(5.0, 220)
print(f"werkpunt op 5 V met 220 ohm: {i * 1000:.2f} mA bij {u:.3f} V")
print(f"met 'U = 0,7 V': {(5.0 - 0.7) / 220 * 1000:.2f} mA")
