Skillsbench imc-tuning-rules
Calculate PI/PID controller gains using Internal Model Control (IMC) tuning rules for first-order systems.
install
source · Clone the upstream repo
git clone https://github.com/benchflow-ai/skillsbench
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/benchflow-ai/skillsbench "$T" && mkdir -p ~/.claude/skills && cp -r "$T/tasks/hvac-control/environment/skills/imc-tuning-rules" ~/.claude/skills/benchflow-ai-skillsbench-imc-tuning-rules && rm -rf "$T"
manifest:
tasks/hvac-control/environment/skills/imc-tuning-rules/SKILL.mdsource content
IMC Tuning Rules for PI/PID Controllers
Overview
Internal Model Control (IMC) is a systematic method for tuning PI/PID controllers based on a process model. Once you've identified system parameters (K and tau), IMC provides controller gains.
Why IMC?
- Model-based: Uses identified process parameters directly
- Single tuning parameter: Just choose the closed-loop speed (lambda)
- Guaranteed stability: For first-order systems, always stable if model is accurate
- Predictable response: Closed-loop time constant equals lambda
IMC Tuning for First-Order Systems
For a first-order process with gain K and time constant tau:
Process: G(s) = K / (tau*s + 1)
The IMC-tuned PI controller gains are:
Kp = tau / (K * lambda) Ki = Kp / tau = 1 / (K * lambda) Kd = 0 (derivative not needed for first-order systems)
Where:
= Proportional gainKp
= Integral gain (units: 1/time)Ki
= Derivative gain (zero for first-order)Kd
= Desired closed-loop time constant (tuning parameter)lambda
Choosing Lambda (λ)
Lambda controls the trade-off between speed and robustness:
| Lambda | Behavior |
|---|---|
| Very aggressive, fast but sensitive to model error |
| Aggressive, good for accurate models |
| Moderate, balanced speed and robustness |
| Conservative, robust to model uncertainty |
Default recommendation: Start with
lambda = tau
For noisy systems or uncertain models, use larger lambda. For precise models and fast response needs, use smaller lambda.
Implementation
def calculate_imc_gains(K, tau, lambda_factor=1.0): """ Calculate IMC-tuned PI gains for a first-order system. Args: K: Process gain tau: Time constant lambda_factor: Multiplier for lambda (default 1.0 = lambda equals tau) Returns: dict with Kp, Ki, Kd, lambda """ lambda_cl = lambda_factor * tau Kp = tau / (K * lambda_cl) Ki = Kp / tau Kd = 0.0 return { "Kp": Kp, "Ki": Ki, "Kd": Kd, "lambda": lambda_cl }
PI Controller Implementation
class PIController: def __init__(self, Kp, Ki, setpoint): self.Kp = Kp self.Ki = Ki self.setpoint = setpoint self.integral = 0.0 def compute(self, measurement, dt): """Compute control output.""" error = self.setpoint - measurement # Integral term self.integral += error * dt # PI control law output = self.Kp * error + self.Ki * self.integral # Clamp to valid range output = max(output_min, min(output_max, output)) return output
Expected Closed-Loop Behavior
With IMC tuning, the closed-loop response is approximately:
y(t) = y_setpoint * (1 - exp(-t / lambda))
Key properties:
- Rise time: ~2.2 * lambda to reach 90% of setpoint
- Settling time: ~4 * lambda to reach 98% of setpoint
- Overshoot: Minimal for first-order systems
- Steady-state error: Zero (integral action eliminates offset)
Tips
- Start conservative: Use
initiallylambda = tau - Decrease lambda carefully: Smaller lambda = larger Kp = faster but riskier
- Watch for oscillation: If output oscillates, increase lambda
- Anti-windup: Prevent integral wind-up when output saturates