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


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

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

 

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

 

一個簡單的例子如下圖所示: 

多個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的位置和速度的不可控。在這里,我們認為右方向為正方向

%模型參數%
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的位置

%% 狀態空間模型
% 當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

結果:

% 當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。

 仿真過程展示:

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.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM