自学内容网 自学内容网

【MPC-Simulink】EX04 信号归一化简化权重调节过程与提高数值计算质量

【MPC-Simulink】EX04 信号归一化简化权重调节过程与提高数值计算质量

参考 Matlab 官网提供的 Model Predictive Control Toolbox - Getting Started Guide,在 MPC 控制器中指定缩放因子,可以简化权重调节过程,提高数值计算质量。

当被控对象输入与输出信号具有不同数量级时,默认的 MPC 控制器权重设置往往导致较差的性能

1. 定义被控对象模型

  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]

  2. 使用 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 控制器权重)

  1. 控制器创建

    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.
    
  2. 控制对象状态的标称值

    Xnominal = zeros(10,1);
    
  3. 不可测量干扰的标称值

    Unominal(UDindex) = 0;
    
  4. 设置标称值

    mpcobjUnscaled.Model.Nominal = struct( ...
        'X', Xnominal, ...
        'DX', Xnominal, ...
        'Y', Ynominal, ...
        'U', Unominal);
    

    为了计算被控对象输出,仿真将从输入信号中减去标称被控对象输入,从当前状态中减去被控对象标称状态,然后应用线性被控对象模型,最后将标称输出值加到计算的输出上。

    为了计算可控输入,将从被控对象输出信号中移除标称输出,计算 MPC 控制序列,并将可控输入的标称值添加到计算的序列中。

  5. 测试三个参考信号设定点变化序列

    % 预期的阶跃响应持续时间
    nStepLen = 15;
    
    % 计算仿真时间以适应ny个步骤
    Ns1 = nStepLen * ny;
    
    % 参考信号
    r1 = ones(Ns1,1) * Ynominal(:)';
    
    % 通过每个输出并定义在StepLen间隔处的参考
    StepTime = 1;
    for i = 1:ny
        r1(StepTime:end,i) = r1(StepTime:end,i) + Yrange(i);
        StepTime = StepTime + nStepLen;
    end
    
  6. 仿真

    sim(mpcobjUnscaled, Ns1, r1);
    

    输入

    请添加图片描述

    蓝色线是实际输出,灰色线是期望输出

    请添加图片描述

    第一个输出的跟踪响应较差。原因是它的范围相对于其他输出较小。如果使用默认的控制器调节权重,MPC 控制器对调节此输出的关注较少,因为与目标函数中其他输出相关的惩罚项相比较小。

  7. 再测试不可测量干扰的抑制效果。

    % 创建仿真选项对象并设置未测量干扰
    SimOpt = mpcsimopt;
    SimOpt.UnmeasuredDisturbance = Urange(UDindex)';
    
    % 设置仿真步骤数和参考信号
    % 参考信号等于范围值
    Ns2 = 100;
    r2 = ones(Ns2,1)*Yrange(:)';
    
    % 模拟闭环,参考信号为 r2
    sim(mpcobjUnscaled, Ns2, r2, [], SimOpt)
    

    请添加图片描述

    请添加图片描述

    第一个通道的扰动抑制效果同样很差,没有一个输出回到其设定值。

3. 使用缩放因子(默认 MPC 控制器权重)

改善优化和状态估计计算的数值质量,增加默认调节权重实现良好控制器性能的可能性,可以指定MPC控制器的输入和输出缩放因子。

  1. 复制带有默认权重的MPC控制器

    mpcobjScaled = mpcobjUnscaled;
    
  2. 使用每个输入和输出的预期工作范围指定缩放因子

    % 缩放可控输入
    for i = 1:length(MVindex)
        mpcobjScaled.ManipulatedVariables(i).ScaleFactor = Urange(MVindex(i));
    end
    
    % 缩放可测量干扰
    nmd = length(MDindex);
    for i = 1:nmd
        mpcobjScaled.DisturbanceVariables(i).ScaleFactor = Urange(MDindex(i));
    end
    
    % 缩放不可测量干扰
    for i = 1:length(UDindex)
        mpcobjScaled.DisturbanceVariables(i+nmd).ScaleFactor = Urange(UDindex(i));
    end
    
    % 缩放输出
    for i = 1:ny
        mpcobjScaled.OV(i).ScaleFactor = Yrange(i);
    end
    
  3. 仿真

    sim(mpcobjScaled, Ns1, r1)
    

    请添加图片描述

    请添加图片描述

  4. 测试不可测量干扰的抑制效果。

    sim(mpcobjScaled,Ns2,r2,[],SimOpt)
    

    请添加图片描述

    请添加图片描述

    即使没有调整 MPC 权重,设定点跟踪和干扰抑制都表现良好。这是因为现在原始权重应用于缩放后的信号,因此加权效果没有失真。


原文地址:https://blog.csdn.net/qq_40964267/article/details/143627903

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!