#!/usr/bin/env julia # # sim_sanity.jl — verify the Julia port matches the MATLAB result. # # Reproduces main.m Run 2 (ctrl_operation under 100% -> 80% Q_sg step) # and prints the final state, which should agree with MATLAB to ~1e-3. using Pkg Pkg.activate(joinpath(@__DIR__, "..")) using OrdinaryDiffEq include(joinpath(@__DIR__, "..", "src", "pke_params.jl")) include(joinpath(@__DIR__, "..", "src", "pke_th_rhs.jl")) include(joinpath(@__DIR__, "..", "controllers", "controllers.jl")) plant = pke_params() x0 = pke_initial_conditions(plant) Q_sg = t -> plant.P0 * (1.0 - 0.2 * (t >= 30)) ref = (; T_avg = plant.T_c0) function rhs!(dx, x, p, t) u = ctrl_operation(t, x, plant, ref) pke_th_rhs!(dx, x, t, plant, Q_sg, u) end prob = ODEProblem(rhs!, x0, (0.0, 600.0)) sol = solve(prob, Rodas5(); reltol=1e-8, abstol=1e-10) xf = sol.u[end] CtoF(T) = T * 9/5 + 32 println("\n=== Julia port sanity — ctrl_operation under 100% -> 80% Q_sg step ===") println(" Final t = ", sol.t[end]) println(" n = $(round(xf[1]; digits=4)) (expect ~0.800)") println(" T_f = $(round(CtoF(xf[8]); digits=2)) F (expect ~616.6)") println(" T_avg = $(round(CtoF(xf[9]); digits=2)) F (expect ~587.8)") println(" T_cold = $(round(CtoF(xf[10]); digits=2)) F (expect ~561.4)") u_final = ctrl_operation(sol.t[end], xf, plant, ref) println(" u = $(round(u_final/plant.beta; digits=4)) \$ (expect ~-0.0068)")