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: object

Dynamic 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

add_disturbance(disturbance_func, name='Disturbance')[source]

Add disturbance to simulation.

Parameters:
  • disturbance_func (Callable[[float], <MagicMock id='130137677418512'>]) – Function d(t) returning disturbance vector

  • name (str) – Disturbance name

set_setpoint_profile(setpoint_func)[source]

Set setpoint profile for closed-loop simulation.

Parameters:

setpoint_func (Callable[[float], float | <MagicMock id='130137677419520'>]) – Function sp(t) returning setpoint value(s)

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:
  • t_span (Tuple[float, float]) – Time span (start, end)

  • 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:

Dict[str, <MagicMock id=’130137677417840’>]

plot_results(variables=None, figsize=(12, 10))[source]

Plot simulation results.

Parameters:
  • variables (List[str] | None) – List of variables to plot

  • figsize (Tuple[int, int]) – Figure size

get_performance_metrics()[source]

Calculate performance metrics for closed-loop simulation.

Returns:

Dictionary with performance metrics

Return type:

Dict[str, float]

compare_scenarios(scenarios, metric='mae')[source]

Compare multiple simulation scenarios.

Parameters:
  • scenarios (List[Dict[str, Any]]) – List of scenario dictionaries

  • metric (str) – Performance metric for comparison

Returns:

Comparison results

Return type:

Dict[str, Any]

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()