MATLAB模型預測控制(MPC,Model Predictive Control)

模型預測控制是一種基於模型的閉環優化控制策略。html

預測控制算法的三要素:內部(預測)模型、參考軌跡、控制算法。如今通常則更清楚地表述爲內部(預測)模型、滾動優化、反饋控制。 
大量的預測控制權威性文獻都無一例外地指出, 預測控制最大的吸引力在於它具備顯式處理約束的能力, 這種能力來自其基於模型對系統將來動態行爲的預測, 經過把約束加到將來的輸入、輸出或狀態變量上, 能夠把約束顯式表示在一個在線求解的二次規劃或非線性規劃問題中
模型預測控制具備控制效果好、魯棒性強等優勢,可有效地克服過程的不肯定性、非線性和並聯性,並能方便的處理過程被控變量和操縱變量中的各類約束算法

 

Mo(measured output):當前可測量的輸出信號 
Ref(Reference signa):參考信號 
Md(optional measured disturbance signa):可選的測量干擾信號 
Mv(optimal manipulated variables ):最優操縱變量 
MPC通常經過求解一個二次規劃(這裏咱們使用ord45)來計算最優操縱變量 app

 

一個簡單的例子以下圖所示: 優化

多個MPC調度控制器解決方案

系統描述 :
若是你的對象模型是非線性,設計一個控制器操做在一個特定的目標地區表現優異,但可能在其餘地區表現不佳。補償的經常使用方法是設計多個控制器,每一個面向一個特定的操做條件的組合。他們之間切換實時隨着狀況的變化。得到這項技術的調度是一個傳統的例子。下面的例子顯示瞭如何協調多個模型預測控制器 
該系統是由兩個物體M1和M2分別鏈接到兩個獨立的彈簧k1和k2組成。假定當M1和M2碰撞的時候是徹底非彈性碰撞。力F對於M1來講是拉力,這是可操縱變量( manipulated variable MV)。目標是使M1的位置y1跟蹤給定參考位置r(Reference signa)。 
當M1和M2分離時,M1自由地移動。發生碰撞的時候,因爲是徹底非彈性碰撞,因此M1 + M2一塊兒移動。咱們假設只有M1的位置和接觸傳感器提供反饋。後者是用來觸發開關MPC控制器來選擇MPC1仍是MPC2。在這裏,咱們認爲,M2的位置和速度的不可控。在這裏,咱們認爲右方向爲正方向spa

%模型參數%
clear all clc M1
=1; % M1的質量 M2=5; % M2的質量 k1=1; % 彈簧k1常數k k2=0.1; % 彈簧k2常數k b1=0.3; % 與空氣的摩擦係數,與速度成正比 b2=0.8; % 摩擦係數 yeq1=10; % 剛性壁1的位置 yeq2=-10; % 剛性壁2的位置

狀態空間模型 :設計

states:M1的位置和速度 
MV:推力F 
MD:物體1由彈簧的需求的力F和實際給出的F之間的常量偏差,用來彌補彈簧彈力,使M在初始位置0上時,彈簧對其做用力爲零。 
MO:M1的位置3d

%% 狀態空間模型
% 當M1和M2不接觸時候的狀態模型.
A1=[0 1;-k1/M1 -b1/M1];
B1=[0 0;-1/M1 k1*yeq1/M1];
C1=[1 0];
D1=[0 0];
sys1=ss(A1,B1,C1,D1);                 %創建狀態空間表達式
sys1=setmpcsignals(sys1,'MD',2);    %第二個輸入是可測量擾動   
%%Setmpcsignals:設置MPC受控對象的的I/0信號模型。這個系統必須是線性時不變系統
%’MD’:可測量的輸入擾動,,第二個輸入是可測量的輸入擾動。若是沒有指定的輸入變量是MV

結果:code

% 當M1和M2接觸時候的狀態模型.
A2=[0 1;-(k1+k2)/(M1+M2) -(b1+b2)/(M1+M2)];
B2=[0 0;-1/(M1+M2) (k1*yeq1+k2*yeq2)/(M1+M2)];
C2=[1 0];
D2=[0 0];
sys2=ss(A2,B2,C2,D2);
sys2=setmpcsignals(sys2,'MD',2); %第二個輸入是可測量擾動   
%%Setmpcsignals:設置MPC受控對象的的I/0信號模型。這個系統必須是線性時不變系統
%’MD’:可測量的輸入擾動,,第二個輸入是可測量的輸入擾動。若是沒有指定的輸入變量是MV
%%Multi-MPC控制設置
%%
MPC仿真參數設置 Ts=0.2; % 採樣時間 p=20; % 預測時域長度 m=1; % 控制時域長度 %% 創建MPC模型 MPC1=mpc(sys1,Ts,p,m); % 定義M1和M2分離的MPC模型 % 設置限制,F的大小不能爲0,F斜率絕對值最大1000 MPC1.MV=struct('Min',0,'Max',Inf,'RateMin',-1e3,'RateMax',1e3); MPC2=mpc(sys2,Ts,p,m); %定義M1和M2鏈接的MPC2模型 MPC2.MV=MPC1.MV; %系統1和系統2的控制限制同樣
%% 仿真參數設置
Tstop=100;             % 仿真時間
y1initial=0;           % 物體1的初始位置
y2initial=10;          % 物體2的初始位置
open_system('wc1');   % 調用wc1.MDL
disp('Start simulation by switching control between MPC1 and MPC2 ...');
set_param('wc1/signals','Open','On');%設置系統和模型的參數值
sim('wc1',Tstop);%開始動態系統仿真

 

The total simulation diagram上面的部分模擬兩個物體的運動,而且這種移動會在在示波器中以信號的方式顯示出來。而且當M1的位置和加速度均大於M2的位置和加速度時,model輸出布爾量true或者false;下半部分包含如下要素: 
1.多個MPC控制器,。這有四個輸入:可測量輸出(mo), 參考(ref),可測量干擾(md)輸入和獨特的多個MPC控制器的功能塊switch輸入。 
2.一脈衝發生器改變M1須要到達的位置 (控制器參考信號)。此脈衝發生器的輸出是一個幅值爲5的方波,頻率是0.015每秒。 
3.模擬傳感器的接觸。當switch輸入1時,激活第一個控制器MPC1,這個時候M1和M2是分離的。當兩個物體有相同的位置時,Compare to Constant的計算結果爲1,經過Add1加法器的輸出值爲2,Multiple MPC Controllers的switch端口被輸入2,自動啓動第二個控制器MPC2。htm

 仿真過程展現:對象

MPC1與MPC2協同工做 
下圖展現了對於這個例子多個MPC控制器的仿真: 

在圖上面上,青色的線(就是咱們M1須要的到達的位置,由reference產生)它從-5開始。的M1位置(黃色)從0開始出發。 在MPC1的控制下, M1移動迅速向所需的位置。M2(紅色)從10開始開始朝着同一個方向移動 
大約在t = 13秒,M2與M1發生徹底非彈性碰撞。M1與M2連在一塊兒。第三幅圖顯示了開關信號的變化,在這個瞬間從1到2,因此MPC2開始起做用。。 
在M1+M2超過了從其所指望的位置時候,M2和M1仍連在一塊兒。控制器MPC2調整做用力F(中間的圖片)使M1+M2快速返回到所需的位置。當r突變到5時,效果同樣是很是不錯的

%單個MPC1一直工做
%再進行一次不管在什麼狀況下只用MPC1系統的實驗
disp('Now repeat simulation by using only MPC1 ...');
MPC2save=MPC2;     %先將MPC2保存起來
MPC2=MPC1;          %用MPC2來代替MPC21
sim('wc1',Tstop);  %動態系統仿真

%%若是一直是MPC1的系統,力F不夠,當M1和M2鏈鏈接在一塊兒的時候,移動緩慢,當下一個轉變發生時還不能到達所需的位置

 

 

%單個MPC2一直工做
%再進行一次不管在什麼狀況下只用MPC2系統的實驗
disp('Now repeat simulation by using only MPC2 ...');
MPC1=MPC2save;
MPC2=MPC1;
sim('WC1',Tstop);

%%當M1和M2分開的時候,MPC2也依然使用,過分使用F,過分補償,致使振盪產生。當M2和M1鏈接在一塊兒的時候,移動更平穩,和預期同樣。最後過渡形成特別嚴重的振盪。 M1和M2頻繁的碰撞,M1不能到達所需的位置

 

 

%%彙總
%% 多個MPC的的調度控制器 % clc
% clear all

%% 系統參數
clear all
clc
M1=1;       % M1的質量
M2=5;       % M2的質量
k1=1;       % 彈簧k1常數k
k2=0.1;     % 彈簧k2常數k 
b1=0.3;     % 與空氣的摩擦係數,與速度成正比
b2=0.8;     % 摩擦係數
yeq1=10;    % 剛性壁1的位置 
yeq2=-10;   % 剛性壁2的位置   

%% 狀態空間模型
% 狀態: M的速度和位置 
% 被控變量:F
% 可測量的擾動:彈簧1的常熟;
% 測量輸出: M1的位置 

% 當M1和M2不接觸時候的狀態模型.
A1=[0 1;-k1/M1 -b1/M1];
B1=[0 0;-1/M1 k1*yeq1/M1];
C1=[1 0];
D1=[0 0]; 
sys1=ss(A1,B1,C1,D1);             %創建狀態空間表達式
sys1=setmpcsignals(sys1,'MD',2)  ;%第二個輸入是可測量擾動

% 當M1和M2接觸時候的狀態模型.
A2=[0 1;-(k1+k2)/(M1+M2) -(b1+b2)/(M1+M2)];
B2=[0 0;-1/(M1+M2) (k1*yeq1+k2*yeq2)/(M1+M2)];
C2=[1 0];
D2=[0 0];
sys2=ss(A2,B2,C2,D2);
sys2=setmpcsignals(sys2,'MD',2);

%% MPC仿真參數設置
Ts=0.2;     % 採樣時間
p=20;       % 預測時域長度
m=1;        % 控制時域長度

%% 創建MPC模型
MPC1=mpc(sys1,Ts,p,m);                        % 定義M1和M2分離的MPC模型
MPC1.MV=struct('Min',0,'Max',Inf,'RateMin',-1e3,'RateMax',1e3);  % 設置限制,F的大小不能爲0

MPC2=mpc(sys2,Ts,p,m);       %定義M1和M2鏈接時候的MPC模型
MPC2.MV=MPC1.MV;             %系統1和系統2的控制限制同樣

%% 仿真參數設置
Tstop=100;      % 仿真時間
y1initial=0;    % 物體1的初始位置
y2initial=10;   % 物體2的初始位置
open_system('WC1');   % 調用WC1.MDL

%% 開始三次仿真
%雙系統MPC1和MPC2仿真實驗
disp('Start simulation by switching control between MPC1 and MPC2 ...');
set_param('wc1/signals','Open','On');%設置系統和模型的參數值
sim('WC1',Tstop);%動態系統仿真

%再進行一次不管在什麼狀況下只用MPC1系統的實驗
disp('Now repeat simulation by using only MPC1 ...'); 
MPC2save=MPC2;  %先將MPC2保存起來
MPC2=MPC1;      %用MPC2來代替MPC21
sim('WC1',Tstop);

%再進行一次不管在什麼狀況下只用MPC2系統的實驗
disp('Now repeat simulation by using only MPC2 ...');
MPC1=MPC2save;
MPC2=MPC1;
sim('WC1',Tstop);

%% 關閉仿真窗口
% bdclose('WC1')
% close(findobj('Tag','WC1_demo'))



%% reference
%[1] A. Bemporad, S. Di Cairano, I. V. Kolmanovsky, and D. Hrovat, "Hybrid
%    modeling and control of a multibody magnetic actuator for automotive
%    applications," in Proc. 46th IEEE(R) Conf. on Decision and Control, New
%    Orleans, LA, 2007. 
%[2]http://cn.mathworks.com/help/mpc/gs/coordination-of-multiple-model-predictive-controllers.html#bs670e3-8
%[3]李國勇,智能預測控制及其MATLAB實現.北京:電子工業出版社,2010.
相關文章
相關標籤/搜索