# mppt.py — gladde synthetische PV-curve; stationmodel, geen fabrikantdata
import numpy as np
voc, vorm, pmax = 168.0, 16.0, 4200.0
vm = voc/(vorm+1)**(1/vorm)
isc = pmax/(vm*vorm/(vorm+1))
def stroom(v, zon=1.0):
    return zon*isc*max(0.0,1-(v/voc)**vorm)
def vermogen(v,zon=1.0):
    return v*stroom(v,zon)

# buitenlus vraagt bronspanning; binnenlus regelt de converter daarop
v, richting, vorig = 90.0, 1.0, None
rij=[]
for k in range(160):
    p=vermogen(v)
    rij.append((k,v,p))
    if vorig is not None and p<vorig:
        richting=-richting
    vorig=p
    v=np.clip(v+richting,20.0,165.0)
rij=np.array(rij)
print(f"modelmaximum {vm:.3f} V, {stroom(vm):.3f} A, {vermogen(vm):.1f} W")
print(f"P&O laatste 20 stappen: {rij[-20:,2].min():.1f} tot {rij[-20:,2].max():.1f} W")
for ub in (44.0,48.0,56.0):
    print(f"batterij {ub:.0f} V: D={ub/vm:.4f}, Iuit={0.97*pmax/ub:.2f} A")
print(f"verlies bij 97%: {(1-0.97)*pmax:.1f} W")
print(f"koude Voc bij -15 °C: {168*(1+0.0028*40):.3f} V")
