🎁 Get the FREE AI Skills Starter Guide β€” Subscribe β†’
BytesAgainBytesAgain
πŸ¦€ ClawHub

first-order-model-fitting

by @wu-uk

Fit first-order dynamic models to experimental step response data and extract K (gain) and tau (time constant) parameters.

Versionv0.1.0
Downloads269
TERMINAL
clawhub install hvac-control-first-order-model-fitting

πŸ“– About This Skill


name: first-order-model-fitting description: Fit first-order dynamic models to experimental step response data and extract K (gain) and tau (time constant) parameters.

First-Order System Model Fitting

Overview

Many physical systems (thermal, electrical, mechanical) exhibit first-order dynamics. This skill explains the mathematical model and how to extract parameters from experimental data.

The First-Order Model

The dynamics are described by:

tau * dy/dt + y = y_ambient + K * u

Where:

  • y = output variable (e.g., temperature, voltage, position)
  • u = input variable (e.g., power, current, force)
  • K = process gain (output change per unit input at steady state)
  • tau = time constant (seconds) - characterizes response speed
  • y_ambient = baseline/ambient value
  • Step Response Formula

    When you apply a step input from 0 to u, the output follows:

    y(t) = y_ambient + K * u * (1 - exp(-t/tau))
    

    This is the key equation for fitting.

    Extracting Parameters

    Process Gain (K)

    At steady state (t -> infinity), the exponential term goes to zero:

    y_steady = y_ambient + K * u
    

    Therefore:

    K = (y_steady - y_ambient) / u
    

    Time Constant (tau)

    The time constant can be found from the 63.2% rise point:

    At t = tau:

    y(tau) = y_ambient + K*u*(1 - exp(-1))
           = y_ambient + 0.632 * (y_steady - y_ambient)
    

    So tau is the time to reach 63.2% of the final output change.

    Model Function for Curve Fitting

    def step_response(t, K, tau, y_ambient, u):
        """First-order step response model."""
        return y_ambient + K * u * (1 - np.exp(-t / tau))
    

    When fitting, you typically fix y_ambient (from initial reading) and u (known input), leaving only K and tau as unknowns:

    def model(t, K, tau):
        return y_ambient + K * u * (1 - np.exp(-t / tau))
    

    Practical Tips

    1. Use rising portion data: The step response formula applies during the transient phase 2. Exclude initial flat region: Start your fit from when the input changes 3. Handle noisy data: Fitting naturally averages out measurement noise 4. Check units: Ensure K has correct units (output units / input units)

    Quality Metrics

    After fitting, calculate:

  • R-squared (R^2): How well the model explains variance (want > 0.9)
  • Fitting error: RMS difference between model and data
  • residuals = y_measured - y_model
    ss_res = np.sum(residuals**2)
    ss_tot = np.sum((y_measured - np.mean(y_measured))**2)
    r_squared = 1 - (ss_res / ss_tot)
    fitting_error = np.sqrt(np.mean(residuals**2))