v2: PV-risk front-load — nabít v neg okně co nejdřív (nejistota predikce)
v1 to řešil rampou (plný výkon než se řeže pole A — zelený bonus B, riziko večerního mraku). v2 byl k načasování v okně sell<0 indiferentní (PV zdarma kdykoliv) a směl nabíjení odložit — odklad ale spoléhá na predikci. Mechanismus: malá prémie za držení energie dřív (objective −= soc[t] × frontload v neg slotech). Rozbíjí indiferenci směrem k front-loadu, nikdy nepřebije skutečné ceny. Velikost z DB: asset_battery. planner_pv_risk_frontload_czk_kwh (V090, default 0.01; 0 = vypnuto), přes fn_planning_site_context (R__039). Test: 4 sloty plným tempem od startu. Eval fixtures beze změny (sloupec v nich není → 0). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -193,6 +193,22 @@ class NightReserveTests(unittest.TestCase):
|
||||
self.assertEqual(len(results), 8)
|
||||
|
||||
|
||||
class PvRiskFrontloadTests(unittest.TestCase):
|
||||
def test_neg_window_charges_asap(self) -> None:
|
||||
# sell<0 okno, PV >> load, prázdnější baterie: s frontload prémií musí
|
||||
# nabíjení běžet plným tempem od začátku (ne odložené na konec okna)
|
||||
bat = _battery()
|
||||
bat.planner_pv_risk_frontload_czk_kwh = 0.05
|
||||
slots = [_slot(_BASE, i, buy=2.0, sell=-0.5, pv_a=12000, load=500) for i in range(12)]
|
||||
results, _, _ = _solve(slots, battery=bat, soc0=0.2 * bat.usable_capacity_wh)
|
||||
# max tempo: 8 kW × 0.25 h × 0.95 eff = 1.9 kWh/slot = 9.5 p.b. na 20 kWh
|
||||
soc_mid = results[3].battery_soc_target
|
||||
self.assertGreaterEqual(
|
||||
soc_mid, 20.0 + 4 * 9.0,
|
||||
"frontload: prvni 4 sloty maji nabijet plnym vykonem",
|
||||
)
|
||||
|
||||
|
||||
class EvDeadlineTests(unittest.TestCase):
|
||||
def test_ev_energy_delivered_before_deadline(self) -> None:
|
||||
slots = [_slot(_BASE, i, buy=2.0 if i < 8 else 6.0, sell=1.0, ev1=True) for i in range(16)]
|
||||
|
||||
Reference in New Issue
Block a user