- forward(): divide t per T_END prima di passarlo alla rete, evita saturazione
di Tanh per t∈[0,10] e migliora la sensibilità temporale del modello
- _pde_scale: include il picco gaussiano della sorgente come denominatore;
con GAUSS_SIGMA=0.01 il picco (~60 °C/s) supera T_char/T_END (15), rendendo
la loss PDE non normalizzata senza questa correzione
- PATIENCE 100→500, SCHED_PATIENCE 30→150: il training ha ora spazio per
convergere prima che l'early stopping o lo scheduler blocchino l'ottimizzatore
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
W_BC=1 causava temperatura sub-ambiente (11.93°C < T_AMB=20°C) perché
i bordi erano poco vincolati; 5 è bilanciamento tra evitare trivial solution
(W_BC=10) e rispettare le BC di Robin (W_BC=1).
N_F aumentato per coprire meglio il dominio temporale tardo dove l'errore
cresceva (max 12.87°C a t=10s).
GAUSS_SIGMA ridotto per avvicinarsi alla sorgente puntuale del FDM e
ridurre il mismatch fisico che causava L2=11.6%.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Il training collassava alla soluzione banale T=T_AMB perché W_BC=10 spingeva
Adam a soddisfare le Robin BC (trivialmente, con gradiente zero) sacrificando
la PDE. Fix: W_PDE=10, W_BC=1 così la PDE domina il gradiente fin dal primo
epoch. LBFGS_STEPS: 20→200 perché L-BFGS era l'unico ottimizzatore a fare
progressi reali. forward(): rimossa moltiplicazione t_norm che causava
vanishing gradient su dT/dx e d²T/dx².
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- config.py: aggiunge GAUSS_SIGMA = 0.02 nella sezione parametri fisici
- model.py: T_char, grad_char, pde_scale diventano costanti di modulo (_T_char,
_grad_char, _pde_scale) calcolate una sola volta all'import
- engine.py: closure L-BFGS definita una volta sola fuori dal loop
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- visualizer.py: sostituisce animations/ con results/pinn/TIMESTAMP/,
nomi fissi (heatmap.html, animation.html, comparison.html) come FDM
- config.py: aggiunge sezioni architettura, sampling, Adam, L-BFGS, loss weights
- model.py: costruisce HeatPINN dinamicamente da HIDDEN_SIZE/N_HIDDEN_LAYERS;
heat_pinn_loss legge pesi W_PDE/W_IC/W_BC da config
- engine.py: tutti i parametri di training letti da config
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>