CtrEditor/timestep_explanation.py

141 lines
5.0 KiB
Python

#!/usr/bin/env python3
"""
Demostración de por qué timesteps más pequeños son mejores para TSNet
"""
def demonstrate_timestep_stability():
"""
Demuestra la diferencia entre timesteps grandes y pequeños
"""
print("🔬 Demostración: Timestep y Estabilidad Numérica\n")
# Simulación de ejemplo: cambio súbito de presión
print("Escenario: Cambio súbito de velocidad de bomba de 0% a 100%")
print("=" * 60)
# Con timestep grande (problemático)
print("\n❌ Con TimeStep = 1.0 segundo:")
print(" t=0.0s → t=1.0s (1 paso)")
print(" • El cambio es instantáneo en la simulación")
print(" • No se capturan transientes intermedios")
print(" • Puede causar inestabilidad numérica")
print(" • Ecuaciones diferenciales mal resueltas")
# Con timestep pequeño (correcto)
print("\n✅ Con TimeStep = 0.1 segundo:")
print(" t=0.0s → t=0.1s → t=0.2s → ... → t=1.0s (10 pasos)")
print(" • Cambio gradual capturado paso a paso")
print(" • Transientes intermedios modelados")
print(" • Mayor estabilidad numérica")
print(" • Ecuaciones resueltas correctamente")
print("\n🎯 Beneficios del timestep más pequeño:")
print(" 1. Mejor convergencia de las ecuaciones")
print(" 2. Captura de fenómenos transitorios")
print(" 3. Menor probabilidad de división por cero")
print(" 4. Resultados más precisos")
# Ejemplo numérico
print("\n📊 Ejemplo numérico:")
print(" Ecuación: dP/dt = f(P, Q) (cambio de presión)")
print(" ")
print(" TimeStep = 1.0s:")
print(" P(1) = P(0) + 1.0 * f(P(0), Q(0)) ← Gran salto")
print(" ")
print(" TimeStep = 0.1s:")
print(" P(0.1) = P(0) + 0.1 * f(P(0), Q(0))")
print(" P(0.2) = P(0.1) + 0.1 * f(P(0.1), Q(0.1))")
print(" ... ← Pasos graduales, más estable")
def show_tsnet_configuration():
"""
Muestra la configuración actual de TSNet
"""
print("\n🔧 Configuración Actual de TSNet:")
print("=" * 40)
print("```csharp")
print("// En TSNetRealTimeSimulator.cs")
print("_simulationManager.Configuration.Duration = 1.0; // 1 segundo total")
print("_simulationManager.Configuration.TimeStep = 0.1; // Pasos de 0.1s")
print("```")
print("\n📋 Esto significa:")
print(" • Cada ciclo simula exactamente 1 segundo")
print(" • Internamente usa 10 pasos de 0.1 segundos")
print(" • Timer ejecuta cada 1 segundo (tiempo real)")
print(" • TSNet tiene suficiente resolución temporal")
print("\n⏱️ Cronología de ejecución:")
print(" Tiempo Real │ TSNet Interno")
print(" ─────────────┼─────────────────")
print(" t=0s │ Inicia simulación")
print(" │ ├─ 0.0→0.1s")
print(" │ ├─ 0.1→0.2s")
print(" │ ├─ 0.2→0.3s")
print(" │ ├─ ... ")
print(" │ └─ 0.9→1.0s")
print(" t=1s │ Completa y devuelve resultados")
print(" t=2s │ Repite para siguiente segundo")
def show_alternatives():
"""
Muestra alternativas de configuración
"""
print("\n🔄 Alternativas de Configuración:")
print("=" * 40)
configs = [
{
"name": "Ultra Rápido (para transientes críticos)",
"duration": 1.0,
"timestep": 0.01,
"steps": 100,
"use_case": "Golpe de ariete, cavitación"
},
{
"name": "Rápido (configuración actual)",
"duration": 1.0,
"timestep": 0.1,
"steps": 10,
"use_case": "Simulación general estable"
},
{
"name": "Moderado",
"duration": 1.0,
"timestep": 0.5,
"steps": 2,
"use_case": "Sistemas muy estables"
},
{
"name": "Problemático (el anterior)",
"duration": 1.0,
"timestep": 1.0,
"steps": 1,
"use_case": "❌ Puede causar errores"
}
]
for config in configs:
print(f"\n📋 {config['name']}:")
print(f" Duration: {config['duration']}s")
print(f" TimeStep: {config['timestep']}s")
print(f" Pasos internos: {config['steps']}")
print(f" Uso: {config['use_case']}")
def main():
demonstrate_timestep_stability()
show_tsnet_configuration()
show_alternatives()
print("\n" + "="*60)
print("🎯 RESPUESTA A TU PREGUNTA:")
print("="*60)
print("✅ SÍ, TSNet puede y DEBE usar timesteps < 1 segundo")
print("✅ La configuración actual (0.1s) es CORRECTA y estable")
print("✅ Esto NO afecta el timing de 1 segundo del simulador")
print("✅ Solo mejora la precisión y estabilidad interna")
print("="*60)
if __name__ == "__main__":
main()