Parametri sorteggiati a ogni corsa: intervalli [min, max] per gradini, ambiente, rumore e salti
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
c0054c49a5
commit
797517db33
6 files changed
+97
-70
No files matched your search
@@ -5,8 +5,8 @@ Elenco di ciò che il programma sa fare. Per l'uso passo per passo vedi il [READ
|
||||
## Generazione dei dati — `genera.py`
|
||||
|
||||
- **Profilo di temperatura**: `T` parte dalla temperatura ambiente, sale con uno o più gradini di riscaldamento e ridiscende con raffreddamento esponenziale fino a `T_amb`.
|
||||
- **Gradini configurabili**: numero, istanti e ampiezze (`t_impulsi_s`, `dT_impulsi_c`); lista vuota = nessun riscaldamento. Costante di raffreddamento in `k_raffreddamento_hz`.
|
||||
- **Variabilità tra corse**: istanti, ampiezze e costante di raffreddamento dei gradini sono perturbati a caso a ogni seed (`impulsi_jitter_*`, `k_jitter_rel`; 0 = disattivata).
|
||||
- **Gradini sorteggiati**: numero, istante del primo, distanza tra gradini e ampiezze sono estratti a caso a ogni seed da intervalli (`n_gradini`, `t_primo_gradino_s`, `distanza_gradini_s`, `dT_gradino_c`). Costante di raffreddamento in `k_raffreddamento_hz`.
|
||||
- **Parametri casuali per corsa**: le chiavi scritte `[min, max]` (ambiente, livelli di rumore, `k`, `tau_sensore_s`, frequenza e σ dei salti) vengono sorteggiate uniformi a ogni seed, così ogni file ha parametri davvero diversi; `[x, x]` = valore fisso.
|
||||
- **Salti stocastici**: scarti casuali con rientro esponenziale, sia durante il riscaldamento (`salti_risc_*`, nei due versi) sia durante il raffreddamento (`salti_*`, solo con `T` molto sopra l'ambiente), come i gradini irregolari di un sensore reale.
|
||||
- **Ambiente realistico**: `T_amb` assestata con andamento esponenziale, con rumore e quantizzazione propri (`amb_*`). Non compare nel CSV, serve per `ΔT` e come baseline di `T`.
|
||||
- **Tempi con jitter**: intervallo medio `dt_ms` con variazione uniforme ±`jitter_ms`, fino a `durata_s`.
|
||||
@@ -15,7 +15,7 @@ Elenco di ciò che il programma sa fare. Per l'uso passo per passo vedi il [READ
|
||||
- **Quantizzazione**: `T` e `ΔT` a `passo_T_c`, ambiente a `amb_passo_c`. `ΔT` è calcolato dopo rumore e quantizzazione di entrambi i canali.
|
||||
- **Riproducibilità**: `--seed` fissa il risultato (stesso seed e stessa configurazione ⇒ file identico); senza seed ne viene scelto uno casuale e stampato su stderr.
|
||||
- **Uscita flessibile**: per default `output/gen_<seed>.csv` (cartella creata se manca); `-o percorso` per un file a scelta; `-o -` per stdout.
|
||||
- **Configurazione senza valori nascosti**: tutti i valori stanno in un TOML; una chiave mancante, un TOML non valido o gradini di lunghezza diversa terminano con exit 1 e un messaggio in italiano. Lo stesso avviene se il file di uscita non è scrivibile.
|
||||
- **Configurazione senza valori nascosti**: tutti i valori stanno in un TOML; una chiave mancante, un TOML non valido o un intervallo `[min, max]` non valido terminano con exit 1 e un messaggio in italiano. Lo stesso avviene se il file di uscita non è scrivibile.
|
||||
|
||||
Formato dell'uscita: `t_ms,T_C,dT_C` (`t_ms` intero, gli altri a due decimali).
|
||||
|
||||
|
||||
+13
-11
@@ -19,16 +19,18 @@ t_ms,T_C,dT_C
|
||||
## 2. Configurazione
|
||||
|
||||
Tutti i valori sono in [`config.toml`](../config.toml) (unica fonte: questo documento non li ripete). Gruppi:
|
||||
tempi · ambiente (anche baseline di T) · rumore · gradini di riscaldamento e raffreddamento · variabilità tra corse · salti.
|
||||
tempi · ambiente (anche baseline di T) · rumore · gradini di riscaldamento e raffreddamento · salti.
|
||||
Nessun valore è scritto nello script: chiave mancante ⇒ errore.
|
||||
|
||||
**Parametri casuali per corsa**: le chiavi scritte come intervallo `[min, max]` (ambiente `amb_inf_c`, `amb_A_c`, `amb_tau_s`; rumore `sigma_c`, `sigma_caldo_c`, `wander_*`; `k_raffreddamento_hz`, `tau_sensore_s`; frequenze e σ dei salti) vengono sorteggiate uniformi a ogni corsa (`[x, x]` = valore fisso). I gradini sono generati da `n_gradini` (intero, estremi inclusi, min ≥ 1), `t_primo_gradino_s`, `distanza_gradini_s` (tra gradini consecutivi) e `dT_gradino_c` (ampiezza di ciascuno). Intervallo non valido (non una coppia di numeri, o min > max) ⇒ errore.
|
||||
|
||||
## 3. Modello (5 passi)
|
||||
|
||||
1. **Tempi**: `t_i = t_{i−1} + dt_ms + U(−jitter_ms, +jitter_ms)`, fino a `durata_s`.
|
||||
2. **T vera** = ambiente vero + eccesso termico (T parte da `T_amb`, sale con i gradini e ridiscende fino a `T_amb`):
|
||||
- ambiente vero `B(t) = amb_inf + amb_A·exp(−t/τ_amb)` (stessa curva del passo 5, senza rumore né quantizzazione);
|
||||
- eccesso `x(t) = Σ_j ΔT_j · exp(−k·(t − t_j))` per `t ≥ t_j` (un gradino per ogni `t_impulsi_s`, poi raffreddamento esponenziale);
|
||||
- **variabilità**: a ogni corsa istanti, ampiezze e `k` dei gradini sono perturbati a caso (σ in `impulsi_jitter_*`, `k_jitter_rel`), quindi la forma cambia con il seed;
|
||||
- eccesso `x(t) = Σ_j ΔT_j · exp(−k·(t − t_j))` per `t ≥ t_j` (un gradino per ogni istante sorteggiato, poi raffreddamento esponenziale);
|
||||
- **variabilità**: a ogni corsa numero, istanti e ampiezze dei gradini, `k`, ambiente, livelli di rumore e frequenza dei salti sono sorteggiati dagli intervalli di config, quindi curva, picco e rumore cambiano molto con il seed;
|
||||
- **salti** (stocastici, scarti casuali con rientro `exp(−t/τ)`, come i gradini irregolari osservati su un sensore reale):
|
||||
durante il **riscaldamento** (tra il primo e l'ultimo gradino) con `salti_risc_*`, ampiezza `N(media, σ²)` nei due versi;
|
||||
durante il **raffreddamento** (dopo l'ultimo gradino, mentre `x ≥ salti_x_min_c`) con `salti_*`; istanti di tipo Poisson in entrambi i casi; ampiezza limitata a ±`salti_max_c` (niente scarti estremi);
|
||||
@@ -55,21 +57,21 @@ python genera.py config.toml -o out.csv # percorso a scelta, seed
|
||||
python genera.py config.toml -o - > out.csv # stdout
|
||||
```
|
||||
Opzioni: `config` (posizionale), `-o/--output` (default `output/gen_<seed>.csv`, cartella creata se manca; `-` = stdout), `--seed` (default: casuale, stampato su stderr).
|
||||
Uscita con errore (exit 1) e messaggio in italiano se manca una chiave, se `t_impulsi_s` e `dT_impulsi_c` hanno lunghezze diverse
|
||||
Uscita con errore (exit 1) e messaggio in italiano se manca una chiave, se un intervallo `[min, max]` non è valido
|
||||
o se il file non è scrivibile. La lettura TOML usa `tomllib` (standard library): unica dipendenza esterna `numpy`.
|
||||
|
||||
## 5. Controlli di accettazione (con la configurazione d'esempio)
|
||||
|
||||
Verificati su 30 seed (valori min–max; picco e `T`/`ΔT` finali dipendono dalla variabilità dei gradini e dai salti):
|
||||
Verificati su 60 seed (valori min–max; con parametri sorteggiati gli intervalli sono larghi, ma `T` e `ΔT` restano coerenti con ambiente e rumore della corsa):
|
||||
|
||||
| Controllo | Atteso |
|
||||
|---|---|
|
||||
| `T` a inizio run | ≈ `T_amb` (≈ 22.65 °C) |
|
||||
| Rumore a freddo: `std(diff(T))/√2` prima del primo gradino (~15 s) | 0.09 – 0.13 |
|
||||
| Picco di `T` | 197 – 209 °C |
|
||||
| `T` a fine run | ≈ `T_amb`: 23.1 – 23.7 °C |
|
||||
| `ΔT` a inizio run | ≈ 0 °C (solo rumore) |
|
||||
| `ΔT` a fine run | 0.3 – 0.65 °C (residuo del raffreddamento) |
|
||||
| `T` a inizio run | ≈ `T_amb` della corsa (20.1 – 26.2 °C) |
|
||||
| Rumore a freddo: `std(diff(T))/√2` prima del primo gradino (~15 s) | 0.06 – 0.19 (segue `sigma_c` sorteggiato) |
|
||||
| Picco di `T` | 66 – 227 °C (dipende da numero e ampiezza dei gradini) |
|
||||
| `T` a fine run | ≈ `T_amb` della corsa: 20.0 – 26.4 °C |
|
||||
| `ΔT` a inizio run | ≈ 0 °C (solo rumore): −0.18 – 0.15 |
|
||||
| `ΔT` a fine run | −0.08 – 1.6 °C (residuo del raffreddamento) |
|
||||
| Intervalli `dt` | tutti in `dt_ms ± jitter_ms` (prima di arrotondare `t_ms` a intero: nel CSV le differenze sono 149–152) |
|
||||
| Stesso `--seed` e stessa config | file identico |
|
||||
|
||||
|
||||
Reference in new issue
Block a user