imc-tuning-rules

$npx mdskill add elizaOS/eliza/imc-tuning-rules

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.

SKILL.md

.github/skills/imc-tuning-rulesView on GitHub ↗
---
name: imc-tuning-rules
description: Calculate PI/PID controller gains using Internal Model Control (IMC) tuning rules for first-order systems.
---

# 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:
- `Kp` = Proportional gain
- `Ki` = Integral gain (units: 1/time)
- `Kd` = Derivative gain (zero for first-order)
- `lambda` = Desired closed-loop time constant (tuning parameter)

## Choosing Lambda (λ)

Lambda controls the trade-off between speed and robustness:

| Lambda | Behavior |
|--------|----------|
| `lambda = 0.1 * tau` | Very aggressive, fast but sensitive to model error |
| `lambda = 0.5 * tau` | Aggressive, good for accurate models |
| `lambda = 1.0 * tau` | Moderate, balanced speed and robustness |
| `lambda = 2.0 * tau` | 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

```python
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

```python
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

1. **Start conservative**: Use `lambda = tau` initially
2. **Decrease lambda carefully**: Smaller lambda = larger Kp = faster but riskier
3. **Watch for oscillation**: If output oscillates, increase lambda
4. **Anti-windup**: Prevent integral wind-up when output saturates

More from elizaOS/eliza

SkillDescription
ac-branch-pi-modelAC branch pi-model power flow equations (P/Q and |S|) with transformer tap ratio and phase shift, matching `acopf-math-model.md` and MATPOWER branch fields. Use when computing branch flows in either direction, aggregating bus injections for nodal balance, checking MVA (rateA) limits, computing branch loading %, or debugging sign/units issues in AC power flow.
academic-pdf-redactionRedact text from PDF documents for blind review anonymization
ada-plan-view-accessibilityUse when checking simplified ADA-derived plan-view bathroom accessibility constraints such as turning space, door clear width, toilet centerline, grab bars, and lavatory knee/toe clearance.
analyze-ciAnalyze failed GitHub Action jobs for a pull request.
architectural-dxf-extractionUse when extracting plan-view architectural geometry from DXF files with semantic CAD layers, especially when outputs must normalize rooms, doors, fixtures, clearances, and grab bars into machine-checkable JSON.
attitude-controller-plannerUse this skill when implementing the inner control loop for a quadrotor — attitude (roll/pitch/yaw) PID control and attitude planning (converting desired acceleration to desired Euler angles). Covers gain layout, integral reset pattern, and the attitude planner inverse kinematics.
azure-bgpAnalyze and resolve BGP oscillation and BGP route leaks in Azure Virtual WAN–style hub-and-spoke topologies (and similar cloud-managed BGP environments). Detect preference cycles, identify valley-free violations, and propose allowed policy-level mitigations while rejecting prohibited fixes.
box-least-squaresBox Least Squares (BLS) periodogram for detecting transiting exoplanets and eclipsing binaries. Use when searching for periodic box-shaped dips in light curves. Alternative to Transit Least Squares, available in astropy.timeseries. Based on Kovács et al. (2002).
browser-testingVERIFY your changes work. Measure CLS, detect theme flicker, test visual stability, check performance. Use BEFORE and AFTER making changes to confirm fixes. Includes ready-to-run scripts: measure-cls.ts, detect-flicker.ts
cache-policy-comparisonCompare and implement eviction policies (LRU, LFU, FIFO, S3FIFO, ARC) for bounded-capacity caches. Use when choosing or implementing an eviction policy for a buffer pool, page cache, CDN edge, or LLM KV cache, or when writing a replay simulator that supports multiple policies. Clarifies recency vs frequency semantics, queue topology, saturating counters, ghost buffers, and the second-chance rule that distinguishes modern FIFO-family policies from classic LRU.