一、概念
????????模型預測控制(Model Predictive Control, MPC)是一種先進的控制方法,廣泛應用于工業過程控制、機器人控制、自動駕駛等領域。MPC的核心思想是利用系統的動態模型預測未來的行為,并通過優化算法計算出當前時刻的最優控制輸入。它的主要特點包括:
- 預測未來行為:基于系統的數學模型,MPC可以預測未來一段時間內系統的狀態。
- 滾動優化:MPC在每個時刻都解決一個優化問題,計算出當前的控制輸入,并滾動更新預測。
- 約束處理:MPC可以顯式地處理輸入和狀態的約束條件。
- 反饋機制:MPC每次優化都基于當前的實際狀態,具有反饋控制的特性。
二、原理
????????MPC的工作流程如下:
1.系統建模:建立系統的動態模型,通常是離散時間的線性或非線性模型。例如,線性模型可以表示為:
????????其中是系統狀態,
是控制輸入,A?和?B?是系統矩陣。
2.預測未來狀態:基于當前狀態和控制輸入
,預測未來 N?步的狀態。
3.定義優化問題:設計一個目標函數,通常是最小化狀態偏差和控制輸入的代價,例如:
????????其中 Q?和 R?是權重矩陣,用于平衡狀態誤差和控制輸入的代價。
4.求解優化問題:在給定約束條件下(如輸入和狀態的范圍),求解目標函數,得到最優控制序列。
5.應用控制輸入:只應用優化得到的第一個控制輸入 ,然后滾動到下一個時刻重復上述過程。
三、python實現
????????被控對象:水箱液位控制系統
????????控制目標:通過調節進水閥門開度(0-100%),使液位穩定在設定值
import numpy as np
from scipy.optimize import minimizeclass SimpleMPC:def __init__(self):# 系統參數self.A = 0.8 # 狀態系數self.B = 0.2 # 輸入系數self.Np = 5 # 預測時域self.Nc = 2 # 控制時域self.Q = 1.0 # 狀態權重self.R = 0.1 # 輸入權重def predict(self, x0, u_sequence):"""狀態預測函數"""x_pred = [x0]for i in range(self.Np):if i < len(u_sequence):u = u_sequence[i]else:u = u_sequence[-1] # 超出控制時域保持最后值x_next = self.A * x_pred[-1] + self.B * ux_pred.append(x_next)return np.array(x_pred[1:]) # 返回預測序列def cost_function(self, u_sequence, x0, ref):"""優化目標函數"""x_pred = self.predict(x0, u_sequence)tracking_error = np.sum((x_pred - ref)**2) * self.Qcontrol_cost = np.sum(u_sequence**2) * self.Rreturn tracking_error + control_costdef solve_mpc(self, x_current, ref):"""求解MPC優化問題"""# 定義初始猜測和控制量邊界u_init = np.zeros(self.Nc)bounds = [(0, 1) for _ in range(self.Nc)] # 閥門開度限制# 構建優化問題res = minimize(fun=self.cost_function,x0=u_init,args=(x_current, ref),bounds=bounds,method='SLSQP')return res.x[0] if res.success else 0.0 # 返回首個控制量# 仿真測試
mpc = SimpleMPC()
h_current = 0.5 # 初始液位
ref_level = 1.0 # 目標液位for step in range(20):# 計算控制量u_opt = mpc.solve_mpc(h_current, ref_level)# 更新系統狀態h_current = mpc.A * h_current + mpc.B * u_optprint(f"Step {step+1}: 液位={h_current:.2f}, 閥門開度={u_opt:.2f}")
? ? ? ? 值得注意的是,這里我們使用了scipy.optimize.minimize,這是幫助我們高效地在復雜約束下找到最優解的重要工具。scipy.optimize.minimize是SciPy中用于求解目標函數最小值的核心工具,它封裝了多種優化算法,能處理從簡單無約束問題到復雜帶約束(線性 / 非線性)問題的優化需求。它本身不是一個單一算法,而是一個統一接口,根據問題類型(是否有約束、是否光滑等)調用不同的底層優化算法。其核心邏輯是:通過迭代搜索,不斷調整輸入參數,找到使目標函數值最小的參數組合。在method參數中,我們可以根據任務的需要選擇不同的優化方法:
算法類型 | 可選參數 | 適用場景 |
---|---|---|
無約束優化 | BFGS、L-BFGS-B | 目標函數光滑(可導),無約束條件;L-BFGS-B 適合大規模問題(內存高效) |
有約束優化 | SLSQP | 支持等式 / 不等式約束(線性或非線性) |
整數規劃 | COBYLA | 處理變量為整數的約束(精度較低) |
全局優化 | differential_evolution | 目標函數非光滑、有多個局部最小值時,尋找全局最優 |