dynamisk-rettsstat/docs/modellkart.md
Kjell Tore Guttormsen 464ad38b49
feat: model core, launcher, reproduction check and the first two skills
The core in modell/kjerne/ is an unmodified copy of sim.py, diagnose.py and
forlop.py from den-dynamiske-rettsstaten @2badc25, pinned by sha256.
kjor.py is the single entry point; kontroll.py reproduces the note's 22 data
files and printed results. Skills: diagnose and forlop (Norwegian).

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-11 13:53:32 +01:00

269 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Modellkart
Kartet beskriver modellen i notatet *Den dynamiske rettsstaten* slik koden i `modell/kjerne/` regner den, ved
**commit 2badc25** i notatets repo (`2badc25e5134ee26309bd8c3bd008ac64afe55a4`). Filene i `modell/kjerne/` er
byte-like kopier av `paper/sim.py`, `paper/diagnose.py` og `paper/forlop.py` ved den commiten, så linjenumrene i
notatets vedlegg C gjelder `modell/kjerne/sim.py` direkte. Verdiene under er lest fra koden. Ligningsnumre, tabeller og
avsnitt er notatets.
Kartet er for den som vil endre modellen: hva tilstanden er, hvor parameterne står, hvilke ligninger koden regner, og
hvilke kontroller som skal holde etter en endring.
## (a) Tilstandsvariabler og avledede størrelser
Tidsenhet: måned. Nivåene er normalisert slik at referanselikevekten har K = 1, T = 1 og Λ = 0,80.
| I koden | Symbol | Betyr | Merknad |
|---|---|---|---|
| `t` | t | tid i måneder | Euler-steg `DT` = 0,05 |
| `K` | K_obj | vektet objektiv kriminalitetsbelastning | 1 i referansen; i `simulate_chain2` er K = K_A + K_B |
| `KA`, `KB` | K_A, K_B | belastning fra alvorlige (A) og øvrige (B) saker | bare `simulate_chain2`; startverdier 0,4 og 0,6 |
| `U` | U | opplevd trygghet | start 0,80 |
| `L` | Λ | tillit | start 0,80; holdes innenfor [10⁻⁴, 1 − 10⁻⁴] etter hvert steg |
| `T` | T | innsats (politiets) | proporsjonal regel T = T₀ + k_p (K(t − τ) − K*), begrenset til [0, T_max]; eller MPC |
| `Q` | Q_D | kø i domstolen (modellens ledd med kø) | normaliserte enheter; aldri negativ |
| `QA`, `QB` | Q_A, Q_B | kø per sakstype | bare `simulate_chain2` |
| `tauD` | τ_D | saksbehandlingstid = m_D + Q_D / Z_D | `tauA`, `tauB` per sakstype |
| `JD` | J_D | innstrømning til domstolen = ξ_D F | lign. (27) |
| `RD` | R_D | avgjorte saker = Z_D Q_D / (Q_D + m_D Z_D) | lign. (28) |
| `Fa`, `F` | F | fjerningsstrøm = `removal(K, L, T)` | lign. (12) og (12′) |
| `Z` | Z_D | kapasitet i domstolen | `ZD0` = 0,10 / 0,95 før sjokket; endogen i `simulate_endo` |
| `xi` | ξ_D | andel saker til domstolen (1 − andel ledet utenom) | ≥ `xi_min` = 0,8 i reglene |
| `q` | q | prosessuell kvalitet | bare kvalitetssløyfen i `simulate_endo` |
| `g` | g | virkning av lang saksbehandlingstid = D / (D + τ_h), D = max(0, τ_D − τ_D^ref) | lign. (30) |
| `Omega(t, p)` | Ω | strukturelt pådrag | Ω₀, ganget med `shock` fra `t_shock` |
| `tau_ref` | τ_D^ref | saksbehandlingstid i utgangslikevekten | 3 måneder |
| `tau` | τ | forsinkelse i politiets sløyfe | argument; et helt antall tidssteg |
| `kp` | k_p | reaktivitet i den proporsjonale regelen | argument, standard 3,0 |
Ligningene slik koden regner dem (`deriv`, `deriv_chain`, `deriv_chain_xz`, `court`):
- K′ = Ω (1 + χ_D g) − (1 − ξ_D ϑ) F − ϑ R_D − δ K. Uten kjede (`deriv`): K′ = Ω − F − δ K.
- F = γ′ Λ^η T K / (1 + K / K_sat), γ′ = γ (1 + 1 / K_sat). Med K_sat = ∞ er F = γ Λ^η T K.
- U′ = κ_U (U_eq − U), U_eq = U₀ − ψ (K − 1), begrenset til [0, 1].
- Λ′ = κ_Λ (Λ₀ + μ₁ (U − U₀) + μ₃ q − μ₄ g − Λ) − μ₂ Λ · max(0, T − T_prop K)², T_prop = 1,6.
- Q_D′ = J_D − R_D − ς_D Q_D.
## (b) Parameterne
### `P`: grunnmodellen (`sim.py`, l. 27–40; tabell 3)
| Navn | Verdi | Enhet | Betyr | I notatet |
|---|---|---|---|---|
| `gamma` | 0,125 | per mnd | effektivitet per enhet tiltak; gir γΛT = 0,10 i likevekt | γ; lign. (12), avsnitt 4.3 |
| `eta` | 1,0 | – | tillitselastisitet | η; lign. (12) |
| `delta` | 0,02 | per mnd | naturlig avgang | δ; lign. (12) |
| `Omega0` | 0,12 | per mnd | strukturelt pådrag ved referansen (gir K = 1 ved T = 1, Λ = 0,8) | Ω₀; lign. (6), avsnitt 3 |
| `shock` | 1,30 | faktor | varig økning i Ω (0,12 → 0,156) | avsnitt 8.1 |
| `t_shock` | 12,0 | mnd | når økningen begynner | avsnitt 8.1 |
| `T0` | 1,0 | – | grunninnsats | T₀; lign. (11), avsnitt 4.2 |
| `Tmax` | 3,0 | – | kapasitetstak for innsatsen | T^max; lign. (11), (23) |
| `Kstar` | 1,0 | – | målnivå for K | K*; lign. (11) |
| `kU` | 0,25 | per mnd | trygghetens tilpasningsrate | κ_U; lign. (20), avsnitt 6.1 |
| `U0` | 0,80 | – | trygghet i referansen | U₀; lign. (20) |
| `psiU` | 0,30 | – | hvor mye trygghet faller per enhet K over 1 | ψ; lign. (20) |
| `kL` | 0,10 | per mnd | tillitens tilpasningsrate | κ_Λ; lign. (21), avsnitt 6.1 |
| `mu1` | 0,50 | – | tillitens følsomhet for trygghet | μ₁; lign. (21) |
| `mu2` | 0,30 | – | tillitstap ved uforholdsmessig innsats | μ₂; lign. (21) |
| `Tprop` | 1,6 | – | grense for forholdsmessig innsats, T_prop(K) = 1,6 K | T_prop; lign. (21) |
| `Lam0` | 0,80 | – | tillit i referansen | Λ₀; lign. (21) |
| `ksat` | ∞ | – | politiets halvmetningsnivå (Holling type II); 3 og 1,5 i robusthetsanalysen | K_sat; lign. (12′), avsnitt 8.3, tabell 5 |
Andre konstanter i `sim.py`:
| Navn | Verdi | Betyr |
|---|---|---|
| `DT` | 0,05 mnd | tidssteg (eksplisitt Euler) |
| `TEND` | 120,0 mnd | horisont for `simulate`, `simulate_chain`, `simulate_chain2`, `simulate_soc`; standard for `simulate_endo` |
| `UPS0` | 0,95 | domstolens utnyttelse før sjokket |
| `TAU_REF` | 3,0 mnd | saksbehandlingstid i utgangslikevekten |
| `ZD0` | 0,10 / 0,95 ≈ 0,105 | domstolens kapasitet før sjokket |
| `VARSIGMA` | 0,01 per mnd | frafall fra køen (henleggelse, foreldelse) |
| `J0` | 0,10 | fjerningsstrømmen i referansen, γ Λ₀ T₀ |
| `MD` | ≈ 0,233 mnd | ren behandlingstid m_D, kalibrert i lukket form slik at τ_D = 3 i utgangslikevekten (l. 155) |
MPC (`mpc_step`, `mpc_step_chain`; lign. (24), avsnitt 6.3 og 8.1): horisont `H` = 24 mnd, vekt på innsatsavvik
`lamT` = 0,05, vekt på tillitsbrudd `lamL` = 20, myk tillitsgrense Λ₀ − 0,05 = 0,75. Beslutningen tas hver måned.
### `CH0`: domstolen som ledd med kø (l. 157–158; tabell 3, avsnitt 7.3 og 8.2)
| Navn | Verdi | Betyr | I notatet |
|---|---|---|---|
| `Z` | `ZD0` ≈ 0,105 | kapasitet | Z_D; lign. (28) |
| `m` | `MD` ≈ 0,233 mnd | ren behandlingstid | m_D; lign. (28) |
| `theta` | 0,5 | andel av virkningen som krever dom | ϑ; lign. (29) |
| `chi` | 0,15 | største økning i Ω av lang saksbehandlingstid (celerity) | χ_D; lign. (30), tabell 4 |
| `mu4` | 0,12 | største tillitstap av lang saksbehandlingstid | μ₄; lign. (30) |
| `tauh` | 9,0 mnd | halvmetningstid for g | τ_h; lign. (30) |
| `varsigma` | 0,01 per mnd | frafall fra køen | ς_D; lign. (28) |
| `xi` | 1,0 | andel saker til domstolen | ξ_D; lign. (27) |
| `Zfun`, `xifun` | `None` | tidsplan for kapasitet og andel (funksjoner av t) | scenario 3–5, avsnitt 8.2 |
| `dbr` | `None` | trommel–buffer–tau: innsatsen begrenses slik at J_D ≤ `dbr` · Z_D (0,95 i scenario 6 og 7) | lign. (32) |
### `CH2`: domstol med to sakstyper (l. 352–354; avsnitt 8.3, tabell 6)
| Navn | Verdi | Betyr |
|---|---|---|
| `Z`, `m`, `chi`, `mu4`, `tauh`, `varsigma` | som `CH0` | |
| `c` | 1 | antall parallelle spor (10 i robusthetsanalysen, med `m` kalibrert av `calibrate_m`) |
| `prio` | `True` | A-saker har forrang; `False` gir felles kø (FIFO) |
| `piA` | 0,4 | alvorlige sakers andel av K |
| `thetaA`, `thetaB` | 0,8, 0,3 | andel av virkningen som krever dom, per sakstype (vektet 0,5) |
| `xiA`, `xiB` | 1,0, 1,0 | andel saker til domstolen, per sakstype |
| `Zfun`, `xiBfun` | `None` | tidsplaner |
| `dbr` | ikke satt | leses med `ch2.get("dbr")`; trommel–buffer–tau via T |
Lign. (33). `c` = 1 gir R = Z Q / (Q + m Z) eksakt; `c` > 1 bruker Erlang C (`erlang_L`, `rho_of_L`).
### `SOC`: rekruttering og vippepunkt (l. 439; avsnitt 8.4, figur 8)
| Navn | Verdi | Betyr |
|---|---|---|
| `eps` | 0,30 | styrken i rekrutteringsleddet ε |
| `Kh` | 2,0 | halvmetningsnivå K_h |
| `pexp` | 4 | bratthet ϱ |
Lign. (34): Ω_soc = ε K^ϱ / (K_h^ϱ + K^ϱ). `simulate_soc` rekalibrerer Ω₀ slik at K = 1 fortsatt er likevekt, og har et
forbigående sjokk: faktor `shock` = 1,6 i månedene `t_on` = 12 til `t_off` = 36.
### `ENDO`: beslutningsreglene (l. 515–530; tabell 3, avsnitt 8.5)
| Navn | Verdi | Betyr | I notatet |
|---|---|---|---|
| `lagD` | 3,0 mnd | observasjonsforsinkelse for kjedestatistikk | τ_D^obs |
| `xi_min` | 0,8 | gulv: høyst 20 % av sakene til forenklede reaksjoner | ξ_min; lign. (35), (37) |
| `tau_thr` | 6,0 mnd | terskel for observert saksbehandlingstid (desentral regel) | τ_D^gr; lign. (35) |
| `k_xi` | 0,2 / 12 per mnd | forsterkning for påtalepraksis (0,2 per år) | k_ξ; lign. (35) |
| `tau_xi` | 6,0 mnd | tidskonstant for endring av påtalepraksis | τ_ξ |
| `ups_star` | 0,95 | målutnyttelse ved dimensjonering | υ*; lign. (36), (37) |
| `ups_hi`, `ups_lo` | 1,0, 0,85 | dødsone: bestill over 1, bygg ned under 0,85 | tabell 3 |
| `kZ` | 1,0 | budsjettforsterkning (1 = hele gapet bestilles) | k_Z; lign. (36) |
| `L1`, `L2` | 6,0, 24,0 mnd | bestilt kapasitet virker lineært fra 6 til 24 mnd etter vedtak | τ_Z |
| `tau_down` | 36,0 mnd | tidskonstant for nedbygging | τ_ned |
| `T_clear` | 24,0 mnd | restansen avvikles over denne tiden (koordinert regel) | H_Q; lign. (37) |
| `H_pred` | 36,0 mnd | prognosehorisont | H_p; lign. (37) |
| `period` | 12,0 mnd | budsjettsyklus | |
| `qloop` | `False` | kvalitetssløyfen av eller på | avsnitt 8.5 |
| `mu3` | 0,5 | tillitsvirkning av q | μ₃; lign. (21) |
| `Lam_star` | 0,78 | tillitsmål for kvalitetssløyfen | Λ* |
| `k_q` | 1 / 12 per mnd | forsterkning (1 per år) | k_q |
| `q_max` | 0,2 | øvre grense for q | q_max |
| `lag_survey` | 3,0 mnd | publiseringsforsinkelse for den årlige tillitsmålingen | |
### Faste verdier i scenarioene (`if __name__ == "__main__"`)
`T_TILTAK` = 24 (vedtak i måned 24), `T_UTV` = 24 (utvidelsen realiseres over 24 mnd), `XI_UND` = 0,8, `ZD_UTV` = 1,34
(+34 % kapasitet), `XI_B_UND` = 1 − 0,2 / 0,6 ≈ 0,67 (20 % av alle saker er 33 % av klasse B), `TEND4` = 180 mnd for
reglene i avsnitt 8.5.
### Konstanter i `diagnose.py` og `forlop.py`
`diagnose.py` bruker ingenting fra `sim.py` og har **egne kopier** av regelverdiene: `UPS_STAR` = 0,95, `UPS_HI` = 1,0,
`T_CLEAR` = 24,0, `L1`, `L2` = 6,0, 24,0. Endres `ENDO` i `sim.py`, må disse endres likt, ellers regner diagnosen og
forløpet med ulike regler. `forlop.py` bruker `ENDO` direkte for regelen og `diagnose.T_CLEAR`/`diagnose.UPS_STAR` for
behovet det sammenligner med.
`forlop.py`: `NAA` = 24 (modellmåneden for første budsjettvedtak), `OBS` = `NAA` − `lagD` = 21, `SLUTT` = 180 mnd,
`LAM_MYK` = Λ₀ − 0,05 = 0,75, `K_GULV` = 0,80 og `T_GULV` = 0,50 (under dette regnes forløpet ikke), `UPS_FOR_MIN` =
`ups_lo` + 0,01 = 0,86 og `UPS_FOR_MAKS` = 0,98 (tillatt utnyttelse før økningen), `RADER` (månedene i tabellen).
`forlop.py` har en egen kopi av regnestegene i `simulate_endo` (`simuler`, bare `koord` og `sched`) og kontrollerer i
hver kjøring at den gir bit for bit samme svar som `simulate_endo` når restansen ikke legges inn. Endres
`simulate_endo`, må `simuler` endres likt.
## (c) Ligning → funksjon → status
Fra notatets vedlegg C (tabell 12). Av de 39 nummererte ligningene er 18 implementert, 12 forenklet og 9 ikke
implementert. *Implementert*: koden regner ligningen slik den står, i aggregert form (n = 1). *Forenklet*: koden regner
et spesialtilfelle eller en enklere form. *Ikke implementert*: ligningen hører til rammeverket, men ingen simulering
bruker den.
| Ligning | Avsnitt | Hva | Kode (`sim.py`) | Status |
|---|---|---|---|---|
| (1) | 1 | naiv beslutningsregel T ← f(K, O) | `simulate`, l. 66–86; regelen l. 73–75 | forenklet: f er proporsjonalregelen (11), O er K forsinket med τ |
| (2) | 2.1 | vektet objektiv kriminalitet K_obj | `simulate_chain2`, l. 369–428 (K = K_A + K_B, l. 395) | forenklet: to kategorier, allerede alvorlighetsvektet; ellers n = 1 |
| (3) | 2.3 | effektivt kriminalitetspress K̃ | – | ikke implementert: reglene svarer på K_obj |
| (4) | 2.4 | måleligningen | – | ikke implementert: feilfritt estimat |
| (5) | 3 | makrovektor E | – | ikke implementert |
| (6) | 3 | strukturelt pådrag Ω | `Omega`, l. 45–46; `simulate_soc`, l. 466 | forenklet: eksogent, Ω₀ = 0,12, +30 % fra måned 12 (+60 % i månedene 12–36 i figur 8) |
| (7) | 4.1 | tiltaksvektoren v | `simulate_endo`, l. 564–653 | forenklet: (T, ξ_D, Z_D, q), én kategori, bare domstolsleddet |
| (8) | 4.1 | observasjonene O | `simulate_endo`, l. 582–588 og 609–611 | forenklet: K forsinket med τ, kjedestatistikk med 3 mnd, tillit årlig med 3 mnd |
| (9) | 4.1 | beslutningsregelen Ψ | `simulate_endo`, l. 590–641 | forenklet: reglene i 8.5; tilstanden er den sanne, forsinket |
| (10) | 4.2 | forsinkelsen τ | `simulate`, l. 70, og tilsvarende | forenklet: én parameter (3, 6 eller 11 mnd) |
| (11) | 4.2 | styringsregelen (PID) | `simulate`, l. 75; `simulate_chain`, l. 218; `simulate_chain2`, l. 397; `simulate_soc`, l. 463; `predict_F`, l. 557; `simulate_endo`, l. 583 | forenklet: bare det reaktive leddet og metningen (k_i = k_d = 0, T_max = 3) |
| (12) | 4.3 | kriminalitetsdynamikken | `deriv`, l. 57–58, med `removal`, l. 49–54; Euler-steget l. 82 | implementert |
| (12′) | 4.3 | fjerning med metning F_sat | `removal`, l. 49–54 | implementert (γ′ = γ(1 + 1/K_sat)); Z_E regnes ikke ut særskilt |
| (13) | 4.4 | dempning a og reaktivitet b | l. 686–688; l. 827–831 | implementert: a = 0,12, b = 0,30 |
| (14) | 4.4 | kritisk forsinkelse τ_c | `critical_delay`, l. 128–132; største stabile k_p, l. 694–695 | implementert: τ_c = 7,2 mnd; k_p ≈ 2,3 ved τ = 11 |
| (15) | 4.4 | tommelfingerregelen | l. 696; l. 724–726 | implementert: k_p < 1,4 ved τ = 11 |
| (13′) | 4.4 | a og b med metning | l. 839–848; l. 874–876 | implementert |
| (16) | 5.1 | forventet nytte | – | ikke implementert |
| (17) | 5.1 | oppdagelsesrisiko | – | ikke implementert (fjerningsraten svarer til intensiteten h, l. 399) |
| (18) | 5.1 | deltakelse | – | ikke implementert: pådraget er eksogent |
| (19) | 5.2 | forskyvning mellom kategorier | – | ikke implementert |
| (20) | 6.1 | trygghet U | `deriv`, l. 59–60, og tilsvarende | implementert |
| (21) | 6.1 | tillit Λ | `deriv`, l. 61–62; μ₃q i `deriv_chain_xz`, l. 543–544 | implementert; μ₃ = 0 utenom kvalitetssløyfen |
| (22) | 6.2 | samfunnsøkonomisk målfunksjon | – | ikke implementert: MPC minimerer et udiskontert kvadratisk tap over 24 mnd (l. 119–120) |
| (23) | 6.3 | skranker | metningen i regelen; MPC, l. 120 og 123 | forenklet: bare 0 ≤ T ≤ T_max og Λ ≥ 0,75 (myk) |
| (24) | 6.3 | MPC | `mpc_step`, l. 89–125; `mpc_step_chain`, l. 240–265 | forenklet: ett konstant innsatsnivå over H = 24, ingen sluttkostnad |
| (25) | 7.1 | lovgivers handlingsrom | – | ikke implementert: T_max er fast |
| (26) | 7.2 | utnyttelse og køtid per ledd | `court`, l. 167–178; utskrift l. 732–738 og 783–786 | forenklet: bare domstolsleddet |
| (27) | 7.2 | J_D = ξ_D F | `deriv_chain`, l. 182–184; `deriv_chain_xz`, l. 535–536; `simulate_chain2`, l. 407–408 | implementert |
| (28) | 7.3 | domstolskøen R_D, τ_D | `court`, l. 167–178; `init_chain`, l. 195–203; m_D l. 154–155 | implementert: m_D = 0,233, τ_D^ref = 3 |
| (29) | 7.3 | K med domstol | `deriv_chain`, l. 187 | implementert |
| (30) | 7.3 | tilbakekoblingene g, Ω^eff, Λ₀ − μ₄g | `court`, l. 176–177; `deriv_chain`, l. 186 og 191 | implementert |
| (31) | 7.3 | a og b med mettet domstol | l. 826–834 | implementert (sluttilstanden i scenario 2) |
| (32) | 7.5 | kapasitetsskranker i kjeden | `simulate_chain`, l. 226–230; `simulate_chain2`, l. 400–406 | forenklet: bare J_D ≤ 0,95 Z_D, håndhevet ved å begrense T |
| (33) | 8.3 | prioritert kø med to sakstyper | `court2`, l. 329–344; `capfun`, l. 320–326; `simulate_chain2` | implementert; i tillegg FIFO og c = 10 spor |
| (34) | 8.4 | rekruttering | `hill`, l. 442–443; `simulate_soc`, l. 451–476; `soc_equilibria`, l. 479–491 | implementert |
| (35) | 8.5 | påtalemyndighetens regel for ξ | `simulate_endo`, l. 598–604 og 640 | implementert |
| (36) | 8.5 | budsjettregelen for Z | `simulate_endo`, l. 614–621 og 628–639 | implementert |
| (37) | 8.5 | den koordinerte regelen | `simulate_endo`, l. 605–608 og 622–634; `predict_F`, l. 548–561 | implementert |
| – | 8.5 | sløyfen for q | `simulate_endo`, l. 609–612 og 641 | implementert |
Merknadene i vedlegg C sier mer om hvert punkt, blant annet hvor koden avviker fra teksten i små ting (grensen på
3 k_ξ per måned i (35), at nedbyggingsmålet i (36) står til ny kapasitet bestilles, og at q også justeres ned).
## (d) De fem simulatorene
Alle integreres med eksplisitt Euler, `DT` = 0,05. Alle tar parameterne som `p` (standard `P`), så en endring gjøres
med `dict(P, navn=verdi)`. `simulate`, `simulate_chain`, `simulate_chain2` og `simulate_soc` bruker den globale `TEND`;
`simulate_endo` har argumentet `tend`, med standardverdien `TEND` slik den var da `sim.py` ble lest inn.
| Funksjon | Dekker | Styring | Datafiler i notatets kjøring | Figur / tabell |
|---|---|---|---|---|
| `simulate(controller, tau, p, kp)` | grunnmodellen uten kjede: K, U, Λ, T | `"P"` eller `"MPC"` | `p3`, `p6`, `p11`, `mpc11`, `p11d`; `sat_B`, `sat_C` (med `ksat` 3 og 1,5) | figur 4 (regime A–E); figur 7 venstre (`sat_C`); tabell 5 |
| `simulate_chain(controller, tau, ch, p, kp, mpc_knows_chain)` | domstolen som ledd med kø, med tidsplaner (`Zfun`, `xifun`) og trommel–buffer–tau (`dbr`) | `"P"` eller `"MPC"` | `kjede_s1`–`kjede_s5` | figur 6; tabell 4 |
| `simulate_chain2(tau, ch2, p, kp)` | domstol med to sakstyper, forrang eller FIFO, c spor | proporsjonal regel | `prio_s2`, `prio_s3`, `prio_s5` | figur 7 høyre; tabell 6 |
| `simulate_soc(controller, tau, p, s, kp, shock, t_on, t_off)` | rekruttering og vippepunkt, forbigående sjokk | `"P"`, ellers fast T = T₀ | `vippe` | figur 8 |
| `simulate_endo(policy, tau, p, ch, e, kp, tend, xi_sched, Z_sched)` | endogene tiltak: ξ_D, Z_D og q bestemt av regler | politiet: proporsjonal regel; kjeden: `"sched"`, `"desentral"`, `"desentral_prog"`, `"koord"` | `endo_e5`, `endo_des`, `endo_desp`, `endo_ko` | figur 9; tabell 7 og 10 |
Regimene i figur 4: A = `p3` (k_p = 3, τ = 3), B = `p6` (τ = 6), C = `p11` (τ = 11), D = `mpc11` (MPC, τ = 11), E =
`p11d` (k_p = 1,2, τ = 11). `stab.dat` og `thumb.dat` (figur 5) kommer fra `critical_delay` og tommelfingerregelen, ikke
fra en simulering. `sat_B` og `prio_s5` skrives, men brukes ikke i figurene. Det er 22 datafiler i alt.
Kolonner: `p*`, `p11d`: `t K U L T`; `kjede_s*`: `t K U L T Q tauD`; `sat_*`: `t K Ks3 Ks15`; `prio_s*`: `t K KA KB tauA
tauB tauF KF KAF`; `vippe`: `t fast p3 p6 p3cap p6cap`; `endo_*`: `t K L T Z xi tauD q` (Z relativt til `ZD0`);
`stab`, `thumb`: `kp tauc`. Tidsseriene skrives med hver tiende rad (`write_csv`, hver halve måned).
I tillegg: `pure_capacity_loop` (ren kapasitetssløyfe, merknad 4; bare utskrift), `predict_F` (prognosen den
koordinerte regelen bruker) og `soc_equilibria` (likevektene i avsnitt 8.4).
## (e) Grensetilfellene koden skriver ut
Regelen i notatet: hver utvidelse har et grensetilfelle som gjenskaper grunnmodellen. `sim.py` skriver ut avviket.
Tallene under er fra en kjøring av `modell/kjerne/sim.py` med notatets låste versjoner (numpy 2.5.4, scipy 1.18.1), der
alle 22 datafilene ble byte-like notatets.
| Kontroll | Utskrift | Største avvik |
|---|---|---|
| `simulate_chain` med Z_D = ∞ gjenskaper regime A–D (`p3`, `p6`, `p11`, `mpc11`) | Del 2, «grensetilfelle: reproduksjon av regime A-D» | 0 for `p3`; høyst 3,8·10⁻¹⁵ i K og 2,9·10⁻¹⁴ i T |
| `simulate_chain` med endelig Z_D og ϑ = χ_D = μ₄ = 0 gjenskaper regime A (køen regnes, men virker ikke tilbake) | samme sted | 0 |
| `simulate_chain` med stor, endelig Z_D (1 og 10) nærmer seg regime A | samme sted | 4,7·10⁻³ og 3,6·10⁻³ i K (ikke et eksakt grensetilfelle) |
| `simulate` med K_sat = ∞ gjenskaper regime A–C; `simulate_chain` gjenskaper scenario 2 | Del 3 (a) | 0 |
| `simulate_chain2` med FIFO, ϑ_A = ϑ_B = 0,5 og c = 1 gjenskaper scenario 2 | Del 3 (b), «kontrolltall» | 2,2·10⁻¹⁵ i K, 2,8·10⁻¹³ i τ |
| `calibrate_m` med c = 1 gir `MD` | samme sted | 0,2330 mot 0,2330 |
| `simulate_endo("sched")` gjenskaper scenario 2, og med tidsplanene scenario 5 | Del 4, «faste tidsplaner gjenskaper scenario 2 og 5» | 0 |
`simulate_soc` har ingen utskrevet grensetilfelle. `forlop.py` kontrollerer sin egen kopi mot `simulate_endo` i hver
kjøring (bit for bit, se over). Den som endrer kjernen, kjører kontrollene på nytt og ser at avvikene fortsatt er 0
eller på avrundingsnivå, og at de 22 datafilene er byte-like med mindre endringen skal endre resultatene.