Simulation Package
The simulation package provides dynamic simulation capabilities for process control systems with integrated control loops, disturbances, and performance monitoring.
Note
This is part of the modern modular structure of SPROCLIB.
Submodules
Process Simulation
Process Simulation for SPROCLIB
This module provides dynamic simulation capabilities for process control systems with integrated control loops, disturbances, and performance monitoring.
Author: Thorsten Gressling <gressling@paramus.ai> License: MIT License
- class sproclib.simulation.process_simulation.ProcessSimulation(process_model, controller=None, name='Process Simulation')[source]
Bases:
objectDynamic process simulation with control loops.
- Parameters:
name (str)
- __init__(process_model, controller=None, name='Process Simulation')[source]
Initialize process simulation.
- Parameters:
process_model – Process model with dynamics(t, x, u) method
controller – Controller object (optional)
name (str) – Simulation name
- run(t_span, x0, u_profile=None, solver='RK45', rtol=1e-06, atol=1e-09, max_step=None)[source]
Run simulation with specified conditions.
- Parameters:
x0 (<MagicMock id='130137677420528'>) – Initial conditions
u_profile (Callable[[float], <MagicMock id='130137677420864'>] | None) – Input profile function (for open-loop) or None (for closed-loop)
solver (str) – ODE solver method
rtol (float) – Relative tolerance
atol (float) – Absolute tolerance
max_step (float | None) – Maximum step size
- Returns:
Simulation results
- Return type:
Quick Usage
Basic Process Simulation:
from simulation.process_simulation import ProcessSimulation
import numpy as np
# Define a simple process model
def tank_model(t, x, u):
# Tank dynamics: dh/dt = (Fin - Fout)/A
h = x[0]
Fin = u[0]
Fout = 2.0 * np.sqrt(h) if h > 0 else 0
return [(Fin - Fout) / 1.0] # Area = 1.0
# Create simulation
sim = ProcessSimulation(tank_model, name="Tank Simulation")
# Define input profile
def input_profile(t):
return [3.0] # Constant inlet flow
# Run simulation
results = sim.run_open_loop(
t_span=(0, 20),
x0=[1.0], # Initial height
u_profile=input_profile
)
# Plot results
sim.plot_results()