模型预测控制(MPC)的稳定性证明——终端约束

作为一种在有限时域内进行滚动优化求解的控制算法,模型预测控制(Model Predictive Control,MPC)的稳定性更引入关注。自从上世纪80年代后期MPC在工业界的成功应用倒逼学术界进行理论研究后,关于MPC的稳定性逐渐得到了证明并出现了在不同基础上的思路,本文主要讲述其中采用添加终端约束(terminal constraints)的方法。参考内容是Maciejowski的Predictive control: with constraints这本书。

这里考虑一个一般性的被控对象的模型:

x(k+1)=f(x(k),u(k))

在每个周期的控制作用是通过求解下面这个优化命题得到的:

V(k)=i=1N(x^(k+i|k),u^(k+i1|k))
这里 (x,u)0 (x,u)=0 当且仅当 x=0 u=0 。同时我们在这里加上终端约束:
x^(k+N|k)=0
在这里为了简明起见,我们令控制时域和预测时域都相等且为 N . 同时要说明的是,这里的 u x 都是带有约束的,即:
  • 26
    点赞
  • 141
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
以下是一个简单的MATLAB代码示例,演示如何使用模型预测控制(MPC)实现终端约束。在这个例子中,我们使用了一个简单的二阶系统,但是可以将其扩展到更复杂的系统。 ``` % 定义系统参数 A = [1 1; 0 1]; B = [0.5; 1]; C = [1 0]; D = 0; % 定义MPC参数 N = 10; % 控制时域 Q = diag([1 0.1]); % 状态成本 R = 0.1; % 控制成本 P = Q; % 终端成本 x0 = [0; 0]; % 初始状态 % 定义约束条件 umin = -1; umax = 1; xmin = [-10; -10]; xmax = [10; 10]; % 构建MPC控制器 sys = ss(A, B, C, D); mpcobj = mpc(sys, 0.1, N); mpcobj.Model.StateFcn = @(x, u) A*x + B*u; % 状态转移方程 mpcobj.Model.OutputFcn = @(x, u) C*x + D*u; % 输出方程 mpcobj.Weights.OutputVariables = [1]; % 只控制第一维输出 mpcobj.Weights.ManipulatedVariablesRate = R; % 控制成本 mpcobj.Weights.ManipulatedVariables = eye(1); % 控制变量的权重 mpcobj.Weights.ECR = P; % 终端成本 mpcobj.OutputVariables = {'y'}; % 输出变量名 mpcobj.MV.Min = umin; % 控制变量最小值 mpcobj.MV.Max = umax; % 控制变量最大值 mpcobj.OV.Min = xmin; % 状态变量最小值 mpcobj.OV.Max = xmax; % 状态变量最大值 mpcobj.OV.Target = [0]; % 目标输出 % 仿真MPC控制器 t_sim = 0:0.1:10; u_sim = zeros(1, length(t_sim)); y_sim = zeros(1, length(t_sim)); x_sim = x0; for i = 1:length(t_sim) % 更新MPC控制器 mpcobj.CurrentState = x_sim(:, i); u_mpc = mpcobj(u_sim(:, i)); % 应用控制输入并更新状态 u_sim(:, i+1) = u_mpc(1); [t, x] = ode45(@(t, x) A*x + B*u_sim(:, i), [t_sim(i) t_sim(i+1)], x_sim(:, i)); x_sim(:, i+1) = x(end, :)'; y_sim(:, i) = C*x_sim(:, i); end % 绘制结果 figure; subplot(211); plot(t_sim, y_sim, 'b', 'LineWidth', 2); xlabel('Time (s)'); ylabel('Output (y)'); grid on; subplot(212); plot(t_sim(1:end-1), u_sim(1:end-1), 'r', 'LineWidth', 2); xlabel('Time (s)'); ylabel('Control Input (u)'); grid on; ``` 在上面的代码中,我们首先定义了系统的动态模型和MPC参数,然后定义了约束条件。接下来,我们使用`mpc`函数创建一个MPC对象,并设置其参数。最后,我们使用一个简单的for循环来模拟MPC控制器并绘制结果。在每个时间步骤中,我们使用当前状态更新MPC对象,并使用`mpc`函数计算控制输入。然后我们将控制输入应用于系统并更新状态,同时记录输出。最后,我们使用`subplot`函数绘制输出和控制输入随时间的变化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值