• 基于神经网络的预测模型控制器matlab仿真


    目录

    一、理论基础

    二、案例背景

    1.问题描述

    2.思路流程

    三、部分MATLAB仿真

    四、仿真结论分析

    五、参考文献


    一、理论基础

    简单的介绍一下BP神经网络

    给定一组样本:

           MPC方法一个潜在的弱点是优化问题必须能严格地按要求推算,尤其是在非线性系统中。模型预测控制已经广泛地应用于线性MPC问题中,但为了减小在线计算时的计算量,该部分的计算为离线。

           一个非常强大的函数逼近器为神经网络,它能很好地用于表示非线性模型或控制器。基于模型跟踪控制的方法已经普遍地应用在神经网络控制,这种方法的一个局限性是它不适合于不稳定地逆系统,基此本文研究了基于优化控制技术的方法。

           许多基于神经网络的方法已经提出了应用在优化控制问题方面,该优化控制的目标是最小化一个与控制相关的代价函数。一个方法是用一个神经网络来逼近与优化控制问题相关联的动态程式方程的解。

           考虑一个离散非线性控制系统:

     

            为在K+N时刻时的无穷小,得出当时的无穷优化控制问题的解,同样就能得到有穷优化问题。对于非线性系统,优化控制问题一般无闭式解,因此,本文研究强力和不最理想的方法。在模型预测控制(MPC)中,控制信号的确定是通过在每个采样时刻输入序列为时,最小化代价函数(2)。只有优化输入序列的第一个元素u(k)作为系统的输入,在下一个采样时刻k+1,新的优化问题是对于给定的优化控制问题而言的。在这种方法中,终止条件可以看作是一个当时刻K+N趋于无穷时最小化代价函数的逼近器,但实际上更多的是用于保证闭环的稳定性。模型预测控制方法有一个非线性的缺点,且需要通过在每个采样时刻得到受约束的优化问题,同时需要通过在线计算来实现。

    二、案例背景

    1.问题描述

    CV 是冷水阀的开度 in % CV

    Oat 是外界温度   单位是摄氏度

    ZT 是室内温度    单位是摄氏度

    CV_V OAT_V和ZT_V 都是用来做模型校准的;

    CV,OAT和ZT  (30天)是用来做模型训练的。

    目的是通过控制冷水阀的开度来调节室内温度,目前该系统采用的是一个简单的比列调节控制。

    2.思路流程

    1. 建一个神经网络预测模型

    2. 通过这个模型计算出一个优化的冷水阀的控制路径,因为没法连接到实际系统上,只要是open loop的就可以。

    三、部分MATLAB仿真

    仿真程序如下所示:

    1. clc;
    2. clear;
    3. close all;
    4. warning off;
    5. addpath 'func\'
    6. %%
    7. %初始化参数
    8. %初始化参数
    9. %仿真时间长度
    10. ALL_Times = 200;
    11. %神经网络学习率
    12. Learn_Rate = 0.1;
    13. Alpha = 0.05;
    14. %网络维度
    15. Nums = 10;
    16. Nums2 = 4;
    17. %初始化随机权值
    18. w2 = rand(Nums,1);
    19. w2d1 = w2;
    20. w2d2 = w2;
    21. %初始化随机权值
    22. w1 = rand(Nums2,Nums);
    23. w1d1 = w1;
    24. w1d2 = w1;
    25. dw1 = zeros(size(w1));
    26. u_1 = 0;
    27. y_1 = 0;
    28. I = zeros(Nums,1);
    29. Iout = zeros(Nums,1);
    30. FI = zeros(Nums,1);
    31. State = zeros(Nums2,1);
    32. t = 0.001.*(1:ALL_Times);
    33. %%
    34. %参考轨迹
    35. %参考轨迹
    36. yr = zeros(ALL_Times,1);
    37. yr = func_reference(ALL_Times);
    38. number1 = 25;
    39. number2 = 16;
    40. Set_Vlaue = 10;
    41. yout_1 = 0;
    42. cube_define;
    43. %%
    44. %循环仿真
    45. %循环仿真3
    46. for k=2:2*ALL_Times-10
    47. if k <= ALL_Times%在线辨识学习
    48. %控制器
    49. [yout,Errs,u] = func_controller0(y_1,K,e,Set_Vlaue,u,A0,k,ALL_Times,number1,number2);
    50. %输出
    51. ym = func_ym0(yr,u,k,ALL_Times);
    52. %计算误差
    53. e(k) = ym(k)-yout(k);
    54. State(1) = yout(k);
    55. State(2) = yout(k-1);
    56. State(3) = u(k);
    57. State(4) = u(k-1);
    58. %在线神经网络训练
    59. %Inner network
    60. for j=1:1:Nums
    61. I(j) = State'*w1(:,j);
    62. Iout(j) = 1/(1+exp(-I(j)));
    63. end
    64. %Output of network
    65. err_estimate(k) = w2'*Iout;
    66. e1(k) = err_estimate(k)-e(k);
    67. %Updata the weight
    68. w2 = w2d1-(Learn_Rate*0.1*e1(k))*Iout+Alpha*(w2d1-w2d2);
    69. for j=1:1:Nums
    70. FI(j)=exp(-I(j))/(1+exp(-I(j)))^2;
    71. end
    72. for i=1:1:Nums2
    73. for j=1:1:Nums
    74. dw1(i,j)=e1(k)*Learn_Rate*FI(j)*w2(j)*State(i);
    75. end
    76. end
    77. w1 = w1d1+dw1+Alpha*(w1d1-w1d2);
    78. w1d2 = w1d1;
    79. w1d1 = w1;
    80. w2d2 = w2d1;
    81. w2d1 = w2;
    82. else
    83. %开始实际的工作
    84. Ind = k-ALL_Times+2;
    85. %被控对象
    86. yout(Ind) = func_system_model(y_1,u_1);
    87. %控制器输出
    88. [Uk_1,Y0,u_1,yout_1,e,SetPoint_Vlaue,Errs,Det,u] = func_controller(yout,A0,err_estimate,u,Ind,ALL_Times,Set_Vlaue,number1,K,number2);
    89. %辨识输出
    90. [State,err_estimate,e,temp]=func_Bpann(I,Iout,err_estimate,yr,u,Ind,ALL_Times,State,w1,w2,Nums);
    91. if Ind-ALL_Times <= 0
    92. ym(Ind) = temp;
    93. else
    94. ym(Ind) = temp+yr(ALL_Times)*u(Ind-ALL_Times);
    95. end
    96. if Ind+1-ALL_Times <= 0
    97. ym1(Ind+1) = temp;
    98. else
    99. ym1(Ind+1) = temp+yr(ALL_Times)*u(Ind+1-ALL_Times);
    100. end
    101. %延迟
    102. %延迟
    103. State(1) = yout(Ind);
    104. State(2) = yout(Ind-1);
    105. State(3) = u(Ind);
    106. State(4) = u(Ind-1);
    107. end
    108. end
    109. Start = 1;
    110. Ends = length(yout)-10;
    111. y_real = yout(Start:Ends);
    112. y_pred = ym(Start:Ends);
    113. y_pred1 = ym1(Start:Ends);
    114. U_cont = u(Start:Ends);
    115. Times = t(Start:Ends);
    116. figure;
    117. subplot(211);
    118. plot(Times,y_pred,'b','linewidth',2);
    119. hold on
    120. plot(Times,y_real,'r','linewidth',1);
    121. hold off
    122. grid on
    123. legend('预测输出','模型输出');
    124. xlabel('Time')
    125. ylabel('振幅')
    126. subplot(212);
    127. plot(Times,U_cont,'k','linewidth',2);
    128. legend('控制u')
    129. xlabel('Time')
    130. ylabel('振幅')
    131. grid on
    132. figure;
    133. subplot(211);
    134. plot(Times,y_pred1,'b','linewidth',2);
    135. legend('预测输出')
    136. xlabel('Time')
    137. ylabel('振幅')
    138. grid on
    139. subplot(212);
    140. plot(Times,abs(y_real-y_pred),'r','linewidth',2);
    141. xlabel('Time')
    142. ylabel('误差')
    143. grid on
    144. Err = abs(mean(y_real(round(length(y_real)/2):end)-y_pred(round(length(y_pred)/2):end)));
    145. disp('误差:');
    146. Err

    四、仿真结论分析

           这里,我们将系统的模型简化为一个简单的控制对象,在实际中,我们只需要对其进行替换即可。具体的仿真如下所示:

           预测模型就是一个基于神经网络的辨识系统。通过这个模型,可以获得系统的辨识结果,在通过该模型的在线学习之后获得辨识结果,然后再系统的后面时刻,即可通过该辨识结果进行模型预测控制输出。

     

    五、参考文献

    [1]高龙, 杨奕, 任晓琳,等. 基于BP神经网络的空气源热泵温度MPC策略[J]. 控制工程, 2021, 28(9):8.A08-22

  • 相关阅读:
    【阿里云】任务2-OSS对象存储教程(找我参加活动可获得京东卡奖励)
    MySQL理解-下载-安装
    时间序列常用数据处理
    模型的动态LOD优化
    【Python基础篇】运算符
    安卓学习笔记
    前端webpack项目如何删除文件中的无用文件
    Linux 救援模式
    拼多多店铺搜索相关问题,为什么新品上架搜索不到
    使用nvm切换node方法,以及在nvm中的注意事项
  • 原文地址:https://blog.csdn.net/ccsss22/article/details/126314045