grame / src /simulator /__init__.py
tiffank1802
Add complete Streamlit app with modular structure
774e2a4
import streamlit as st
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from scipy import linalg
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import time
def show_simulator():
"""Simulateur principal intégré"""
st.header("🧪 Simulateur intégré - Jumeau Numérique Complet")
# Configuration du système
st.markdown("### 1. Configuration du système physique")
system_config = st.selectbox("Système à simuler",
["Masse-ressort 1D", "Poutre en flexion",
"Système 2DDL", "Système personnalisé"])
# Paramètres communs
col1, col2, col3 = st.columns(3)
with col1:
st.markdown("**Physique**")
simulate_physics = st.checkbox("Simuler la physique", True)
fidelity = st.slider("Fidélité du modèle", 1, 3, 2,
help="1: Basse fidélité, 2: Moyenne, 3: Haute")
with col2:
st.markdown("**Capteurs**")
sensor_count = st.slider("Nombre de capteurs", 1, 10, 2)
sensor_noise_level = st.slider("Bruit des capteurs", 0.0, 0.2, 0.05, 0.01)
with col3:
st.markdown("**Contrôle**")
control_enabled = st.checkbox("Activer le contrôle", True)
control_type = st.selectbox("Algorithme de contrôle",
["PID", "LQR", "MPC", "Adaptatif"])
# Configuration du jumeau numérique
st.markdown("### 2. Configuration du jumeau numérique")
twin_config = st.columns(4)
with twin_config[0]:
use_kalman = st.checkbox("Filtre de Kalman", True)
kalman_type = st.selectbox("Type", ["Standard", "Étendu", "Unscented"])
with twin_config[1]:
use_model_update = st.checkbox("Mise à jour modèle", False)
update_frequency = st.slider("Fréquence MAJ", 1, 100, 10)
with twin_config[2]:
use_data_assimilation = st.checkbox("Assimilation de données", True)
assimilation_method = st.selectbox("Méthode", ["Kalman", "Particle", "Ensemble"])
with twin_config[3]:
real_time_simulation = st.checkbox("Simulation temps réel", False)
visualization_level = st.selectbox("Niveau de visualisation", ["Basique", "Détaillé", "Expert"])
# Bouton de lancement
if st.button("🚀 Lancer le jumeau numérique", type="primary"):
st.info("Simulation du jumeau numérique en cours...")
# Simulation placeholder
progress_bar = st.progress(0)
for i in range(100):
time.sleep(0.01)
progress_bar.progress(i + 1)
st.success("Simulation terminée !")
st.balloons()
# Résultats fictifs
col1, col2, col3 = st.columns(3)
with col1:
st.metric("Précision du modèle", "95.2%", "↗️ +2.1%")
with col2:
st.metric("Performance contrôle", "87.8%", "↗️ +5.3%")
with col3:
st.metric("Qualité estimation", "92.1%", "↗️ +1.8%")