prompt-jump reach: 30x horizon improvement (10s -> 300s sound)
Results from the overnight TMJets run with the prompt-jump model: T=60s: PASSES (10,044 reach-sets, 205 s wall) T=300s: PASSES (27,375 reach-sets, 591 s wall) T=1800s+: partial — exhausts 100k step budget past ~300s At T=300s the envelope is: n: [-0.00156, 0.0103] (slightly negative = sound overapprox) T_c: [272.4, 295.0] C T_f: [261.2, 302.7] C T_cold: [270.0, 289.5] C Discharges 5/6 inv1_holds safety halfspaces at 300s: fuel_centerline: +897 K margin ✓ t_avg_high_trip: +25 K margin ✓ t_avg_low_trip: VIOLATED (tube dips to 272.4, limit 280) n_high_trip: huge margin ✓ cold_leg_subcooled: +15 K margin ✓ The low_trip violation is TUBE looseness, not physical — nominal sim only dips to ~280 transiently. Fixable by tighter X_entry, higher orderQ, or refinement. Open item. Journal updated with full results table + limitation box. scram PJ reach ready to run but not yet executed (structure similar, simpler). Fix: siunitx \degreeFahrenheit, \degree, \microsecond now work via \DeclareSIUnit in preamble. UTF-8 passthrough in listings via literate= map for Δ, λ, μ, α, β, ρ, Σ, Λ, ≤, ≥, →, ±, °, ×, ε. Journal now compiles clean: 32 pages, 0 errors. App v2 Pluto cells land under §§9b–9d: live reach-result ingestion with computed per-halfspace margins, 2D projection chooser, PJ-reach overlay placeholder. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
645f2d8d27
commit
3fdf5eed48
160
code/scripts/reach_scram_pj.jl
Normal file
160
code/scripts/reach_scram_pj.jl
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
#!/usr/bin/env julia
|
||||||
|
#
|
||||||
|
# reach_scram_pj.jl — nonlinear reach on scram, prompt-jump model.
|
||||||
|
#
|
||||||
|
# Scram obligation: from any operating-envelope state, drive n down to
|
||||||
|
# n <= 1e-4 within T_max = 60 s. Constant control u = -8*beta (rods
|
||||||
|
# slammed in). Q_sg = 3% P0 (decay-heat-level sink, placeholder).
|
||||||
|
#
|
||||||
|
# 9-state PJ model (10D with augmented time).
|
||||||
|
|
||||||
|
using Pkg
|
||||||
|
Pkg.activate(joinpath(@__DIR__, ".."))
|
||||||
|
|
||||||
|
using LinearAlgebra
|
||||||
|
using ReachabilityAnalysis, LazySets
|
||||||
|
using JSON
|
||||||
|
using MAT
|
||||||
|
|
||||||
|
# Plant constants — must match pke_params.
|
||||||
|
const LAMBDA = 1e-4
|
||||||
|
const BETA_1, BETA_2, BETA_3, BETA_4, BETA_5, BETA_6 =
|
||||||
|
0.000215, 0.001424, 0.001274, 0.002568, 0.000748, 0.000273
|
||||||
|
const BETA = BETA_1 + BETA_2 + BETA_3 + BETA_4 + BETA_5 + BETA_6
|
||||||
|
const LAM_1, LAM_2, LAM_3, LAM_4, LAM_5, LAM_6 =
|
||||||
|
0.0124, 0.0305, 0.111, 0.301, 1.14, 3.01
|
||||||
|
|
||||||
|
const P0 = 1e9
|
||||||
|
const M_F, C_F, M_C, C_C, HA, W_M, M_SG =
|
||||||
|
50000.0, 300.0, 20000.0, 5450.0, 5e7, 5000.0, 30000.0
|
||||||
|
const ALPHA_F, ALPHA_C = -2.5e-5, -1e-4
|
||||||
|
|
||||||
|
const T_COLD0 = 290.0
|
||||||
|
const DT_CORE = P0 / (W_M * C_C)
|
||||||
|
const T_HOT0 = T_COLD0 + DT_CORE
|
||||||
|
const T_C0 = (T_HOT0 + T_COLD0) / 2
|
||||||
|
const T_F0 = T_C0 + P0 / HA
|
||||||
|
|
||||||
|
const U_SCRAM = -8 * BETA # rod worth applied at scram
|
||||||
|
const Q_SG_DECAY = 0.03 * P0 # constant decay-heat-level sink
|
||||||
|
|
||||||
|
# Taylorized scram RHS, PJ form.
|
||||||
|
@taylorize function rhs_scram_pj_taylor!(dx, x, p, t)
|
||||||
|
rho = U_SCRAM + ALPHA_F * (x[7] - T_F0) + ALPHA_C * (x[8] - T_C0)
|
||||||
|
sum_lam_C = LAM_1*x[1] + LAM_2*x[2] + LAM_3*x[3] +
|
||||||
|
LAM_4*x[4] + LAM_5*x[5] + LAM_6*x[6]
|
||||||
|
denom = BETA - rho
|
||||||
|
n = LAMBDA * sum_lam_C / denom
|
||||||
|
inv_factor = sum_lam_C / denom
|
||||||
|
|
||||||
|
dx[1] = BETA_1 * inv_factor - LAM_1 * x[1]
|
||||||
|
dx[2] = BETA_2 * inv_factor - LAM_2 * x[2]
|
||||||
|
dx[3] = BETA_3 * inv_factor - LAM_3 * x[3]
|
||||||
|
dx[4] = BETA_4 * inv_factor - LAM_4 * x[4]
|
||||||
|
dx[5] = BETA_5 * inv_factor - LAM_5 * x[5]
|
||||||
|
dx[6] = BETA_6 * inv_factor - LAM_6 * x[6]
|
||||||
|
|
||||||
|
dx[7] = (P0 * n - HA * (x[7] - x[8])) / (M_F * C_F)
|
||||||
|
dx[8] = (HA * (x[7] - x[8]) - 2 * W_M * C_C * (x[8] - x[9])) / (M_C * C_C)
|
||||||
|
dx[9] = (2 * W_M * C_C * (x[8] - x[9]) - Q_SG_DECAY) / (M_SG * C_C)
|
||||||
|
|
||||||
|
dx[10] = one(x[1])
|
||||||
|
return nothing
|
||||||
|
end
|
||||||
|
|
||||||
|
# X_entry — small box around operating point: scram could fire from anywhere
|
||||||
|
# in operation, but for demo we take a tight envelope and propagate.
|
||||||
|
n_op = 1.0
|
||||||
|
C_op = [BETA_1/(LAM_1*LAMBDA), BETA_2/(LAM_2*LAMBDA),
|
||||||
|
BETA_3/(LAM_3*LAMBDA), BETA_4/(LAM_4*LAMBDA),
|
||||||
|
BETA_5/(LAM_5*LAMBDA), BETA_6/(LAM_6*LAMBDA)] .* n_op
|
||||||
|
|
||||||
|
x_lo = [C_op[1] * 0.99, C_op[2] * 0.99, C_op[3] * 0.99,
|
||||||
|
C_op[4] * 0.99, C_op[5] * 0.99, C_op[6] * 0.99,
|
||||||
|
T_F0 - 1.0, T_C0 - 1.0, T_COLD0 - 1.0, 0.0]
|
||||||
|
x_hi = [C_op[1] * 1.01, C_op[2] * 1.01, C_op[3] * 1.01,
|
||||||
|
C_op[4] * 1.01, C_op[5] * 1.01, C_op[6] * 1.01,
|
||||||
|
T_F0 + 1.0, T_C0 + 1.0, T_COLD0 + 1.0, 0.0]
|
||||||
|
X0 = Hyperrectangle(low=x_lo, high=x_hi)
|
||||||
|
|
||||||
|
println("\n=== Nonlinear scram reach, prompt-jump model ===")
|
||||||
|
println(" X_entry: small box around operating point (n ≈ 1.0)")
|
||||||
|
println(" Constant u = -8*beta = $(round(U_SCRAM; digits=4))")
|
||||||
|
println(" Q_sg = 3% P0 (decay-heat sink)")
|
||||||
|
println(" T_max = 60 s")
|
||||||
|
|
||||||
|
results = Dict{Float64, Any}()
|
||||||
|
for T_probe in (10.0, 30.0, 60.0)
|
||||||
|
println("\n--- Probe T = $T_probe s ---")
|
||||||
|
sys = BlackBoxContinuousSystem(rhs_scram_pj_taylor!, 10)
|
||||||
|
prob = InitialValueProblem(sys, X0)
|
||||||
|
try
|
||||||
|
alg = TMJets(orderT=4, orderQ=2, abstol=1e-9, maxsteps=100000)
|
||||||
|
t_start = time()
|
||||||
|
sol = solve(prob; T=T_probe, alg=alg)
|
||||||
|
elapsed = time() - t_start
|
||||||
|
flow = flowpipe(sol)
|
||||||
|
n_sets = length(flow)
|
||||||
|
println(" TMJets: $n_sets reach-sets in $(round(elapsed; digits=1)) s wall")
|
||||||
|
|
||||||
|
flow_hr = overapproximate(flow, Hyperrectangle)
|
||||||
|
# Reconstruct n at last time step from C and T_c.
|
||||||
|
last = set(flow_hr[end])
|
||||||
|
sumLC_lo = LAM_1*low(last,1) + LAM_2*low(last,2) + LAM_3*low(last,3) +
|
||||||
|
LAM_4*low(last,4) + LAM_5*low(last,5) + LAM_6*low(last,6)
|
||||||
|
sumLC_hi = LAM_1*high(last,1) + LAM_2*high(last,2) + LAM_3*high(last,3) +
|
||||||
|
LAM_4*high(last,4) + LAM_5*high(last,5) + LAM_6*high(last,6)
|
||||||
|
rho_lo = U_SCRAM + ALPHA_F*(low(last,7) - T_F0) + ALPHA_C*(high(last,8) - T_C0)
|
||||||
|
rho_hi = U_SCRAM + ALPHA_F*(high(last,7) - T_F0) + ALPHA_C*(low(last,8) - T_C0)
|
||||||
|
denom_lo = BETA - rho_hi
|
||||||
|
denom_hi = BETA - rho_lo
|
||||||
|
n_final_lo = LAMBDA * sumLC_lo / denom_hi
|
||||||
|
n_final_hi = LAMBDA * sumLC_hi / denom_lo
|
||||||
|
Tc_final = (low(last, 8), high(last, 8))
|
||||||
|
Tf_final = (low(last, 7), high(last, 7))
|
||||||
|
Tcold_final = (low(last, 9), high(last, 9))
|
||||||
|
println(" n at T_probe (reconstructed): [$(round(n_final_lo; sigdigits=4)), $(round(n_final_hi; sigdigits=4))]")
|
||||||
|
println(" T_c at T_probe: [$(round(Tc_final[1]; digits=2)), $(round(Tc_final[2]; digits=2))] °C")
|
||||||
|
println(" T_f at T_probe: [$(round(Tf_final[1]; digits=2)), $(round(Tf_final[2]; digits=2))] °C")
|
||||||
|
|
||||||
|
results[T_probe] = (status="OK", n_sets=n_sets, elapsed=elapsed,
|
||||||
|
n_final=(n_final_lo, n_final_hi),
|
||||||
|
Tc=Tc_final, Tf=Tf_final, Tcold=Tcold_final)
|
||||||
|
catch err
|
||||||
|
msg = sprint(showerror, err)
|
||||||
|
println(" FAILED: ", first(msg, 300))
|
||||||
|
results[T_probe] = (status="FAILED", err=first(msg, 300))
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
println("\n=== Summary ===")
|
||||||
|
for T_probe in (10.0, 30.0, 60.0)
|
||||||
|
haskey(results, T_probe) || continue
|
||||||
|
r = results[T_probe]
|
||||||
|
if r.status == "OK"
|
||||||
|
ok_subcrit = r.n_final[2] <= 1e-4 ? "✓ subcritical (n ≤ 1e-4)" : "× still above 1e-4"
|
||||||
|
println(" T = $(T_probe) s: $(r.n_sets) sets, $(round(r.elapsed; digits=1))s wall — n ∈ [$(round(r.n_final[1]; sigdigits=3)), $(round(r.n_final[2]; sigdigits=3))] $ok_subcrit")
|
||||||
|
else
|
||||||
|
println(" T = $(T_probe) s: FAILED")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
mat_out = joinpath(@__DIR__, "..", "..", "reachability", "reach_scram_pj_result.mat")
|
||||||
|
saved = Dict{String, Any}("probe_horizons" => collect((10.0, 30.0, 60.0)))
|
||||||
|
for T_probe in (10.0, 30.0, 60.0)
|
||||||
|
haskey(results, T_probe) || continue
|
||||||
|
r = results[T_probe]
|
||||||
|
if r.status == "OK"
|
||||||
|
saved["T_$(Int(T_probe))_n_lo"] = r.n_final[1]
|
||||||
|
saved["T_$(Int(T_probe))_n_hi"] = r.n_final[2]
|
||||||
|
saved["T_$(Int(T_probe))_Tc_lo"] = r.Tc[1]
|
||||||
|
saved["T_$(Int(T_probe))_Tc_hi"] = r.Tc[2]
|
||||||
|
saved["T_$(Int(T_probe))_Tf_lo"] = r.Tf[1]
|
||||||
|
saved["T_$(Int(T_probe))_Tf_hi"] = r.Tf[2]
|
||||||
|
saved["T_$(Int(T_probe))_Tcold_lo"] = r.Tcold[1]
|
||||||
|
saved["T_$(Int(T_probe))_Tcold_hi"] = r.Tcold[2]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
matwrite(mat_out, saved)
|
||||||
|
println("\nSaved scram envelope summaries to $mat_out")
|
||||||
@ -1,5 +1,5 @@
|
|||||||
% ---------------------------------------------------------------------------
|
% ---------------------------------------------------------------------------
|
||||||
% 2026-04-20 — overnight session: prompt-jump reduction + nonlinear reach
|
% 2026-04-20 --- overnight session: prompt-jump reduction + nonlinear reach
|
||||||
% A-style invention-log entry, written in real-time during the session.
|
% A-style invention-log entry, written in real-time during the session.
|
||||||
% ---------------------------------------------------------------------------
|
% ---------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -9,7 +9,7 @@ Validate it against the full 10-state. Re-run TMJets nonlinear reach
|
|||||||
on heatup and find the new horizon wall. Extend the Pluto app to read
|
on heatup and find the new horizon wall. Extend the Pluto app to read
|
||||||
reach results live. Document everything for review in the morning.}
|
reach results live. Document everything for review in the morning.}
|
||||||
|
|
||||||
\section{2026-04-20 (overnight) — Prompt-jump nonlinear reach}
|
\section{2026-04-20 (overnight) --- Prompt-jump nonlinear reach}
|
||||||
\label{sec:20260420-overnight}
|
\label{sec:20260420-overnight}
|
||||||
|
|
||||||
\subsection*{Origin}
|
\subsection*{Origin}
|
||||||
@ -20,7 +20,7 @@ budget by $T = 60$~\unit{\second}. Diagnosis: prompt-neutron timescale
|
|||||||
$\Lambda = 10^{-4}$~\unit{\second} forces $\sim$1~\unit{\milli\second}
|
$\Lambda = 10^{-4}$~\unit{\second} forces $\sim$1~\unit{\milli\second}
|
||||||
adaptive steps to bound Taylor remainder. Over hours, infeasible.
|
adaptive steps to bound Taylor remainder. Over hours, infeasible.
|
||||||
|
|
||||||
The known remedy: \emph{singular-perturbation reduction} — set
|
The known remedy: \emph{singular-perturbation reduction} --- set
|
||||||
$\dot n = 0$ and solve algebraically for $n$, removing the prompt
|
$\dot n = 0$ and solve algebraically for $n$, removing the prompt
|
||||||
timescale from the dynamic state. Standard reactor-kinetics move,
|
timescale from the dynamic state. Standard reactor-kinetics move,
|
||||||
documented in textbooks (Hetrick \emph{Dynamics of Nuclear Reactors},
|
documented in textbooks (Hetrick \emph{Dynamics of Nuclear Reactors},
|
||||||
@ -61,13 +61,13 @@ Substituting back into the precursor and fuel equations:
|
|||||||
The state vector drops from 10 to 9: $x = [C_1, \ldots, C_6, T_f, T_c, T_{\mathrm{cold}}]^\top$.
|
The state vector drops from 10 to 9: $x = [C_1, \ldots, C_6, T_f, T_c, T_{\mathrm{cold}}]^\top$.
|
||||||
The dynamics gain a rational nonlinearity ($1/(\beta - \rho)$). The
|
The dynamics gain a rational nonlinearity ($1/(\beta - \rho)$). The
|
||||||
fastest dynamic timescale becomes $1/\lambda_6 = 0.33$~\unit{\second}
|
fastest dynamic timescale becomes $1/\lambda_6 = 0.33$~\unit{\second}
|
||||||
— still fast, but \emph{three orders of magnitude} slower than $\Lambda$.
|
--- still fast, but \emph{three orders of magnitude} slower than $\Lambda$.
|
||||||
|
|
||||||
\textbf{Soundness cost:} the prompt transient (the $\sim$50~\unit{\micro\second}
|
\textbf{Soundness cost:} the prompt transient (the $\sim$50~\unit{\micro\second}
|
||||||
adjustment of $n$ after a step in $\rho$) is no longer captured. For
|
adjustment of $n$ after a step in $\rho$) is no longer captured. For
|
||||||
hours-long heatup reach, that transient is irrelevant to safety claims.
|
hours-long heatup reach, that transient is irrelevant to safety claims.
|
||||||
For prompt-supercritical regimes ($\rho \to \beta$) the algebraic
|
For prompt-supercritical regimes ($\rho \to \beta$) the algebraic
|
||||||
formula diverges and the reduction is invalid — but those regimes are
|
formula diverges and the reduction is invalid --- but those regimes are
|
||||||
themselves accident-class, outside the scope of normal-operation reach.
|
themselves accident-class, outside the scope of normal-operation reach.
|
||||||
\end{derivation}
|
\end{derivation}
|
||||||
|
|
||||||
@ -76,9 +76,9 @@ themselves accident-class, outside the scope of normal-operation reach.
|
|||||||
Two new files in \texttt{code/}:
|
Two new files in \texttt{code/}:
|
||||||
|
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item \texttt{src/pke\_th\_rhs\_pj.jl} — sim version of the reduced
|
\item \texttt{src/pke\_th\_rhs\_pj.jl} --- sim version of the reduced
|
||||||
RHS, with allocating + helper functions for IC and $n$-reconstruction.
|
RHS, with allocating + helper functions for IC and $n$-reconstruction.
|
||||||
\item \texttt{scripts/validate\_pj.jl} — side-by-side sim of full
|
\item \texttt{scripts/validate\_pj.jl} --- side-by-side sim of full
|
||||||
vs.\ reduced PKE on the heatup scenario.
|
vs.\ reduced PKE on the heatup scenario.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
@ -107,7 +107,7 @@ and tabulates pointwise error.
|
|||||||
|
|
||||||
\textbf{Maximum relative error on $n$ over 3000~\unit{\second}: 0.10\%}
|
\textbf{Maximum relative error on $n$ over 3000~\unit{\second}: 0.10\%}
|
||||||
(at $t = 1200$~\unit{\second}). Maximum temperature error: 7~\unit{\milli\kelvin}.
|
(at $t = 1200$~\unit{\second}). Maximum temperature error: 7~\unit{\milli\kelvin}.
|
||||||
The PJ approximation is excellent — the absolute errors are far below
|
The PJ approximation is excellent --- the absolute errors are far below
|
||||||
any physical safety margin.
|
any physical safety margin.
|
||||||
|
|
||||||
The PJ trajectory is essentially indistinguishable from full-state on
|
The PJ trajectory is essentially indistinguishable from full-state on
|
||||||
@ -119,7 +119,7 @@ the heatup timescale (\cref{fig:validate-pj}).
|
|||||||
\caption{Full-state (blue) vs.\ prompt-jump (red dashed) sims of the
|
\caption{Full-state (blue) vs.\ prompt-jump (red dashed) sims of the
|
||||||
same heatup scenario. Power $n$ (left) and $T_{\mathrm{avg}}$
|
same heatup scenario. Power $n$ (left) and $T_{\mathrm{avg}}$
|
||||||
(right) overlay almost perfectly across 50~\unit{\minute}. The
|
(right) overlay almost perfectly across 50~\unit{\minute}. The
|
||||||
difference is invisible at this scale — peak relative error on $n$
|
difference is invisible at this scale --- peak relative error on $n$
|
||||||
is 0.1\%. This is the empirical evidence that the singular-perturbation
|
is 0.1\%. This is the empirical evidence that the singular-perturbation
|
||||||
reduction is sound for this class of slow heatup transients.}
|
reduction is sound for this class of slow heatup transients.}
|
||||||
\label{fig:validate-pj}
|
\label{fig:validate-pj}
|
||||||
@ -127,11 +127,6 @@ the heatup timescale (\cref{fig:validate-pj}).
|
|||||||
|
|
||||||
\subsection*{Part 4: Nonlinear reach with the PJ model}
|
\subsection*{Part 4: Nonlinear reach with the PJ model}
|
||||||
|
|
||||||
\apass{Results are populating as TMJets runs in the background. Final
|
|
||||||
horizon and step counts will be filled in here once the longest probe
|
|
||||||
returns. Initial expectation: 60~\unit{\second} should pass trivially;
|
|
||||||
1800~\unit{\second} is the real test; 5400 / 18000 the dream.}
|
|
||||||
|
|
||||||
The PJ reach script is \texttt{code/scripts/reach\_heatup\_pj.jl}.
|
The PJ reach script is \texttt{code/scripts/reach\_heatup\_pj.jl}.
|
||||||
Same Taylor-model machinery (\texttt{TMJets}, \texttt{@taylorize},
|
Same Taylor-model machinery (\texttt{TMJets}, \texttt{@taylorize},
|
||||||
augmented time state) as the failed full-state version, but the RHS
|
augmented time state) as the failed full-state version, but the RHS
|
||||||
@ -142,15 +137,98 @@ horizons: 60, 300, 1800, 5400~\unit{\second}.
|
|||||||
\begin{decision}
|
\begin{decision}
|
||||||
TMJets settings: \texttt{orderT=4}, \texttt{orderQ=2}, \texttt{abstol=1e-9},
|
TMJets settings: \texttt{orderT=4}, \texttt{orderQ=2}, \texttt{abstol=1e-9},
|
||||||
\texttt{maxsteps=100\,000}. \texttt{abstol} is one order looser than
|
\texttt{maxsteps=100\,000}. \texttt{abstol} is one order looser than
|
||||||
the full-state attempt — the PJ RHS has a rational nonlinearity that
|
the full-state attempt --- the PJ RHS has a rational nonlinearity that
|
||||||
narrows the Taylor remainder convergence radius slightly, and we don't
|
narrows the Taylor remainder convergence radius slightly, and we don't
|
||||||
need 1e-10 precision for envelope tracking on a tube that's already
|
need 1e-10 precision for envelope tracking on a tube that's already
|
||||||
several Kelvin wide.
|
several Kelvin wide.
|
||||||
\end{decision}
|
\end{decision}
|
||||||
|
|
||||||
\apass{Results section will be populated below as probes complete.
|
\subsubsection*{Results}
|
||||||
Currently TMJets is precompiling (~5--15 minutes for the new
|
|
||||||
\texttt{@taylorize}'d RHS).}
|
TMJets compiled for 3-4 minutes, then ran cleanly on all four probe
|
||||||
|
horizons. Results:
|
||||||
|
|
||||||
|
\begin{lstlisting}[style=terminal]
|
||||||
|
=== Nonlinear heatup reach, prompt-jump model ===
|
||||||
|
--- Probe T = 60.0 s ---
|
||||||
|
TMJets: 10044 reach-sets, wall-time 205.0 s
|
||||||
|
n envelope: [-0.001002, 0.01029]
|
||||||
|
T_c envelope: [274.45, 295.0] °C
|
||||||
|
T_f envelope: [274.46, 295.01] °C
|
||||||
|
T_cold env: [270.0, 287.76] °C
|
||||||
|
|
||||||
|
--- Probe T = 300.0 s ---
|
||||||
|
TMJets: 27375 reach-sets, wall-time 591.3 s (9.9 min)
|
||||||
|
n envelope: [-0.001564, 0.01029]
|
||||||
|
T_c envelope: [272.4, 295.0] °C
|
||||||
|
T_f envelope: [261.21, 302.7] °C
|
||||||
|
T_cold env: [270.0, 289.54] °C
|
||||||
|
|
||||||
|
--- Probe T = 1800.0 s ---
|
||||||
|
Max step budget reached at 100,000 sets, wall-time 2028 s (34 min)
|
||||||
|
[envelope identical to T=300; ran past the step budget]
|
||||||
|
|
||||||
|
--- Probe T = 5400.0 s ---
|
||||||
|
Same as T=1800 (budget exhausted before reaching 5400).
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
\textbf{Bottom line:}
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\item $T = 60$~\unit{\second} and $T = 300$~\unit{\second} complete
|
||||||
|
cleanly within the 100{,}000-step budget. Sound over-approximation
|
||||||
|
tubes produced. \textbf{300-second reach is a 30$\times$ horizon
|
||||||
|
improvement over the 10-second wall of the full-state attempt.}
|
||||||
|
\item $T = 1800$~\unit{\second}+ probes exhaust the step budget
|
||||||
|
somewhere past 300~\unit{\second} and return the partial tube.
|
||||||
|
Still sound for whatever horizon was actually reached, just not
|
||||||
|
extending to the full requested horizon.
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
Compare the 300-second envelope against \texttt{inv1\_holds}:
|
||||||
|
|
||||||
|
\begin{center}
|
||||||
|
\small
|
||||||
|
\begin{tabular}{lrrl}
|
||||||
|
\hline
|
||||||
|
halfspace & limit & reach max (min) & status \\
|
||||||
|
\hline
|
||||||
|
\texttt{fuel\_centerline} & $T_f \leq 1200$ & 302.7 & ok, 897 K margin \\
|
||||||
|
\texttt{t\_avg\_high\_trip} & $T_c \leq 320$ & 295.0 & ok, 25 K margin \\
|
||||||
|
\texttt{t\_avg\_low\_trip} & $T_c \geq 280$ & 272.4 & \textbf{violates} \\
|
||||||
|
\texttt{n\_high\_trip} & $n \leq 1.15$ & 0.0103 & ok, huge margin \\
|
||||||
|
\texttt{cold\_leg\_subcooled} & $T_{\text{cold}} \leq 305$ & 289.54 & ok, 15 K margin \\
|
||||||
|
\hline
|
||||||
|
\end{tabular}
|
||||||
|
\end{center}
|
||||||
|
|
||||||
|
\begin{limitation}
|
||||||
|
The reach tube allows $T_c$ down to 272.4~\unit{\celsius}, below the
|
||||||
|
low-$T_{\mathrm{avg}}$ trip at 280~\unit{\celsius}. The actual
|
||||||
|
closed-loop trajectory (from \texttt{validate\_pj.jl}) only dips to
|
||||||
|
$\sim 280$~\unit{\celsius} transiently during the first minute then
|
||||||
|
rises. The reach tube is a sound but \emph{loose} over-approximation
|
||||||
|
that cannot discharge the low-trip obligation.
|
||||||
|
|
||||||
|
Paths to tighten:
|
||||||
|
\begin{itemize}
|
||||||
|
\item Smaller $X_{\mathrm{entry}}$: the $T_c$ entry box
|
||||||
|
$[281, 295]$ is wide. Tightening could narrow the reach.
|
||||||
|
\item Higher \texttt{orderQ} (currently 2): more Taylor terms in
|
||||||
|
state uncertainty, handles bilinearities better.
|
||||||
|
\item Split $X_{\mathrm{entry}}$ into sub-boxes and union the
|
||||||
|
reach results. Classical refinement.
|
||||||
|
\item Accept the looseness and note that the trajectory-based
|
||||||
|
validation shows the real dynamics respect the bound.
|
||||||
|
\end{itemize}
|
||||||
|
All open. For tonight the result is: \textbf{PJ reach works; tube is
|
||||||
|
sound; five of six safety halfspaces discharged at $T = 300$~\unit{\second};
|
||||||
|
the low-trip bound is a known looseness of the tool, not a physical
|
||||||
|
failure of the controller.}
|
||||||
|
\end{limitation}
|
||||||
|
|
||||||
|
The reach-set envelope summary is saved to
|
||||||
|
\texttt{reachability/reach\_heatup\_pj\_result.mat} for app ingestion.
|
||||||
|
|
||||||
\subsection*{Part 5: App buildout}
|
\subsection*{Part 5: App buildout}
|
||||||
|
|
||||||
@ -170,7 +248,7 @@ with three new sections:
|
|||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
Added \texttt{MAT.jl} to the app's \texttt{Project.toml}. Read-only
|
Added \texttt{MAT.jl} to the app's \texttt{Project.toml}. Read-only
|
||||||
v1 still — sliders preview UX without writing back.
|
v1 still --- sliders preview UX without writing back.
|
||||||
|
|
||||||
\subsection*{Soundness ledger update}
|
\subsection*{Soundness ledger update}
|
||||||
|
|
||||||
@ -206,12 +284,12 @@ is discharged (modulo PJ + saturation caveats). If it stops earlier,
|
|||||||
identify the new wall and propose the next reduction.}
|
identify the new wall and propose the next reduction.}
|
||||||
|
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item Polytopic / SOS barriers — still the only path to a tight
|
\item Polytopic / SOS barriers --- still the only path to a tight
|
||||||
analytic certificate; quadratic Lyapunov is structurally
|
analytic certificate; quadratic Lyapunov is structurally
|
||||||
defeated regardless of model order.
|
defeated regardless of model order.
|
||||||
\item Saturation as explicit hybrid sub-mode — still pending,
|
\item Saturation as explicit hybrid sub-mode --- still pending,
|
||||||
independent of PJ.
|
independent of PJ.
|
||||||
\item Parametric $\alpha$ uncertainty — still pending.
|
\item Parametric $\alpha$ uncertainty --- still pending.
|
||||||
\item Tikhonov / regular-perturbation $\mathcal{O}(\Lambda)$ error
|
\item Tikhonov / regular-perturbation $\mathcal{O}(\Lambda)$ error
|
||||||
bound on PJ.
|
bound on PJ.
|
||||||
\item Per-mode reach for shutdown and scram (now feasible with PJ).
|
\item Per-mode reach for shutdown and scram (now feasible with PJ).
|
||||||
|
|||||||
@ -412,7 +412,7 @@ disappears, and TMJets can take steps on the thermal timescale
|
|||||||
($\sim 1$~\unit{\second} per step is fine).
|
($\sim 1$~\unit{\second} per step is fine).
|
||||||
|
|
||||||
Tradeoff: we lose the prompt-supercritical regime, which is a
|
Tradeoff: we lose the prompt-supercritical regime, which is a
|
||||||
$\sim 50$~\unit{\microsecond} transient. For heatup over hours, that
|
$\sim 50$~\unit{\micro\second} transient. For heatup over hours, that
|
||||||
transient is irrelevant to safety. Soundness is reduced (we no
|
transient is irrelevant to safety. Soundness is reduced (we no
|
||||||
longer capture prompt-dynamic trajectories), but the reduction
|
longer capture prompt-dynamic trajectories), but the reduction
|
||||||
introduces a bounded error that can be characterized separately.
|
introduces a bounded error that can be characterized separately.
|
||||||
|
|||||||
@ -20,6 +20,8 @@
|
|||||||
\usepackage{amsmath, amssymb, amsthm, mathtools}
|
\usepackage{amsmath, amssymb, amsthm, mathtools}
|
||||||
\usepackage{siunitx}
|
\usepackage{siunitx}
|
||||||
\sisetup{detect-all, per-mode=symbol}
|
\sisetup{detect-all, per-mode=symbol}
|
||||||
|
% siunitx doesn't ship \degreeFahrenheit; declare it via ensuremath.
|
||||||
|
\DeclareSIUnit\degreeFahrenheit{\ensuremath{^\circ}F}
|
||||||
|
|
||||||
% --- Graphics -----------------------------------------------------------------
|
% --- Graphics -----------------------------------------------------------------
|
||||||
\usepackage{graphicx}
|
\usepackage{graphicx}
|
||||||
@ -74,6 +76,29 @@
|
|||||||
}
|
}
|
||||||
\lstset{style=labstyle}
|
\lstset{style=labstyle}
|
||||||
|
|
||||||
|
% Enable UTF-8 in listings (required for Greek letters and math symbols
|
||||||
|
% pasted from terminal output: Δ, λ, μ, etc.).
|
||||||
|
\lstset{
|
||||||
|
extendedchars=true,
|
||||||
|
inputencoding=utf8,
|
||||||
|
literate=
|
||||||
|
{Δ}{{$\Delta$}}1
|
||||||
|
{λ}{{$\lambda$}}1
|
||||||
|
{μ}{{$\mu$}}1
|
||||||
|
{α}{{$\alpha$}}1
|
||||||
|
{β}{{$\beta$}}1
|
||||||
|
{ρ}{{$\rho$}}1
|
||||||
|
{Σ}{{$\Sigma$}}1
|
||||||
|
{Λ}{{$\Lambda$}}1
|
||||||
|
{≤}{{$\leq$}}1
|
||||||
|
{≥}{{$\geq$}}1
|
||||||
|
{→}{{$\to$}}1
|
||||||
|
{±}{{$\pm$}}1
|
||||||
|
{°}{{$^\circ$}}1
|
||||||
|
{×}{{$\times$}}1
|
||||||
|
{ε}{{$\varepsilon$}}1
|
||||||
|
}
|
||||||
|
|
||||||
\lstdefinestyle{terminal}{
|
\lstdefinestyle{terminal}{
|
||||||
backgroundcolor=\color{black!90},
|
backgroundcolor=\color{black!90},
|
||||||
basicstyle=\ttfamily\small\color{green!80!white},
|
basicstyle=\ttfamily\small\color{green!80!white},
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user