【MPC-Simulink】EX04 信号归一化简化权重调节过程与提高数值计算质量
参考 Matlab 官网提供的 Model Predictive Control Toolbox - Getting Started Guide,在 MPC 控制器中指定缩放因子,可以简化权重调节过程,提高数值计算质量。
当被控对象输入与输出信号具有不同数量级时,默认的 MPC 控制器权重设置往往导致较差的性能
1. 定义被控对象模型
-
使用 Matlab 被控对象示例
[plant,Ts] = mpcscalefactor_model; [ny,nu] = size(plant.D); % 5个输入 3个输出 10个状态MVindex = [1, 3, 5]; % 可控输入 MDindex = 4; % 可测量扰动 UDindex = 2; % 不可测量扰动 MOindex = [1 3]; % 可测量输出 UOindex = 2; % 不可测量输出 plant = setmpcsignals(plant, ... 'MV',MVindex, ... 'MD',MDindex, ... 'UD',UDindex, ... 'MO',MOindex, ... 'UO',UOindex);
The nominal values and operating ranges of plant model are as follows:
• Input 1: manipulated variable, nominal value is 100, range is [50 150]
• Input 2: unmeasured disturbance, nominal value is 10, range is [5 15]
• Input 3: manipulated variable, nominal value is 0.01, range is [0.005 0.015]
• Input 4: measured disturbance, nominal value is 0.1, range is [0.05 0.15]
• Input 5: manipulated variable, nominal value is 1, range is [0.5 1.5]
• Output 1: measured output, nominal value is 0.01, range is [0.005 0.015]
• Output 2: unmeasured output, nominal value is 1, range is [0.5 1.5]
• Output 3: measured output, nominal value is 100, range is [50 150]
-
使用
lsim
命令运行开环线性仿真。验证当输入信号在其标称值周围随机变化时,被控对象输出是否在范围内且其平均值是否接近标称值。
% 设置输入和输出范围 Urange = [100; 10; 0.01; 0.1; 1]; % 比如第一个输入在50-150之间变化,这里范围就是100 Yrange = [0.01; 1; 100];% 设置输入和输出标称值 % 对于此示例,标称值等同于范围 Unominal = [100; 10; 0.01; 0.1; 1]; Ynominal = [0.01; 1; 100];% 定义时间间隔 t = (0:1000)' * Ts; nt = length(t);% 定义输入和输出信号 Uol = (rand(nt, nu) - 0.5) .* (ones(nt, 1) * Urange'); % 设计输入信号 Yol = lsim(plant, Uol, t); % 计算被控对象输出% 输出平均输出值与标称值之间的差异 fprintf(['The differences between average output values ' ...'\n and the nominal values are: ' ...' %.2f%%, %.2f%%, %.2f%% respectively.\n'], ...abs(mean(Yol(:, 1))) / Ynominal(1) * 100, ...abs(mean(Yol(:, 2))) / Ynominal(2) * 100, ...abs(mean(Yol(:, 3))) / Ynominal(3) * 100);
The differences between average output values and the nominal values are: 2.25%, 3.53%, 2.47% respectively.
% 输入信号均值 mean(Uol)% 输入信号标准差 std(Uol)% 输出信号均值 mean(Yol)% 输出信号标准差 std(Yol)
这里,均值反映实际的标称值,标准差捕捉了信号的范围。
标称值/名义值(Nominal Value)指的是在理想情况下、没有任何干扰或误差时,系统或组件所期望的标准值或预设值。它通常用于描述一个系统的正常工作状态,作为参考值。在工程和控制系统中,标称值常常作为计算和设计的基础,以便评估系统在不同条件下的表现。
例如:
- 标称输入值:指的是在没有干扰或偏差的情况下,给定系统输入的理想值。
- 标称输出值:指的是在没有外部扰动的情况下,期望系统输出的标准值。
- 标称状态值:指的是在理想条件下,系统状态的参考值。
标称值通常用来简化模型的计算,帮助设计和评估控制系统的性能。在实际运行中,系统的实际值可能会有所偏差,通常需要通过反馈控制来修正这些偏差。
2. 不使用缩放因子(默认 MPC 控制器权重)
-
控制器创建
Weight.MV = 0 Weight.MVRate = 0.1 Weight.OV = 1% 创建MPC对象 mpcobjUnscaled = mpc(plant);
-->The "PredictionHorizon" property is empty. Assuming default 10. -->The "ControlHorizon" property is empty. Assuming default 2. -->The "Weights.ManipulatedVariables" property is empty. Assuming default 0.00000. -->The "Weights.ManipulatedVariablesRate" property is empty. Assuming default 0.10000. -->The "Weights.OutputVariables" property is empty. Assuming default 1.00000.
-
控制对象状态的标称值
Xnominal = zeros(10,1);
-
不可测量干扰的标称值
Unominal(UDindex) = 0;
-
设置标称值
mpcobjUnscaled.Model.Nominal = struct( ...'X', Xnominal, ...'DX', Xnominal, ...'Y', Ynominal, ...'U', Unominal);
为了计算被控对象输出,仿真将从输入信号中减去标称被控对象输入,从当前状态中减去被控对象标称状态,然后应用线性被控对象模型,最后将标称输出值加到计算的输出上。
为了计算可控输入,将从被控对象输出信号中移除标称输出,计算 MPC 控制序列,并将可控输入的标称值添加到计算的序列中。
-
测试三个参考信号设定点变化序列
% 预期的阶跃响应持续时间 nStepLen = 15;% 计算仿真时间以适应ny个步骤 Ns1 = nStepLen * ny;% 参考信号 r1 = ones(Ns1,1) * Ynominal(:)';% 通过每个输出并定义在StepLen间隔处的参考 StepTime = 1; for i = 1:nyr1(StepTime:end,i) = r1(StepTime:end,i) + Yrange(i);StepTime = StepTime + nStepLen; end
-
仿真
sim(mpcobjUnscaled, Ns1, r1);
输入
蓝色线是实际输出,灰色线是期望输出
第一个输出的跟踪响应较差。原因是它的范围相对于其他输出较小。如果使用默认的控制器调节权重,MPC 控制器对调节此输出的关注较少,因为与目标函数中其他输出相关的惩罚项相比较小。
-
再测试不可测量干扰的抑制效果。
% 创建仿真选项对象并设置未测量干扰 SimOpt = mpcsimopt; SimOpt.UnmeasuredDisturbance = Urange(UDindex)';% 设置仿真步骤数和参考信号 % 参考信号等于范围值 Ns2 = 100; r2 = ones(Ns2,1)*Yrange(:)';% 模拟闭环,参考信号为 r2 sim(mpcobjUnscaled, Ns2, r2, [], SimOpt)
第一个通道的扰动抑制效果同样很差,没有一个输出回到其设定值。
3. 使用缩放因子(默认 MPC 控制器权重)
改善优化和状态估计计算的数值质量,增加默认调节权重实现良好控制器性能的可能性,可以指定MPC控制器的输入和输出缩放因子。
-
复制带有默认权重的MPC控制器
mpcobjScaled = mpcobjUnscaled;
-
使用每个输入和输出的预期工作范围指定缩放因子
% 缩放可控输入 for i = 1:length(MVindex)mpcobjScaled.ManipulatedVariables(i).ScaleFactor = Urange(MVindex(i)); end% 缩放可测量干扰 nmd = length(MDindex); for i = 1:nmdmpcobjScaled.DisturbanceVariables(i).ScaleFactor = Urange(MDindex(i)); end% 缩放不可测量干扰 for i = 1:length(UDindex)mpcobjScaled.DisturbanceVariables(i+nmd).ScaleFactor = Urange(UDindex(i)); end% 缩放输出 for i = 1:nympcobjScaled.OV(i).ScaleFactor = Yrange(i); end
-
仿真
sim(mpcobjScaled, Ns1, r1)
-
测试不可测量干扰的抑制效果。
sim(mpcobjScaled,Ns2,r2,[],SimOpt)
即使没有调整 MPC 权重,设定点跟踪和干扰抑制都表现良好。这是因为现在原始权重应用于缩放后的信号,因此加权效果没有失真。