• 【DR_CAN-MPC学习笔记】3.一个详细的建模例子


    上一篇博客:【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.最优化数学建模推导):

    257f713d8284457f80484c23c347319c.png

    分析过程:

    回到单输入二阶系统的例子,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?Mgif.latex?x_k+gif.latex?Cgif.latex?U_k
    (N+1)n×1=(N+1)n×nn×1+(N+1)n×NpNp×1
    8×1=8×22×1+8×33×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...

    1. %% 清屏
    2. clear;
    3. close all;
    4. clc;
    5. %% 加载 optim package,若使用matlab,则注释掉此行
    6. pkg load optim;
    7. %% 第一步,定义状态空间矩阵
    8. %% 定义状态矩阵 A, n x n 矩阵
    9. A = [1 0.1; 0 2];
    10. n= size (A,1); % 计算矩阵第一个维度的长度
    11. %% 定义输入矩阵 B, n x p 矩阵
    12. B = [0; 0.5];
    13. p = size(B,2); % 计算矩阵第二个维度的长度
    14. %% 定义Q矩阵,n x n 矩阵
    15. Q=[1 0; 0 1];
    16. %% 定义F矩阵,n x n 矩阵
    17. F=[1 0; 0 1];
    18. %% 定义R矩阵,p x p 矩阵
    19. R=[0.1];
    20. %% 定义step数量k
    21. k_steps=100;
    22. %% 定义矩阵 X_K, n x k 矩 阵
    23. X_K=zeros(n,k_steps);
    24. %% 初始状态变量值, n x 1 向量
    25. X_K(:,1)=[20;-20]; % 初始状态不为0,控制目标为0
    26. %% 定义输入矩阵 U_K, p x k 矩阵
    27. U_K=zeros(p,k_steps);
    28. %% 定义预测区间K
    29. N=5;
    30. %% Call MPC_Matrices 函数 求得 E,H矩阵
    31. [E,H]=MPC_Matrices(A,B,Q,R,F,N);
    32. %% 计算每一步的状态变量的值
    33. for k = 1 : k_steps
    34. %% 求得U_K(:,k)
    35. U_K(:,k) = Prediction(X_K(:,k),E,H,N,p);
    36. %% 计算第k+1步时状态变量的值
    37. X_K(:,k+1)=(A*X_K(:,k)+B*U_K(:,k));
    38. end
    39. %% 绘制状态变量和输入的变化
    40. subplot(2, 1, 1);
    41. hold;
    42. for i =1 :size (X_K,1)
    43. plot(X_K(i,:));
    44. end
    45. legend("x1","x2")
    46. hold off;
    47. subplot(2, 1, 2);
    48. hold;
    49. for i =1 : size(U_K,1)
    50. plot(U_K(i,:));
    51. end
    52. legend("u1")
    53. %% 作者:DR_CAN https://www.bilibili.com/read/cv16891782 出处:bilibili

    分析:

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

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

    得到:

    76ebac27960a46b1997e0ca9454d266c.png

    由上图可见,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

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

    Prediction.m

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

    分析:

    quadprog:matlab自带的最优化函数

    381a539c375e40f89ccd1cfe410e033e.png

    运行结果:

    7056c855bf9e487894e6a12bf8f214dc.png

    由上图所示,状态值 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:(其余不变)

    1. %% 清屏
    2. clear;
    3. close all;
    4. clc;
    5. %% 加载 optim package,若使用matlab,则注释掉此行
    6. % pkg load optim;
    7. %% 第一步,定义状态空间矩阵
    8. %% 定义状态矩阵 A, n x n 矩阵
    9. % A = [1 0.1; 0 2];
    10. A = [1 0.1; -1 2];
    11. n= size (A,1); % 计算矩阵维度
    12. %% 定义输入矩阵 B, n x p 矩阵
    13. % B = [0; 0.5];
    14. B=[0.2 1; 0.5 2];
    15. p = size(B,2);
    16. %% 定义Q矩阵,n x n 矩阵
    17. % Q=[1 0; 0 1];
    18. Q=[100 0; 0 1]; % 更加看重x_1的变化
    19. %% 定义F矩阵,n x n 矩阵
    20. % F=[1 0; 0 1];
    21. F=[100 0; 0 1];
    22. %% 定义R矩阵,p x p 矩阵
    23. % R=[0.1];
    24. R=[1 0; 0 0.1]; % 减小能耗,减小输入u_1
    25. %% 定义step数量k
    26. k_steps=100;
    27. %% 定义矩阵 X_K, n x k 矩 阵
    28. X_K = zeros(n,k_steps);
    29. %% 初始状态变量值, n x 1 向量
    30. X_K(:,1) =[20;-20];
    31. %% 定义输入矩阵 U_K, p x k 矩阵
    32. U_K=zeros(p,k_steps);
    33. %% 定义预测区间K
    34. N=5;
    35. %% Call MPC_Matrices 函数 求得 E,H矩阵
    36. [E,H]=MPC_Matrices(A,B,Q,R,F,N);
    37. %% 计算每一步的状态变量的值
    38. for k = 1 : k_steps
    39. %% 求得U_K(:,k)
    40. U_K(:,k) = Prediction(X_K(:,k),E,H,N,p);
    41. %% 计算第k+1步时状态变量的值
    42. X_K(:,k+1)=(A*X_K(:,k)+B*U_K(:,k));
    43. end
    44. %% 绘制状态变量和输入的变化
    45. subplot(2, 1, 1);
    46. hold;
    47. for i =1 :size (X_K,1)
    48. plot(X_K(i,:));
    49. end
    50. legend("x1","x2")
    51. hold off;
    52. subplot(2, 1, 2);
    53. hold;
    54. for i =1 : size (U_K,1)
    55. plot(U_K(i,:));
    56. end
    57. legend("u1","u2")
    58. %% 作者:DR_CAN https://www.bilibili.com/read/cv16891782 出处:bilibili

    95357d359de9448998812bd926199b2e.png

    由上图所示,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的最优化的决策结果不是绝对的。

  • 相关阅读:
    Java 集合 - Map 接口
    大数据讲课笔记1.6 压缩与打包
    html css制作正六边形
    【面试题】操作系统面试题(第六篇)
    C语言K&R圣经笔记 2.1变量名 2.2 数据类型和大小
    第7章-查找
    leetcode分类刷题:二叉树(一、简单的层序遍历)
    【跟学C++】C++STL标准模板库——算法详细整理(下)(Study18)
    对象创建(一)
    [深入研究4G/5G/6G专题-54]: L3信令控制-3-软件功能与流程的切分-CU-UP网元的信令
  • 原文地址:https://blog.csdn.net/weixin_43470383/article/details/126150144