docs(paper): add appendix mapping each equation to sim.py

New appendix C "Fra ligning til kode": for each of the 39 numbered
equations, the function and lines in sim.py that compute it, the figure
or table it feeds, and its status (18 implemented, 11 simplified, 10 not
implemented), plus a table tracing every figure and table to code and
data file. Documents small code-text differences (cap in the xi rule,
latched binding and dead zone in the coordinated rule, two-sided quality
loop). Introduction points to the appendix. sim.py and paper/data/ are
unchanged; main.tex builds with no undefined references.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-11-10 12:34:36 +01:00
commit 4c9a7304f3
Signed by: ktg
SSH key fingerprint: SHA256:JakMjO6FTBBzN0Bhfj9saOoEjaFxlSdYuZQQpM/lF9Q
2 changed files with 301 additions and 4 deletions

View file

@ -340,8 +340,11 @@ parametere er estimert på norske data, simuleringene illustrerer mekanismer
og rangerer tiltak under gitte forutsetninger, og de samfunnsøkonomiske
kostnadene og gevinstene er definert, men ikke tallfestet. \Cref{def:konsept}
gjelder lover og regler generelt; modellen dekker bare straffesakskjeden, ikke
tilsyn og administrative sanksjoner. \Cref{sec:diskusjon} samler de kjente
begrensningene og en veiplan for det som gjenstår.
tilsyn og administrative sanksjoner. Ikke alle ligningene er brukt i
simuleringene: \cref{app:kode} viser for hver ligning om simuleringskoden
regner den slik den står, i forenklet form eller ikke i det hele tatt.
\Cref{sec:diskusjon} samler de kjente begrensningene og en veiplan for det
som gjenstår.
\paragraph{Disposisjon}
Rekkefølgen følger i hovedsak de fire forutsetningene ovenfor.
@ -355,8 +358,8 @@ modellen med lovverkets handlingsrom og straffesakskjedens flaskehalser og
munner ut i beslutningsmetoden. \Cref{sec:numerikk} gir den numeriske
illustrasjonen, \cref{sec:bruk} viser bruken i praksis,
\cref{sec:diskusjon} drøfter begrensninger, og \cref{sec:konklusjon}
konkluderer. \Cref{app:symboler} gir en symboloversikt og \cref{app:bevis}
bevisene.
konkluderer. \Cref{app:symboler} gir en symboloversikt, \cref{app:bevis}
bevisene og \cref{app:kode} koblingen mellom ligningene og simuleringskoden.
% =================================================================
\section{Kriminalitetsbelastning, opplevd trygghet og tillit}\label{sec:dekomp}

View file

@ -173,3 +173,297 @@ når $Z_{\mathrm{E}}(T^{\max})$ ikke overstiger $\Omega+\epsilon$ med
tilstrekkelig margin.
\hfill$\square$
% =================================================================
\section{Fra ligning til kode}\label{app:kode}
% =================================================================
Dette vedlegget viser hvilke ligninger som ligger bak simuleringene i
\cref{sec:numerikk}, og hvilke som bare er stilt opp. For hver nummererte
ligning oppgir \cref{tab:kode} funksjonen i simuleringskoden
\texttt{paper/sim.py} som regner den, med linjenummer (l.), hvilken figur
eller tabell den bidrar til, og status:
\begin{itemize}[leftmargin=*,itemsep=1pt]
\item \emph{implementert}: koden regner ligningen slik den står, i den
aggregerte formen ($n=1$, nivåene normalisert slik at $\Kobj=1$ i
referanselikevekten);
\item \emph{forenklet}: koden regner et spesialtilfelle eller en enklere
form, og merknaden sier hva som er utelatt;
\item \emph{ikke implementert}: ligningen hører til rammeverket, men ingen
simulering bruker den.
\end{itemize}
Av de 39 nummererte ligningene er 18 implementert, 11 forenklet og 10 ikke
implementert. Det som ikke er implementert, er kategoriene og den
strategiske tilpasningen (\cref{sec:spill}), måleligningen, de
makroøkonomiske driverne, målfunksjonen og lovgivers handlingsrom.
Simuleringene regner altså på den aggregerte kjernen av modellen ---
kriminalitetsdynamikken med forsinket respons, trygghet og tillit,
domstolskøen og beslutningsreglene --- og ikke på hele rammeverket.
\Cref{sec:diskusjon} drøfter hva det betyr. \Cref{tab:kodefunn} viser
hvor hver figur og tabell kommer fra.
Alle simuleringene integreres med eksplisitt Euler-metode med tidssteg
$\Delta t=0{,}05$~måned over 120~måneder (180 i \cref{sec:endogen}), og
forsinkelsen $\tau$ er et helt antall tidssteg. Etter hvert steg holdes
tilliten innenfor $[10^{-4},\,1-10^{-4}]$ og køene ikke-negative; tillitsgrensen
binder ikke i noen kjøring (laveste tillit er $0{,}47$). En kjøring tar om lag
to minutter, skriver figurdataene i \texttt{paper/data/}, som figurene leser
direkte, og skriver ut tallene som tabellene og teksten oppgir. Med
Python~3.14.0, numpy~2.5.4 og scipy~1.18.1 gir en ny kjøring byte-identiske
datafiler. Linjenumrene gjelder \texttt{sim.py} i samme versjon som denne
teksten.
\newcommand{\stImp}{\textbf{Implementert.}}
\newcommand{\stFor}{\textbf{Forenklet.}}
\newcommand{\stIkke}{\textbf{Ikke implementert.}}
{\footnotesize
\renewcommand{\arraystretch}{0.96}
\begin{xltabular}{\linewidth}{@{}P{1.25cm} P{3.4cm} P{2.3cm} L@{}}
\caption{Ligningene i artikkelen, koden som regner dem, og hva de gir.}
\label{tab:kode}\\
\toprule
Ligning & Kode (\texttt{sim.py}) & Gir & Status og merknad \\
\midrule
\endfirsthead
\toprule
Ligning & Kode (\texttt{sim.py}) & Gir & Status og merknad \\
\midrule
\endhead
\midrule
\multicolumn{4}{r@{}}{\itshape fortsetter på neste side}\\
\endfoot
\bottomrule
\endlastfoot
\eqref{eq:naiv} & \texttt{simulate}, l.~66--86; regelen l.~73--75 & \cref{fig:sim} &
\stFor{} $f$ er proporsjonalregelen i~\eqref{eq:pid}, og $\mathcal O$ er
$\Kobj$ forsinket med $\tau$. \\
\eqref{eq:Kobj} & --- & --- &
\stIkke{} Koden har én aggregert, normalisert belastning ($n=1$); antall,
alvorlighet og skadekostnad per kategori inngår ikke. \\
\eqref{eq:Ktilde} & --- & --- &
\stIkke{} Styringsreglene svarer på $\Kobj$, ikke på $\Kt$. \\
\eqref{eq:maling} & --- & --- &
\stIkke{} Alle simuleringer antar et feilfritt estimat; forsinkelsen er
eneste måleimperfeksjon. \\
\eqref{eq:E} & --- & --- & \stIkke{} \\
\eqref{eq:Omega} & \texttt{Omega}, l.~45--46; \texttt{simulate\_soc}, l.~466 &
alle simuleringer &
\stFor{} Pådraget er eksogent: $\Omega_0=0{,}12$, varig økt med 30~prosent
fra måned~12 (forbigående økt med 60~prosent i månedene 12--36 i
\cref{fig:vippe}). Koeffisientene $\beta_k$ og etterslepene $\ell_k$ inngår
ikke. \\
\eqref{eq:tiltak} & \texttt{simulate\_endo}, l.~564--653 &
\cref{fig:endogen,tab:endogen} &
\stFor{} Tiltaksvektoren er $(T,\xi_{\mathrm{D}},Z_{\mathrm{D}},q)$, med én
kategori og bare domstolsleddet; $T_i^{\mathrm{lov}}$ inngår ikke. \\
\eqref{eq:obs} & \texttt{simulate\_endo}, l.~582--588 og 609--611 &
\cref{fig:endogen,tab:endogen} &
\stFor{} Observasjonene er $\Kobj$ forsinket med $\tau$; saksbehandlingstid,
innstrømning, kø og fjerningsstrøm i domstolen forsinket med 3~måneder; og
tilliten fra en årlig måling publisert etter 3~måneder. Registrerte lovbrudd,
trygghetsmålinger og makroindikatorer inngår ikke. \\
\eqref{eq:policy} & \texttt{simulate\_endo}, l.~590--641 &
\cref{fig:endogen,tab:endogen} &
\stFor{} $\Psi$ er de desentraliserte reglene og den koordinerte regelen i
\cref{sec:endogen}. Tilstandsestimatet $\hat\vx$ er den sanne tilstanden
forsinket, uten estimering. \\
\eqref{eq:tau} & \texttt{simulate}, l.~70, og tilsvarende i de andre
simuleringsfunksjonene & \cref{fig:sim,fig:stab} &
\stFor{} $\tau$ er én parameter (3, 6 eller 11~måneder). Oppdelingen i
informasjons-, beslutnings- og iverksettingstid brukes bare i teksten
(\cref{sec:regimer,sec:regneeks}). \\
\eqref{eq:pid} & \texttt{simulate}, l.~75; \texttt{simulate\_chain}, l.~218;
\texttt{simulate\_chain2}, l.~397; \texttt{simulate\_soc}, l.~463;
\texttt{predict\_F}, l.~557; \texttt{simulate\_endo}, l.~583 &
\cref{fig:sim,fig:kjedesim,fig:robust,fig:vippe,fig:endogen} &
\stFor{} Bare det reaktive leddet og metningen er implementert
($k_i=k_d=0$, $T^{\max}=3$). Det integrerende leddet, som ville fjernet det
varige avviket i regime~A, er ikke simulert. \\
\eqref{eq:dde} & \texttt{deriv}, l.~57--58, med \texttt{removal}, l.~49--54;
Euler-steget l.~82 & \cref{fig:sim} &
\stImp{} Med $K_{\mathrm{sat}}=\infty$ gir \texttt{removal} eksakt
$\gamma\Lambda^{\eta}T\Kobj$. \\
\eqref{eq:Fsat} & \texttt{removal}, l.~49--54 &
\cref{fig:robust} (venstre), \cref{tab:satrobust} &
\stImp{} Med $\gamma'=\gamma(1+\Kref/K_{\mathrm{sat}})$ og $\Kref=1$.
$Z_{\mathrm{E}}$ regnes ikke ut særskilt. \\
\eqref{eq:ab} & l.~686--688 (referanselikevekten); l.~827--831 (sluttilstanden
i scenario~2) & \cref{tab:param,fig:stab} &
\stImp{} Gir $a=0{,}12$ og $b=0{,}30$. \\
\eqref{eq:tauc} & \texttt{critical\_delay}, l.~128--132; største stabile
$k_p$, l.~694--695 & \cref{fig:stab,tab:param}; \cref{sec:regimer,sec:regneeks} &
\stImp{} Gir $\tau_c=\infty$ når $b\le a$, $\tau_c=7{,}2$~måneder i
referanselikevekten og $k_p\approx 2{,}3$ ved $\tau=11$. Grensen på om lag
7,1~måneder i likevekten etter sjokket (\cref{sec:regimer}) skrives ikke ut;
den følger av~\eqref{eq:tauc} med sluttverdiene for regime~A. \\
\eqref{eq:tommel} & l.~696; l.~724--726 & \cref{fig:stab}; \cref{sec:regneeks} &
\stImp{} Med $\bar K=1$; gir $k_p<1{,}4$ ved $\tau=11$. \\
\eqref{eq:absat} & l.~839--848 (referanselikevekten); l.~874--876
(sluttlikevekten) & \cref{tab:satrobust} & \stImp{} \\
\eqref{eq:nytte} & --- & --- & \stIkke{} \\
\eqref{eq:p} & --- & --- &
\stIkke{} Den aggregerte fjerningsraten $\gamma\Lambda^{\eta}T$ svarer til
intensiteten $h$ (fjerning per enhet i \texttt{simulate\_chain2}, l.~399),
men oppdagelsesrisikoen regnes ikke. \\
\eqref{eq:deltakelse} & --- & --- &
\stIkke{} Deltakelsen er ikke modellert; pådraget er eksogent. \\
\eqref{eq:forskyvning} & --- & --- &
\stIkke{} Med $n=1$ og $\Sigma=0$ reduseres ligningen til~\eqref{eq:dde},
som er det som simuleres. \\
\eqref{eq:U} & \texttt{deriv}, l.~59--60, og tilsvarende i de andre
simuleringsfunksjonene & alle simuleringer &
\stImp{} Med $\Kref=1$ og projeksjon til $[0,1]$. \\
\eqref{eq:lambda} & \texttt{deriv}, l.~61--62; leddet $\mu_3q$ i
\texttt{deriv\_chain\_xz}, l.~543--544 &
\cref{fig:sim,fig:kjedesim,fig:endogen} og tabellene i \cref{sec:numerikk} &
\stImp{} Med $\Tprop(K)=1{,}6\,K$. Leddet $\mu_3(q-q_0)$ inngår bare i
kvalitetssløyfen ($q_0=0$, $\mu_3=0{,}5$); ellers er $\mu_3=0$. \\
\eqref{eq:J} & --- & --- &
\stIkke{} MPC-regimet minimerer i stedet et udiskontert kvadratisk tap over
24~måneder (l.~119--120):
$(\Kobj-K^*)^2+\lambda_T(T-T_0)^2+\lambda_\Lambda\max(0,\,0{,}75-\Lambda)^2$,
uten ledd for trygghet, budsjett eller kvalitet. \\
\eqref{eq:skranker} & metningen i proporsjonalregelen; MPC, l.~120 og 123 &
\cref{fig:sim} &
\stFor{} Bare $0\le T\le T^{\max}$ (hard) og $\Lambda\ge 0{,}75$ (myk, som
straffeledd i MPC) er med. Budsjettskranken, $K^*$ og $U^*$ inngår ikke som
skranker; $K^*$ er målet i proporsjonalregelen. \\
\eqref{eq:mpc} & \texttt{mpc\_step}, l.~89--125; \texttt{mpc\_step\_chain},
l.~240--265 & \cref{fig:sim} (regime~D); MPC-radene i \cref{sec:simkjede} &
\stFor{} Ett konstant innsatsnivå over horisonten $H=24$ i stedet for en
tiltaksfølge, ingen sluttkostnad $V_f$, og pådraget holdes på siste
observerte verdi. Tilstanden prediseres fra den forsinkede observasjonen
med kjente tidligere tiltak, og beslutningen tas på nytt hver måned. \\
\eqref{eq:Tlov} & --- & --- &
\stIkke{} Lovgivers sløyfe er ikke simulert; taket $T^{\max}$ er fast. \\
\eqref{eq:ko} & \texttt{court}, l.~167--178; utnyttelsen skrives ut
l.~732--738 og 783--786 & \cref{sec:regneeks2} &
\stFor{} Bare domstolsleddet, i den glattede formen~\eqref{eq:koD}.
Etterforskning, påtale og straffegjennomføring er ikke simulert.
Regneeksempelet i \cref{sec:regneeks2} bruker~\eqref{eq:ko} direkte på
tallene koden skriver ut. \\
\eqref{eq:JD} & \texttt{deriv\_chain}, l.~182--184;
\texttt{deriv\_chain\_xz}, l.~535--536; \texttt{simulate\_chain2}, l.~407--408 &
\cref{fig:kjedesim,fig:endogen} &
\stImp{} Som $J_{\mathrm{D}}=\xi_{\mathrm{D}}F$; med politimetning er $F$
fjerningsleddet i~\eqref{eq:Fsat}. \\
\eqref{eq:koD} & \texttt{court}, l.~167--178; stasjonær startkø i
\texttt{init\_chain}, l.~195--203; $m_{\mathrm{D}}$ kalibrert l.~154--155 &
\cref{fig:kjedesim,tab:param} &
\stImp{} Gir $m_{\mathrm{D}}=0{,}233$~måneder og
$\tau_{\mathrm{D}}^{\mathrm{ref}}=3$~måneder. \\
\eqref{eq:ddeD} & \texttt{deriv\_chain}, l.~187 &
\cref{fig:kjedesim,tab:kjedefolsom} &
\stImp{} Med $Z_{\mathrm{D}}=\infty$ gjenskaper koden regime~A--D med avvik
under $10^{-13}$ (l.~740--754). \\
\eqref{eq:kjedefb} & \texttt{court}, l.~176--177 ($g$); \texttt{deriv\_chain},
l.~186 ($\Omega^{\mathrm{eff}}$) og l.~191 ($\Lambda_0-\mu_4g$) &
\cref{fig:kjedesim,tab:kjedefolsom} & \stImp{} \\
\eqref{eq:abD} & l.~826--834 & \cref{sec:simkjede} &
\stImp{} I sluttilstanden for scenario~2 ($\xi_{\mathrm{D}}=1$,
$\vartheta=0{,}5$). \\
\eqref{eq:skranker2} & trommel--buffer--tau: \texttt{simulate\_chain},
l.~226--230; \texttt{simulate\_chain2}, l.~400--406 &
\cref{sec:simkjede}; \cref{tab:prio} &
\stFor{} Bare kapasitetsskranken for domstolen,
$J_{\mathrm{D}}\le 0{,}95\,Z_{\mathrm{D}}$, håndhevet ved å begrense $T$;
lovgrensen inngår ikke. \\
\eqref{eq:prio} & \texttt{court2}, l.~329--344, med \texttt{capfun},
l.~320--326; \texttt{simulate\_chain2}, l.~369--428 &
\cref{fig:robust} (høyre), \cref{tab:prio} &
\stImp{} Koden har i tillegg felles kø (FIFO) og $c_{\mathrm{D}}=10$
parallelle spor etter Erlang~C (l.~295--317); $c_{\mathrm{D}}=1$ gir
ligningen eksakt. \\
\eqref{eq:soc} & \texttt{hill}, l.~442--443; \texttt{simulate\_soc},
l.~451--476; \texttt{soc\_equilibria}, l.~479--491 &
\cref{fig:vippe}; likevektene i \cref{sec:vippe} &
\stImp{} $\Omega_0$ rekalibreres slik at $\Kobj=1$ fortsatt er likevekt
(l.~455). \\
\eqref{eq:regelxi} & \texttt{simulate\_endo}, l.~598--604 og 640 &
\cref{fig:endogen,tab:endogen} &
\stImp{} Koden begrenser det første leddet til $3k_\xi$ per måned (l.~600),
det vil si når $\hat\tau_{\mathrm{D}}^{\text{kø}}>24$~måneder. Grensen
binder ikke: den lengste saksbehandlingstiden med desentraliserte regler er
14,8~måneder. \\
\eqref{eq:regelZ} & \texttt{simulate\_endo}, l.~614--621 og 628--639 &
\cref{fig:endogen,tab:endogen} &
\stImp{} $\bar J_{\mathrm{D}}$ er gjennomsnittet av observert innstrømning
de siste 12~månedene, og bestilt kapasitet realiseres lineært 6--24~måneder
etter vedtaket (l.~630 og 636). Koden bygger bare ned når ingen bestilt
kapasitet er under realisering (l.~632). \\
\eqref{eq:regelkoord} & \texttt{simulate\_endo}, l.~605--608 (påtale) og
622--634 (budsjett); \texttt{predict\_F}, l.~548--561 &
\cref{fig:endogen,tab:endogen} &
\stImp{} Domstolen regnes som bindende fra første gang observert
fjerningsstrøm overstiger kapasiteten ($\hat F>Z_{\mathrm{D}}$, som er
$\hat\upsilon_{\mathrm{D}}>1$ så lenge $\xi_{\mathrm{D}}=1$), og forblir det
(l.~606). Budsjettet bestiller bare når behovet overstiger bevilget
kapasitet, slik \cref{tab:param} angir; ligningen viser bare
$(\cdot)_+$. \\
Sløyfen for $q$ (\cref{sec:endogen}) & \texttt{simulate\_endo}, l.~609--612
og 641 & \cref{tab:endogen} &
\stImp{} Koden justerer $q$ også ned når siste måling ligger over
$\Lambda^{*}$, og $q$ følger målet med tidskonstant 12~måneder; teksten
nevner bare økningen. \\
\end{xltabular}
}
{\footnotesize
\renewcommand{\arraystretch}{0.96}
\begin{xltabular}{\linewidth}{@{}P{2.4cm} P{4.2cm} L@{}}
\caption{Figurer, tabeller og resultater: koden som lager dem.}
\label{tab:kodefunn}\\
\toprule
Resultat & Kode (\texttt{sim.py}) & Data eller utskrift \\
\midrule
\endfirsthead
\toprule
Resultat & Kode (\texttt{sim.py}) & Data eller utskrift \\
\midrule
\endhead
\midrule
\multicolumn{3}{r@{}}{\itshape fortsetter på neste side}\\
\endfoot
\bottomrule
\endlastfoot
\Cref{prop:stabilitet}, \cref{kor:tommel} & \texttt{critical\_delay},
l.~128--132; l.~686--696 &
Analytisk (\cref{app:bevis}). Koden bruker formlene, men prøver ikke
beviset; simuleringene stemmer med det: regime~A og~B ligger under grensen
og demper ut, regime~C ligger over og ender i en grensesyklus. \\
\Cref{fig:sim} & \texttt{simulate}; l.~698--714 &
\texttt{p3}, \texttt{p6}, \texttt{p11}, \texttt{mpc11}, \texttt{p11d}
(\texttt{.dat}). Tallene i \cref{sec:regimer} fra utskriften; perioden i
regime~C fra toppene som skrives ut i l.~817--825. \\
\Cref{fig:stab} & \texttt{critical\_delay}; l.~716--726 &
\texttt{stab.dat}, \texttt{thumb.dat} \\
\Cref{tab:param}, \cref{sec:regneeks} & l.~149--155 og 686--696 &
Utskrift: $a$, $b$, $\tau_c$, periode, grensene for $k_p$, $Z_{\mathrm{D}}$,
$m_{\mathrm{D}}$ \\
\Cref{sec:regneeks2} & l.~783--786 &
Utskrift: $J_{\mathrm{D}}=0{,}134$, $\upsilon_{\mathrm{D}}=1{,}28$ og
$1{,}02$, kapasitetsbehov $+34$ og $+7$~prosent \\
\Cref{fig:kjedesim} & \texttt{simulate\_chain}; l.~756--786 &
\texttt{kjede\_s1}--\texttt{kjede\_s5} (\texttt{.dat}) \\
Trommel--buffer--tau og MPC med kjede (\cref{sec:simkjede}) & l.~788--794 &
Utskrift \\
\Cref{tab:kjedefolsom} & l.~796--804 & Utskrift \\
Stabilitet med kø (\cref{sec:simkjede}) & l.~816--834 & Utskrift \\
\Cref{tab:satrobust} & l.~839--848, 863--883 og 896--904 & Utskrift \\
\Cref{fig:robust} & \texttt{simulate}, \texttt{simulate\_chain2};
l.~884--888 og 948--952 &
\texttt{sat\_C.dat}; \texttt{prio\_s2.dat}, \texttt{prio\_s3.dat}.
\texttt{sat\_B.dat} og \texttt{prio\_s5.dat} skrives, men brukes ikke i
figuren. \\
\Cref{tab:prio} & \texttt{simulate\_chain2}; l.~906--963 & Utskrift \\
\Cref{fig:vippe}, likevektene i \cref{sec:vippe} & \texttt{simulate\_soc},
\texttt{soc\_equilibria}; l.~973--1006 & \texttt{vippe.dat}; utskrift \\
\Cref{fig:endogen} & \texttt{simulate\_endo}; l.~1022--1045 &
\texttt{endo\_e5}, \texttt{endo\_des}, \texttt{endo\_desp},
\texttt{endo\_ko} (\texttt{.dat}) \\
\Cref{tab:endogen} & \texttt{summary\_endo}, l.~656--664; l.~1022--1068 &
Utskrift \\
\Cref{mrk:kapasitet} & \texttt{pure\_capacity\_loop}, l.~667--679;
l.~1069--1077 & Utskrift \\
\end{xltabular}
}