上一篇博客:【DR_CAN-MPC学习笔记】2.最优化数学建模推导

参照二次规划一般形式,详细推导了MPC的数学模型,即最小化代价函数的表达式,最终推导结果为:

gif.latex?J%3Dx_k%5ETGx_k+2x_k%5ETEU_k+U_k%5ETHU_k

DR_CAN的视频:

【MPC模型预测控制器】3_一个详细的建模例子

【MPC模型预测控制器】3

【MPC模型预测控制器】4_完整案例讲解 - Octave代码

【MPC模型预测控制器】4


离散系统状态空间一般形式:

gif.latex?%5Cboldsymbol%20x%28k+1%29%3D%5Cboldsymbol%20A%20%5Cboldsymbol%20x%28k%29+%5Cboldsymbol%20B%20%5Cboldsymbol%20u%28k%29

其中 gif.latex?x%28k%29 为状态向量(n×1),gif.latex?u%28k%29 为输入向量(p×1),gif.latex?A 为系统状态矩阵(n×n),gif.latex?B 为系统输入矩阵(n×p)。

单输入二阶系统的例子:

gif.latex?%5Cleft%5B%5Cbegin%7Barray%7D%7Bc%7D%20x_%7B1%7D%28k+1%29%20%5C%5C%20x_%7B2%7D%28k+1%29%20%5Cend%7Barray%7D%5Cright%5D%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bcc%7D%201%20%26%200.1%20%5C%5C%200%20%26%202%20%5Cend%7Barray%7D%5Cright%5D%5Cleft%5B%5Cbegin%7Barray%7D%7Bl%7D%20x_%7B1%7D%28k%29%20%5C%5C%20x_%7B2%7D%28k%29%20%5Cend%7Barray%7D%5Cright%5D+%5Cleft%5B%5Cbegin%7Barray%7D%7Bc%7D%200%20%5C%5C%200.5%20%5Cend%7Barray%7D%5Cright%5D%20u%28k%29

上式中,gif.latex?%5Cboldsymbol%20A%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bcc%7D%201%20%26%200.1%20%5C%5C%200%20%26%202%20%5Cend%7Barray%7D%5Cright%5Dgif.latex?%5Cboldsymbol%20B%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bl%7D%200%20%5C%5C%200.5%20%5Cend%7Barray%7D%5Cright%5D,n = 2,p = 1

系统状态向量和输入向量的关系:

gif.latex?%5Cboldsymbol%20X_k%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bc%7D%20%5Cboldsymbol%20x%28k%20%5Cmid%20k%29%20%5C%5C%20%5Cboldsymbol%20x%28k+1%20%5Cmid%20k%29%20%5C%5C%20%5Cvdots%20%5C%5C%20%5Cboldsymbol%20x%28k+i%20%5Cmid%20k%29%20%5C%5C%20%5Cvdots%20%5C%5C%20%5Cboldsymbol%20x%28k+N%20%5Cmid%20k%29%20%5Cend%7Barray%7D%5Cright%5D%2C%5Cboldsymbol%20U_k%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bc%7D%20%5Cboldsymbol%20u%28k%20%5Cmid%20k%29%20%5C%5C%20%5Cboldsymbol%20u%28k+1%20%5Cmid%20k%29%20%5C%5C%20%5Cvdots%20%5C%5C%20%5Cboldsymbol%20u%28k+i%20%5Cmid%20k%29%20%5C%5C%20%5Cvdots%20%5C%5C%20%5Cboldsymbol%20u%28k+N-1%20%5Cmid%20k%29%20%5Cend%7Barray%7D%5Cright%5D

  • gif.latex?x%28k+1%20%5Cmid%20k%29 表示在k时刻预测 k+1 时刻的系统状态。
  • 由于 gif.latex?x%28k%20+N%5Cmid%20k%29gif.latex?u%28k+N-1%20%5Cmid%20k%29 决定,因此不需要 gif.latex?u%28k+N%5Cmid%20k%29 ,所以 gif.latex?U_kgif.latex?X_k 少一个维度。
  • 因为初始值 gif.latex?x%28k%20%5Cmid%20k%29gif.latex?x%28k+i%20%5Cmid%20k%29 均为 n×1 向量,因此 gif.latex?X_k 为 (N+1)n×1 向量。同理可推出 gif.latex?U_k 为 Np×1 向量。

gif.latex?%5Cboldsymbol%7BM%7D%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bc%7D%20%5Cboldsymbol%7BI%7D_%7Bn%20%5Ctimes%20n%7D%20%5C%5C%20%5Cboldsymbol%7BA%7D_%7Bn%20%5Ctimes%20n%7D%20%5C%5C%20%5Cboldsymbol%7BA%7D_%7Bn%20%5Ctimes%20n%7D%5E%7B2%7D%20%5C%5C%20%5Cvdots%20%5C%5C%20%5Cboldsymbol%7BA%7D%5E%7BN%7D%20%5Cend%7Barray%7D%5Cright%5D%2C%20%5Cboldsymbol%7BC%7D%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bcccc%7D%200%20%26%200%20%26%20%5Cldots%20%26%200%20%5C%5C%20%5Cvdots%20%26%20%5Cvdots%20%26%20%5Cldots%20%26%20%5Cvdots%20%5C%5C%200%20%26%200%20%26%20%26%200%20%5C%5C%20%5Cboldsymbol%7BB%7D%20%26%200%20%26%20%5Cldots%20%26%200%20%5C%5C%20%5Cboldsymbol%7BA%20B%7D%20%26%20%5Cboldsymbol%7BB%7D%20%26%20%5Cldots%20%26%200%20%5C%5C%20%5Cvdots%20%26%20%5Cvdots%20%26%20%5Cddots%20%26%200%20%5C%5C%20%5Cboldsymbol%7BA%7D%5E%7BN-1%7D%20%5Cboldsymbol%7BB%7D%20%26%20%5Cboldsymbol%7BA%7D%5E%7BN-2%7D%20%5Cboldsymbol%7BB%7D%20%26%20%5Cldots%20%26%20%5Cboldsymbol%7BB%7D%20%5Cend%7Barray%7D%5Cright%5D

  • gif.latex?M 为 (N+1)n×n 矩阵。
  • gif.latex?C 矩阵上面所有的 0 与初始状态 gif.latex?x%28k%20%5Cmid%20k%29 有关(n×1矩阵),gif.latex?B%2CAB...A%5E%7BN-1%7DB 均为 n×p 矩阵,因此 gif.latex?C 为 (N+1)n×Np 矩阵。

具体可参考上一篇博客的推导(【DR_CAN-MPC学习笔记】2.最优化数学建模推导):

分析过程:

回到单输入二阶系统的例子,gif.latex?%5Cboldsymbol%20A%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bcc%7D%201%20%26%200.1%20%5C%5C%200%20%26%202%20%5Cend%7Barray%7D%5Cright%5Dgif.latex?%5Cboldsymbol%20B%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bl%7D%200%20%5C%5C%200.5%20%5Cend%7Barray%7D%5Cright%5D,n = 2,p = 1,假设预测区间 N=3 ,

整理一下维度:

gif.latex?X_k = gif.latex?M gif.latex?x_k + gif.latex?C gif.latex?U_k
(N+1)n×1 = (N+1)n×n n×1 + (N+1)n×Np Np×1
8×1 = 8×2 2×1 + 8×3 3×1

gif.latex?%5Cboldsymbol%7BX%7D%28k%29%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bc%7D%20%5Cboldsymbol%20x%28k%20%5Cmid%20k%29%20%5C%5C%20%5Cboldsymbol%20x%28k+1%20%5Cmid%20k%29%20%5C%5C%20%5Cboldsymbol%20x%28k+2%20%5Cmid%20k%29%20%5C%5C%20%5Cboldsymbol%20x%28k+3%20%5Cmid%20k%29%20%5Cend%7Barray%7D%5Cright%5D%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bc%7D%20x_%7B1%7D%28k%20%5Cmid%20k%29%20%5C%5C%20x_%7B2%7D%28k%20%5Cmid%20k%29%20%5C%5C%20x_%7B1%7D%28k+1%20%5Cmid%20k%29%20%5C%5C%20x_%7B2%7D%28k+1%20%5Cmid%20k%29%20%5C%5C%20x_%7B1%7D%28k+2%20%5Cmid%20k%29%20%5C%5C%20x_%7B2%7D%28k+2%20%5Cmid%20k%29%20%5C%5C%20x_%7B1%7D%28k+3%20%5Cmid%20k%29%20%5C%5C%20x_%7B2%7D%28k+3%20%5Cmid%20k%29%20%5Cend%7Barray%7D%5Cright%5D

gif.latex?%5Cboldsymbol%7BU%7D%28k%29%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bc%7D%20%5Cboldsymbol%20u%28k%20%5Cmid%20k%29%20%5C%5C%20%5Cboldsymbol%20u%28k+1%20%5Cmid%20k%29%20%5C%5C%20%5Cboldsymbol%20u%28k+2%20%5Cmid%20k%29%20%5C%5C%20%5Cend%7Barray%7D%5Cright%5D%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bc%7D%20u%28k%20%5Cmid%20k%29%20%5C%5C%20u%28k+1%20%5Cmid%20k%29%20%5C%5C%20u%28k+2%20%5Cmid%20k%29%20%5Cend%7Barray%7D%5Cright%5D

gif.latex?%5Cboldsymbol%20M%3D%5Cleft%5B%20%5Cbegin%7Barray%7D%7Bcccc%7D%20%5Cboldsymbol%20I_%7B2%5Ctimes%202%7D%20%5C%5C%20%5Cboldsymbol%20A_%7B2%5Ctimes%202%7D%20%5C%5C%20%5Cboldsymbol%20A_%7B2%5Ctimes%202%7D%5E2%20%5C%5C%20%5Cboldsymbol%20A_%7B2%5Ctimes%202%7D%5E3%20%5C%5C%20%5Cend%7Barray%7D%20%5Cright%5D%3D%5Cleft%5B%20%5Cbegin%7Barray%7D%7Bcccccccc%7D%201%261%20%5C%5C%201%261%20%5C%5C%201%260.1%20%5C%5C0%262%20%5C%5C%201%260.3%20%5C%5C0%264%20%5C%5C%201%260.7%20%5C%5C0%268%20%5C%5C%5Cend%7Barray%7D%20%5Cright%5D

gif.latex?%5Cboldsymbol%7BC%7D%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bcccc%7D%200%20%26%200%20%26%20%5Cldots%20%26%200%20%5C%5C%20%5Cvdots%20%26%20%5Cvdots%20%26%20%5Cldots%20%26%20%5Cvdots%20%5C%5C%200%20%26%200%20%26%20%26%200%20%5C%5C%20%5Cboldsymbol%7BB%7D%20%26%200%20%26%20%5Cldots%20%26%200%20%5C%5C%20%5Cboldsymbol%7BAB%7D%20%26%20%5Cboldsymbol%7BB%7D%20%26%20%5Cldots%20%26%200%20%5C%5C%20%5Cvdots%20%26%20%5Cvdots%20%26%20%5Cddots%20%26%200%20%5C%5C%20%5Cboldsymbol%7BA%7D%5E%7BN-1%7D%20%5Cboldsymbol%7BB%7D%20%26%20%5Cboldsymbol%7BA%7D%5E%7BN-2%7D%20%5Cboldsymbol%7BB%7D%20%26%20%5Cldots%20%26%20%5Cboldsymbol%7BB%7D%20%5Cend%7Barray%7D%5Cright%5D%20%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bcccccccc%7D%200%20%26%200%20%26%200%20%5C%5C%200%20%26%200%20%26%200%20%5C%5C%20%5Cboldsymbol%20B%20%26%200%20%26%200%20%5C%5C%20%5Cboldsymbol%7BAB%7D%20%26%20%5Cboldsymbol%20B%20%26%200%20%5C%5C%20%5Cboldsymbol%7BA%5E2B%7D%20%26%20%5Cboldsymbol%7BAB%7D%20%26%20%5Cboldsymbol%20B%20%5Cend%7Barray%7D%5Cright%5D%20%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bcccccccc%7D%200%20%26%200%20%26%200%20%5C%5C%200%20%26%200%20%26%200%20%5C%5C%200%20%26%200%20%26%200%20%5C%5C%200.5%20%26%200%20%26%200%20%5C%5C%200.05%20%26%200%20%26%200%20%5C%5C%201%20%26%200.5%20%26%200%20%5C%5C%200.15%20%26%200.05%20%26%200%20%5C%5C%202%20%26%201%20%26%200.5%20%5Cend%7Barray%7D%5Cright%5D

对于系统输出方程: gif.latex?y%3Dx ,参考值 gif.latex?R%27%3D0 ,误差 gif.latex?E%27%3Dy-R%27%3Dx-0%3Dx ,代价函数为:

gif.latex?%5Cboldsymbol%20J%3D%5Csum_%7Bi%3D0%7D%5E%7BN-1%7D%5Cleft%28%5Cboldsymbol%20x%28k+i%20%5Cmid%20k%29%5E%7BT%7D%20%5Cboldsymbol%20Q%20%5Cboldsymbol%20x%28k+i%20%5Cmid%20k%29+%5Cboldsymbol%20u%28k+i%20%5Cmid%20k%29%5E%7BT%7D%20%5Cboldsymbol%20R%20%5Cboldsymbol%20u%28k+i%20%5Cmid%20k%29+%5Cboldsymbol%20x%28k+N%20%5Cmid%20k%29%5E%7BT%7D%20%5Cboldsymbol%20F%20%5Cboldsymbol%20x%28k+N%20%5Cmid%20k%29%5Cright%29

代价函数 = gif.latex?x%28k+i%20%5Cmid%20k%29%5E%7BT%7D%20Q%20x%28k+i%20%5Cmid%20k%29 误差加权和 + gif.latex?u%28k+i%20%5Cmid%20k%29%5E%7BT%7D%20R%20u%28k+i%20%5Cmid%20k%29 输入加权和 + gif.latex?x%28k+N%20%5Cmid%20k%29%5E%7BT%7D%20F%20x%28k+N%20%5Cmid%20k%29 终端误差,其中 gif.latex?Qgif.latex?R 为权重系数矩阵且均为对角矩阵。

经过简化后消去变量 gif.latex?X_k (简化过程参考【DR_CAN-MPC学习笔记】2.最优化数学建模推导):

gif.latex?%5Cboldsymbol%20J%3D%5Cboldsymbol%20x_k%5ET%20%5Cboldsymbol%20G%20%5Cboldsymbol%20x_k+2%20%5Cboldsymbol%20x_k%5ET%20%5Cboldsymbol%20E%20%5Cboldsymbol%20U_k+%20%5Cboldsymbol%20U_k%5ET%20%5Cboldsymbol%20H%20%5Cboldsymbol%20U_k

由上式可见,gif.latex?J 只包含了初始状态项 gif.latex?x_k 和输入项 gif.latex?U_k ,对 gif.latex?J 进行最优化可以得到输入项 gif.latex?U_k

矩阵 gif.latex?G%2CE%2CH 与 gif.latex?M%2CC 有关:

gif.latex?%5Cbegin%7Baligned%7D%20%5Cboldsymbol%7BG%7D%20%26%3D%5Cboldsymbol%7BM%7D%5E%7BT%7D%20%5Cbar%7B%20%5Cboldsymbol%20Q%7D%20%5Cboldsymbol%20M%20%5C%5C%20%5Cboldsymbol%20E%20%26%3D%5Cboldsymbol%20M%5E%7BT%7D%20%5Cbar%7B%20%5Cboldsymbol%20Q%7D%20%5Cboldsymbol%20C%5C%5C%20%5Cboldsymbol%20H%20%26%3D%20%5Cboldsymbol%20C%5E%7BT%7D%20%5Cbar%7B%20%5Cboldsymbol%20Q%7D%20%5Cboldsymbol%20C+%5Cbar%7B%20%5Cboldsymbol%20R%7D%20%5Cend%7Baligned%7D

其中 gif.latex?%5Cbar%20Qgif.latex?%5Cbar%20R 是原来两个权重矩阵 gif.latex?Qgif.latex?R 的增广形式:

gif.latex?%5Cbar%7BQ%7D%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bccccc%7D%20Q%20%26%200%20%26%20%5Ccdots%20%26%200%20%5C%5C%200%20%26%20Q%20%26%20%5Ccdots%20%26%200%5C%5C%20%5Cvdots%20%26%20%26%20%5Cddots%20%26%20%5Cvdots%5C%5C%200%20%26%200%20%26%20%5Ccdots%20%26%20F%20%5Cend%7Barray%7D%5Cright%5D%2C%5Cbar%7BR%7D%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bccccc%7D%20R%20%26%200%20%26%20%5Ccdots%20%26%200%20%5C%5C%200%20%26%20R%20%26%20%5Ccdots%20%26%200%5C%5C%20%5Cvdots%20%26%20%26%20%5Cddots%20%26%20%5Cvdots%5C%5C%200%20%26%200%20%26%20%5Ccdots%20%26%20R%20%5Cend%7Barray%7D%5Cright%5D

矩阵计算较为复杂,可用编程求解。

例子代码:

gif.latex?%5Cboldsymbol%20x%28k+1%29%3D%5Cboldsymbol%20A%20%5Cboldsymbol%20x%28k%29+%5Cboldsymbol%20B%20%5Cboldsymbol%20u%28k%29

控制目标:设计合适的 gif.latex?u%28k%29 使得 gif.latex?x%28k+1%29 随着 gif.latex?k 的增加,趋近于0。引入误差 gif.latex?e

gif.latex?e%3Dx_d-x_%7Bk+1%7D

gif.latex?x_d 为目标值,控制目标为令误差接近0。

状态矩阵(n×k):

gif.latex?%5Cboldsymbol%20X_K%3D%5B%5Cboldsymbol%20x%280%29%2C%5Cboldsymbol%20x%281%29%2C%5Cboldsymbol%20x%282%29...%5Cboldsymbol%20x%28k%29%5D

gif.latex?%5Cboldsymbol%20x%281%29%3Ax_1%281%29%2Cx_2%281%29...x_n%281%29

...

gif.latex?%5Cboldsymbol%20x%28k%29%3Ax_1%28k%29%2Cx_2%28k%29...x_n%28k%29

输入矩阵(p×k):

gif.latex?%5Cboldsymbol%20U_K%3D%5B%5Cboldsymbol%20u%280%29%2C%5Cboldsymbol%20u%281%29%2C%5Cboldsymbol%20u%282%29...%5Cboldsymbol%20u%28k%29%5D

gif.latex?%5Cboldsymbol%20u%281%29%3Au_1%281%29%2Cu_2%281%29...u_p%281%29

...

gif.latex?%5Cboldsymbol%20u%28k%29%3Au_1%28k%29%2Cu_2%28k%29...u_p%28k%29

状态方程:

gif.latex?%5Cboldsymbol%20X_K%28%3A%2Ck+1%29%3D%28%5Cboldsymbol%20A*%5Cboldsymbol%20X_K%28%3A%2Ck%29+%5Cboldsymbol%20B%20*%20%5Cboldsymbol%20U_K%28%3A%2Ck%29%29%3B

例如:k=1 时,gif.latex?X_K%28%3A%2C2%29 表示第2列 gif.latex?x_1%282%29%2Cx_2%282%29...x_n%282%29

回到单输入二阶系统的例子:

gif.latex?%5Cbegin%7Barray%7D%7Bc%7D%20%7B%5Cleft%5B%5Cbegin%7Barray%7D%7Bl%7D%20x_%7B1%7D%28k+1%29%20%5C%5C%20x_%7B2%7D%28k+1%29%20%5Cend%7Barray%7D%5Cright%5D%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bcc%7D%201%20%26%200.1%20%5C%5C%200%20%26%202%20%5Cend%7Barray%7D%5Cright%5D%5Cleft%5B%5Cbegin%7Barray%7D%7Bl%7D%20x_%7B1%7D%28k%29%20%5C%5C%20x_%7B2%7D%28k%29%20%5Cend%7Barray%7D%5Cright%5D+%5Cleft%5B%5Cbegin%7Barray%7D%7Bc%7D%200%20%5C%5C%200.5%20%5Cend%7Barray%7D%5Cright%5D%20u%28k%29%7D%20%5Cend%7Barray%7D

gif.latex?%5Cboldsymbol%7BQ%7D%3D%5Cleft%28%5Cbegin%7Barray%7D%7Bll%7D%201%20%26%200%20%5C%5C%200%20%26%201%20%5Cend%7Barray%7D%5Cright%29%20%5Cquad%20%5Cboldsymbol%7BF%7D%3D%5Cleft%28%5Cbegin%7Barray%7D%7Bll%7D%201%20%26%200%20%5C%5C%200%20%26%201%20%5Cend%7Barray%7D%5Cright%29%20%5Cquad%20%5Cboldsymbol%7BR%7D%3D0.1

gif.latex?Q 为系统状态变量权重矩阵, gif.latex?R 为系统输入变量权重矩阵,gif.latex?F 为终端权重矩阵。

DR_CAN给出了Octave代码,在Matlab中也可以运行。下面的代码是我在此基础上修改后的单输入例子的代码,后面也有介绍如何修改为多输入系统。

传送门:(二输入系统)【MPC模型预测控制器】4_Octave代码

代码一共由三个部分组成,分别为主程序:MPC_Test.m,以及两个函数:MPC_Matrices.m和Prediction.m

MPC_Test.m

设置初始参数:

gif.latex?%5Cboldsymbol%20A%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bcc%7D%201%20%26%200.1%20%5C%5C%200%20%26%202%20%5Cend%7Barray%7D%5Cright%5Dgif.latex?%5Cboldsymbol%20B%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bl%7D%200%20%5C%5C%200.5%20%5Cend%7Barray%7D%5Cright%5D...

%% 清屏
clear;
close all;
clc;%% 加载 optim package,若使用matlab,则注释掉此行
pkg load optim;%% 第一步,定义状态空间矩阵
%% 定义状态矩阵 A, n x n 矩阵
A = [1 0.1; 0 2];
n= size (A,1); % 计算矩阵第一个维度的长度%% 定义输入矩阵 B, n x p 矩阵
B = [0; 0.5];
p = size(B,2); % 计算矩阵第二个维度的长度%% 定义Q矩阵,n x n 矩阵
Q=[1 0; 0 1];%% 定义F矩阵,n x n 矩阵
F=[1 0; 0 1];%% 定义R矩阵,p x p 矩阵
R=[0.1];%% 定义step数量k
k_steps=100; %% 定义矩阵 X_K, n x k 矩 阵
X_K=zeros(n,k_steps);%% 初始状态变量值, n x 1 向量
X_K(:,1)=[20;-20]; % 初始状态不为0,控制目标为0%% 定义输入矩阵 U_K, p x k 矩阵
U_K=zeros(p,k_steps);%% 定义预测区间K
N=5;%% Call MPC_Matrices 函数 求得 E,H矩阵
[E,H]=MPC_Matrices(A,B,Q,R,F,N);%% 计算每一步的状态变量的值
for k = 1 : k_steps
%% 求得U_K(:,k)
U_K(:,k) = Prediction(X_K(:,k),E,H,N,p);
%% 计算第k+1步时状态变量的值
X_K(:,k+1)=(A*X_K(:,k)+B*U_K(:,k));
end%% 绘制状态变量和输入的变化
subplot(2, 1, 1);
hold;
for i =1 :size (X_K,1)
plot(X_K(i,:));
end
legend("x1","x2")
hold off;
subplot(2, 1, 2);
hold;
for i =1 : size(U_K,1)
plot(U_K(i,:));
end
legend("u1") %% 作者:DR_CAN https://www.bilibili.com/read/cv16891782 出处:bilibili

分析:

注释掉以下行,即输入设为0,可单独运行:

N=5;
[E,H]=MPC_Matrices(A,B,Q,R,F,N);
U_K(:,k) = Prediction(X_K(:,k),E,H,N,p);

得到:

由上图可见,gif.latex?x_1%2Cx_2 均趋于无穷,因为初始状态不为0且输入为0.

接下来设置合适的输入使得状态值趋于0.

代价函数:

gif.latex?%5Cboldsymbol%20J%3D%5Cboldsymbol%20x_k%5ET%20%5Cboldsymbol%20G%20%5Cboldsymbol%20x_k+2%20%5Cboldsymbol%20x_k%5ET%20%5Cboldsymbol%20E%20%5Cboldsymbol%20U_k+%20%5Cboldsymbol%20U_k%5ET%20%5Cboldsymbol%20H%20%5Cboldsymbol%20U_k

gif.latex?%5Cboldsymbol%20x_k%5ET%20%5Cboldsymbol%20G%20%5Cboldsymbol%20x 与初始状态有关,不影响代价函数,因此控制目标为最小化 gif.latex?2%20%5Cboldsymbol%20x_k%5ET%20%5Cboldsymbol%20E%20%5Cboldsymbol%20U_k+%20%5Cboldsymbol%20U_k%5ET%20%5Cboldsymbol%20H%20%5Cboldsymbol%20U_k .

gif.latex?%5Cboldsymbol%20U_k%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bc%7D%20%5Cboldsymbol%20u%28k%20%5Cmid%20k%29%20%5C%5C%20%5Cboldsymbol%20u%28k+1%20%5Cmid%20k%29%20%5C%5C%20%5Cvdots%20%5C%5C%20%5Cboldsymbol%20u%28k+i%20%5Cmid%20k%29%20%5C%5C%20%5Cvdots%20%5C%5C%20%5Cboldsymbol%20u%28k+N-1%20%5Cmid%20k%29%20%5Cend%7Barray%7D%5Cright%5D

预测了N项,但结果只取第一项 gif.latex?%5Cboldsymbol%20u%28k%20%5Cmid%20k%29 .

gif.latex?%5Cbegin%7Baligned%7D%20%5Cboldsymbol%20E%20%26%3D%5Cboldsymbol%20M%5E%7BT%7D%20%5Cbar%7B%20%5Cboldsymbol%20Q%7D%20%5Cboldsymbol%20C%2C%20%5Cboldsymbol%20H%20%26%3D%20%5Cboldsymbol%20C%5E%7BT%7D%20%5Cbar%7B%20%5Cboldsymbol%20Q%7D%20%5Cboldsymbol%20C+%5Cbar%7B%20%5Cboldsymbol%20R%7D%20%5Cend%7Baligned%7D

矩阵 gif.latex?C%2CM%2CQ%2CR 在之前已经分析过了:

gif.latex?%5Cboldsymbol%20M%3D%5Cleft%5B%20%5Cbegin%7Barray%7D%7Bcccc%7D%20%5Cboldsymbol%20I_%7B2%5Ctimes%202%7D%20%5C%5C%20%5Cboldsymbol%20A_%7B2%5Ctimes%202%7D%20%5C%5C%20%5Cboldsymbol%20A_%7B2%5Ctimes%202%7D%5E2%20%5C%5C%20%5Cboldsymbol%20A_%7B2%5Ctimes%202%7D%5E3%20%5C%5C%20%5Cend%7Barray%7D%20%5Cright%5D%3D%5Cleft%5B%20%5Cbegin%7Barray%7D%7Bcccccccc%7D%201%261%20%5C%5C%201%261%20%5C%5C%201%260.1%20%5C%5C0%262%20%5C%5C%201%260.3%20%5C%5C0%264%20%5C%5C%201%260.7%20%5C%5C0%268%20%5C%5C%5Cend%7Barray%7D%20%5Cright%5D

gif.latex?%5Cbar%7BQ%7D%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bccccc%7D%20Q%20%26%200%20%26%20%5Ccdots%20%26%200%20%5C%5C%200%20%26%20Q%20%26%20%5Ccdots%20%26%200%5C%5C%20%5Cvdots%20%26%20%26%20%5Cddots%20%26%20%5Cvdots%5C%5C%200%20%26%200%20%26%20%5Ccdots%20%26%20F%20%5Cend%7Barray%7D%5Cright%5D%2C%5Cbar%7BR%7D%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bccccc%7D%20R%20%26%200%20%26%20%5Ccdots%20%26%200%20%5C%5C%200%20%26%20R%20%26%20%5Ccdots%20%26%200%5C%5C%20%5Cvdots%20%26%20%26%20%5Cddots%20%26%20%5Cvdots%5C%5C%200%20%26%200%20%26%20%5Ccdots%20%26%20R%20%5Cend%7Barray%7D%5Cright%5D

gif.latex?%5Cboldsymbol%7BC%7D%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bcccc%7D%200%20%26%200%20%26%20%5Cldots%20%26%200%20%5C%5C%20%5Cvdots%20%26%20%5Cvdots%20%26%20%5Cldots%20%26%20%5Cvdots%20%5C%5C%200%20%26%200%20%26%20%26%200%20%5C%5C%20%5Cboldsymbol%7BB%7D%20%26%200%20%26%20%5Cldots%20%26%200%20%5C%5C%20%5Cboldsymbol%7BAB%7D%20%26%20%5Cboldsymbol%7BB%7D%20%26%20%5Cldots%20%26%200%20%5C%5C%20%5Cvdots%20%26%20%5Cvdots%20%26%20%5Cddots%20%26%200%20%5C%5C%20%5Cboldsymbol%7BA%7D%5E%7BN-1%7D%20%5Cboldsymbol%7BB%7D%20%26%20%5Cboldsymbol%7BA%7D%5E%7BN-2%7D%20%5Cboldsymbol%7BB%7D%20%26%20%5Cldots%20%26%20%5Cboldsymbol%7BB%7D%20%5Cend%7Barray%7D%5Cright%5D%20%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bcccccccc%7D%200%20%26%200%20%26%200%20%5C%5C%200%20%26%200%20%26%200%20%5C%5C%20%5Cboldsymbol%20B%20%26%200%20%26%200%20%5C%5C%20%5Cboldsymbol%7BAB%7D%20%26%20%5Cboldsymbol%20B%20%26%200%20%5C%5C%20%5Cboldsymbol%7BA%5E2B%7D%20%26%20%5Cboldsymbol%7BAB%7D%20%26%20%5Cboldsymbol%20B%20%5Cend%7Barray%7D%5Cright%5D%20%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bcccccccc%7D%200%20%26%200%20%26%200%20%5C%5C%200%20%26%200%20%26%200%20%5C%5C%200%20%26%200%20%26%200%20%5C%5C%200.5%20%26%200%20%26%200%20%5C%5C%200.05%20%26%200%20%26%200%20%5C%5C%201%20%26%200.5%20%26%200%20%5C%5C%200.15%20%26%200.05%20%26%200%20%5C%5C%202%20%26%201%20%26%200.5%20%5Cend%7Barray%7D%5Cright%5D

矩阵的计算用 MPC_Matrices 函数解决,即代码:

[E,H]=MPC_Matrices(A,B,Q,R,F,N);

功能:输入矩阵 A,B,Q,R,F 和预测区间 N ,输出矩阵 E,H。具体过程参考下面的 MPC_Matrices.m 文件。接下来进行预测:

U_K(:,k) = Prediction(X_K(:,k),E,H,N,p);

MPC_Matrices.m

function  [E , H]=MPC_Matrices(A,B,Q,R,F,N)n=size(A,1);   % A 是 n x n 矩阵, 得到 n
p=size(B,2);   % B 是 n x p 矩阵, 得到 pM=[eye(n);zeros(N*n,n)]; % 初始化 M 矩阵. M 矩阵是 (N+1)n x n的, % 它上面是 n x n 个 "I", 这一步先把下半部% 分写成 0
C=zeros((N+1)*n,N*p); % 初始化 C 矩阵, 这一步令它有 (N+1)n x NP 个 0% 定义M 和 C
tmp=eye(n);  %定义一个n x n 的 I 矩阵% 更新M和C
for i=1:N % 循环,i 从 1到 Nrows =i*n+(1:n); %定义当前行数,从i x n开始,共n行 C(rows,:)=[tmp*B,C(rows-n, 1:end-p)]; %将c矩阵填满tmp= A*tmp; %每一次将tmp左乘一次AM(rows,:)=tmp; %将M矩阵写满
end % 定义Q_bar和R_bar
Q_bar = kron(eye(N),Q);
Q_bar = blkdiag(Q_bar,F);
R_bar = kron(eye(N),R); % 计算G, E, H
G=M'*Q_bar*M; % G: n x n
E=C'*Q_bar*M; % E: NP x n
H=C'*Q_bar*C+R_bar; % NP x NP
end %%作者:DR_CAN https://www.bilibili.com/read/cv16891782 出处:bilibili

Prediction.m

function u_k= Prediction(x_k,E,H,N,p)U_k = zeros(N*p,1); % NP x 1
U_k = quadprog(H,E*x_k); % 求出代价函数最小时U_k的数值
u_k = U_k(1:p,1); % 取第一个结果end %%作者:DR_CAN https://www.bilibili.com/read/cv16891782 出处:bilibili

分析:

quadprog:matlab自带的最优化函数

运行结果:

由上图所示,状态值 gif.latex?x_1%2Cx_2 趋于0.

以上为单输入系统的例子。

二输入例子:

代码修改一下,也可以用于多输入,比如:

gif.latex?%5Cleft%5B%5Cbegin%7Barray%7D%7Bl%7D%20x_%7B1%7D%28k+1%29%20%5C%5C%20x_%7B2%7D%28k+1%29%20%5Cend%7Barray%7D%5Cright%5D%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bcc%7D%201%20%26%200.1%20%5C%5C%20-1%20%26%202%20%5Cend%7Barray%7D%5Cright%5D%5Cleft%5B%5Cbegin%7Barray%7D%7Bl%7D%20x_%7B1%7D%28k%29%20%5C%5C%20x_%7B2%7D%28k%29%20%5Cend%7Barray%7D%5Cright%5D+%5Cleft%5B%5Cbegin%7Barray%7D%7Bll%7D%200.2%20%26%201%20%5C%5C%200.5%20%26%202%20%5Cend%7Barray%7D%5Cright%5D%5Cleft%5B%5Cbegin%7Barray%7D%7Bl%7D%20u_%7B1%7D%28k%29%20%5C%5C%20u_%7B2%7D%28k%29%20%5Cend%7Barray%7D%5Cright%5D

修改矩阵 A,B,R,Q,F,R ,使得 gif.latex?x_1 变化得更快(通过对矩阵Q的设置),且降低能耗减小 gif.latex?u_1 初始值(系统的输入一般是耗能的部分,通过对矩阵R的设置)

修改后的 MPC_Test.m:(其余不变)

%% 清屏
clear;
close all;
clc;%% 加载 optim package,若使用matlab,则注释掉此行
% pkg load optim;%% 第一步,定义状态空间矩阵
%% 定义状态矩阵 A, n x n 矩阵
% A = [1 0.1; 0 2];
A = [1 0.1; -1 2];
n= size (A,1); % 计算矩阵维度%% 定义输入矩阵 B, n x p 矩阵
% B = [0; 0.5];
B=[0.2 1; 0.5 2];
p = size(B,2);%% 定义Q矩阵,n x n 矩阵
% Q=[1 0; 0 1];
Q=[100 0; 0 1]; % 更加看重x_1的变化%% 定义F矩阵,n x n 矩阵
% F=[1 0; 0 1];
F=[100 0; 0 1];%% 定义R矩阵,p x p 矩阵
% R=[0.1];
R=[1 0; 0 0.1]; % 减小能耗,减小输入u_1%% 定义step数量k
k_steps=100; %% 定义矩阵 X_K, n x k 矩 阵
X_K = zeros(n,k_steps);%% 初始状态变量值, n x 1 向量
X_K(:,1) =[20;-20];%% 定义输入矩阵 U_K, p x k 矩阵
U_K=zeros(p,k_steps);%% 定义预测区间K
N=5;%% Call MPC_Matrices 函数 求得 E,H矩阵
[E,H]=MPC_Matrices(A,B,Q,R,F,N);%% 计算每一步的状态变量的值
for k = 1 : k_steps
%% 求得U_K(:,k)
U_K(:,k) = Prediction(X_K(:,k),E,H,N,p);
%% 计算第k+1步时状态变量的值
X_K(:,k+1)=(A*X_K(:,k)+B*U_K(:,k));
end%% 绘制状态变量和输入的变化
subplot(2, 1, 1);
hold;
for i =1 :size (X_K,1)
plot(X_K(i,:));
end
legend("x1","x2")
hold off;
subplot(2, 1, 2);
hold;
for i =1 : size (U_K,1)
plot(U_K(i,:));
end
legend("u1","u2") %% 作者:DR_CAN https://www.bilibili.com/read/cv16891782 出处:bilibili

由上图所示,gif.latex?x_1 迅速趋近于0. 相比于 R=[0.1 0; 0 0.1] 时,R=[1 0; 0 0.1] 时的输入 gif.latex?u_1 减小,但 gif.latex?x_1 趋近于0的速度变缓。由此也可以看出MPC的最优化的决策结果不是绝对的。

PS:
腾讯云开学季优惠:

【腾讯云】多款云产品1折起,买云服务器送免费机器,最长免费续3个月
【腾讯云】爆款云服务器限时体验20元起,更多上云必备产品低至1元

【DR_CAN-MPC学习笔记】34.详细的MPC建模例子和matlab代码相关推荐

  1. JUC.Condition学习笔记[附详细源码解析]

    JUC.Condition学习笔记[附详细源码解析] 目录 Condition的概念 大体实现流程 I.初始化状态 II.await()操作 III.signal()操作 3个主要方法 Conditi ...

  2. 观察者模式学习笔记(详细)

    观察者模式学习笔记(详细) 一.什么是观察者模式 观察者模式,是定义对象之间的一对多的关系,主要作用是减少对象之间的耦合度,分为两个角色 被观察者:其实就是发布者,发布消息通知所有的观察者 观察者:接 ...

  3. 吴恩达《机器学习》学习笔记四——单变量线性回归(梯度下降法)代码

    吴恩达<机器学习>学习笔记四--单变量线性回归(梯度下降法)代码 一.问题介绍 二.解决过程及代码讲解 三.函数解释 1. pandas.read_csv()函数 2. DataFrame ...

  4. 【Unity学习笔记】[Unity中文课堂教程] C#中级编程代码

    [Unity学习笔记][Unity中文课堂教程] C#中级编程代码 最近想补一补C#基础,Unity官方的C#中级编程教程质量很高,于是开个帖子把跟着敲+记录了部分价讲解和我自己的理解的代码存在这 原 ...

  5. MPC学习笔记1:基于状态空间模型的预测控制(1)

    MPC调节器 1.给定一个由状态空间法描述的离散系统: MPC控制器与其他线性二次调节器(LQR)的区别就在于其可以很好的将系统动态约束纳入考虑. 采样周期Ts控制了算法的效率,太大会错过很多系统运行 ...

  6. MPC学习笔记(1)——原理

    最近在学习M. W. Mehrez的MPC时发现了很多不了解的细节,分享一下对该算法的梳理与理解. 在自动驾驶或机器人领域中,模型预测控制(Model Predictive Control, MPC) ...

  7. SpringBoot学习笔记整理详细

    写在前面:欢迎来到「发奋的小张」的博客.我是小张,一名普通的在校大学生.在学习之余,用博客来记录我学习过程中的点点滴滴,也希望我的博客能够更给同样热爱学习热爱技术的你们带来收获!希望大家多多关照,我们 ...

  8. 影像组学视频学习笔记(34)-使用3D Slicer软件提取影像组学特征、Li‘s have a solution and plan.

    作者:北欧森林 链接:https://www.jianshu.com/p/afcd06221ea4 来源:简书,已获授权转载 RadiomicsWorld.com "影像组学世界" ...

  9. DR_CAN的学习笔记--1现代控制理论

    本文是在学习B站up主DR_CAN博士之后的学习笔记以及一些个人的感悟.B站链接为https://space.bilibili.com/230105574/,感兴趣的可以去B站看视频. 本文针对的读者 ...

最新文章

  1. windows多线程同步--临界区
  2. golang append时slice len 和 cap
  3. 正则表达式验证代码(字母、数字、Email、网址、电话号码、汉字、身份证号码)
  4. Python实训day14am【Python网络爬虫综合大作业-答辩】
  5. 实验-网页动画(js版)
  6. PWN-PRACTICE-BUUCTF-17
  7. 智能机器人语音识别技术详细解析
  8. SVN下载及语言包安装
  9. matlab对矩阵谱分解
  10. maya加载不了arnold的mtoa可能是这个低级错误!
  11. 量化金融分析AQF(1):股票概述
  12. Olivetti PR2/PR2E 打印机故障分析与排除
  13. CPU时钟周期和时钟频率
  14. 用计算机画小鸡,水墨电脑画--丝瓜小鸡图
  15. java常用二进制数据转换工具
  16. html与css第三天
  17. 关于编程C++——如何写程序
  18. java二进制补码_java基础 二进制补码
  19. 用云服务器windows环境下来搭建一个Minecraft服务器教程以及客户端使用教程java版
  20. Win+ubuntu单硬盘双系统安装(雷神新911机型)

热门文章

  1. 百度地图瓦片 android,百度地图自定义瓦片图获取
  2. 记录manjaro在新bios上启动的一些问题
  3. DSP SMBus总线通信
  4. 网络直播电视之寻找直播地址
  5. 童年回忆--扫雷(包括标记功能和递归展开)--万字讲解让你学会扫雷制作
  6. React 移动端项目之pdf预览
  7. 入门区块链之我放弃了
  8. 图片转cad软件 WinTopo Pro 2.52 汉化版
  9. 无线数字平板探测器维修Mars1717XU-VSI故障分析
  10. ubuntu18.04 安装Nvidia驱动的三种方式(必看)