使用APMonitor实现Python模型预测控制:能否本地获取有偏/无偏预测控制变量数据?
Absolutely! You can totally retrieve both biased and unbiased predictive control variables using APMonitor's Python interface for MPC—no need to rely on external online servers at all. Everything can be run locally on your machine, so you can collect all the data you need and plot it directly in Python. Let’s break this down clearly:
First, Let’s Clarify the Terms
- Unbiased predictive control variables: These are the control sequences your ideal MPC model predicts without accounting for real-world deviations like model mismatch, external disturbances, or measurement feedback. It’s essentially an open-loop prediction based purely on your perfect, nominal model.
- Biased predictive control variables: These are adjusted predictions that incorporate real-time measurement feedback (to fix model inaccuracies) or intentional disturbance inputs. This is the closed-loop MPC output that reflects how the controller would tweak actions to account for what’s actually happening in the system.
Local APMonitor Setup (No External Servers)
To run everything locally, just follow these quick steps:
- Install the APMonitor Python package:
pip install apmonitor - Initialize your model to use a local server (APMonitor spins up a local instance automatically—no internet required):
from apmonitor import * m = APMonitor() m.server = 'http://127.0.0.1' # Force local server usage m.new_model('local_mpc')
Full Code Example: Fetch and Plot Both Predictions
Here’s a complete, runnable example that sets up a simple first-order system, computes both types of predictions, extracts the control variables, and plots them locally:
Step 1: Define the MPC Model
import numpy as np import matplotlib.pyplot as plt from apmonitor import * # Initialize local APMonitor model m = APMonitor() m.server = 'http://127.0.0.1' m.new_model('mpc_demo') # Model parameters (first-order system) m.param('tau', 10.0) # Time constant m.param('K', 2.0) # Gain # Variables: process output (y), control input (u) m.var('y', lb=0, ub=100) m.var('u', lb=0, ub=10, dv=True) # dv=True marks u as a manipulated variable # Dynamic model equation m.equation('tau*dy/dt = -y + K*u') # MPC configuration: 10-step prediction horizon m.options['nlc.imode'] = 6 # Set to MPC mode m.options['nlc.ncp'] = 2 # Collocation points per time interval m.options['nlc.tau'] = 1 # 1-second time steps m.options['nlc.horizon'] = 10 # Predict 10 steps ahead
Step 2: Get Unbiased (Open-Loop) Predictions
For unbiased predictions, we run the MPC using only the nominal model (no feedback or disturbances):
# Set nominal initial condition (y starts at 0) m.set('y', 0.0) # Solve open-loop MPC m.solve(disp=False) # disp=False hides solver output # Extract predicted u values across the horizon unbiased_u = [m.get('u', step) for step in range(m.options['nlc.horizon'])] time_steps = np.arange(m.options['nlc.horizon'])
Step 3: Get Biased (Closed-Loop) Predictions
To simulate biased predictions, we’ll introduce a real-world deviation (like a measured value that doesn’t match the model) and let the MPC adjust its control sequence:
# Simulate a disturbance/measurement mismatch: actual y is 5 instead of 0 m.set('y', 5.0) # Solve closed-loop MPC (uses feedback to adjust predictions) m.solve(disp=False) # Extract adjusted u values biased_u = [m.get('u', step) for step in range(m.options['nlc.horizon'])]
Step 4: Plot the Results Locally
plt.figure(figsize=(10, 6)) plt.plot(time_steps, unbiased_u, label='Unbiased (Open-Loop) Control', marker='o', linestyle='--') plt.plot(time_steps, biased_u, label='Biased (Closed-Loop with Feedback) Control', marker='s') plt.xlabel('Prediction Step') plt.ylabel('Control Input (u)') plt.title('Biased vs. Unbiased MPC Predictive Control Variables') plt.legend() plt.grid(True) plt.show()
Quick Tips for Your Workflow
- Extracting variables: Use
m.get(var_name, step)to pull the value of any variable at a specific prediction step. Loop through the horizon steps to collect the full sequence. - Local solvers: APMonitor uses local solvers (like IPOPT or APOPT) by default when running locally—no external server calls needed.
- Customizing bias: You can introduce bias in any way that matches your use case: add measurement noise, tweak model parameters to simulate mismatch, or inject external disturbances into the system.
内容的提问来源于stack exchange,提问作者Mohamad Ibrahim

