Gradini variabili, disturbi a salto stocastici, fasi di raffreddamento più lunghe; rimosso dati.csv
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
4592f5f87b
commit
33c99afe6a
6 files changed
+75
-16
No files matched your search
@@ -20,6 +20,9 @@ CHIAVI = [
|
||||
"amb_inf_c", "amb_A_c", "amb_tau_s", "amb_sigma_c", "amb_passo_c",
|
||||
"sigma_c", "sigma_caldo_c", "x_rif_c", "wander_sigma_c", "wander_tau_s", "passo_T_c",
|
||||
"t_impulsi_s", "dT_impulsi_c", "k_raffreddamento_hz", "tau_sensore_s",
|
||||
"impulsi_jitter_t_s", "impulsi_jitter_amp_rel", "k_jitter_rel",
|
||||
"salti_rate_hz", "salti_media_c", "salti_sigma_c", "salti_tau_s", "salti_x_min_c",
|
||||
"salti_max_c", "salti_risc_rate_hz", "salti_risc_media_c", "salti_risc_sigma_c", "salti_risc_tau_s",
|
||||
]
|
||||
|
||||
|
||||
@@ -53,6 +56,41 @@ def eccesso(t_s, cfg):
|
||||
return x
|
||||
|
||||
|
||||
def perturba(cfg, rng):
|
||||
"""Copia di cfg con istanti, ampiezze e k degli impulsi variati a caso (ogni corsa è diversa)."""
|
||||
n = len(cfg["t_impulsi_s"])
|
||||
t = np.sort(np.asarray(cfg["t_impulsi_s"], float) + cfg["impulsi_jitter_t_s"] * rng.standard_normal(n))
|
||||
d = np.asarray(cfg["dT_impulsi_c"], float) * (1 + cfg["impulsi_jitter_amp_rel"] * rng.standard_normal(n))
|
||||
k = cfg["k_raffreddamento_hz"] * (1 + cfg["k_jitter_rel"] * rng.standard_normal())
|
||||
return {**cfg, "t_impulsi_s": t, "dT_impulsi_c": d, "k_raffreddamento_hz": k}
|
||||
|
||||
|
||||
def eventi(g_s, cfg, rng, t_ini, t_fin, rate, media, sigma, tau, x_min):
|
||||
"""Scarti casuali (Poisson) in [t_ini, t_fin], con rientro esponenziale, se x ≥ x_min."""
|
||||
s = np.zeros_like(g_s)
|
||||
n = rng.poisson(rate * (t_fin - t_ini))
|
||||
ts = np.sort(rng.uniform(t_ini, t_fin, n))
|
||||
ampiezze = np.clip(rng.normal(media, sigma, n), -cfg["salti_max_c"], cfg["salti_max_c"])
|
||||
for tj, aj in zip(ts, ampiezze):
|
||||
if eccesso(np.array([tj]), cfg)[0] < x_min:
|
||||
continue
|
||||
dopo = g_s >= tj
|
||||
s[dopo] += aj * np.exp(-(g_s[dopo] - tj) / tau)
|
||||
return s
|
||||
|
||||
|
||||
def salti(g_s, cfg, rng):
|
||||
"""Disturbi a salto: durante il riscaldamento (tra primo e ultimo gradino) e il raffreddamento."""
|
||||
if len(cfg["t_impulsi_s"]) == 0:
|
||||
return np.zeros_like(g_s)
|
||||
t_primo, t_ultimo = cfg["t_impulsi_s"][0], cfg["t_impulsi_s"][-1]
|
||||
risc = eventi(g_s, cfg, rng, t_primo, t_ultimo, cfg["salti_risc_rate_hz"],
|
||||
cfg["salti_risc_media_c"], cfg["salti_risc_sigma_c"], cfg["salti_risc_tau_s"], 0.0)
|
||||
raff = eventi(g_s, cfg, rng, t_ultimo, cfg["durata_s"], cfg["salti_rate_hz"],
|
||||
cfg["salti_media_c"], cfg["salti_sigma_c"], cfg["salti_tau_s"], cfg["salti_x_min_c"])
|
||||
return risc + raff
|
||||
|
||||
|
||||
def ambiente_vero(t_s, cfg):
|
||||
return cfg["amb_inf_c"] + cfg["amb_A_c"] * np.exp(-t_s / cfg["amb_tau_s"])
|
||||
|
||||
@@ -62,6 +100,7 @@ def quantizza(v, passo):
|
||||
|
||||
|
||||
def genera(cfg, rng):
|
||||
cfg = perturba(cfg, rng)
|
||||
# 1. tempi
|
||||
n_max = int(cfg["durata_s"] * 1000 / (cfg["dt_ms"] - cfg["jitter_ms"])) + 2
|
||||
dt = cfg["dt_ms"] + rng.uniform(-cfg["jitter_ms"], cfg["jitter_ms"], n_max)
|
||||
@@ -70,9 +109,9 @@ def genera(cfg, rng):
|
||||
dt = np.diff(t_ms, prepend=0.0)
|
||||
t_s = t_ms / 1000
|
||||
|
||||
# 2. T vera su griglia fine = ambiente vero + eccesso termico
|
||||
# 2. T vera su griglia fine = ambiente vero + eccesso termico + salti
|
||||
g_s = np.arange(0.0, cfg["durata_s"] + GRIGLIA_MS / 1000, GRIGLIA_MS / 1000)
|
||||
t_vera = ambiente_vero(g_s, cfg) + eccesso(g_s, cfg)
|
||||
t_vera = ambiente_vero(g_s, cfg) + eccesso(g_s, cfg) + salti(g_s, cfg, rng)
|
||||
|
||||
# 3. risposta del sensore: filtro del 1° ordine, interpolato ai t_i
|
||||
a = np.exp(-GRIGLIA_MS / 1000 / cfg["tau_sensore_s"])
|
||||
|
||||
Reference in new issue
Block a user