在运行时调整MPC控制器权重
这个例子展示了如何使用Simulink®或在运行时改变输出、输入和ECR松弛变量的权重,以获得软约束金宝appmpcmove
.
在MPC对象中指定的权重将被提供给MPC控制器块的权重覆盖。如果一个权重信号没有连接到MPC控制器块,那么相应的权重是在MPC对象中指定的。
定义植物模型
定义一个多变量离散线性系统,没有直接I/O馈通,并假设输入#4是一个测量的扰动,输出#4是不可测量的。
Ts = 0.1;%采样时间植物特遣部队(= {1 [1]5 2;3,[1 - 5],1,0,0,0,1,[1];2,[1],0,0},...{[1 1 1],[1 3 4 5],[1 10],[1 5];[1 1],[1 2],[1 2 8],[1 1];[1 2 1],[1 3 1 1],[1 1],[1 2];[1 1],[1 3 10 10],[1 10],[1 1]});plant = c2d(ss(plant),Ts);工厂。D = 0;%显示植物大小。大小(植物)
具有4个输出、4个输入和17个状态的状态空间模型。
MPC控制器设计
指定输入和输出信号类型。
植物= setmpcsignals(植物,“医学博士”,4,“UO”4);创建具有采样周期、预测和控制的控制器对象%的视野:P = 20;%预测水平M = 3;%控制水平mpcobj = mpc(plant,Ts,p,m);请注意,输入、输入速率和输出的默认权重是假设的
——>假设未指定的输入信号是被操纵的变量。——>假设未指定的输出信号是测量输出。- - - >“权重。属性为空。假设默认值为0.00000。- - - >“权重。属性为空。假设默认为0.10000。- - - >“权重。OutputVariables属性为空。 Assuming default 1.00000. for output(s) y1 y2 y3 and zero weight for output(s) y4
指定MV约束。
mpcobj.MV(1)。Min = -6;mpcobj.MV(1)。Max = 6;mpcobj.MV(2)。Min = -6;mpcobj.MV(2)。Max = 6;mpcobj.MV(3)。Min = -6;mpcobj.MV(3)。Max = 6;
使用结构格式定义时变信号
定义参考信号。
Tstop = 10;Ref = [1 0 3 1];R = struct(“时间”(0: Ts: Tstop) ');N = number (r.time);r.signals.values = (N - 1) *的裁判;
定义测量扰动。
V = 0.5;
OV权重随时间线性增加,除了没有加权的输出#2。
ywt。时间= r.time;ywt.signals.values = (1:N)'*[。1 0.1 .1];
MV率权值随时间线性减小。
duwt。时间= r.time;duwt.signals.values = (1-(1:N)/2/N)'*[。1.1 .1];
ECR权重随时间呈指数增长。
ECRwt。时间= r.time;ECRwt.signals.values = 10.^(2+(1:N)’/N);
使用Simulink®进行模拟金宝app
开始仿真。
mdl =“mpc_onlinetuning”;open_system (mdl);打开Simul金宝appink(R)模型sim (mdl);%开始模拟
假设添加到测量输出通道#1的输出扰动是集成白噪声。假设添加到测量输出通道#2的输出扰动是集成白噪声。假设添加到测量输出通道#3的输出扰动是集成白噪声。——>”模式。“噪音”属性为空。假设每个测量输出都有白噪声。
使用MPCMOVE命令模拟
定义真实工厂和MPC状态对象。
[A,B,C,D] = ssdata(植物);x = 0 (size(plant.B,1),1);工厂的初始状态XMPC = mpcstate(mpcobj);MPC控制器的状态句柄
将闭环MPC轨迹存储在数组YY,UU,XX中。
Yy = [];Uu = [];Xx = [];
使用mpcmoveopt
对象在运行时提供权重。
选项= mpcmoveopt;
开始仿真。
为t = 0:N-1,%商店状态XX = [XX,x];% #好< * AGROW >计算和存储工厂输出(从MV到Y无馈通)y = C*x+D(:,4)*v;YY = [YY;y'];获取参考信号Ref = r.signals.values(t+1,:)';使用运行时权重更新|mpcmoveopt|对象选项。MVRateWeight = duwt.signals.values(t+1,:);选项。OutputWeight = ywt.signals.values(t+1,:);选项。ECRWeight = ECRwt.signals.values(t+1,:);计算和疼痛控制措施U = mpcmove(mpcobj,xmpc,y(1:3),ref,v,options);UU = [UU;u'];更新工厂状态x = A*x + B(:,1:3)*u + B(:,4)*v;结束
绘制并比较模拟结果。
图(1);clf;subplot(121) plot(0:Ts:Tstop,[YY ysim])“输出”) subplot(122) plot(0:Ts:Tstop,[UU usim])“输入”)
比较输入和输出信号。
规范(UU-usim)规范(YY-ysim)%结果除了数值错误外是相同的。
Ans = 4.1345e-11 Ans = 8.7018e-12
bdclose (mdl);