# 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 modellene med kø i domstolen er starttilstanden nesten, men ikke helt, en likevekt: ved start er K′ = ϑ ς_D Q_D > 0, fordi det som faller fra køen, aldri trekkes fra K (ligningen for K′ under). Uten sjokk kryper K og τ_D derfor sakte oppover; se `forbehold.md` for hvor mye. | 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. `kjor.py kontroll` gjør dette og mer: den måler kjernen og fasiten mot notatets sjekksummer, kjører diagnosen, forløpet, hele `sim.py`, grensetilfellene i utvidelsene og scenariokjøreren, og sier hvilke av notatets resultater som har flyttet seg.